diff options
| author | Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> | 2013-01-15 15:58:25 -0500 | 
|---|---|---|
| committer | Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> | 2013-01-15 15:58:25 -0500 | 
| commit | 7bcc1ec07748cae3552dc9b46701c117926c8923 (patch) | |
| tree | 2b3edc7de77ca306b2559ae341077094bac8c4a2 /kernel/workqueue.c | |
| parent | e5c702d3b268066dc70d619ecff06a08065f343f (diff) | |
| parent | 29594404d7fe73cd80eaa4ee8c43dcc53970c60e (diff) | |
| download | olio-linux-3.10-7bcc1ec07748cae3552dc9b46701c117926c8923.tar.xz olio-linux-3.10-7bcc1ec07748cae3552dc9b46701c117926c8923.zip  | |
Merge tag 'v3.7' into stable/for-linus-3.8
Linux 3.7
* tag 'v3.7': (833 commits)
  Linux 3.7
  Input: matrix-keymap - provide proper module license
  Revert "revert "Revert "mm: remove __GFP_NO_KSWAPD""" and associated damage
  ipv4: ip_check_defrag must not modify skb before unsharing
  Revert "mm: avoid waking kswapd for THP allocations when compaction is deferred or contended"
  inet_diag: validate port comparison byte code to prevent unsafe reads
  inet_diag: avoid unsafe and nonsensical prefix matches in inet_diag_bc_run()
  inet_diag: validate byte code to prevent oops in inet_diag_bc_run()
  inet_diag: fix oops for IPv4 AF_INET6 TCP SYN-RECV state
  mm: vmscan: fix inappropriate zone congestion clearing
  vfs: fix O_DIRECT read past end of block device
  net: gro: fix possible panic in skb_gro_receive()
  tcp: bug fix Fast Open client retransmission
  tmpfs: fix shared mempolicy leak
  mm: vmscan: do not keep kswapd looping forever due to individual uncompactable zones
  mm: compaction: validate pfn range passed to isolate_freepages_block
  mmc: sh-mmcif: avoid oops on spurious interrupts (second try)
  Revert misapplied "mmc: sh-mmcif: avoid oops on spurious interrupts"
  mmc: sdhci-s3c: fix missing clock for gpio card-detect
  lib/Makefile: Fix oid_registry build dependency
  ...
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Conflicts:
	arch/arm/xen/enlighten.c
	drivers/xen/Makefile
[We need to have the v3.7 base as the 'for-3.8' was based off v3.7-rc3
and there are some patches in v3.7-rc6 that we to have in our branch]
Diffstat (limited to 'kernel/workqueue.c')
| -rw-r--r-- | kernel/workqueue.c | 22 | 
1 files changed, 16 insertions, 6 deletions
diff --git a/kernel/workqueue.c b/kernel/workqueue.c index 042d221d33c..1dae900df79 100644 --- a/kernel/workqueue.c +++ b/kernel/workqueue.c @@ -1361,8 +1361,19 @@ static void __queue_delayed_work(int cpu, struct workqueue_struct *wq,  	WARN_ON_ONCE(timer->function != delayed_work_timer_fn ||  		     timer->data != (unsigned long)dwork); -	BUG_ON(timer_pending(timer)); -	BUG_ON(!list_empty(&work->entry)); +	WARN_ON_ONCE(timer_pending(timer)); +	WARN_ON_ONCE(!list_empty(&work->entry)); + +	/* +	 * If @delay is 0, queue @dwork->work immediately.  This is for +	 * both optimization and correctness.  The earliest @timer can +	 * expire is on the closest next tick and delayed_work users depend +	 * on that there's no such delay when @delay is 0. +	 */ +	if (!delay) { +		__queue_work(cpu, wq, &dwork->work); +		return; +	}  	timer_stats_timer_set_start_info(&dwork->timer); @@ -1417,9 +1428,6 @@ bool queue_delayed_work_on(int cpu, struct workqueue_struct *wq,  	bool ret = false;  	unsigned long flags; -	if (!delay) -		return queue_work_on(cpu, wq, &dwork->work); -  	/* read the comment in __queue_work() */  	local_irq_save(flags); @@ -2407,8 +2415,10 @@ static int rescuer_thread(void *__wq)  repeat:  	set_current_state(TASK_INTERRUPTIBLE); -	if (kthread_should_stop()) +	if (kthread_should_stop()) { +		__set_current_state(TASK_RUNNING);  		return 0; +	}  	/*  	 * See whether any cpu is asking for help.  Unbounded  |