Merge branch 'rxrpc-afs-miscellaneous-fixes'
David Howells says: ==================== rxrpc, afs: Miscellaneous fixes Here are some miscellaneous fixes for rxrpc and afs: (1) In the rxperf test server, make it correctly receive and decode the terminal magic cookie. (2) In rxrpc, get rid of the peer->mtu_lock as it is not only redundant, it now causes a lockdep complaint. (3) In rxrpc, fix a lockdep-detected instance where a spinlock is being bh-locked whilst irqs are disabled. (4) In afs, fix the ref of a server displaced from an afs_server_list struct. (5) In afs, make afs_server records belonging to a cell take refs on the afs_cell record so that the latter doesn't get deleted first when that cell is being destroyed. ==================== Link: https://patch.msgid.link/20250218192250.296870-1-dhowells@redhat.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
commit
b282c54823
8 changed files with 22 additions and 16 deletions
|
@ -163,6 +163,8 @@ static struct afs_server *afs_install_server(struct afs_cell *cell,
|
|||
rb_insert_color(&server->uuid_rb, &net->fs_servers);
|
||||
hlist_add_head_rcu(&server->proc_link, &net->fs_proc);
|
||||
|
||||
afs_get_cell(cell, afs_cell_trace_get_server);
|
||||
|
||||
added_dup:
|
||||
write_seqlock(&net->fs_addr_lock);
|
||||
estate = rcu_dereference_protected(server->endpoint_state,
|
||||
|
@ -442,6 +444,7 @@ static void afs_server_rcu(struct rcu_head *rcu)
|
|||
atomic_read(&server->active), afs_server_trace_free);
|
||||
afs_put_endpoint_state(rcu_access_pointer(server->endpoint_state),
|
||||
afs_estate_trace_put_server);
|
||||
afs_put_cell(server->cell, afs_cell_trace_put_server);
|
||||
kfree(server);
|
||||
}
|
||||
|
||||
|
|
|
@ -97,8 +97,8 @@ struct afs_server_list *afs_alloc_server_list(struct afs_volume *volume,
|
|||
break;
|
||||
if (j < slist->nr_servers) {
|
||||
if (slist->servers[j].server == server) {
|
||||
afs_put_server(volume->cell->net, server,
|
||||
afs_server_trace_put_slist_isort);
|
||||
afs_unuse_server(volume->cell->net, server,
|
||||
afs_server_trace_put_slist_isort);
|
||||
continue;
|
||||
}
|
||||
|
||||
|
|
|
@ -174,6 +174,7 @@ enum yfs_cm_operation {
|
|||
EM(afs_cell_trace_get_queue_dns, "GET q-dns ") \
|
||||
EM(afs_cell_trace_get_queue_manage, "GET q-mng ") \
|
||||
EM(afs_cell_trace_get_queue_new, "GET q-new ") \
|
||||
EM(afs_cell_trace_get_server, "GET server") \
|
||||
EM(afs_cell_trace_get_vol, "GET vol ") \
|
||||
EM(afs_cell_trace_insert, "INSERT ") \
|
||||
EM(afs_cell_trace_manage, "MANAGE ") \
|
||||
|
@ -182,6 +183,7 @@ enum yfs_cm_operation {
|
|||
EM(afs_cell_trace_put_destroy, "PUT destry") \
|
||||
EM(afs_cell_trace_put_queue_work, "PUT q-work") \
|
||||
EM(afs_cell_trace_put_queue_fail, "PUT q-fail") \
|
||||
EM(afs_cell_trace_put_server, "PUT server") \
|
||||
EM(afs_cell_trace_put_vol, "PUT vol ") \
|
||||
EM(afs_cell_trace_see_source, "SEE source") \
|
||||
EM(afs_cell_trace_see_ws, "SEE ws ") \
|
||||
|
|
|
@ -360,7 +360,6 @@ struct rxrpc_peer {
|
|||
u8 pmtud_jumbo; /* Max jumbo packets for the MTU */
|
||||
bool ackr_adv_pmtud; /* T if the peer advertises path-MTU */
|
||||
unsigned int ackr_max_data; /* Maximum data advertised by peer */
|
||||
seqcount_t mtu_lock; /* Lockless MTU access management */
|
||||
unsigned int if_mtu; /* Local interface MTU (- hdrsize) for this peer */
|
||||
unsigned int max_data; /* Maximum packet data capacity for this peer */
|
||||
unsigned short hdrsize; /* header size (IP + UDP + RxRPC) */
|
||||
|
|
|
@ -810,9 +810,7 @@ static void rxrpc_input_ack_trailer(struct rxrpc_call *call, struct sk_buff *skb
|
|||
if (max_mtu < peer->max_data) {
|
||||
trace_rxrpc_pmtud_reduce(peer, sp->hdr.serial, max_mtu,
|
||||
rxrpc_pmtud_reduce_ack);
|
||||
write_seqcount_begin(&peer->mtu_lock);
|
||||
peer->max_data = max_mtu;
|
||||
write_seqcount_end(&peer->mtu_lock);
|
||||
}
|
||||
|
||||
max_data = umin(max_mtu, peer->max_data);
|
||||
|
|
|
@ -130,9 +130,7 @@ static void rxrpc_adjust_mtu(struct rxrpc_peer *peer, unsigned int mtu)
|
|||
peer->pmtud_bad = max_data + 1;
|
||||
|
||||
trace_rxrpc_pmtud_reduce(peer, 0, max_data, rxrpc_pmtud_reduce_icmp);
|
||||
write_seqcount_begin(&peer->mtu_lock);
|
||||
peer->max_data = max_data;
|
||||
write_seqcount_end(&peer->mtu_lock);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -408,13 +406,8 @@ void rxrpc_input_probe_for_pmtud(struct rxrpc_connection *conn, rxrpc_serial_t a
|
|||
}
|
||||
|
||||
max_data = umin(max_data, peer->ackr_max_data);
|
||||
if (max_data != peer->max_data) {
|
||||
preempt_disable();
|
||||
write_seqcount_begin(&peer->mtu_lock);
|
||||
if (max_data != peer->max_data)
|
||||
peer->max_data = max_data;
|
||||
write_seqcount_end(&peer->mtu_lock);
|
||||
preempt_enable();
|
||||
}
|
||||
|
||||
jumbo = max_data + sizeof(struct rxrpc_jumbo_header);
|
||||
jumbo /= RXRPC_JUMBO_SUBPKTLEN;
|
||||
|
|
|
@ -235,7 +235,6 @@ struct rxrpc_peer *rxrpc_alloc_peer(struct rxrpc_local *local, gfp_t gfp,
|
|||
peer->service_conns = RB_ROOT;
|
||||
seqlock_init(&peer->service_conn_lock);
|
||||
spin_lock_init(&peer->lock);
|
||||
seqcount_init(&peer->mtu_lock);
|
||||
peer->debug_id = atomic_inc_return(&rxrpc_debug_id);
|
||||
peer->recent_srtt_us = UINT_MAX;
|
||||
peer->cong_ssthresh = RXRPC_TX_MAX_WINDOW;
|
||||
|
@ -325,10 +324,10 @@ void rxrpc_new_incoming_peer(struct rxrpc_local *local, struct rxrpc_peer *peer)
|
|||
hash_key = rxrpc_peer_hash_key(local, &peer->srx);
|
||||
rxrpc_init_peer(local, peer, hash_key);
|
||||
|
||||
spin_lock_bh(&rxnet->peer_hash_lock);
|
||||
spin_lock(&rxnet->peer_hash_lock);
|
||||
hash_add_rcu(rxnet->peer_hash, &peer->hash_link, hash_key);
|
||||
list_add_tail(&peer->keepalive_link, &rxnet->peer_keepalive_new);
|
||||
spin_unlock_bh(&rxnet->peer_hash_lock);
|
||||
spin_unlock(&rxnet->peer_hash_lock);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -478,6 +478,18 @@ static int rxperf_deliver_request(struct rxperf_call *call)
|
|||
call->unmarshal++;
|
||||
fallthrough;
|
||||
case 2:
|
||||
ret = rxperf_extract_data(call, true);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
/* Deal with the terminal magic cookie. */
|
||||
call->iov_len = 4;
|
||||
call->kvec[0].iov_len = call->iov_len;
|
||||
call->kvec[0].iov_base = call->tmp;
|
||||
iov_iter_kvec(&call->iter, READ, call->kvec, 1, call->iov_len);
|
||||
call->unmarshal++;
|
||||
fallthrough;
|
||||
case 3:
|
||||
ret = rxperf_extract_data(call, false);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
|
Loading…
Add table
Reference in a new issue