Thread (9 messages) 9 messages, 5 authors, 2010-09-02

Re: vhost_dev_cleanup() crash: BUG: unable to handle kernel NULL pointer dereference

From: Eric Dumazet <hidden>
Date: 2010-08-31 12:14:31
Also in: lkml
Subsystem: the rest, virtio host (vhost) · Maintainers: Linus Torvalds, "Michael S. Tsirkin", Jason Wang

Le mardi 31 août 2010 à 13:14 +0200, Ingo Molnar a écrit :
* Eric Dumazet [off-list ref] wrote:
quoted
Seems to be commit c23f3445e68e1
(vhost: replace vhost_workqueue with per-vhost kthread)

following patch should cure it ?

Thanks

[PATCH] vhost: stop worker only if created

Its illegal to call kthread_stop(NULL)

Reported-by: Ingo Molnar <redacted>
Signed-off-by: Eric Dumazet <redacted>
---
diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c
index e05557d..0a00121 100644
--- a/drivers/vhost/vhost.c
+++ b/drivers/vhost/vhost.c
@@ -323,7 +323,8 @@ void vhost_dev_cleanup(struct vhost_dev *dev)
 	dev->mm = NULL;
 
 	WARN_ON(!list_empty(&dev->work_list));
-	kthread_stop(dev->worker);
+	if (dev->worker)
+		kthread_stop(dev->worker);
Btw., i think this check should be pushed into kthread_stop() instead - 
just like kfree(NULL) is possible as well - it simplifies cleanup 
sequences.
Sure !

Just in case, I resubmit the patch, clearing dev->worker, because I am
not sure if vhost_dev_cleanup() can be run several times on same struct
vhost_dev. Patch is needed even if you add this check in kthread_stop()

[PATCH v2] vhost: stop worker only if created

Its currently illegal to call kthread_stop(NULL)

Reported-by: Ingo Molnar <redacted>
Signed-off-by: Eric Dumazet <redacted>
---
 drivers/vhost/vhost.c |    5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c
index e05557d..4b99117 100644
--- a/drivers/vhost/vhost.c
+++ b/drivers/vhost/vhost.c
@@ -323,7 +323,10 @@ void vhost_dev_cleanup(struct vhost_dev *dev)
 	dev->mm = NULL;
 
 	WARN_ON(!list_empty(&dev->work_list));
-	kthread_stop(dev->worker);
+	if (dev->worker) {
+		kthread_stop(dev->worker);
+		dev->worker = NULL;
+	}
 }
 
 static int log_access_ok(void __user *log_base, u64 addr, unsigned long sz)
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help