mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-06 13:16:22 +00:00
rxrpc: Stash the network namespace pointer in rxrpc_local
Stash the network namespace pointer in the rxrpc_local struct in addition to a pointer to the rxrpc-specific net namespace info. Use this to remove some places where the socket is passed as a parameter. Signed-off-by: David Howells <dhowells@redhat.com> cc: Marc Dionne <marc.dionne@auristor.com> cc: linux-afs@lists.infradead.org
This commit is contained in:
parent
eea8ce81fb
commit
8a758d98db
@ -283,7 +283,8 @@ struct rxrpc_local {
|
|||||||
struct rcu_head rcu;
|
struct rcu_head rcu;
|
||||||
atomic_t active_users; /* Number of users of the local endpoint */
|
atomic_t active_users; /* Number of users of the local endpoint */
|
||||||
refcount_t ref; /* Number of references to the structure */
|
refcount_t ref; /* Number of references to the structure */
|
||||||
struct rxrpc_net *rxnet; /* The network ns in which this resides */
|
struct net *net; /* The network namespace */
|
||||||
|
struct rxrpc_net *rxnet; /* Our bits in the network namespace */
|
||||||
struct hlist_node link;
|
struct hlist_node link;
|
||||||
struct socket *socket; /* my UDP socket */
|
struct socket *socket; /* my UDP socket */
|
||||||
struct task_struct *io_thread;
|
struct task_struct *io_thread;
|
||||||
@ -1063,12 +1064,11 @@ void rxrpc_peer_keepalive_worker(struct work_struct *);
|
|||||||
*/
|
*/
|
||||||
struct rxrpc_peer *rxrpc_lookup_peer_rcu(struct rxrpc_local *,
|
struct rxrpc_peer *rxrpc_lookup_peer_rcu(struct rxrpc_local *,
|
||||||
const struct sockaddr_rxrpc *);
|
const struct sockaddr_rxrpc *);
|
||||||
struct rxrpc_peer *rxrpc_lookup_peer(struct rxrpc_sock *, struct rxrpc_local *,
|
struct rxrpc_peer *rxrpc_lookup_peer(struct rxrpc_local *local,
|
||||||
struct sockaddr_rxrpc *, gfp_t);
|
struct sockaddr_rxrpc *srx, gfp_t gfp);
|
||||||
struct rxrpc_peer *rxrpc_alloc_peer(struct rxrpc_local *, gfp_t,
|
struct rxrpc_peer *rxrpc_alloc_peer(struct rxrpc_local *, gfp_t,
|
||||||
enum rxrpc_peer_trace);
|
enum rxrpc_peer_trace);
|
||||||
void rxrpc_new_incoming_peer(struct rxrpc_sock *, struct rxrpc_local *,
|
void rxrpc_new_incoming_peer(struct rxrpc_local *local, struct rxrpc_peer *peer);
|
||||||
struct rxrpc_peer *);
|
|
||||||
void rxrpc_destroy_all_peers(struct rxrpc_net *);
|
void rxrpc_destroy_all_peers(struct rxrpc_net *);
|
||||||
struct rxrpc_peer *rxrpc_get_peer(struct rxrpc_peer *, enum rxrpc_peer_trace);
|
struct rxrpc_peer *rxrpc_get_peer(struct rxrpc_peer *, enum rxrpc_peer_trace);
|
||||||
struct rxrpc_peer *rxrpc_get_peer_maybe(struct rxrpc_peer *, enum rxrpc_peer_trace);
|
struct rxrpc_peer *rxrpc_get_peer_maybe(struct rxrpc_peer *, enum rxrpc_peer_trace);
|
||||||
|
@ -280,7 +280,7 @@ static struct rxrpc_call *rxrpc_alloc_incoming_call(struct rxrpc_sock *rx,
|
|||||||
(peer_tail + 1) &
|
(peer_tail + 1) &
|
||||||
(RXRPC_BACKLOG_MAX - 1));
|
(RXRPC_BACKLOG_MAX - 1));
|
||||||
|
|
||||||
rxrpc_new_incoming_peer(rx, local, peer);
|
rxrpc_new_incoming_peer(local, peer);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Now allocate and set up the connection */
|
/* Now allocate and set up the connection */
|
||||||
|
@ -378,7 +378,7 @@ static struct rxrpc_bundle *rxrpc_prep_call(struct rxrpc_sock *rx,
|
|||||||
|
|
||||||
_enter("{%d,%lx},", call->debug_id, call->user_call_ID);
|
_enter("{%d,%lx},", call->debug_id, call->user_call_ID);
|
||||||
|
|
||||||
cp->peer = rxrpc_lookup_peer(rx, cp->local, srx, gfp);
|
cp->peer = rxrpc_lookup_peer(cp->local, srx, gfp);
|
||||||
if (!cp->peer)
|
if (!cp->peer)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
|
@ -85,7 +85,7 @@ static long rxrpc_local_cmp_key(const struct rxrpc_local *local,
|
|||||||
/*
|
/*
|
||||||
* Allocate a new local endpoint.
|
* Allocate a new local endpoint.
|
||||||
*/
|
*/
|
||||||
static struct rxrpc_local *rxrpc_alloc_local(struct rxrpc_net *rxnet,
|
static struct rxrpc_local *rxrpc_alloc_local(struct net *net,
|
||||||
const struct sockaddr_rxrpc *srx)
|
const struct sockaddr_rxrpc *srx)
|
||||||
{
|
{
|
||||||
struct rxrpc_local *local;
|
struct rxrpc_local *local;
|
||||||
@ -94,7 +94,8 @@ static struct rxrpc_local *rxrpc_alloc_local(struct rxrpc_net *rxnet,
|
|||||||
if (local) {
|
if (local) {
|
||||||
refcount_set(&local->ref, 1);
|
refcount_set(&local->ref, 1);
|
||||||
atomic_set(&local->active_users, 1);
|
atomic_set(&local->active_users, 1);
|
||||||
local->rxnet = rxnet;
|
local->net = net;
|
||||||
|
local->rxnet = rxrpc_net(net);
|
||||||
INIT_HLIST_NODE(&local->link);
|
INIT_HLIST_NODE(&local->link);
|
||||||
init_rwsem(&local->defrag_sem);
|
init_rwsem(&local->defrag_sem);
|
||||||
init_completion(&local->io_thread_ready);
|
init_completion(&local->io_thread_ready);
|
||||||
@ -248,7 +249,7 @@ struct rxrpc_local *rxrpc_lookup_local(struct net *net,
|
|||||||
goto found;
|
goto found;
|
||||||
}
|
}
|
||||||
|
|
||||||
local = rxrpc_alloc_local(rxnet, srx);
|
local = rxrpc_alloc_local(net, srx);
|
||||||
if (!local)
|
if (!local)
|
||||||
goto nomem;
|
goto nomem;
|
||||||
|
|
||||||
|
@ -147,10 +147,10 @@ struct rxrpc_peer *rxrpc_lookup_peer_rcu(struct rxrpc_local *local,
|
|||||||
* assess the MTU size for the network interface through which this peer is
|
* assess the MTU size for the network interface through which this peer is
|
||||||
* reached
|
* reached
|
||||||
*/
|
*/
|
||||||
static void rxrpc_assess_MTU_size(struct rxrpc_sock *rx,
|
static void rxrpc_assess_MTU_size(struct rxrpc_local *local,
|
||||||
struct rxrpc_peer *peer)
|
struct rxrpc_peer *peer)
|
||||||
{
|
{
|
||||||
struct net *net = sock_net(&rx->sk);
|
struct net *net = local->net;
|
||||||
struct dst_entry *dst;
|
struct dst_entry *dst;
|
||||||
struct rtable *rt;
|
struct rtable *rt;
|
||||||
struct flowi fl;
|
struct flowi fl;
|
||||||
@ -236,11 +236,11 @@ struct rxrpc_peer *rxrpc_alloc_peer(struct rxrpc_local *local, gfp_t gfp,
|
|||||||
/*
|
/*
|
||||||
* Initialise peer record.
|
* Initialise peer record.
|
||||||
*/
|
*/
|
||||||
static void rxrpc_init_peer(struct rxrpc_sock *rx, struct rxrpc_peer *peer,
|
static void rxrpc_init_peer(struct rxrpc_local *local, struct rxrpc_peer *peer,
|
||||||
unsigned long hash_key)
|
unsigned long hash_key)
|
||||||
{
|
{
|
||||||
peer->hash_key = hash_key;
|
peer->hash_key = hash_key;
|
||||||
rxrpc_assess_MTU_size(rx, peer);
|
rxrpc_assess_MTU_size(local, peer);
|
||||||
peer->mtu = peer->if_mtu;
|
peer->mtu = peer->if_mtu;
|
||||||
peer->rtt_last_req = ktime_get_real();
|
peer->rtt_last_req = ktime_get_real();
|
||||||
|
|
||||||
@ -272,8 +272,7 @@ static void rxrpc_init_peer(struct rxrpc_sock *rx, struct rxrpc_peer *peer,
|
|||||||
/*
|
/*
|
||||||
* Set up a new peer.
|
* Set up a new peer.
|
||||||
*/
|
*/
|
||||||
static struct rxrpc_peer *rxrpc_create_peer(struct rxrpc_sock *rx,
|
static struct rxrpc_peer *rxrpc_create_peer(struct rxrpc_local *local,
|
||||||
struct rxrpc_local *local,
|
|
||||||
struct sockaddr_rxrpc *srx,
|
struct sockaddr_rxrpc *srx,
|
||||||
unsigned long hash_key,
|
unsigned long hash_key,
|
||||||
gfp_t gfp)
|
gfp_t gfp)
|
||||||
@ -285,7 +284,7 @@ static struct rxrpc_peer *rxrpc_create_peer(struct rxrpc_sock *rx,
|
|||||||
peer = rxrpc_alloc_peer(local, gfp, rxrpc_peer_new_client);
|
peer = rxrpc_alloc_peer(local, gfp, rxrpc_peer_new_client);
|
||||||
if (peer) {
|
if (peer) {
|
||||||
memcpy(&peer->srx, srx, sizeof(*srx));
|
memcpy(&peer->srx, srx, sizeof(*srx));
|
||||||
rxrpc_init_peer(rx, peer, hash_key);
|
rxrpc_init_peer(local, peer, hash_key);
|
||||||
}
|
}
|
||||||
|
|
||||||
_leave(" = %p", peer);
|
_leave(" = %p", peer);
|
||||||
@ -304,14 +303,13 @@ static void rxrpc_free_peer(struct rxrpc_peer *peer)
|
|||||||
* since we've already done a search in the list from the non-reentrant context
|
* since we've already done a search in the list from the non-reentrant context
|
||||||
* (the data_ready handler) that is the only place we can add new peers.
|
* (the data_ready handler) that is the only place we can add new peers.
|
||||||
*/
|
*/
|
||||||
void rxrpc_new_incoming_peer(struct rxrpc_sock *rx, struct rxrpc_local *local,
|
void rxrpc_new_incoming_peer(struct rxrpc_local *local, struct rxrpc_peer *peer)
|
||||||
struct rxrpc_peer *peer)
|
|
||||||
{
|
{
|
||||||
struct rxrpc_net *rxnet = local->rxnet;
|
struct rxrpc_net *rxnet = local->rxnet;
|
||||||
unsigned long hash_key;
|
unsigned long hash_key;
|
||||||
|
|
||||||
hash_key = rxrpc_peer_hash_key(local, &peer->srx);
|
hash_key = rxrpc_peer_hash_key(local, &peer->srx);
|
||||||
rxrpc_init_peer(rx, peer, hash_key);
|
rxrpc_init_peer(local, peer, hash_key);
|
||||||
|
|
||||||
spin_lock(&rxnet->peer_hash_lock);
|
spin_lock(&rxnet->peer_hash_lock);
|
||||||
hash_add_rcu(rxnet->peer_hash, &peer->hash_link, hash_key);
|
hash_add_rcu(rxnet->peer_hash, &peer->hash_link, hash_key);
|
||||||
@ -322,8 +320,7 @@ void rxrpc_new_incoming_peer(struct rxrpc_sock *rx, struct rxrpc_local *local,
|
|||||||
/*
|
/*
|
||||||
* obtain a remote transport endpoint for the specified address
|
* obtain a remote transport endpoint for the specified address
|
||||||
*/
|
*/
|
||||||
struct rxrpc_peer *rxrpc_lookup_peer(struct rxrpc_sock *rx,
|
struct rxrpc_peer *rxrpc_lookup_peer(struct rxrpc_local *local,
|
||||||
struct rxrpc_local *local,
|
|
||||||
struct sockaddr_rxrpc *srx, gfp_t gfp)
|
struct sockaddr_rxrpc *srx, gfp_t gfp)
|
||||||
{
|
{
|
||||||
struct rxrpc_peer *peer, *candidate;
|
struct rxrpc_peer *peer, *candidate;
|
||||||
@ -343,7 +340,7 @@ struct rxrpc_peer *rxrpc_lookup_peer(struct rxrpc_sock *rx,
|
|||||||
/* The peer is not yet present in hash - create a candidate
|
/* The peer is not yet present in hash - create a candidate
|
||||||
* for a new record and then redo the search.
|
* for a new record and then redo the search.
|
||||||
*/
|
*/
|
||||||
candidate = rxrpc_create_peer(rx, local, srx, hash_key, gfp);
|
candidate = rxrpc_create_peer(local, srx, hash_key, gfp);
|
||||||
if (!candidate) {
|
if (!candidate) {
|
||||||
_leave(" = NULL [nomem]");
|
_leave(" = NULL [nomem]");
|
||||||
return NULL;
|
return NULL;
|
||||||
|
Loading…
Reference in New Issue
Block a user