lkml.org 
[lkml]   [2022]   [Aug]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.19 0958/1157] 9p: Drop kref usage
    Date
    From: Kent Overstreet <kent.overstreet@gmail.com>

    [ Upstream commit 6cda12864cb0f99810a5809e11e3ee5b102c9a47 ]

    An upcoming patch is going to require passing the client through
    p9_req_put() -> p9_req_free(), but that's awkward with the kref
    indirection - so this patch switches to using refcount_t directly.

    Link: https://lkml.kernel.org/r/20220704014243.153050-1-kent.overstreet@gmail.com
    Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
    Cc: Eric Van Hensbergen <ericvh@gmail.com>
    Cc: Latchesar Ionkov <lucho@ionkov.net>
    Signed-off-by: Dominique Martinet <asmadeus@codewreck.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    include/net/9p/client.h | 6 +++---
    net/9p/client.c | 19 ++++++++-----------
    2 files changed, 11 insertions(+), 14 deletions(-)

    diff --git a/include/net/9p/client.h b/include/net/9p/client.h
    index ec1d1706f43c..c038c2d73dae 100644
    --- a/include/net/9p/client.h
    +++ b/include/net/9p/client.h
    @@ -76,7 +76,7 @@ enum p9_req_status_t {
    struct p9_req_t {
    int status;
    int t_err;
    - struct kref refcount;
    + refcount_t refcount;
    wait_queue_head_t wq;
    struct p9_fcall tc;
    struct p9_fcall rc;
    @@ -227,12 +227,12 @@ struct p9_req_t *p9_tag_lookup(struct p9_client *c, u16 tag);

    static inline void p9_req_get(struct p9_req_t *r)
    {
    - kref_get(&r->refcount);
    + refcount_inc(&r->refcount);
    }

    static inline int p9_req_try_get(struct p9_req_t *r)
    {
    - return kref_get_unless_zero(&r->refcount);
    + return refcount_inc_not_zero(&r->refcount);
    }

    int p9_req_put(struct p9_req_t *r);
    diff --git a/net/9p/client.c b/net/9p/client.c
    index 8bba0d9cf975..0ee48e8b7220 100644
    --- a/net/9p/client.c
    +++ b/net/9p/client.c
    @@ -305,7 +305,7 @@ p9_tag_alloc(struct p9_client *c, int8_t type, unsigned int max_size)
    * callback), so p9_client_cb eats the second ref there
    * as the pointer is duplicated directly by virtqueue_add_sgs()
    */
    - refcount_set(&req->refcount.refcount, 2);
    + refcount_set(&req->refcount, 2);

    return req;

    @@ -370,18 +370,15 @@ static int p9_tag_remove(struct p9_client *c, struct p9_req_t *r)
    return p9_req_put(r);
    }

    -static void p9_req_free(struct kref *ref)
    -{
    - struct p9_req_t *r = container_of(ref, struct p9_req_t, refcount);
    -
    - p9_fcall_fini(&r->tc);
    - p9_fcall_fini(&r->rc);
    - kmem_cache_free(p9_req_cache, r);
    -}
    -
    int p9_req_put(struct p9_req_t *r)
    {
    - return kref_put(&r->refcount, p9_req_free);
    + if (refcount_dec_and_test(&r->refcount)) {
    + p9_fcall_fini(&r->tc);
    + p9_fcall_fini(&r->rc);
    + kmem_cache_free(p9_req_cache, r);
    + return 1;
    + }
    + return 0;
    }
    EXPORT_SYMBOL(p9_req_put);

    --
    2.35.1


    \
     
     \ /
      Last update: 2022-08-16 02:49    [W:4.115 / U:0.072 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site