Commit 2557d0c5 authored by Matthew Wilcox's avatar Matthew Wilcox Committed by Dominique Martinet

9p: Embed wait_queue_head into p9_req_t

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.orgSigned-off-by: default avatarMatthew Wilcox <willy@infradead.org>
Reviewed-by: default avatarGreg 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: default avatarDominique Martinet <dominique.martinet@cea.fr>
parent f28cdf04
...@@ -113,7 +113,7 @@ enum p9_req_status_t { ...@@ -113,7 +113,7 @@ enum p9_req_status_t {
struct p9_req_t { struct p9_req_t {
int status; int status;
int t_err; int t_err;
wait_queue_head_t *wq; wait_queue_head_t wq;
struct p9_fcall *tc; struct p9_fcall *tc;
struct p9_fcall *rc; struct p9_fcall *rc;
void *aux; void *aux;
......
...@@ -283,8 +283,9 @@ p9_tag_alloc(struct p9_client *c, u16 tag, unsigned int max_size) ...@@ -283,8 +283,9 @@ p9_tag_alloc(struct p9_client *c, u16 tag, unsigned int max_size)
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
} }
for (col = 0; col < P9_ROW_MAXTAG; col++) { for (col = 0; col < P9_ROW_MAXTAG; col++) {
c->reqs[row][col].status = REQ_STATUS_IDLE; req = &c->reqs[row][col];
c->reqs[row][col].tc = NULL; req->status = REQ_STATUS_IDLE;
init_waitqueue_head(&req->wq);
} }
c->max_tag += P9_ROW_MAXTAG; c->max_tag += P9_ROW_MAXTAG;
} }
...@@ -294,13 +295,6 @@ p9_tag_alloc(struct p9_client *c, u16 tag, unsigned int max_size) ...@@ -294,13 +295,6 @@ p9_tag_alloc(struct p9_client *c, u16 tag, unsigned int max_size)
col = tag % P9_ROW_MAXTAG; col = tag % P9_ROW_MAXTAG;
req = &c->reqs[row][col]; 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) if (!req->tc)
req->tc = p9_fcall_alloc(alloc_msize); req->tc = p9_fcall_alloc(alloc_msize);
if (!req->rc) if (!req->rc)
...@@ -320,9 +314,7 @@ p9_tag_alloc(struct p9_client *c, u16 tag, unsigned int max_size) ...@@ -320,9 +314,7 @@ p9_tag_alloc(struct p9_client *c, u16 tag, unsigned int max_size)
pr_err("Couldn't grow tag array\n"); pr_err("Couldn't grow tag array\n");
kfree(req->tc); kfree(req->tc);
kfree(req->rc); kfree(req->rc);
kfree(req->wq);
req->tc = req->rc = NULL; req->tc = req->rc = NULL;
req->wq = NULL;
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
} }
...@@ -410,7 +402,6 @@ static void p9_tag_cleanup(struct p9_client *c) ...@@ -410,7 +402,6 @@ static void p9_tag_cleanup(struct p9_client *c)
/* free requests associated with tags */ /* free requests associated with tags */
for (row = 0; row < (c->max_tag/P9_ROW_MAXTAG); row++) { for (row = 0; row < (c->max_tag/P9_ROW_MAXTAG); row++) {
for (col = 0; col < P9_ROW_MAXTAG; col++) { 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].tc);
kfree(c->reqs[row][col].rc); 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) ...@@ -453,7 +444,7 @@ void p9_client_cb(struct p9_client *c, struct p9_req_t *req, int status)
smp_wmb(); smp_wmb();
req->status = status; req->status = status;
wake_up(req->wq); wake_up(&req->wq);
p9_debug(P9_DEBUG_MUX, "wakeup: %d\n", req->tc->tag); p9_debug(P9_DEBUG_MUX, "wakeup: %d\n", req->tc->tag);
} }
EXPORT_SYMBOL(p9_client_cb); EXPORT_SYMBOL(p9_client_cb);
...@@ -774,7 +765,7 @@ p9_client_rpc(struct p9_client *c, int8_t type, const char *fmt, ...) ...@@ -774,7 +765,7 @@ p9_client_rpc(struct p9_client *c, int8_t type, const char *fmt, ...)
} }
again: again:
/* Wait for the response */ /* 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 * Make sure our req is coherent with regard to updates in other
......
...@@ -490,7 +490,7 @@ p9_virtio_zc_request(struct p9_client *client, struct p9_req_t *req, ...@@ -490,7 +490,7 @@ p9_virtio_zc_request(struct p9_client *client, struct p9_req_t *req,
virtqueue_kick(chan->vq); virtqueue_kick(chan->vq);
spin_unlock_irqrestore(&chan->lock, flags); spin_unlock_irqrestore(&chan->lock, flags);
p9_debug(P9_DEBUG_TRANS, "virtio request kicked\n"); 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 * Non kernel buffers are pinned, unpin them
*/ */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment