diff --git a/elevator-Fix-a-race-in-elevator-switching-and-md.patch b/elevator-Fix-a-race-in-elevator-switching-and-md.patch new file mode 100644 index 000000000..5517687ff --- /dev/null +++ b/elevator-Fix-a-race-in-elevator-switching-and-md.patch @@ -0,0 +1,162 @@ + +Delivered-To: jwboyer@gmail.com +Received: by 10.76.168.104 with SMTP id zv8csp55663oab; + Fri, 30 Aug 2013 15:52:46 -0700 (PDT) +X-Received: by 10.68.244.168 with SMTP id xh8mr12419215pbc.3.1377903166373; + Fri, 30 Aug 2013 15:52:46 -0700 (PDT) +Return-Path: +Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) + by mx.google.com with ESMTP id qc9si280431pac.269.1969.12.31.16.00.00; + Fri, 30 Aug 2013 15:52:46 -0700 (PDT) +Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; +Authentication-Results: mx.google.com; + spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mail=linux-kernel-owner@vger.kernel.org; + dkim=neutral (bad format) header.i=@hds.com +Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand + id S1753535Ab3H3WrV (ORCPT + + 99 others); Fri, 30 Aug 2013 18:47:21 -0400 +Received: from usindpps04.hds.com ([207.126.252.17]:35636 "EHLO + usindpps04.hds.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org + with ESMTP id S1752650Ab3H3WrU (ORCPT + ); + Fri, 30 Aug 2013 18:47:20 -0400 +DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=hds.com; h=subject : to : from : cc + : date : message-id : mime-version : content-type : + content-transfer-encoding; s=mail1; + bh=VofHN8IMnygn2hbqnFjLmX0PPEPbvpzE377u1RxpGOY=; + b=piW6J78W57qDXBPJJuodWw/tvf0T//JbxKX6sLPvpuaOG2nBLMHzDqUeTYwFEQqUvdmf + ZTkiwsKi0WEku3MKcxJ7veR7wvTZcQ4fGMETFTf1c2J/1JOKpXLnft4ERuW89/FAxw25 + wQM1ulsuQ3Cncl0I/sIaqMlaMOtvuQ/C8rsHorp+75eFiL6yx1jU5wMbuti4D/NprIET + 3r57cPZ0YCh6sLjvOgjay6mKyktMToyjHPx6X1TWCSWcwes33Popc1hpadxUdFI/0npL + mN3Tttbe7e2RcmkXAZbwg8xj+FwSu3nIRC4G9UpFCsMz518C/AWZj4puwWE6VHZWVvVZ Rg== +Received: from usindmail01.hds.com (usindmail03 [207.126.252.22]) + by usindpps04.hds.com (8.14.5/8.14.5) with ESMTP id r7UMlBjr025492; + Fri, 30 Aug 2013 18:47:11 -0400 +Received: from hds.com (usindnetf5d-vlan47float.corp.hds.com [10.74.73.11]) + by usindmail01.hds.com (8.14.1/8.14.1) with ESMTP id r7UMl8SG058466; + Fri, 30 Aug 2013 18:47:10 -0400 (EDT) +Subject: [PATCH v2 1/2] elevator: Fix a race in elevator switching and md + device initialization +To: linux-kernel@vger.kernel.org +From: Tomoki Sekiyama +Cc: axboe@kernel.dk, tj@kernel.org, seiji.aguchi@hds.com, + vgoyal@redhat.com, majianpeng@gmail.com +Date: Fri, 30 Aug 2013 18:47:07 -0400 +Message-ID: <20130830224707.21812.63516.stgit@hds.com> +User-Agent: StGit/0.16 +MIME-Version: 1.0 +Content-Type: text/plain; charset="utf-8" +Content-Transfer-Encoding: 7bit +X-Proofpoint-SPF-Result: pass +X-Proofpoint-SPF-Record: v=spf1 mx ip4:207.126.244.0/26 ip4:207.126.252.0/25 include:mktomail.com + include:cloud.hds.com ~all +X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:5.10.8794,1.0.431,0.0.0000 + definitions=2013-08-30_09:2013-08-30,2013-08-30,1970-01-01 signatures=0 +X-Proofpoint-Spam-Details: rule=notspam policy=outbound_policy score=0 spamscore=0 suspectscore=1 + phishscore=0 adultscore=0 bulkscore=0 classifier=spam adjust=0 reason=mlx + scancount=1 engine=7.0.1-1305240000 definitions=main-1308300162 +Sender: linux-kernel-owner@vger.kernel.org +Precedence: bulk +List-ID: +X-Mailing-List: linux-kernel@vger.kernel.org + +The soft lockup below happens at the boot time of the system using dm +multipath and the udev rules to switch scheduler. + +[ 356.127001] BUG: soft lockup - CPU#3 stuck for 22s! [sh:483] +[ 356.127001] RIP: 0010:[] [] lock_timer_base.isra.35+0x1d/0x50 +... +[ 356.127001] Call Trace: +[ 356.127001] [] try_to_del_timer_sync+0x20/0x70 +[ 356.127001] [] ? kmem_cache_alloc_node_trace+0x20a/0x230 +[ 356.127001] [] del_timer_sync+0x52/0x60 +[ 356.127001] [] cfq_exit_queue+0x32/0xf0 +[ 356.127001] [] elevator_exit+0x2f/0x50 +[ 356.127001] [] elevator_change+0xf1/0x1c0 +[ 356.127001] [] elv_iosched_store+0x20/0x50 +[ 356.127001] [] queue_attr_store+0x59/0xb0 +[ 356.127001] [] sysfs_write_file+0xc6/0x140 +[ 356.127001] [] vfs_write+0xbd/0x1e0 +[ 356.127001] [] SyS_write+0x49/0xa0 +[ 356.127001] [] system_call_fastpath+0x16/0x1b + +This is caused by a race between md device initialization by multipathd and +shell script to switch the scheduler using sysfs. + + - multipathd: + SyS_ioctl -> do_vfs_ioctl -> dm_ctl_ioctl -> ctl_ioctl -> table_load + -> dm_setup_md_queue -> blk_init_allocated_queue -> elevator_init + q->elevator = elevator_alloc(q, e); // not yet initialized + + - sh -c 'echo deadline > /sys/$DEVPATH/queue/scheduler': + elevator_switch (in the call trace above) + struct elevator_queue *old = q->elevator; + q->elevator = elevator_alloc(q, new_e); + elevator_exit(old); // lockup! (*) + + - multipathd: (cont.) + err = e->ops.elevator_init_fn(q); // init fails; q->elevator is modified + +(*) When del_timer_sync() is called, lock_timer_base() will loop infinitely +while timer->base == NULL. In this case, as timer will never initialized, +it results in lockup. + +This patch introduces acquisition of q->sysfs_lock around elevator_init() +into blk_init_allocated_queue(), to provide mutual exclusion between +initialization of the q->scheduler and switching of the scheduler. + +This should fix this bugzilla: +https://bugzilla.redhat.com/show_bug.cgi?id=902012 + +Signed-off-by: Tomoki Sekiyama +--- + block/blk-core.c | 10 +++++++++- + block/elevator.c | 6 ++++++ + 2 files changed, 15 insertions(+), 1 deletion(-) + +diff --git a/block/blk-core.c b/block/blk-core.c +index 93a18d1..2f6275f 100644 +--- a/block/blk-core.c ++++ b/block/blk-core.c +@@ -739,9 +739,17 @@ blk_init_allocated_queue(struct request_queue *q, request_fn_proc *rfn, + + q->sg_reserved_size = INT_MAX; + ++ /* Protect q->elevator from elevator_change */ ++ mutex_lock(&q->sysfs_lock); ++ + /* init elevator */ +- if (elevator_init(q, NULL)) ++ if (elevator_init(q, NULL)) { ++ mutex_unlock(&q->sysfs_lock); + return NULL; ++ } ++ ++ mutex_unlock(&q->sysfs_lock); ++ + return q; + } + EXPORT_SYMBOL(blk_init_allocated_queue); +diff --git a/block/elevator.c b/block/elevator.c +index 668394d..02d4390 100644 +--- a/block/elevator.c ++++ b/block/elevator.c +@@ -186,6 +186,12 @@ int elevator_init(struct request_queue *q, char *name) + struct elevator_type *e = NULL; + int err; + ++ /* ++ * q->sysfs_lock must be held to provide mutual exclusion between ++ * elevator_switch() and here. ++ */ ++ lockdep_assert_held(&q->sysfs_lock); ++ + if (unlikely(q->elevator)) + return 0; + + +-- +To unsubscribe from this list: send the line "unsubscribe linux-kernel" in +the body of a message to majordomo@vger.kernel.org +More majordomo info at http://vger.kernel.org/majordomo-info.html +Please read the FAQ at http://www.tux.org/lkml/ diff --git a/elevator-acquire-q-sysfs_lock-in-elevator_change.patch b/elevator-acquire-q-sysfs_lock-in-elevator_change.patch new file mode 100644 index 000000000..6f112b81c --- /dev/null +++ b/elevator-acquire-q-sysfs_lock-in-elevator_change.patch @@ -0,0 +1,121 @@ + +Delivered-To: jwboyer@gmail.com +Received: by 10.76.168.104 with SMTP id zv8csp55623oab; + Fri, 30 Aug 2013 15:51:42 -0700 (PDT) +X-Received: by 10.67.30.70 with SMTP id kc6mr13149193pad.32.1377903101609; + Fri, 30 Aug 2013 15:51:41 -0700 (PDT) +Return-Path: +Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) + by mx.google.com with ESMTP id gg2si304840pac.217.1969.12.31.16.00.00; + Fri, 30 Aug 2013 15:51:41 -0700 (PDT) +Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; +Authentication-Results: mx.google.com; + spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mail=linux-kernel-owner@vger.kernel.org; + dkim=neutral (bad format) header.i=@hds.com +Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand + id S1756106Ab3H3WrX (ORCPT + + 99 others); Fri, 30 Aug 2013 18:47:23 -0400 +Received: from usindpps04.hds.com ([207.126.252.17]:35640 "EHLO + usindpps04.hds.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org + with ESMTP id S1752650Ab3H3WrW (ORCPT + ); + Fri, 30 Aug 2013 18:47:22 -0400 +DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=hds.com; h=subject : to : from : cc + : date : message-id : in-reply-to : references : mime-version : + content-type : content-transfer-encoding; s=mail1; + bh=xbQuWVaSJrPfWG5E7bXFAbOFjf/sBaRZsPmpVgy0CYk=; + b=NW/A8Imu32MXoBi5FLrQ0FsK66RTWMQo1bFRtgQplVEQQIAXyf1XhCaAZyTkTplc0iEx + ovyGZHvLbmGL6w3I3pxkCFz1BPJCqoZtvQITir/WvfzyadYOK1cz+vuBUQSCmfkacvS/ + w37h1jLAjsvWXkl0GY7pxB9HJMXdeLnhhuWxtNU8m8rKZ7t3LSByMeQi5/3OTkNojDEe + 70cKeZXCPQ/UIDJAF4cpSVXia5FwoJISjXvQIrvqkYhFelzq3OHMcC482PdpqNB475h3 + yHHJ83HFOLRulUQdOG5ZVTB9qRg0zxRx/oedeXwzturFke68noRRa4f4izQ8sCwsWOCI Dw== +Received: from usindmail01.hds.com (usindmail03 [207.126.252.22]) + by usindpps04.hds.com (8.14.5/8.14.5) with ESMTP id r7UMlHIc025543; + Fri, 30 Aug 2013 18:47:17 -0400 +Received: from hds.com (usindnetf5d-vlan47float.corp.hds.com [10.74.73.11]) + by usindmail01.hds.com (8.14.1/8.14.1) with ESMTP id r7UMlGiC058545; + Fri, 30 Aug 2013 18:47:17 -0400 (EDT) +Subject: [PATCH v2 2/2] elevator: acquire q->sysfs_lock in elevator_change() +To: linux-kernel@vger.kernel.org +From: Tomoki Sekiyama +Cc: axboe@kernel.dk, tj@kernel.org, seiji.aguchi@hds.com, + vgoyal@redhat.com, majianpeng@gmail.com +Date: Fri, 30 Aug 2013 18:47:16 -0400 +Message-ID: <20130830224716.21812.99333.stgit@hds.com> +In-Reply-To: <20130830224707.21812.63516.stgit@hds.com> +References: <20130830224707.21812.63516.stgit@hds.com> +User-Agent: StGit/0.16 +MIME-Version: 1.0 +Content-Type: text/plain; charset="utf-8" +Content-Transfer-Encoding: 7bit +X-Proofpoint-SPF-Result: pass +X-Proofpoint-SPF-Record: v=spf1 mx ip4:207.126.244.0/26 ip4:207.126.252.0/25 include:mktomail.com + include:cloud.hds.com ~all +X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:5.10.8794,1.0.431,0.0.0000 + definitions=2013-08-30_09:2013-08-30,2013-08-30,1970-01-01 signatures=0 +X-Proofpoint-Spam-Details: rule=notspam policy=outbound_policy score=0 spamscore=0 suspectscore=1 + phishscore=0 adultscore=0 bulkscore=0 classifier=spam adjust=0 reason=mlx + scancount=1 engine=7.0.1-1305240000 definitions=main-1308300162 +Sender: linux-kernel-owner@vger.kernel.org +Precedence: bulk +List-ID: +X-Mailing-List: linux-kernel@vger.kernel.org + +Add locking of q->sysfs_lock into elevator_change() (an exported function) +to ensure it is held to protect q->elevator from elevator_init(), even if +elevator_change() is called from non-sysfs paths. +sysfs path (elv_iosched_store) uses __elevator_change(), non-locking +version, as the lock is already taken by elv_iosched_store(). + +Signed-off-by: Tomoki Sekiyama +--- + block/elevator.c | 16 ++++++++++++++-- + 1 file changed, 14 insertions(+), 2 deletions(-) + +diff --git a/block/elevator.c b/block/elevator.c +index 02d4390..6d765f7 100644 +--- a/block/elevator.c ++++ b/block/elevator.c +@@ -965,7 +965,7 @@ fail_init: + /* + * Switch this queue to the given IO scheduler. + */ +-int elevator_change(struct request_queue *q, const char *name) ++static int __elevator_change(struct request_queue *q, const char *name) + { + char elevator_name[ELV_NAME_MAX]; + struct elevator_type *e; +@@ -987,6 +987,18 @@ int elevator_change(struct request_queue *q, const char *name) + + return elevator_switch(q, e); + } ++ ++int elevator_change(struct request_queue *q, const char *name) ++{ ++ int ret; ++ ++ /* Protect q->elevator from elevator_init() */ ++ mutex_lock(&q->sysfs_lock); ++ ret = __elevator_change(q, name); ++ mutex_unlock(&q->sysfs_lock); ++ ++ return ret; ++} + EXPORT_SYMBOL(elevator_change); + + ssize_t elv_iosched_store(struct request_queue *q, const char *name, +@@ -997,7 +1009,7 @@ ssize_t elv_iosched_store(struct request_queue *q, const char *name, + if (!q->elevator) + return count; + +- ret = elevator_change(q, name); ++ ret = __elevator_change(q, name); + if (!ret) + return count; + + +-- +To unsubscribe from this list: send the line "unsubscribe linux-kernel" in +the body of a message to majordomo@vger.kernel.org +More majordomo info at http://vger.kernel.org/majordomo-info.html +Please read the FAQ at http://www.tux.org/lkml/ diff --git a/kernel.spec b/kernel.spec index ccca48402..7b2777393 100644 --- a/kernel.spec +++ b/kernel.spec @@ -743,6 +743,10 @@ Patch25108: Revert-rt2x00pci-Use-PCI-MSIs-whenever-possible.patch #rhbz 1008323 Patch25109: skge-fix-invalid-value-passed-to-pci_unmap_sigle.patch +#rhbz 902012 +Patch25114: elevator-Fix-a-race-in-elevator-switching-and-md.patch +Patch25115: elevator-acquire-q-sysfs_lock-in-elevator_change.patch + # END OF PATCH DEFINITIONS %endif @@ -1447,6 +1451,10 @@ ApplyPatch Revert-rt2x00pci-Use-PCI-MSIs-whenever-possible.patch #rhbz 1008323 ApplyPatch skge-fix-invalid-value-passed-to-pci_unmap_sigle.patch +#rhbz 902012 +ApplyPatch elevator-Fix-a-race-in-elevator-switching-and-md.patch +ApplyPatch elevator-acquire-q-sysfs_lock-in-elevator_change.patch + # END OF PATCH APPLICATIONS %endif @@ -2251,6 +2259,9 @@ fi # ||----w | # || || %changelog +* Fri Sep 27 2013 Josh Boyer +- Add patches to fix soft lockup from elevator changes (rhbz 902012) + * Thu Sep 26 2013 Josh Boyer - 3.12.0-0.rc2.git2.1 - Linux v3.12-rc2-83-g4b97280