diff options
author | David Howells <dhowells@redhat.com> | 2019-09-02 11:43:44 +0100 |
---|---|---|
committer | David Howells <dhowells@redhat.com> | 2019-09-02 11:43:44 +0100 |
commit | f16180739cd18a39a1a45516ac0e65d18a9f100e (patch) | |
tree | 22d1135650f8ddb25707c788cd4846c77b428ff0 /net/rxrpc/conn_client.c | |
parent | 9f159ae07f07fc540290f21937231034f554bdd7 (diff) | |
parent | e1e54ec7fb55501c33b117c111cb0a045b8eded2 (diff) | |
download | kernel_replicant_linux-f16180739cd18a39a1a45516ac0e65d18a9f100e.tar.gz kernel_replicant_linux-f16180739cd18a39a1a45516ac0e65d18a9f100e.tar.bz2 kernel_replicant_linux-f16180739cd18a39a1a45516ac0e65d18a9f100e.zip |
Merge remote-tracking branch 'net/master' into afs-next
Diffstat (limited to 'net/rxrpc/conn_client.c')
-rw-r--r-- | net/rxrpc/conn_client.c | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/net/rxrpc/conn_client.c b/net/rxrpc/conn_client.c index aea82f909c60..3f1da1b49f69 100644 --- a/net/rxrpc/conn_client.c +++ b/net/rxrpc/conn_client.c @@ -1162,3 +1162,47 @@ void rxrpc_destroy_all_client_connections(struct rxrpc_net *rxnet) _leave(""); } + +/* + * Clean up the client connections on a local endpoint. + */ +void rxrpc_clean_up_local_conns(struct rxrpc_local *local) +{ + struct rxrpc_connection *conn, *tmp; + struct rxrpc_net *rxnet = local->rxnet; + unsigned int nr_active; + LIST_HEAD(graveyard); + + _enter(""); + + spin_lock(&rxnet->client_conn_cache_lock); + nr_active = rxnet->nr_active_client_conns; + + list_for_each_entry_safe(conn, tmp, &rxnet->idle_client_conns, + cache_link) { + if (conn->params.local == local) { + ASSERTCMP(conn->cache_state, ==, RXRPC_CONN_CLIENT_IDLE); + + trace_rxrpc_client(conn, -1, rxrpc_client_discard); + if (!test_and_clear_bit(RXRPC_CONN_EXPOSED, &conn->flags)) + BUG(); + conn->cache_state = RXRPC_CONN_CLIENT_INACTIVE; + list_move(&conn->cache_link, &graveyard); + nr_active--; + } + } + + rxnet->nr_active_client_conns = nr_active; + spin_unlock(&rxnet->client_conn_cache_lock); + ASSERTCMP(nr_active, >=, 0); + + while (!list_empty(&graveyard)) { + conn = list_entry(graveyard.next, + struct rxrpc_connection, cache_link); + list_del_init(&conn->cache_link); + + rxrpc_put_connection(conn); + } + + _leave(" [culled]"); +} |