Skip to content

Commit

Permalink
rxrpc: Provide more refcount helper functions
Browse files Browse the repository at this point in the history
Provide refcount helper functions for connections so that the code doesn't
touch local or connection usage counts directly.

Also make it such that local and peer put functions can take a NULL
pointer.

Signed-off-by: David Howells <dhowells@redhat.com>
  • Loading branch information
David Howells committed Jun 22, 2016
1 parent 985a5c8 commit 5627cc8
Show file tree
Hide file tree
Showing 8 changed files with 26 additions and 18 deletions.
7 changes: 2 additions & 5 deletions net/rxrpc/af_rxrpc.c
Original file line number Diff line number Diff line change
Expand Up @@ -674,11 +674,8 @@ static int rxrpc_release_sock(struct sock *sk)
flush_workqueue(rxrpc_workqueue);
rxrpc_purge_queue(&sk->sk_receive_queue);

if (rx->local) {
rxrpc_put_local(rx->local);
rx->local = NULL;
}

rxrpc_put_local(rx->local);
rx->local = NULL;
key_put(rx->key);
rx->key = NULL;
key_put(rx->securities);
Expand Down
15 changes: 13 additions & 2 deletions net/rxrpc/ar-internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -597,6 +597,17 @@ static inline bool rxrpc_conn_is_service(const struct rxrpc_connection *conn)
return conn->proto.in_clientflag;
}

static inline void rxrpc_get_connection(struct rxrpc_connection *conn)
{
atomic_inc(&conn->usage);
}

static inline
struct rxrpc_connection *rxrpc_get_connection_maybe(struct rxrpc_connection *conn)
{
return atomic_inc_not_zero(&conn->usage) ? conn : NULL;
}

/*
* input.c
*/
Expand Down Expand Up @@ -645,7 +656,7 @@ struct rxrpc_local *rxrpc_get_local_maybe(struct rxrpc_local *local)

static inline void rxrpc_put_local(struct rxrpc_local *local)
{
if (atomic_dec_and_test(&local->usage))
if (local && atomic_dec_and_test(&local->usage))
__rxrpc_put_local(local);
}

Expand Down Expand Up @@ -702,7 +713,7 @@ struct rxrpc_peer *rxrpc_get_peer_maybe(struct rxrpc_peer *peer)
extern void __rxrpc_put_peer(struct rxrpc_peer *peer);
static inline void rxrpc_put_peer(struct rxrpc_peer *peer)
{
if (atomic_dec_and_test(&peer->usage))
if (peer && atomic_dec_and_test(&peer->usage))
__rxrpc_put_peer(peer);
}

