]> git.ipfire.org Git - people/ms/linux.git/blobdiff - fs/afs/rxrpc.c
Merge branch 'for-6.0/dax' into libnvdimm-fixes
[people/ms/linux.git] / fs / afs / rxrpc.c
index a5434f3e57c689a792b23aa62386bc2e0372b8e4..eccc3cd0cb70047508fa88ea3d723b2e2f1f7f85 100644 (file)
@@ -145,14 +145,14 @@ static struct afs_call *afs_alloc_call(struct afs_net *net,
        call->type = type;
        call->net = net;
        call->debug_id = atomic_inc_return(&rxrpc_debug_id);
-       atomic_set(&call->usage, 1);
+       refcount_set(&call->ref, 1);
        INIT_WORK(&call->async_work, afs_process_async_call);
        init_waitqueue_head(&call->waitq);
        spin_lock_init(&call->state_lock);
        call->iter = &call->def_iter;
 
        o = atomic_inc_return(&net->nr_outstanding_calls);
-       trace_afs_call(call, afs_call_trace_alloc, 1, o,
+       trace_afs_call(call->debug_id, afs_call_trace_alloc, 1, o,
                       __builtin_return_address(0));
        return call;
 }
@@ -163,14 +163,16 @@ static struct afs_call *afs_alloc_call(struct afs_net *net,
 void afs_put_call(struct afs_call *call)
 {
        struct afs_net *net = call->net;
-       int n = atomic_dec_return(&call->usage);
-       int o = atomic_read(&net->nr_outstanding_calls);
+       unsigned int debug_id = call->debug_id;
+       bool zero;
+       int r, o;
 
-       trace_afs_call(call, afs_call_trace_put, n, o,
+       zero = __refcount_dec_and_test(&call->ref, &r);
+       o = atomic_read(&net->nr_outstanding_calls);
+       trace_afs_call(debug_id, afs_call_trace_put, r - 1, o,
                       __builtin_return_address(0));
 
-       ASSERTCMP(n, >=, 0);
-       if (n == 0) {
+       if (zero) {
                ASSERT(!work_pending(&call->async_work));
                ASSERT(call->type->name != NULL);
 
@@ -185,7 +187,7 @@ void afs_put_call(struct afs_call *call)
                afs_put_addrlist(call->alist);
                kfree(call->request);
 
-               trace_afs_call(call, afs_call_trace_free, 0, o,
+               trace_afs_call(call->debug_id, afs_call_trace_free, 0, o,
                               __builtin_return_address(0));
                kfree(call);
 
@@ -198,9 +200,11 @@ void afs_put_call(struct afs_call *call)
 static struct afs_call *afs_get_call(struct afs_call *call,
                                     enum afs_call_trace why)
 {
-       int u = atomic_inc_return(&call->usage);
+       int r;
 
-       trace_afs_call(call, why, u,
+       __refcount_inc(&call->ref, &r);
+
+       trace_afs_call(call->debug_id, why, r + 1,
                       atomic_read(&call->net->nr_outstanding_calls),
                       __builtin_return_address(0));
        return call;
@@ -347,6 +351,7 @@ void afs_make_call(struct afs_addr_cursor *ac, struct afs_call *call, gfp_t gfp)
        if (call->max_lifespan)
                rxrpc_kernel_set_max_life(call->net->socket, rxcall,
                                          call->max_lifespan);
+       call->issue_time = ktime_get_real();
 
        /* send the request */
        iov[0].iov_base = call->request;
@@ -497,12 +502,6 @@ static void afs_deliver_to_call(struct afs_call *call)
                        return;
                }
 
-               if (!call->have_reply_time &&
-                   rxrpc_kernel_get_reply_time(call->net->socket,
-                                               call->rxcall,
-                                               &call->reply_time))
-                       call->have_reply_time = true;
-
                ret = call->type->deliver(call);
                state = READ_ONCE(call->state);
                if (ret == 0 && call->unmarshalling_error)
@@ -668,14 +667,13 @@ static void afs_wake_up_async_call(struct sock *sk, struct rxrpc_call *rxcall,
                                   unsigned long call_user_ID)
 {
        struct afs_call *call = (struct afs_call *)call_user_ID;
-       int u;
+       int r;
 
        trace_afs_notify_call(rxcall, call);
        call->need_attention = true;
 
-       u = atomic_fetch_add_unless(&call->usage, 1, 0);
-       if (u != 0) {
-               trace_afs_call(call, afs_call_trace_wake, u + 1,
+       if (__refcount_inc_not_zero(&call->ref, &r)) {
+               trace_afs_call(call->debug_id, afs_call_trace_wake, r + 1,
                               atomic_read(&call->net->nr_outstanding_calls),
                               __builtin_return_address(0));