From mboxrd@z Thu Jan 1 00:00:00 1970 From: James Bottomley Subject: Re: parisc 4.13-git, BUG: sleeping function called from invalid context at mm/slab.h:416 Date: Sun, 30 Jul 2017 11:37:18 -0700 Message-ID: <1501439838.3670.5.camel@HansenPartnership.com> References: <1501428648.3670.1.camel@HansenPartnership.com> <15C99B92-DFB7-4B86-A280-2D491A5907CB@bell.net> Mime-Version: 1.0 Content-Type: text/plain; charset="UTF-8" Cc: linux-parisc@vger.kernel.org To: John David Anglin , Meelis Roos Return-path: In-Reply-To: <15C99B92-DFB7-4B86-A280-2D491A5907CB@bell.net> List-ID: List-Id: linux-parisc.vger.kernel.org On Sun, 2017-07-30 at 14:21 -0400, John David Anglin wrote: > On 2017-07-30, at 2:12 PM, Meelis Roos wrote: > > > > > > > > > How about this?  There's no need to take the write lock when > > > creating > > > links anyway. > > > > No effect. > > Is the backtrace still the same? There's another write lock over a symlink in pdcs_register_pathentries() does moving it up as well finally make this go away (cumulative patch below).  If that doesn't work, enabling DEBUG_PREEMPT might show which lock is the problem. James --- diff --git a/drivers/parisc/pdc_stable.c b/drivers/parisc/pdc_stable.c index 7147aa53e9a2..3e0c90420a1b 100644 --- a/drivers/parisc/pdc_stable.c +++ b/drivers/parisc/pdc_stable.c @@ -331,13 +331,13 @@ pdcspath_hwpath_write(struct pdcspath_entry *entry, const char *buf, size_t coun /* Now, dive in. Write back to the hardware */ pdcspath_store(entry); + write_unlock(&entry->rw_lock); + /* Update the symlink to the real device */ sysfs_remove_link(&entry->kobj, "device"); ret = sysfs_create_link(&entry->kobj, &entry->dev->kobj, "device"); WARN_ON(ret); - write_unlock(&entry->rw_lock); - printk(KERN_INFO PDCS_PREFIX ": changed \"%s\" path to \"%s\"\n", entry->name, buf); @@ -998,6 +998,7 @@ pdcs_register_pathentries(void) /* kobject is now registered */ write_lock(&entry->rw_lock); entry->ready = 2; + write_unlock(&entry->rw_lock); /* Add a nice symlink to the real device */ if (entry->dev) { @@ -1005,7 +1006,6 @@ pdcs_register_pathentries(void) WARN_ON(err); } - write_unlock(&entry->rw_lock); kobject_uevent(&entry->kobj, KOBJ_ADD); }