lkml.org 
[lkml]   [2022]   [Aug]   [23]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.10 035/158] SUNRPC: Reinitialise the backchannel request buffers before reuse
    Date
    From: Trond Myklebust <trond.myklebust@hammerspace.com>

    commit 6622e3a73112fc336c1c2c582428fb5ef18e456a upstream.

    When we're reusing the backchannel requests instead of freeing them,
    then we should reinitialise any values of the send/receive xdr_bufs so
    that they reflect the available space.

    Fixes: 0d2a970d0ae5 ("SUNRPC: Fix a backchannel race")
    Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    net/sunrpc/backchannel_rqst.c | 14 ++++++++++++++
    1 file changed, 14 insertions(+)

    --- a/net/sunrpc/backchannel_rqst.c
    +++ b/net/sunrpc/backchannel_rqst.c
    @@ -64,6 +64,17 @@ static void xprt_free_allocation(struct
    kfree(req);
    }

    +static void xprt_bc_reinit_xdr_buf(struct xdr_buf *buf)
    +{
    + buf->head[0].iov_len = PAGE_SIZE;
    + buf->tail[0].iov_len = 0;
    + buf->pages = NULL;
    + buf->page_len = 0;
    + buf->flags = 0;
    + buf->len = 0;
    + buf->buflen = PAGE_SIZE;
    +}
    +
    static int xprt_alloc_xdr_buf(struct xdr_buf *buf, gfp_t gfp_flags)
    {
    struct page *page;
    @@ -292,6 +303,9 @@ void xprt_free_bc_rqst(struct rpc_rqst *
    */
    spin_lock_bh(&xprt->bc_pa_lock);
    if (xprt_need_to_requeue(xprt)) {
    + xprt_bc_reinit_xdr_buf(&req->rq_snd_buf);
    + xprt_bc_reinit_xdr_buf(&req->rq_rcv_buf);
    + req->rq_rcv_buf.len = PAGE_SIZE;
    list_add_tail(&req->rq_bc_pa_list, &xprt->bc_pa_list);
    xprt->bc_alloc_count++;
    atomic_inc(&xprt->bc_slot_count);

    \
     
     \ /
      Last update: 2022-08-23 14:14    [W:2.154 / U:0.688 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site