Expand Down
2 changes: 1 addition & 1 deletion net/rxrpc/call_accept.c
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,7 @@ static int rxrpc_accept_incoming_call(struct rxrpc_local *local,
_debug("await conn sec");
list_add_tail(&call->accept_link, &rx->secureq);
call->conn->state = RXRPC_CONN_SERVER_CHALLENGING;
atomic_inc(&call->conn->usage);
rxrpc_get_connection(call->conn);
set_bit(RXRPC_CONN_CHALLENGE, &call->conn->events);
rxrpc_queue_conn(call->conn);
} else {
Expand Down
2 changes: 1 addition & 1 deletion net/rxrpc/call_object.c
Original file line number Diff line number Diff line change
Expand Up @@ -515,7 +515,7 @@ struct rxrpc_call *rxrpc_incoming_call(struct rxrpc_sock *rx,
rb_insert_color(&call->conn_node, &conn->calls);
conn->channels[call->channel] = call;
sock_hold(&rx->sk);
atomic_inc(&conn->usage);
rxrpc_get_connection(conn);
write_unlock_bh(&conn->lock);

spin_lock(&conn->params.peer->lock);
Expand Down
2 changes: 1 addition & 1 deletion net/rxrpc/conn_event.c
Original file line number Diff line number Diff line change
Expand Up @@ -263,7 +263,7 @@ void rxrpc_process_connection(struct work_struct *work)

_enter("{%d}", conn->debug_id);

atomic_inc(&conn->usage);
rxrpc_get_connection(conn);

if (test_and_clear_bit(RXRPC_CONN_CHALLENGE, &conn->events)) {
rxrpc_secure_connection(conn);
Expand Down
12 changes: 6 additions & 6 deletions net/rxrpc/conn_object.c
Original file line number Diff line number Diff line change
Expand Up @@ -333,7 +333,7 @@ static int rxrpc_connect_exclusive(struct rxrpc_sock *rx,
* channel.
*/
chan = 0;
atomic_inc(&conn->usage);
rxrpc_get_connection(conn);
conn->avail_calls = RXRPC_MAXCALLS - 1;
conn->channels[chan] = call;
conn->call_counter = 1;
Expand Down Expand Up @@ -392,7 +392,7 @@ int rxrpc_connect_call(struct rxrpc_sock *rx,
conn->channels[1] == NULL ||
conn->channels[2] == NULL ||
conn->channels[3] == NULL);
atomic_inc(&conn->usage);
rxrpc_get_connection(conn);
break;
}

Expand All @@ -412,7 +412,7 @@ int rxrpc_connect_call(struct rxrpc_sock *rx,
conn->channels[1] == NULL &&
conn->channels[2] == NULL &&
conn->channels[3] == NULL);
atomic_inc(&conn->usage);
rxrpc_get_connection(conn);
list_move(&conn->bundle_link, &bundle->avail_conns);
break;
}
Expand Down Expand Up @@ -629,7 +629,7 @@ rxrpc_incoming_connection(struct rxrpc_transport *trans, struct sk_buff *skb)
read_unlock_bh(&trans->conn_lock);
goto security_mismatch;
}
atomic_inc(&conn->usage);
rxrpc_get_connection(conn);
read_unlock_bh(&trans->conn_lock);
goto success;

Expand All @@ -639,7 +639,7 @@ rxrpc_incoming_connection(struct rxrpc_transport *trans, struct sk_buff *skb)
write_unlock_bh(&trans->conn_lock);
goto security_mismatch;
}
atomic_inc(&conn->usage);
rxrpc_get_connection(conn);
write_unlock_bh(&trans->conn_lock);
kfree(candidate);
goto success;
Expand Down Expand Up @@ -698,7 +698,7 @@ struct rxrpc_connection *rxrpc_find_connection(struct rxrpc_transport *trans,
return NULL;

found:
atomic_inc(&conn->usage);
rxrpc_get_connection(conn);
read_unlock_bh(&trans->conn_lock);
_leave(" = %p", conn);
return conn;
Expand Down
2 changes: 1 addition & 1 deletion net/rxrpc/input.c
Original file line number Diff line number Diff line change
Expand Up @@ -580,7 +580,7 @@ static void rxrpc_post_packet_to_conn(struct rxrpc_connection *conn,
{
_enter("%p,%p", conn, skb);

atomic_inc(&conn->usage);
rxrpc_get_connection(conn);
skb_queue_tail(&conn->rx_queue, skb);
rxrpc_queue_conn(conn);
}
Expand Down
2 changes: 1 addition & 1 deletion net/rxrpc/local_object.c
Original file line number Diff line number Diff line change
Expand Up @@ -209,7 +209,7 @@ struct rxrpc_local *rxrpc_lookup_local(const struct sockaddr_rxrpc *srx)
* bind the transport socket may still fail if we're attempting
* to use a local address that the dying object is still using.
*/
if (!atomic_inc_not_zero(&local->usage)) {
if (!rxrpc_get_local_maybe(local)) {
cursor = cursor->next;
list_del_init(&local->link);
break;
Expand Down

0 comments on commit 5627cc8

Please sign in to comment.