9p: Embed wait_queue_head into p9_req_t
authorMatthew Wilcox <willy@infradead.org>
Wed, 11 Jul 2018 21:02:23 +0000 (14:02 -0700)
committerDominique Martinet <dominique.martinet@cea.fr>
Mon, 13 Aug 2018 00:21:44 +0000 (09:21 +0900)
On a 64-bit system, the wait_queue_head_t is 24 bytes while the pointer
to it is 8 bytes.  Growing the p9_req_t by 16 bytes is better than
performing a 24-byte memory allocation.

Link: http://lkml.kernel.org/r/20180711210225.19730-5-willy@infradead.org
Signed-off-by: Matthew Wilcox <willy@infradead.org>
Reviewed-by: Greg Kurz <groug@kaod.org>
Cc: Eric Van Hensbergen <ericvh@gmail.com>
Cc: Ron Minnich <rminnich@sandia.gov>
Cc: Latchesar Ionkov <lucho@ionkov.net>
Signed-off-by: Dominique Martinet <dominique.martinet@cea.fr>
include/net/9p/client.h
net/9p/client.c
net/9p/trans_virtio.c

index e405729..0fa0fba 100644 (file)
@@ -113,7 +113,7 @@ enum p9_req_status_t {
 struct p9_req_t {
        int status;
        int t_err;
-       wait_queue_head_t *wq;
+       wait_queue_head_t wq;
        struct p9_fcall *tc;
        struct p9_fcall *rc;
        void *aux;
index cd33cf6..33717b1 100644 (file)
@@ -283,8 +283,9 @@ p9_tag_alloc(struct p9_client *c, u16 tag, unsigned int max_size)
                                return ERR_PTR(-ENOMEM);
                        }
                        for (col = 0; col < P9_ROW_MAXTAG; col++) {
-                               c->reqs[row][col].status = REQ_STATUS_IDLE;
-                               c->reqs[row][col].tc = NULL;
+                               req = &c->reqs[row][col];
+                               req->status = REQ_STATUS_IDLE;
+                               init_waitqueue_head(&req->wq);
                        }
                        c->max_tag += P9_ROW_MAXTAG;
                }
@@ -294,13 +295,6 @@ p9_tag_alloc(struct p9_client *c, u16 tag, unsigned int max_size)
        col = tag % P9_ROW_MAXTAG;
 
        req = &c->reqs[row][col];
-       if (!req->wq) {
-               req->wq = kmalloc(sizeof(wait_queue_head_t), GFP_NOFS);
-               if (!req->wq)
-                       goto grow_failed;
-               init_waitqueue_head(req->wq);
-       }
-
        if (!req->tc)
                req->tc = p9_fcall_alloc(alloc_msize);
        if (!req->rc)
@@ -320,9 +314,7 @@ grow_failed:
        pr_err("Couldn't grow tag array\n");
        kfree(req->tc);
        kfree(req->rc);
-       kfree(req->wq);
        req->tc = req->rc = NULL;
-       req->wq = NULL;
        return ERR_PTR(-ENOMEM);
 }
 
@@ -410,7 +402,6 @@ static void p9_tag_cleanup(struct p9_client *c)
        /* free requests associated with tags */
        for (row = 0; row < (c->max_tag/P9_ROW_MAXTAG); row++) {
                for (col = 0; col < P9_ROW_MAXTAG; col++) {
-                       kfree(c->reqs[row][col].wq);
                        kfree(c->reqs[row][col].tc);
                        kfree(c->reqs[row][col].rc);
                }
@@ -453,7 +444,7 @@ void p9_client_cb(struct p9_client *c, struct p9_req_t *req, int status)
        smp_wmb();
        req->status = status;
 
-       wake_up(req->wq);
+       wake_up(&req->wq);
        p9_debug(P9_DEBUG_MUX, "wakeup: %d\n", req->tc->tag);
 }
 EXPORT_SYMBOL(p9_client_cb);
@@ -774,7 +765,7 @@ p9_client_rpc(struct p9_client *c, int8_t type, const char *fmt, ...)
        }
 again:
        /* Wait for the response */
-       err = wait_event_killable(*req->wq, req->status >= REQ_STATUS_RCVD);
+       err = wait_event_killable(req->wq, req->status >= REQ_STATUS_RCVD);
 
        /*
         * Make sure our req is coherent with regard to updates in other
index eaacce0..3f69c42 100644 (file)
@@ -490,7 +490,7 @@ req_retry_pinned:
        virtqueue_kick(chan->vq);
        spin_unlock_irqrestore(&chan->lock, flags);
        p9_debug(P9_DEBUG_TRANS, "virtio request kicked\n");
-       err = wait_event_killable(*req->wq, req->status >= REQ_STATUS_RCVD);
+       err = wait_event_killable(req->wq, req->status >= REQ_STATUS_RCVD);
        /*
         * Non kernel buffers are pinned, unpin them
         */