From ccf8f201f84dd9579b81837f3dd8b949c9ddf3e0 Mon Sep 17 00:00:00 2001 From: Josh Boyer Date: Jul 02 2014 13:34:58 +0000 Subject: Linux v3.16-rc3-62-gd92a333a65a1 - Add patch to fix virt_blk oops (rhbz 1113805) --- diff --git a/kernel.spec b/kernel.spec index 8b719f4..b50a66a 100644 --- a/kernel.spec +++ b/kernel.spec @@ -69,7 +69,7 @@ Summary: The Linux kernel # The rc snapshot level %define rcrev 3 # The git snapshot level -%define gitrev 1 +%define gitrev 2 # Set rpm version accordingly %define rpmversion 3.%{upstream_sublevel}.0 %endif @@ -638,6 +638,9 @@ Patch25109: revert-input-wacom-testing-result-shows-get_report-is-unnecessary.pa #rhbz 1021036, submitted upstream Patch25110: 0001-ideapad-laptop-Change-Lenovo-Yoga-2-series-rfkill-ha.patch +#rhbz 1113805 +Patch25111: kernfs-kernfs_notify-must-be-usable-from-non-sleepable-contexts.patch + # git clone ssh://git.fedorahosted.org/git/kernel-arm64.git, git diff master...devel Patch30000: kernel-arm64.patch @@ -1362,6 +1365,9 @@ ApplyPatch revert-input-wacom-testing-result-shows-get_report-is-unnecessary.pat #rhbz 1021036, submitted upstream ApplyPatch 0001-ideapad-laptop-Change-Lenovo-Yoga-2-series-rfkill-ha.patch +#rhbz 1113805 +ApplyPatch kernfs-kernfs_notify-must-be-usable-from-non-sleepable-contexts.patch + %if 0%{?aarch64patches} ApplyPatch kernel-arm64.patch %ifnarch aarch64 # this is stupid, but i want to notice before secondary koji does. @@ -2241,6 +2247,10 @@ fi # ||----w | # || || %changelog +* Wed Jul 02 2014 Josh Boyer - 3.16.0-0.rc3.git2.1 +- Linux v3.16-rc3-62-gd92a333a65a1 +- Add patch to fix virt_blk oops (rhbz 1113805) + * Wed Jul 02 2014 Kyle McMartin - arm64: build-in ahci, ethernet, and rtc drivers. diff --git a/kernfs-kernfs_notify-must-be-usable-from-non-sleepable-contexts.patch b/kernfs-kernfs_notify-must-be-usable-from-non-sleepable-contexts.patch new file mode 100644 index 0000000..83bacc3 --- /dev/null +++ b/kernfs-kernfs_notify-must-be-usable-from-non-sleepable-contexts.patch @@ -0,0 +1,262 @@ +Bugzilla: 1113805 +Upstream-status: queued for 3.16 +Delivered-To: jwboyer@gmail.com +Received: by 10.76.6.212 with SMTP id d20csp61002oaa; + Tue, 1 Jul 2014 13:41:10 -0700 (PDT) +X-Received: by 10.70.36.203 with SMTP id s11mr216865pdj.30.1404247270266; + Tue, 01 Jul 2014 13:41:10 -0700 (PDT) +Return-Path: +Received: from bastion.fedoraproject.org (bastion02.fedoraproject.org. [209.132.181.3]) + by mx.google.com with ESMTP id kk10si24969097pbd.238.2014.07.01.13.41.09 + for ; + Tue, 01 Jul 2014 13:41:10 -0700 (PDT) +Received-SPF: softfail (google.com: domain of transitioning htejun@gmail.com does not designate 209.132.181.3 as permitted sender) client-ip=209.132.181.3; +Authentication-Results: mx.google.com; + spf=softfail (google.com: domain of transitioning htejun@gmail.com does not designate 209.132.181.3 as permitted sender) smtp.mail=htejun@gmail.com; + dkim=pass header.i=@gmail.com +Received: by bastion02.phx2.fedoraproject.org (Postfix) + id B10D940254; Tue, 1 Jul 2014 20:41:09 +0000 (UTC) +Delivered-To: jwboyer@fedoraproject.org +Received: from mx1.redhat.com (ext-mx11.extmail.prod.ext.phx2.redhat.com [10.5.110.16]) + by bastion02.phx2.fedoraproject.org (Postfix) with ESMTP id B85F34023B + for ; Tue, 1 Jul 2014 20:41:08 +0000 (UTC) +Received: from mail-qg0-f54.google.com (mail-qg0-f54.google.com [209.85.192.54]) + by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s61Kf6SO012731 + (version=TLSv1/SSLv3 cipher=RC4-SHA bits=128 verify=FAIL) + for ; Tue, 1 Jul 2014 16:41:07 -0400 +Received: by mail-qg0-f54.google.com with SMTP id q107so4001033qgd.13 + for ; Tue, 01 Jul 2014 13:41:06 -0700 (PDT) +DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; + d=gmail.com; s=20120113; + h=sender:date:from:to:cc:subject:message-id:references:mime-version + :content-type:content-disposition:in-reply-to:user-agent; + bh=6XKZNT2j9E5fPfYRAGlZGjGhRFI/mJ2H4GG/9wx0YJ8=; + b=y5rarhV+vMKAm+ta99eylQ+byg9AD0erza6YL9fdzP/Zn1StotASphxOFR5kgPTecY + QDAy7UTOje/NG0GtGLPU7r1rIT77mUNCSYhALFpG6yUHQmMlX5Lo+BuXQSOJBoIGefcv + mLwG3YwsHrmE8JEov4fJvU67VO2ZPq2GW1iTASOea3qn/f6595XqdIUHzpHjvmz/aX9R + nxAxkE+VGEZDm1Rp72rlwSSh2MJ5k3fbprLW8Ec41NyV2u5mehYHTgEf5DCu4JodmlHY + j94xfjqvm7HIqNtKGB3aTsNl2L7+dGDZ0dwbdo2/WRINOhGkPuNnJ5wqS9YaDDaQG4ND + HQ0w== +X-Received: by 10.140.22.134 with SMTP id 6mr70449172qgn.4.1404247266223; + Tue, 01 Jul 2014 13:41:06 -0700 (PDT) +Received: from htj.dyndns.org (207-38-225-25.c3-0.43d-ubr1.qens-43d.ny.cable.rcn.com. [207.38.225.25]) + by mx.google.com with ESMTPSA id q12sm39024393qad.40.2014.07.01.13.41.04 + for + (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); + Tue, 01 Jul 2014 13:41:05 -0700 (PDT) +Sender: Tejun Heo +Date: Tue, 1 Jul 2014 16:41:03 -0400 +From: Tejun Heo +To: Greg Kroah-Hartman +Cc: Jens Axboe , "Michael S. Tsirkin" , + Christoph Hellwig , Josh Boyer , + Rusty Russell , + virtualization@lists.linux-foundation.org, + "Linux-Kernel@Vger. Kernel. Org" , + Brian Lane , John McCutchan , + Robert Love , Eric Paris +Subject: [PATCH driver-core-linus] kernfs: kernfs_notify() must be useable + from non-sleepable contexts +Message-ID: <20140701204103.GA12459@htj.dyndns.org> +References: + <20140629082637.GA23942@redhat.com> + <20140629193222.GA7030@lst.de> + <20140629204710.GB11100@redhat.com> + <53B07D48.60003@kernel.dk> + <20140630201741.GA20853@htj.dyndns.org> +MIME-Version: 1.0 +Content-Type: text/plain; charset=us-ascii +Content-Disposition: inline +In-Reply-To: <20140630201741.GA20853@htj.dyndns.org> +User-Agent: Mutt/1.5.23 (2014-03-12) +X-RedHat-Spam-Score: -2.31 (BAYES_00,DCC_REPUT_00_12,DKIM_SIGNED,DKIM_VALID,FREEMAIL_FROM,RCVD_IN_DNSWL_NONE,SPF_PASS) +X-Scanned-By: MIMEDefang 2.68 on 10.5.110.16 + +d911d9874801 ("kernfs: make kernfs_notify() trigger inotify events +too") added fsnotify triggering to kernfs_notify() which requires a +sleepable context. There are already existing users of +kernfs_notify() which invoke it from an atomic context and in general +it's silly to require a sleepable context for triggering a +notification. + +The following is an invalid context bug triggerd by md invoking +sysfs_notify() from IO completion path. + + BUG: sleeping function called from invalid context at kernel/locking/mutex.c:586 + in_atomic(): 1, irqs_disabled(): 1, pid: 0, name: swapper/1 + 2 locks held by swapper/1/0: + #0: (&(&vblk->vq_lock)->rlock){-.-...}, at: [] virtblk_done+0x42/0xe0 [virtio_blk] + #1: (&(&bitmap->counts.lock)->rlock){-.....}, at: [] bitmap_endwrite+0x68/0x240 + irq event stamp: 33518 + hardirqs last enabled at (33515): [] default_idle+0x1f/0x230 + hardirqs last disabled at (33516): [] common_interrupt+0x6d/0x72 + softirqs last enabled at (33518): [] _local_bh_enable+0x22/0x50 + softirqs last disabled at (33517): [] irq_enter+0x60/0x80 + CPU: 1 PID: 0 Comm: swapper/1 Not tainted 3.16.0-0.rc2.git2.1.fc21.x86_64 #1 + Hardware name: Bochs Bochs, BIOS Bochs 01/01/2011 + 0000000000000000 f90db13964f4ee05 ffff88007d403b80 ffffffff81807b4c + 0000000000000000 ffff88007d403ba8 ffffffff810d4f14 0000000000000000 + 0000000000441800 ffff880078fa1780 ffff88007d403c38 ffffffff8180caf2 + Call Trace: + [] dump_stack+0x4d/0x66 + [] __might_sleep+0x184/0x240 + [] mutex_lock_nested+0x42/0x440 + [] kernfs_notify+0x90/0x150 + [] bitmap_endwrite+0xcc/0x240 + [] close_write+0x93/0xb0 [raid1] + [] r1_bio_write_done+0x29/0x50 [raid1] + [] raid1_end_write_request+0xe4/0x260 [raid1] + [] bio_endio+0x6b/0xa0 + [] blk_update_request+0x94/0x420 + [] blk_mq_end_io+0x1a/0x70 + [] virtblk_request_done+0x32/0x80 [virtio_blk] + [] __blk_mq_complete_request+0x88/0x120 + [] blk_mq_complete_request+0x2a/0x30 + [] virtblk_done+0x66/0xe0 [virtio_blk] + [] vring_interrupt+0x3a/0xa0 [virtio_ring] + [] handle_irq_event_percpu+0x77/0x340 + [] handle_irq_event+0x3d/0x60 + [] handle_edge_irq+0x66/0x130 + [] handle_irq+0x84/0x150 + [] do_IRQ+0x4d/0xe0 + [] common_interrupt+0x72/0x72 + [] ? native_safe_halt+0x6/0x10 + [] default_idle+0x24/0x230 + [] arch_cpu_idle+0xf/0x20 + [] cpu_startup_entry+0x37c/0x7b0 + [] start_secondary+0x25b/0x300 + +This patch fixes it by punting the notification delivery through a +work item. This ends up adding an extra pointer to kernfs_elem_attr +enlarging kernfs_node by a pointer, which is not ideal but not a very +big deal either. If this turns out to be an actual issue, we can move +kernfs_elem_attr->size to kernfs_node->iattr later. + +Signed-off-by: Tejun Heo +Reported-by: Josh Boyer +Cc: "Michael S. Tsirkin" +Cc: Jens Axboe +--- + fs/kernfs/file.c | 69 +++++++++++++++++++++++++++++++++++++++---------- + include/linux/kernfs.h | 1 + 2 files changed, 56 insertions(+), 14 deletions(-) + +--- a/fs/kernfs/file.c ++++ b/fs/kernfs/file.c +@@ -39,6 +39,19 @@ struct kernfs_open_node { + struct list_head files; /* goes through kernfs_open_file.list */ + }; + ++/* ++ * kernfs_notify() may be called from any context and bounces notifications ++ * through a work item. To minimize space overhead in kernfs_node, the ++ * pending queue is implemented as a singly linked list of kernfs_nodes. ++ * The list is terminated with the self pointer so that whether a ++ * kernfs_node is on the list or not can be determined by testing the next ++ * pointer for NULL. ++ */ ++#define KERNFS_NOTIFY_EOL ((void *)&kernfs_notify_list) ++ ++static DEFINE_SPINLOCK(kernfs_notify_lock); ++static struct kernfs_node *kernfs_notify_list = KERNFS_NOTIFY_EOL; ++ + static struct kernfs_open_file *kernfs_of(struct file *file) + { + return ((struct seq_file *)file->private_data)->private; +@@ -783,24 +796,25 @@ static unsigned int kernfs_fop_poll(stru + return DEFAULT_POLLMASK|POLLERR|POLLPRI; + } + +-/** +- * kernfs_notify - notify a kernfs file +- * @kn: file to notify +- * +- * Notify @kn such that poll(2) on @kn wakes up. +- */ +-void kernfs_notify(struct kernfs_node *kn) ++static void kernfs_notify_workfn(struct work_struct *work) + { +- struct kernfs_root *root = kernfs_root(kn); ++ struct kernfs_node *kn; + struct kernfs_open_node *on; + struct kernfs_super_info *info; +- unsigned long flags; +- +- if (WARN_ON(kernfs_type(kn) != KERNFS_FILE)) ++repeat: ++ /* pop one off the notify_list */ ++ spin_lock_irq(&kernfs_notify_lock); ++ kn = kernfs_notify_list; ++ if (kn == KERNFS_NOTIFY_EOL) { ++ spin_unlock_irq(&kernfs_notify_lock); + return; ++ } ++ kernfs_notify_list = kn->attr.notify_next; ++ kn->attr.notify_next = NULL; ++ spin_unlock_irq(&kernfs_notify_lock); + + /* kick poll */ +- spin_lock_irqsave(&kernfs_open_node_lock, flags); ++ spin_lock_irq(&kernfs_open_node_lock); + + on = kn->attr.open; + if (on) { +@@ -808,12 +822,12 @@ void kernfs_notify(struct kernfs_node *k + wake_up_interruptible(&on->poll); + } + +- spin_unlock_irqrestore(&kernfs_open_node_lock, flags); ++ spin_unlock_irq(&kernfs_open_node_lock); + + /* kick fsnotify */ + mutex_lock(&kernfs_mutex); + +- list_for_each_entry(info, &root->supers, node) { ++ list_for_each_entry(info, &kernfs_root(kn)->supers, node) { + struct inode *inode; + struct dentry *dentry; + +@@ -833,6 +847,33 @@ void kernfs_notify(struct kernfs_node *k + } + + mutex_unlock(&kernfs_mutex); ++ kernfs_put(kn); ++ goto repeat; ++} ++ ++/** ++ * kernfs_notify - notify a kernfs file ++ * @kn: file to notify ++ * ++ * Notify @kn such that poll(2) on @kn wakes up. Maybe be called from any ++ * context. ++ */ ++void kernfs_notify(struct kernfs_node *kn) ++{ ++ static DECLARE_WORK(kernfs_notify_work, kernfs_notify_workfn); ++ unsigned long flags; ++ ++ if (WARN_ON(kernfs_type(kn) != KERNFS_FILE)) ++ return; ++ ++ spin_lock_irqsave(&kernfs_notify_lock, flags); ++ if (!kn->attr.notify_next) { ++ kernfs_get(kn); ++ kn->attr.notify_next = kernfs_notify_list; ++ kernfs_notify_list = kn; ++ schedule_work(&kernfs_notify_work); ++ } ++ spin_unlock_irqrestore(&kernfs_notify_lock, flags); + } + EXPORT_SYMBOL_GPL(kernfs_notify); + +--- a/include/linux/kernfs.h ++++ b/include/linux/kernfs.h +@@ -91,6 +91,7 @@ struct kernfs_elem_attr { + const struct kernfs_ops *ops; + struct kernfs_open_node *open; + loff_t size; ++ struct kernfs_node *notify_next; /* for kernfs_notify() */ + }; + + /* diff --git a/sources b/sources index 1626cd3..cb503f3 100644 --- a/sources +++ b/sources @@ -1,4 +1,4 @@ 97ca1625bb40368dc41b9a7971549071 linux-3.15.tar.xz ef8f4db937f521a7e323ec589536ba25 perf-man-3.15.tar.gz 423d8cf28277a385276146c990d029e8 patch-3.16-rc3.xz -7427a491180a3a85883652ebd6500fc5 patch-3.16-rc3-git1.xz +436a44358b6011f5a85a1c8391603bde patch-3.16-rc3-git2.xz