]> git.ipfire.org Git - people/ms/linux.git/blobdiff - net/rxrpc/conn_object.c
rxrpc: Use refcount_t rather than atomic_t
[people/ms/linux.git] / net / rxrpc / conn_object.c
index b2159dbf5412c0d0df7251536efb4cdfb5d57ff8..03c7f22691510bfdb26236c07f5d5dc0a079f2e6 100644 (file)
@@ -104,7 +104,7 @@ struct rxrpc_connection *rxrpc_find_connection_rcu(struct rxrpc_local *local,
                        goto not_found;
                *_peer = peer;
                conn = rxrpc_find_service_conn_rcu(peer, skb);
-               if (!conn || atomic_read(&conn->usage) == 0)
+               if (!conn || refcount_read(&conn->ref) == 0)
                        goto not_found;
                _leave(" = %p", conn);
                return conn;
@@ -114,7 +114,7 @@ struct rxrpc_connection *rxrpc_find_connection_rcu(struct rxrpc_local *local,
                 */
                conn = idr_find(&rxrpc_client_conn_ids,
                                sp->hdr.cid >> RXRPC_CIDSHIFT);
-               if (!conn || atomic_read(&conn->usage) == 0) {
+               if (!conn || refcount_read(&conn->ref) == 0) {
                        _debug("no conn");
                        goto not_found;
                }
@@ -263,11 +263,12 @@ void rxrpc_kill_connection(struct rxrpc_connection *conn)
 bool rxrpc_queue_conn(struct rxrpc_connection *conn)
 {
        const void *here = __builtin_return_address(0);
-       int n = atomic_fetch_add_unless(&conn->usage, 1, 0);
-       if (n == 0)
+       int r;
+
+       if (!__refcount_inc_not_zero(&conn->ref, &r))
                return false;
        if (rxrpc_queue_work(&conn->processor))
-               trace_rxrpc_conn(conn->debug_id, rxrpc_conn_queued, n + 1, here);
+               trace_rxrpc_conn(conn->debug_id, rxrpc_conn_queued, r + 1, here);
        else
                rxrpc_put_connection(conn);
        return true;
@@ -280,7 +281,7 @@ void rxrpc_see_connection(struct rxrpc_connection *conn)
 {
        const void *here = __builtin_return_address(0);
        if (conn) {
-               int n = atomic_read(&conn->usage);
+               int n = refcount_read(&conn->ref);
 
                trace_rxrpc_conn(conn->debug_id, rxrpc_conn_seen, n, here);
        }
@@ -292,9 +293,10 @@ void rxrpc_see_connection(struct rxrpc_connection *conn)
 struct rxrpc_connection *rxrpc_get_connection(struct rxrpc_connection *conn)
 {
        const void *here = __builtin_return_address(0);
-       int n = atomic_inc_return(&conn->usage);
+       int r;
 
-       trace_rxrpc_conn(conn->debug_id, rxrpc_conn_got, n, here);
+       __refcount_inc(&conn->ref, &r);
+       trace_rxrpc_conn(conn->debug_id, rxrpc_conn_got, r, here);
        return conn;
 }
 
@@ -305,11 +307,11 @@ struct rxrpc_connection *
 rxrpc_get_connection_maybe(struct rxrpc_connection *conn)
 {
        const void *here = __builtin_return_address(0);
+       int r;
 
        if (conn) {
-               int n = atomic_fetch_add_unless(&conn->usage, 1, 0);
-               if (n > 0)
-                       trace_rxrpc_conn(conn->debug_id, rxrpc_conn_got, n + 1, here);
+               if (__refcount_inc_not_zero(&conn->ref, &r))
+                       trace_rxrpc_conn(conn->debug_id, rxrpc_conn_got, r + 1, here);
                else
                        conn = NULL;
        }
@@ -333,12 +335,11 @@ void rxrpc_put_service_conn(struct rxrpc_connection *conn)
 {
        const void *here = __builtin_return_address(0);
        unsigned int debug_id = conn->debug_id;
-       int n;
+       int r;
 
-       n = atomic_dec_return(&conn->usage);
-       trace_rxrpc_conn(debug_id, rxrpc_conn_put_service, n, here);
-       ASSERTCMP(n, >=, 0);
-       if (n == 1)
+       __refcount_dec(&conn->ref, &r);
+       trace_rxrpc_conn(debug_id, rxrpc_conn_put_service, r - 1, here);
+       if (r - 1 == 1)
                rxrpc_set_service_reap_timer(conn->params.local->rxnet,
                                             jiffies + rxrpc_connection_expiry);
 }
@@ -351,9 +352,9 @@ static void rxrpc_destroy_connection(struct rcu_head *rcu)
        struct rxrpc_connection *conn =
                container_of(rcu, struct rxrpc_connection, rcu);
 
-       _enter("{%d,u=%d}", conn->debug_id, atomic_read(&conn->usage));
+       _enter("{%d,u=%d}", conn->debug_id, refcount_read(&conn->ref));
 
-       ASSERTCMP(atomic_read(&conn->usage), ==, 0);
+       ASSERTCMP(refcount_read(&conn->ref), ==, 0);
 
        _net("DESTROY CONN %d", conn->debug_id);
 
@@ -392,8 +393,8 @@ void rxrpc_service_connection_reaper(struct work_struct *work)
 
        write_lock(&rxnet->conn_lock);
        list_for_each_entry_safe(conn, _p, &rxnet->service_conns, link) {
-               ASSERTCMP(atomic_read(&conn->usage), >, 0);
-               if (likely(atomic_read(&conn->usage) > 1))
+               ASSERTCMP(refcount_read(&conn->ref), >, 0);
+               if (likely(refcount_read(&conn->ref) > 1))
                        continue;
                if (conn->state == RXRPC_CONN_SERVICE_PREALLOC)
                        continue;
@@ -405,7 +406,7 @@ void rxrpc_service_connection_reaper(struct work_struct *work)
                                expire_at = idle_timestamp + rxrpc_closed_conn_expiry * HZ;
 
                        _debug("reap CONN %d { u=%d,t=%ld }",
-                              conn->debug_id, atomic_read(&conn->usage),
+                              conn->debug_id, refcount_read(&conn->ref),
                               (long)expire_at - (long)now);
 
                        if (time_before(now, expire_at)) {
@@ -418,7 +419,7 @@ void rxrpc_service_connection_reaper(struct work_struct *work)
                /* The usage count sits at 1 whilst the object is unused on the
                 * list; we reduce that to 0 to make the object unavailable.
                 */
-               if (atomic_cmpxchg(&conn->usage, 1, 0) != 1)
+               if (!refcount_dec_if_one(&conn->ref))
                        continue;
                trace_rxrpc_conn(conn->debug_id, rxrpc_conn_reap_service, 0, NULL);
 
@@ -442,7 +443,7 @@ void rxrpc_service_connection_reaper(struct work_struct *work)
                                  link);
                list_del_init(&conn->link);
 
-               ASSERTCMP(atomic_read(&conn->usage), ==, 0);
+               ASSERTCMP(refcount_read(&conn->ref), ==, 0);
                rxrpc_kill_connection(conn);
        }
 
@@ -470,7 +471,7 @@ void rxrpc_destroy_all_connections(struct rxrpc_net *rxnet)
        write_lock(&rxnet->conn_lock);
        list_for_each_entry_safe(conn, _p, &rxnet->service_conns, link) {
                pr_err("AF_RXRPC: Leaked conn %p {%d}\n",
-                      conn, atomic_read(&conn->usage));
+                      conn, refcount_read(&conn->ref));
                leak = true;
        }
        write_unlock(&rxnet->conn_lock);