3.4.60-stable review
Subsystems (14)
Greg Kroah-Hartman
maintainercover 3.4.60-stable review
This is the start of the stable review cycle for the 3.4.60 release. There are 13 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Thu Aug 29 01:03:03 UTC 2013. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
kernel.org/pub/linux/kernel/v3.0/stable-review/patch-3.4.60-rc1.gz
and the diffstat can be found below.
thanks,
greg k-h
-------------
Pseudo-Shortlog of commits:
Greg Kroah-Hartman <[email protected]>
Linux 3.4.60-rc1
David Vrabel <[email protected]>
x86/xen: do not identity map UNUSABLE regions in the machine E820
Martin Peschke <[email protected]>
SCSI: zfcp: fix schedule-inside-lock in scsi_device list loops
Martin Peschke <[email protected]>
SCSI: zfcp: fix lock imbalance by reworking request queue locking
Terry Suereth <[email protected]>
libata: apply behavioral quirks to sil3826 PMP
Dan Carpenter <[email protected]>
Hostap: copying wrong data prism2_ioctl_giwaplist()
Vyacheslav Dubeyko <[email protected]>
nilfs2: fix issue with counting number of bio requests for BIO_EOPNOTSUPP error detection
Vyacheslav Dubeyko <[email protected]>
nilfs2: remove double bio_put() in nilfs_end_bio_write() for BIO_EOPNOTSUPP error
Wladislav Wiebe <[email protected]>
of: fdt: fix memory initialization for expanded DT
Chris Wilson <[email protected]>
drm/i915: Invalidate TLBs for the rings after a reset
David Vrabel <[email protected]>
xen/events: initialize local per-cpu mask for all possible events
Jussi Kivilinna <[email protected]>
zd1201: do not use stack as URB transfer_buffer
Tejun Heo <[email protected]>
workqueue: consider work function when searching for busy work items
Lai Jiangshan <[email protected]>
workqueue: fix possible stall on try_to_grab_pending() of a delayed work item
-------------
Diffstat:
Makefile | 4 +- arch/x86/xen/setup.c | 22 ++++++++++ drivers/ata/libata-pmp.c | 12 +++--- drivers/gpu/drm/i915/i915_reg.h | 2 + drivers/gpu/drm/i915/intel_ringbuffer.c | 12 ++++++ drivers/net/wireless/hostap/hostap_ioctl.c | 4 +- drivers/net/wireless/zd1201.c | 4 +- drivers/of/fdt.c | 2 + drivers/s390/scsi/zfcp_erp.c | 29 +++++++++---- drivers/s390/scsi/zfcp_qdio.c | 8 +--- drivers/xen/events.c | 2 +- fs/nilfs2/segbuf.c | 5 +-- include/linux/wait.h | 57 +++++++++++++++++++++++++ kernel/workqueue.c | 67 +++++++++++++++++++++++------- 14 files changed, 188 insertions(+), 42 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 1/13 workqueue: fix possible stall on try_to_grab_pending() of a delayed work item
3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lai Jiangshan <[email protected]>
commit 3aa62497594430ea522050b75c033f71f2c60ee6 upstream.
Currently, when try_to_grab_pending() grabs a delayed work item, it leaves its linked work items alone on the delayed_works. The linked work items are always NO_COLOR and will cause future cwq_activate_first_delayed() increase cwq->nr_active incorrectly, and may cause the whole cwq to stall. For example,
state: cwq->max_active = 1, cwq->nr_active = 1
one work in cwq->pool, many in cwq->delayed_works.
step1: try_to_grab_pending() removes a work item from delayed_works
but leaves its NO_COLOR linked work items on it.
step2: Later on, cwq_activate_first_delayed() activates the linked
work item increasing ->nr_active.
step3: cwq->nr_active = 1, but all activated work items of the cwq are
NO_COLOR. When they finish, cwq->nr_active will not be
decreased due to NO_COLOR, and no further work items will be
activated from cwq->delayed_works. the cwq stalls.Fix it by ensuring the target work item is activated before stealing PENDING in try_to_grab_pending(). This ensures that all the linked work items are activated without incorrectly bumping cwq->nr_active.
tj: Updated comment and description.
--- kernel/workqueue.c | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-)
kernel/workqueue.c +22 -3
@@ -1721,10 +1721,9 @@ static void move_linked_works(struct wor *nextp = n; } -static void cwq_activate_first_delayed (struct cpu_workqueue_struct *cwq) +static void cwq_activate_delayed_work (struct work_struct *work) { -struct work_struct *work =list_first_entry (&cwq->delayed_works, - struct work_struct, entry); +struct cpu_workqueue_struct *cwq =get_work_cwq (work);struct list_head *pos =gcwq_determine_ins_pos (cwq->gcwq, cwq);trace_workqueue_activate_work (work);
@@ -1733,6 +1732,14 @@ static void cwq_activate_first_delayed(s cwq->nr_active++; } +static void cwq_activate_first_delayed (struct cpu_workqueue_struct *cwq) +{ +struct work_struct *work =list_first_entry (&cwq->delayed_works, + struct work_struct, entry); + +cwq_activate_delayed_work (work); +} +/** * cwq_dec_nr_in_flight - decrement cwq's nr_in_flight * @cwq: cwq of interest
@@ -2625,6 +2632,18 @@ static int try_to_grab_pending(struct wosmp_rmb ();if (gcwq ==get_work_gcwq (work)) {debug_work_deactivate (work); + +/* +* A delayed work item cannot be grabbed directly +* because it might have linked NO_COLOR work items +* which, if left on the delayed_list, will confuse +* cwq->nr_active management later on and cause +* stall. Make sure the work item is activated +* before grabbing. +*/ +if (*work_data_bits (work) &WORK_STRUCT_DELAYED ) +cwq_activate_delayed_work (work); +list_del_init (&work->entry); cwq_dec_nr_in_flight(get_work_cwq(work), get_work_color(work),
Greg Kroah-Hartman
maintainerPATCH 2/13 workqueue: consider work function when searching for busy work items
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tejun Heo <[email protected]>
commit a2c1c57be8d9fd5b716113c8991d3d702eeacf77 upstream.
To avoid executing the same work item concurrenlty, workqueue hashes currently busy workers according to their current work items and looks up the the table when it wants to execute a new work item. If there already is a worker which is executing the new work item, the new item is queued to the found worker so that it gets executed only after the current execution finishes.
Unfortunately, a work item may be freed while being executed and thus recycled for different purposes. If it gets recycled for a different work item and queued while the previous execution is still in progress, workqueue may make the new work item wait for the old one although the two aren't really related in any way.
In extreme cases, this false dependency may lead to deadlock although it's extremely unlikely given that there aren't too many self-freeing work item users and they usually don't wait for other work items.
To alleviate the problem, record the current work function in each busy worker and match it together with the work item address in find_worker_executing_work(). While this isn't complete, it ensures that unrelated work items don't interact with each other and in the very unlikely case where a twisted wq user triggers it, it's always onto itself making the culprit easy to spot.
Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=51701
[lizf: Backported to 3.4:
- Adjust context
- Incorporate earlier logging cleanup in process_one_work() from 044c782ce3a9 ('workqueue: fix checkpatch issues')]
--- kernel/workqueue.c | 42 +++++++++++++++++++++++++++++++----------- 1 file changed, 31 insertions(+), 11 deletions(-)
kernel/workqueue.c +31 -11
@@ -128,6 +128,7 @@ struct worker { };struct work_struct *current_work;/* L: work being processed */ +work_func_t current_func;/* L: current_work's fn */ struct cpu_workqueue_struct *current_cwq;/* L: current_work's cwq */ struct list_head scheduled;/* L: scheduled works */ struct task_struct *task;/* I: worker task */
@@ -838,7 +839,8 @@ static struct worker *__find_worker_execstruct hlist_node *tmp;hlist_for_each_entry (worker, tmp, bwh, hentry) -if (worker->current_work == work) +if (worker->current_work == work && + worker->current_func == work->func)return worker;return NULL ; }
@@ -848,9 +850,27 @@ static struct worker *__find_worker_exec* @gcwq: gcwq of interest * @work: work to find worker for * -* Find a worker which is executing @work on @gcwq. This function is -* identical to __find_worker_executing_work() except that this -* function calculates @bwh itself. +* Find a worker which is executing @work on @gcwq by searching +* @gcwq->busy_hash which is keyed by the address of @work. For a worker +* to match, its current execution should match the address of @work and +* its work function. This is to avoid unwanted dependency between +* unrelated work executions through a work item being recycled while still +* being executed. +* +* This is a bit tricky. A work item may be freed once its execution +* starts and nothing prevents the freed area from being recycled for +* another work item. If the same work item address ends up being reused +* before the original execution finishes, workqueue will identify the +* recycled work item as currently executing and make it wait until the +* current execution finishes, introducing an unwanted dependency. +* +* This function checks the work item address, work function and workqueue +* to avoid false positives. Note that this isn't complete as one may +* construct a work function which can introduce dependency onto itself +* through a recycled work item. Well, if somebody wants to shoot oneself +* in the foot that badly, there's only so much we can do, and if such +* deadlock actually occurs, it should be easy to locate the culprit work +* function. * * CONTEXT: * spin_lock_irq(gcwq->lock).
@@ -1811,7 +1831,6 @@ __acquires(&gcwq->lock)struct global_cwq *gcwq = cwq->gcwq;struct hlist_head *bwh =busy_worker_head (gcwq, work);bool cpu_intensive = cwq->wq->flags &WQ_CPU_INTENSIVE ; -work_func_t f = work->func;int work_color;struct worker *collision;#ifdef CONFIG_LOCKDEP
@@ -1840,6 +1859,7 @@ __acquires(&gcwq->lock)debug_work_deactivate (work);hlist_add_head (&worker->hentry, bwh); worker->current_work = work; + worker->current_func = work->func; worker->current_cwq = cwq; work_color =get_work_color (work);
@@ -1877,7 +1897,7 @@ __acquires(&gcwq->lock)lock_map_acquire_read (&cwq->wq->lockdep_map);lock_map_acquire (&lockdep_map);trace_workqueue_execute_start (work); -f (work); + worker->current_func (work);/* * While we must be careful to not use "work" after this, the trace * point will only record its address.
@@ -1887,11 +1907,10 @@ __acquires(&gcwq->lock)lock_map_release (&cwq->wq->lockdep_map);if (unlikely (in_atomic () ||lockdep_depth (current) >0 )) { -printk (KERN_ERR "BUG: workqueue leaked lock or atomic: " -"%s/0x%08x/%d\n" , - current->comm,preempt_count (),task_pid_nr (current)); -printk (KERN_ERR " last function: " ); -print_symbol ("%s\n" , (unsigned long )f); +pr_err ("BUG: workqueue leaked lock or atomic: %s/0x%08x/%d\n" +" last function: %pf\n" , + current->comm,preempt_count (),task_pid_nr (current), + worker->current_func);debug_show_held_locks (current);dump_stack (); }
@@ -1905,6 +1924,7 @@ __acquires(&gcwq->lock)/* we're done with it, release */ hlist_del_init (&worker->hentry); worker->current_work =NULL ; + worker->current_func =NULL ; worker->current_cwq =NULL ;cwq_dec_nr_in_flight (cwq, work_color, false); }
Greg Kroah-Hartman
maintainerPATCH 3/13 zd1201: do not use stack as URB transfer_buffer
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jussi Kivilinna <[email protected]>
commit 1206ff4ff9d2ef7468a355328bc58ac6ebf5be44 upstream.
Patch fixes zd1201 not to use stack as URB transfer_buffer. URB buffers need to be DMA-able, which stack is not.
Patch is only compile tested.
--- drivers/net/wireless/zd1201.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/net/wireless/zd1201.c +3 -1
@@ -98,10 +98,12 @@ static int zd1201_fw_upload(struct usb_d goto exit; err =usb_control_msg (dev,usb_rcvctrlpipe (dev,0 ),0x4 , -USB_DIR_IN |0x40 ,0 ,0 , &ret,sizeof (ret),ZD1201_FW_TIMEOUT ); +USB_DIR_IN |0x40 ,0 ,0 , buf,sizeof (ret),ZD1201_FW_TIMEOUT );if (err <0 ) goto exit; +memcpy (&ret, buf,sizeof (ret)); +if (ret &0x80 ) { err = -EIO ; goto exit;
Greg Kroah-Hartman
maintainerPATCH 4/13 xen/events: initialize local per-cpu mask for all possible events
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: David Vrabel <[email protected]>
commit 84ca7a8e45dafb49cd5ca90a343ba033e2885c17 upstream.
The sizeof() argument in init_evtchn_cpu_bindings() is incorrect resulting in only the first 64 (or 32 in 32-bit guests) ports having their bindings being initialized to VCPU 0.
In most cases this does not cause a problem as request_irq() will set the irq affinity which will set the correct local per-cpu mask. However, if the request_irq() is called on a VCPU other than 0, there is a window between the unmasking of the event and the affinity being set were an event may be lost because it is not locally unmasked on any VCPU. If request_irq() is called on VCPU 0 then local irqs are disabled during the window and the race does not occur.
Fix this by initializing all NR_EVENT_CHANNEL bits in the local per-cpu masks.
--- drivers/xen/events.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/xen/events.c +1 -1
@@ -324,7 +324,7 @@ static void init_evtchn_cpu_bindings(voifor_each_possible_cpu (i)memset (per_cpu (cpu_evtchn_mask, i), - (i ==0 ) ? ~0 :0 ,sizeof (*per_cpu (cpu_evtchn_mask, i))); + (i ==0 ) ? ~0 :0 ,NR_EVENT_CHANNELS /8 ); }static inline void clear_evtchn (int port)
Greg Kroah-Hartman
maintainerPATCH 5/13 drm/i915: Invalidate TLBs for the rings after a reset
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chris Wilson <[email protected]>
commit 884020bf3d2a3787a1cc6df902e98e0eec60330b upstream.
After any "soft gfx reset" we must manually invalidate the TLBs associated with each ring. Empirically, it seems that a suspend/resume or D3-D0 cycle count as a "soft reset". The symptom is that the hardware would fail to note the new address for its status page, and so it would continue to write the shadow registers and breadcrumbs into the old physical address (now used by something completely different, scary). Whereas the driver would read the new status page and never see any progress, it would appear that the GPU hung immediately upon resume.
Based on a patch by naresh kumar kachhi <[email protected]>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=64725
--- drivers/gpu/drm/i915/i915_reg.h | 2 ++ drivers/gpu/drm/i915/intel_ringbuffer.c | 12 ++++++++++++ 2 files changed, 14 insertions(+)
drivers/gpu/drm/i915/i915_reg.h +2 -0
@@ -502,6 +502,8 @@will not assert AGPBUSY# and will only be delivered when out of C3. */ #define INSTPM_FORCE_ORDERING (1<<7)/* GEN6+ */ +#define INSTPM_TLB_INVALIDATE (1<<9) +#define INSTPM_SYNC_FLUSH (1<<5)#define ACTHD 0x020c8#define FW_BLC 0x020d8#define FW_BLC2 0x020dc
drivers/gpu/drm/i915/intel_ringbuffer.c +12 -0
@@ -767,6 +767,18 @@ void intel_ring_setup_status_page(structI915_WRITE (mmio, (u32 )ring->status_page.gfx_addr);POSTING_READ (mmio); + +/* Flush the TLB for this page */ +if (INTEL_INFO (dev)->gen >=6 ) { +u32 reg =RING_INSTPM (ring->mmio_base); +I915_WRITE (reg, +_MASKED_BIT_ENABLE (INSTPM_TLB_INVALIDATE | +INSTPM_SYNC_FLUSH )); +if (wait_for ((I915_READ (reg) &INSTPM_SYNC_FLUSH ) ==0 , +1000 )) +DRM_ERROR ("%s: wait for SyncFlush to complete for TLB invalidation timed out\n" , + ring->name); + } } static int
Greg Kroah-Hartman
maintainerPATCH 6/13 of: fdt: fix memory initialization for expanded DT
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Wladislav Wiebe <[email protected]>
commit 9e40127526e857fa3f29d51e83277204fbdfc6ba upstream.
Already existing property flags are filled wrong for properties created from initial FDT. This could cause problems if this DYNAMIC device-tree functions are used later, i.e. properties are attached/detached/replaced. Simply dumping flags from the running system show, that some initial static (not allocated via kzmalloc()) nodes are marked as dynamic.
I putted some debug extensions to property_proc_show(..) :
..
+ if (OF_IS_DYNAMIC(pp))
+ pr_err("DEBUG: xxx : OF_IS_DYNAMIC\n");
+ if (OF_IS_DETACHED(pp))
+ pr_err("DEBUG: xxx : OF_IS_DETACHED\n");
when you operate on the nodes (e.g.: ~$ cat /proc/device-tree/*some_node*) you will see that those flags are filled wrong, basically in most cases it will dump a DYNAMIC or DETACHED status, which is in not true.
(BTW. this OF_IS_DETACHED is a own define for debug purposes which which just make a test_bit(OF_DETACHED, &x->_flags)
If nodes are dynamic kernel is allowed to kfree() them. But it will crash attempting to do so on the nodes from FDT -- they are not allocated via kzmalloc().
--- drivers/of/fdt.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/of/fdt.c +2 -0
@@ -390,6 +390,8 @@ static void __unflatten_device_tree(stru mem = (unsigned long )dt_alloc (size +4 , __alignof__(struct device_node )); +memset ((void *)mem,0 , size); + ((__be32 *)mem)[size /4 ] =cpu_to_be32 (0xdeadbeef );pr_debug (" unflattening %lx...\n" , mem);
Greg Kroah-Hartman
maintainerPATCH 7/13 nilfs2: remove double bio_put() in nilfs_end_bio_write() for BIO_EOPNOTSUPP error
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vyacheslav Dubeyko <[email protected]>
commit 2df37a19c686c2d7c4e9b4ce1505b5141e3e5552 upstream.
Remove double call of bio_put() in nilfs_end_bio_write() for the case of BIO_EOPNOTSUPP error detection. The issue was found by Dan Carpenter and he suggests first version of the fix too.
--- fs/nilfs2/segbuf.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
fs/nilfs2/segbuf.c +1 -2
@@ -345,8 +345,7 @@ static void nilfs_end_bio_write(struct bif (err == -EOPNOTSUPP ) {set_bit (BIO_EOPNOTSUPP , &bio->bi_flags); -bio_put (bio); -/* to be detected by submit_seg_bio() */ +/* to be detected by nilfs_segbuf_submit_bio() */ }if (!uptodate)
Greg Kroah-Hartman
maintainerPATCH 8/13 nilfs2: fix issue with counting number of bio requests for BIO_EOPNOTSUPP error detection
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vyacheslav Dubeyko <[email protected]>
commit 4bf93b50fd04118ac7f33a3c2b8a0a1f9fa80bc9 upstream.
Fix the issue with improper counting number of flying bio requests for BIO_EOPNOTSUPP error detection case.
The sb_nbio must be incremented exactly the same number of times as complete() function was called (or will be called) because nilfs_segbuf_wait() will call wail_for_completion() for the number of times set to sb_nbio:
do {
wait_for_completion(&segbuf->sb_bio_event);
} while (--segbuf->sb_nbio > 0);Two functions complete() and wait_for_completion() must be called the same number of times for the same sb_bio_event. Otherwise, wait_for_completion() will hang or leak.
--- fs/nilfs2/segbuf.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/nilfs2/segbuf.c +1 -1
@@ -376,12 +376,12 @@ static int nilfs_segbuf_submit_bio(struc bio->bi_private = segbuf;bio_get (bio);submit_bio (mode, bio); + segbuf->sb_nbio++;if (bio_flagged (bio,BIO_EOPNOTSUPP )) {bio_put (bio); err = -EOPNOTSUPP ; goto failed; } - segbuf->sb_nbio++;bio_put (bio); wi->bio =NULL ;
Greg Kroah-Hartman
maintainerPATCH 9/13 Hostap: copying wrong data prism2_ioctl_giwaplist()
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dan Carpenter <[email protected]>
commit 909bd5926d474e275599094acad986af79671ac9 upstream.
We want the data stored in "addr" and "qual", but the extra ampersands mean we are copying stack data instead.
--- drivers/net/wireless/hostap/hostap_ioctl.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/net/wireless/hostap/hostap_ioctl.c +2 -2
@@ -522,9 +522,9 @@ static int prism2_ioctl_giwaplist(struct data->length =prism2_ap_get_sta_qual (local, addr, qual,IW_MAX_AP ,1 ); -memcpy (extra, &addr,sizeof (struct sockaddr ) * data->length); +memcpy (extra, addr,sizeof (struct sockaddr ) * data->length); data->flags =1 ;/* has quality information */ -memcpy (extra +sizeof (struct sockaddr ) * data->length, &qual, +memcpy (extra +sizeof (struct sockaddr ) * data->length, qual,sizeof (struct iw_quality ) * data->length);kfree (addr);
Greg Kroah-Hartman
maintainerPATCH 10/13 libata: apply behavioral quirks to sil3826 PMP
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Terry Suereth <[email protected]>
commit 8ffff94d20b7eb446e848e0046107d51b17a20a8 upstream.
Fixing support for the Silicon Image 3826 port multiplier, by applying to it the same quirks applied to the Silicon Image 3726. Specifically fixes the repeated timeout/reset process which previously afflicted the 3726, as described from line 290. Slightly based on notes from:
https://bugzilla.redhat.com/show_bug.cgi?id=890237
--- drivers/ata/libata-pmp.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
drivers/ata/libata-pmp.c +6 -6
@@ -289,24 +289,24 @@ static int sata_pmp_configure(struct ata/* Disable sending Early R_OK. * With "cached read" HDD testing and multiple ports busy on a SATA -* host controller, 3726 PMP will very rarely drop a deferred +* host controller, 3x26 PMP will very rarely drop a deferred * R_OK that was intended for the host. Symptom will be all * 5 drives under test will timeout, get reset, and recover. */ -if (vendor ==0x1095 && devid ==0x3726 ) { +if (vendor ==0x1095 && (devid ==0x3726 || devid ==0x3826 )) {u32 reg; err_mask =sata_pmp_read (&ap->link,PMP_GSCR_SII_POL , ®);if (err_mask) { rc = -EIO ; - reason ="failed to read Sil3726 Private Register" ; + reason ="failed to read Sil3x26 Private Register" ; goto fail; } reg &= ~0x1 ; err_mask =sata_pmp_write (&ap->link,PMP_GSCR_SII_POL , reg);if (err_mask) { rc = -EIO ; - reason ="failed to write Sil3726 Private Register" ; + reason ="failed to write Sil3x26 Private Register" ; goto fail; } }
@@ -383,8 +383,8 @@ static void sata_pmp_quirks(struct ata_pu16 devid =sata_pmp_gscr_devid (gscr);struct ata_link *link; -if (vendor ==0x1095 && devid ==0x3726 ) { -/* sil3726 quirks */ +if (vendor ==0x1095 && (devid ==0x3726 || devid ==0x3826 )) { +/* sil3x26 quirks */ ata_for_each_link (link, ap,EDGE ) {/* link reports offline after LPM */ link->flags |=ATA_LFLAG_NO_LPM ;
Greg Kroah-Hartman
maintainerPATCH 11/13 SCSI: zfcp: fix lock imbalance by reworking request queue locking
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Martin Peschke <[email protected]>
commit d79ff142624e1be080ad8d09101f7004d79c36e1 upstream.
This patch adds wait_event_interruptible_lock_irq_timeout(), which is a straight-forward descendant of wait_event_interruptible_timeout() and wait_event_interruptible_lock_irq().
The zfcp driver used to call wait_event_interruptible_timeout() in combination with some intricate and error-prone locking. Using wait_event_interruptible_lock_irq_timeout() as a replacement nicely cleans up that locking.
This rework removes a situation that resulted in a locking imbalance in zfcp_qdio_sbal_get():
BUG: workqueue leaked lock or atomic: events/1/0xffffff00/10
last function: zfcp_fc_wka_port_offline+0x0/0xa0 [zfcp]It was introduced by commit c2af7545aaff3495d9bf9a7608c52f0af86fb194 "[SCSI] zfcp: Do not wait for SBALs on stopped queue", which had a new code path related to ZFCP_STATUS_ADAPTER_QDIOUP that took an early exit without a required lock being held. The problem occured when a special, non-SCSI I/O request was being submitted in process context, when the adapter's queues had been torn down. In this case the bug surfaced when the Fibre Channel port connection for a well-known address was closed during a concurrent adapter shut-down procedure, which is a rare constellation.
This patch also fixes these warnings from the sparse tool (make C=1):
drivers/s390/scsi/zfcp_qdio.c:224:12: warning: context imbalance in
'zfcp_qdio_sbal_check' - wrong count at exitdrivers/s390/scsi/zfcp_qdio.c:244:5: warning: context imbalance in
'zfcp_qdio_sbal_get' - unexpected unlock
Last but not least, we get rid of that crappy lock-unlock-lock sequence at the beginning of the critical section.
It is okay to call zfcp_erp_adapter_reopen() with req_q_lock held.
--- drivers/s390/scsi/zfcp_qdio.c | 8 +---- include/linux/wait.h | 57 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 6 deletions(-)
drivers/s390/scsi/zfcp_qdio.c +2 -6
@@ -224,11 +224,9 @@ int zfcp_qdio_sbals_from_sg(struct zfcp_static int zfcp_qdio_sbal_check (struct zfcp_qdio *qdio) { -spin_lock_irq (&qdio->req_q_lock);if (atomic_read (&qdio->req_q_free) || !(atomic_read (&qdio->adapter->status) &ZFCP_STATUS_ADAPTER_QDIOUP ))return 1 ; -spin_unlock_irq (&qdio->req_q_lock);return 0 ; }
@@ -246,9 +244,8 @@ int zfcp_qdio_sbal_get(struct zfcp_qdio {long ret; -spin_unlock_irq (&qdio->req_q_lock); - ret =wait_event_interruptible_timeout (qdio->req_q_wq, -zfcp_qdio_sbal_check (qdio),5 *HZ ); + ret =wait_event_interruptible_lock_irq_timeout (qdio->req_q_wq, +zfcp_qdio_sbal_check (qdio), qdio->req_q_lock,5 *HZ );if (!(atomic_read (&qdio->adapter->status) &ZFCP_STATUS_ADAPTER_QDIOUP ))return -EIO ;
@@ -262,7 +259,6 @@ int zfcp_qdio_sbal_get(struct zfcp_qdiozfcp_erp_adapter_reopen (qdio->adapter,0 ,"qdsbg_1" ); } -spin_lock_irq (&qdio->req_q_lock);return -EIO ; }
include/linux/wait.h +57 -0
63 lines not on this page · raw message
Greg Kroah-Hartman
maintainerPATCH 12/13 SCSI: zfcp: fix schedule-inside-lock in scsi_device list loops
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Martin Peschke <[email protected]>
commit 924dd584b198a58aa7cb3efefd8a03326550ce8f upstream.
BUG: sleeping function called from invalid context at kernel/workqueue.c:2752 in_atomic(): 1, irqs_disabled(): 1, pid: 360, name: zfcperp0.0.1700 CPU: 1 Not tainted 3.9.3+ #69 Process zfcperp0.0.1700 (pid: 360, task: 0000000075b7e080, ksp: 000000007476bc30) <snip> Call Trace: ([<00000000001165de>] show_trace+0x106/0x154) [<00000000001166a0>] show_stack+0x74/0xf4 [<00000000006ff646>] dump_stack+0xc6/0xd4 [<000000000017f3a0>] __might_sleep+0x128/0x148 [<000000000015ece8>] flush_work+0x54/0x1f8 [<00000000001630de>] __cancel_work_timer+0xc6/0x128 [<00000000005067ac>] scsi_device_dev_release_usercontext+0x164/0x23c [<0000000000161816>] execute_in_process_context+0x96/0xa8 [<00000000004d33d8>] device_release+0x60/0xc0 [<000000000048af48>] kobject_release+0xa8/0x1c4 [<00000000004f4bf2>] __scsi_iterate_devices+0xfa/0x130 [<000003ff801b307a>] zfcp_erp_strategy+0x4da/0x1014 [zfcp] [<000003ff801b3caa>] zfcp_erp_thread+0xf6/0x2b0 [zfcp] [<000000000016b75a>] kthread+0xf2/0xfc [<000000000070c9de>] kernel_thread_starter+0x6/0xc [<000000000070c9d8>] kernel_thread_starter+0x0/0xc
Apparently, the ref_count for some scsi_device drops down to zero, triggering device removal through execute_in_process_context(), while the lldd error recovery thread iterates through a scsi device list. Unfortunately, execute_in_process_context() decides to immediately execute that device removal function, instead of scheduling asynchronous execution, since it detects process context and thinks it is safe to do so. But almost all calls to shost_for_each_device() in our lldd are inside spin_lock_irq, even in thread context. Obviously, schedule() inside spin_lock_irq sections is a bad idea.
Change the lldd to use the proper iterator function, __shost_for_each_device(), in combination with required locking.
Occurences that need to be changed include all calls in zfcp_erp.c, since those might be executed in zfcp error recovery thread context with a lock held.
Other occurences of shost_for_each_device() in zfcp_fsf.c do not need to be changed (no process context, no surrounding locking).
The problem was introduced in Linux 2.6.37 by commit b62a8d9b45b971a67a0f8413338c230e3117dff5
"[SCSI] zfcp: Use SCSI device data zfcp_scsi_dev instead of zfcp_unit".
--- drivers/s390/scsi/zfcp_erp.c | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-)
drivers/s390/scsi/zfcp_erp.c +22 -7
@@ -102,10 +102,13 @@ static void zfcp_erp_action_dismiss_portif (atomic_read (&port->status) &ZFCP_STATUS_COMMON_ERP_INUSE )zfcp_erp_action_dismiss (&port->erp_action); -else -shost_for_each_device (sdev, port->adapter->scsi_host) +else { +spin_lock (port->adapter->scsi_host->host_lock); +__shost_for_each_device (sdev, port->adapter->scsi_host)if (sdev_to_zfcp (sdev)->port == port)zfcp_erp_action_dismiss_lun (sdev); +spin_unlock (port->adapter->scsi_host->host_lock); + } }static void zfcp_erp_action_dismiss_adapter (struct zfcp_adapter *adapter)
@@ -592,9 +595,11 @@ static void _zfcp_erp_lun_reopen_all(str {struct scsi_device *sdev; -shost_for_each_device (sdev, port->adapter->scsi_host) +spin_lock (port->adapter->scsi_host->host_lock); +__shost_for_each_device (sdev, port->adapter->scsi_host)if (sdev_to_zfcp (sdev)->port == port)_zfcp_erp_lun_reopen (sdev, clear, id,0 ); +spin_unlock (port->adapter->scsi_host->host_lock); }static void zfcp_erp_strategy_followup_failed (struct zfcp_erp_action *act)
@@ -1435,8 +1440,10 @@ void zfcp_erp_set_adapter_status(structatomic_set_mask (common_mask, &port->status);read_unlock_irqrestore (&adapter->port_list_lock, flags); -shost_for_each_device (sdev, adapter->scsi_host) +spin_lock_irqsave (adapter->scsi_host->host_lock, flags); +__shost_for_each_device (sdev, adapter->scsi_host)atomic_set_mask (common_mask, &sdev_to_zfcp (sdev)->status); +spin_unlock_irqrestore (adapter->scsi_host->host_lock, flags); }/**
@@ -1470,11 +1477,13 @@ void zfcp_erp_clear_adapter_status(struc }read_unlock_irqrestore (&adapter->port_list_lock, flags); -shost_for_each_device (sdev, adapter->scsi_host) { +spin_lock_irqsave (adapter->scsi_host->host_lock, flags); +__shost_for_each_device (sdev, adapter->scsi_host) {atomic_clear_mask (common_mask, &sdev_to_zfcp (sdev)->status);if (clear_counter)atomic_set (&sdev_to_zfcp (sdev)->erp_counter,0 ); } +spin_unlock_irqrestore (adapter->scsi_host->host_lock, flags); }/**
@@ -1488,16 +1497,19 @@ void zfcp_erp_set_port_status(struct zfc {struct scsi_device *sdev;u32 common_mask = mask &ZFCP_COMMON_FLAGS ; +unsigned long flags;atomic_set_mask (mask, &port->status);if (!common_mask)return ; -shost_for_each_device (sdev, port->adapter->scsi_host) +spin_lock_irqsave (port->adapter->scsi_host->host_lock, flags); +__shost_for_each_device (sdev, port->adapter->scsi_host)if (sdev_to_zfcp (sdev)->port == port)atomic_set_mask (common_mask, &sdev_to_zfcp (sdev)->status); +spin_unlock_irqrestore (port->adapter->scsi_host->host_lock, flags); }/**
@@ -1512,6 +1524,7 @@ void zfcp_erp_clear_port_status(struct zstruct scsi_device *sdev;u32 common_mask = mask &ZFCP_COMMON_FLAGS ;u32 clear_counter = mask &ZFCP_STATUS_COMMON_ERP_FAILED ; +unsigned long flags;atomic_clear_mask (mask, &port->status);
@@ -1521,13 +1534,15 @@ void zfcp_erp_clear_port_status(struct zif (clear_counter)atomic_set (&port->erp_counter,0 ); -shost_for_each_device (sdev, port->adapter->scsi_host) +spin_lock_irqsave (port->adapter->scsi_host->host_lock, flags); +__shost_for_each_device (sdev, port->adapter->scsi_host)if (sdev_to_zfcp (sdev)->port == port) {atomic_clear_mask (common_mask, &sdev_to_zfcp (sdev)->status);if (clear_counter)atomic_set (&sdev_to_zfcp (sdev)->erp_counter,0 ); } +spin_unlock_irqrestore (port->adapter->scsi_host->host_lock, flags); }/**
Greg Kroah-Hartman
maintainerPATCH 13/13 x86/xen: do not identity map UNUSABLE regions in the machine E820
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: David Vrabel <[email protected]>
commit 3bc38cbceb85881a8eb789ee1aa56678038b1909 upstream.
If there are UNUSABLE regions in the machine memory map, dom0 will attempt to map them 1:1 which is not permitted by Xen and the kernel will crash.
There isn't anything interesting in the UNUSABLE region that the dom0 kernel needs access to so we can avoid making the 1:1 mapping and treat it as RAM.
We only do this for dom0, as that is where tboot case shows up. A PV domU could have an UNUSABLE region in its pseudo-physical map and would need to be handled in another patch.
This fixes a boot failure on hosts with tboot.
tboot marks a region in the e820 map as unusable and the dom0 kernel would attempt to map this region and Xen does not permit unusable regions to be mapped by guests.
(XEN) 0000000000000000 - 0000000000060000 (usable) (XEN) 0000000000060000 - 0000000000068000 (reserved) (XEN) 0000000000068000 - 000000000009e000 (usable) (XEN) 0000000000100000 - 0000000000800000 (usable) (XEN) 0000000000800000 - 0000000000972000 (unusable)
tboot marked this region as unusable.
(XEN) 0000000000972000 - 00000000cf200000 (usable) (XEN) 00000000cf200000 - 00000000cf38f000 (reserved) (XEN) 00000000cf38f000 - 00000000cf3ce000 (ACPI data) (XEN) 00000000cf3ce000 - 00000000d0000000 (reserved) (XEN) 00000000e0000000 - 00000000f0000000 (reserved) (XEN) 00000000fe000000 - 0000000100000000 (reserved) (XEN) 0000000100000000 - 0000000630000000 (usable)
--- arch/x86/xen/setup.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+)
arch/x86/xen/setup.c +22 -0
@@ -213,6 +213,17 @@ static void xen_align_and_add_e820_regioe820_add_region (start, end - start, type); } +void xen_ignore_unusable (struct e820entry *list,size_t map_size) +{ +struct e820entry *entry; +unsigned int i; + +for (i =0 , entry = list; i < map_size; i++, entry++) { +if (entry->type ==E820_UNUSABLE ) + entry->type =E820_RAM ; + } +} +/** * machine_specific_memory_setup - Hook for machine specific memory setup. **/
@@ -251,6 +262,17 @@ char * __init xen_memory_setup(void) }BUG_ON (rc); +/* +* Xen won't allow a 1:1 mapping to be created to UNUSABLE +* regions, so if we're using the machine memory map leave the +* region as RAM as it is in the pseudo-physical map. +* +* UNUSABLE regions in domUs are not handled and will need +* a patch in the future. +*/ +if (xen_initial_domain ()) +xen_ignore_unusable (map, memmap.nr_entries); +/* Make sure the Xen-supplied memory map is well-ordered. */ sanitize_e820_map (map, memmap.nr_entries, &memmap.nr_entries);
Quoted 5 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 3.4.60 release. There are 13 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Quoted 7 lines
Responses should be made by Thu Aug 29 01:03:03 UTC 2013. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
kernel.org/pub/linux/kernel/v3.0/stable-review/patch-3.4.60-rc1.gzand the diffstat can be found below.
Cross build results:
total: 75 pass: 73 fail: 2 Compared to 3.4.59: total: 69 pass: 67 fail: 2
qemu tests:
mips, mips64, ppc, x86, x86_64: pass (boot to login prompt) arm: skipped
More builds, more platforms tested, still only two failures. Results look good.
Details:
http://server.roeck-us.net:8010/builders
Guenter
Greg Kroah-Hartman
maintainerQuoted 19 lines · Guenter Roeck
Quoted 5 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 3.4.60 release. There are 13 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Quoted 7 lines
Responses should be made by Thu Aug 29 01:03:03 UTC 2013. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
kernel.org/pub/linux/kernel/v3.0/stable-review/patch-3.4.60-rc1.gzand the diffstat can be found below.
Cross build results:
total: 75 pass: 73 fail: 2 Compared to 3.4.59: total: 69 pass: 67 fail: 2
Quoted 5 lines
qemu tests:
mips, mips64, ppc, x86, x86_64: pass (boot to login prompt) arm: skippedMore builds, more platforms tested, still only two failures. Results look good.
that's great, thanks.
greg k-h
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 3.4.60 release. There are 13 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Thu Aug 29 01:03:03 UTC 2013. Anything received after that time might be too late.
Quoted 8 lines
The whole patch series can be found in one patch at:
kernel.org/pub/linux/kernel/v3.0/stable-review/patch-3.4.60-rc1.gzand the diffstat can be found below.
thanks,
greg k-h
3.4.60
-------
3.4.60-rc1 applied cleanly to 3.4.59
Compiled and booted on the following systems:
Samsung Series 9 900X4C Intel Corei5
HP ProBook 6475b AMD A10-4600M APU with Radeon(tm) HD Graphics
dmesgs look good. No regressions compared to the previous dmesgs for this release. dmesg emerg, crit, alert, err are clean. No regressions in warn.
Cross-compile testing: HP Compaq dc7700 SFF desktop: x86-64 Intel Core-i2:
Cross-compile tests results:
alpha: defconfig passed
arm: defconfig passed
arm64: not applicable
blackfin: defconfig passed
c6x: defconfig passed
mips: defconfig passed
mipsel: defconfig passed
powerpc: wii_defconfig passed
sh: defconfig passed
sparc: defconfig passed
tile: tilegx_defconfig passed
-- Shuah
Signature · 4 lines
Shuah Khan Senior Linux Kernel Developer - Open Source Group Samsung Research America(Silicon Valley) [email protected] | (970) 672-0658
Greg Kroah-Hartman
maintainerQuoted 22 lines · Shuah Khan
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 3.4.60 release. There are 13 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Thu Aug 29 01:03:03 UTC 2013. Anything received after that time might be too late.
Quoted 8 lines
The whole patch series can be found in one patch at:
kernel.org/pub/linux/kernel/v3.0/stable-review/patch-3.4.60-rc1.gzand the diffstat can be found below.
thanks,
greg k-h
3.4.60
-------
3.4.60-rc1 applied cleanly to 3.4.59
Quoted 8 lines
Compiled and booted on the following systems:
Samsung Series 9 900X4C Intel Corei5
HP ProBook 6475b AMD A10-4600M APU with Radeon(tm) HD Graphicsdmesgs look good. No regressions compared to the previous dmesgs for this release. dmesg emerg, crit, alert, err are clean. No regressions in warn.
Thanks for testing and letting me know.
greg k-h