gtfs: Don't use a kernel message for destruction
authorBarret Rhoden <brho@cs.berkeley.edu>
Fri, 27 Jul 2018 18:44:23 +0000 (14:44 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Mon, 30 Jul 2018 20:05:46 +0000 (16:05 -0400)
The decref only happens from the devtab->close() which is never called from
an RCU callback.  It used to be, until commit 99932a6cf527 ("Don't
chan_release() from an RCU callback").

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/drivers/dev/gtfs.c

index bd375a0..d2d25b1 100644 (file)
@@ -190,9 +190,9 @@ static void purge_cb(struct tree_file *tf)
        poperror();
 }
 
-static void __gtfs_destroy(uint32_t srcid, long a0, long a1, long a2)
+static void gtfs_release(struct kref *kref)
 {
-       struct gtfs *gtfs = (struct gtfs*)a0;
+       struct gtfs *gtfs = container_of(kref, struct gtfs, users);
 
        tfs_frontend_purge(&gtfs->tfs, purge_cb);
        /* this is the ref from attach */
@@ -204,18 +204,6 @@ static void __gtfs_destroy(uint32_t srcid, long a0, long a1, long a2)
        kfree(gtfs);
 }
 
-static void gtfs_release(struct kref *kref)
-{
-       struct gtfs *gtfs = container_of(kref, struct gtfs, users);
-
-       /* We can't use RCU within an RCU callback, and release methods are often
-        * called from within callbacks.  We can use a kernel message, which can
-        * block and do whatever else it wants.  In essence, we break the connection
-        * to our current context (the rcu_mgmt_ktask) by using a kmsg. */
-       send_kernel_message(core_id(), __gtfs_destroy, (long)gtfs, 0, 0,
-                           KMSG_ROUTINE);
-}
-
 static struct gtfs *chan_to_gtfs(struct chan *c)
 {
        struct tree_file *tf = chan_to_tree_file(c);