* [PATCH] FMC: fix locking in sample chardev driver
@ 2013-07-16 10:58 Alessandro Rubini
0 siblings, 0 replies; only message in thread
From: Alessandro Rubini @ 2013-07-16 10:58 UTC (permalink / raw)
To: linux-kernel; +Cc: gregkh, Sasha Levin, Fengguang Wu
The fmc-chardev module was over-locking, by calling misc
register/unregister while holding its spinlock. This reported a
"scheduling while atomic" error.
Since the misc driver already serializes operations internally, this
commit downgrades the fmc-chardev lock to just cover its own list.
Reported-by: Sasha Levin <sasha.levin@oracle.com>
Reported-by: Fengguang Wu <fengguang.wu@intel.com>
Signed-off-by: Alessandro Rubini <rubini@gnudd.com>
---
drivers/fmc/fmc-chardev.c | 9 ++++-----
1 files changed, 4 insertions(+), 5 deletions(-)
diff --git a/drivers/fmc/fmc-chardev.c b/drivers/fmc/fmc-chardev.c
index cc031db..ace6ef2 100644
--- a/drivers/fmc/fmc-chardev.c
+++ b/drivers/fmc/fmc-chardev.c
@@ -143,18 +143,17 @@ static int fc_probe(struct fmc_device *fmc)
fc->misc.fops = &fc_fops;
fc->misc.name = kstrdup(dev_name(&fmc->dev), GFP_KERNEL);
- spin_lock(&fc_lock);
ret = misc_register(&fc->misc);
if (ret < 0)
- goto err_unlock;
+ goto out;
+ spin_lock(&fc_lock);
list_add(&fc->list, &fc_devices);
spin_unlock(&fc_lock);
dev_info(&fc->fmc->dev, "Created misc device \"%s\"\n",
fc->misc.name);
return 0;
-err_unlock:
- spin_unlock(&fc_lock);
+out:
kfree(fc->misc.name);
kfree(fc);
return ret;
@@ -174,10 +173,10 @@ static int fc_remove(struct fmc_device *fmc)
spin_lock(&fc_lock);
list_del(&fc->list);
+ spin_unlock(&fc_lock);
misc_deregister(&fc->misc);
kfree(fc->misc.name);
kfree(fc);
- spin_unlock(&fc_lock);
return 0;
}
--
1.7.7.2
^ permalink raw reply related [flat|nested] only message in thread
only message in thread, other threads:[~2013-07-16 10:58 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-07-16 10:58 [PATCH] FMC: fix locking in sample chardev driver Alessandro Rubini
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.