Skip to content

Commit b282c54

Browse files
committed
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/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
2 parents f06e4bf + 1f0fc33 commit b282c54

File tree

8 files changed

+22
-16
lines changed

8 files changed

+22
-16
lines changed

fs/afs/server.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,8 @@ static struct afs_server *afs_install_server(struct afs_cell *cell,
163163
rb_insert_color(&server->uuid_rb, &net->fs_servers);
164164
hlist_add_head_rcu(&server->proc_link, &net->fs_proc);
165165

166+
afs_get_cell(cell, afs_cell_trace_get_server);
167+
166168
added_dup:
167169
write_seqlock(&net->fs_addr_lock);
168170
estate = rcu_dereference_protected(server->endpoint_state,
@@ -442,6 +444,7 @@ static void afs_server_rcu(struct rcu_head *rcu)
442444
atomic_read(&server->active), afs_server_trace_free);
443445
afs_put_endpoint_state(rcu_access_pointer(server->endpoint_state),
444446
afs_estate_trace_put_server);
447+
afs_put_cell(server->cell, afs_cell_trace_put_server);
445448
kfree(server);
446449
}
447450

fs/afs/server_list.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,8 +97,8 @@ struct afs_server_list *afs_alloc_server_list(struct afs_volume *volume,
9797
break;
9898
if (j < slist->nr_servers) {
9999
if (slist->servers[j].server == server) {
100-
afs_put_server(volume->cell->net, server,
101-
afs_server_trace_put_slist_isort);
100+
afs_unuse_server(volume->cell->net, server,
101+
afs_server_trace_put_slist_isort);
102102
continue;
103103
}
104104

include/trace/events/afs.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,7 @@ enum yfs_cm_operation {
174174
EM(afs_cell_trace_get_queue_dns, "GET q-dns ") \
175175
EM(afs_cell_trace_get_queue_manage, "GET q-mng ") \
176176
EM(afs_cell_trace_get_queue_new, "GET q-new ") \
177+
EM(afs_cell_trace_get_server, "GET server") \
177178
EM(afs_cell_trace_get_vol, "GET vol ") \
178179
EM(afs_cell_trace_insert, "INSERT ") \
179180
EM(afs_cell_trace_manage, "MANAGE ") \
@@ -182,6 +183,7 @@ enum yfs_cm_operation {
182183
EM(afs_cell_trace_put_destroy, "PUT destry") \
183184
EM(afs_cell_trace_put_queue_work, "PUT q-work") \
184185
EM(afs_cell_trace_put_queue_fail, "PUT q-fail") \
186+
EM(afs_cell_trace_put_server, "PUT server") \
185187
EM(afs_cell_trace_put_vol, "PUT vol ") \
186188
EM(afs_cell_trace_see_source, "SEE source") \
187189
EM(afs_cell_trace_see_ws, "SEE ws ") \

net/rxrpc/ar-internal.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -360,7 +360,6 @@ struct rxrpc_peer {
360360
u8 pmtud_jumbo; /* Max jumbo packets for the MTU */
361361
bool ackr_adv_pmtud; /* T if the peer advertises path-MTU */
362362
unsigned int ackr_max_data; /* Maximum data advertised by peer */
363-
seqcount_t mtu_lock; /* Lockless MTU access management */
364363
unsigned int if_mtu; /* Local interface MTU (- hdrsize) for this peer */
365364
unsigned int max_data; /* Maximum packet data capacity for this peer */
366365
unsigned short hdrsize; /* header size (IP + UDP + RxRPC) */

net/rxrpc/input.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -810,9 +810,7 @@ static void rxrpc_input_ack_trailer(struct rxrpc_call *call, struct sk_buff *skb
810810
if (max_mtu < peer->max_data) {
811811
trace_rxrpc_pmtud_reduce(peer, sp->hdr.serial, max_mtu,
812812
rxrpc_pmtud_reduce_ack);
813-
write_seqcount_begin(&peer->mtu_lock);
814813
peer->max_data = max_mtu;
815-
write_seqcount_end(&peer->mtu_lock);
816814
}
817815

818816
max_data = umin(max_mtu, peer->max_data);

net/rxrpc/peer_event.c

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -130,9 +130,7 @@ static void rxrpc_adjust_mtu(struct rxrpc_peer *peer, unsigned int mtu)
130130
peer->pmtud_bad = max_data + 1;
131131

132132
trace_rxrpc_pmtud_reduce(peer, 0, max_data, rxrpc_pmtud_reduce_icmp);
133-
write_seqcount_begin(&peer->mtu_lock);
134133
peer->max_data = max_data;
135-
write_seqcount_end(&peer->mtu_lock);
136134
}
137135
}
138136

@@ -408,13 +406,8 @@ void rxrpc_input_probe_for_pmtud(struct rxrpc_connection *conn, rxrpc_serial_t a
408406
}
409407

410408
max_data = umin(max_data, peer->ackr_max_data);
411-
if (max_data != peer->max_data) {
412-
preempt_disable();
413-
write_seqcount_begin(&peer->mtu_lock);
409+
if (max_data != peer->max_data)
414410
peer->max_data = max_data;
415-
write_seqcount_end(&peer->mtu_lock);
416-
preempt_enable();
417-
}
418411

419412
jumbo = max_data + sizeof(struct rxrpc_jumbo_header);
420413
jumbo /= RXRPC_JUMBO_SUBPKTLEN;

net/rxrpc/peer_object.c

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,6 @@ struct rxrpc_peer *rxrpc_alloc_peer(struct rxrpc_local *local, gfp_t gfp,
235235
peer->service_conns = RB_ROOT;
236236
seqlock_init(&peer->service_conn_lock);
237237
spin_lock_init(&peer->lock);
238-
seqcount_init(&peer->mtu_lock);
239238
peer->debug_id = atomic_inc_return(&rxrpc_debug_id);
240239
peer->recent_srtt_us = UINT_MAX;
241240
peer->cong_ssthresh = RXRPC_TX_MAX_WINDOW;
@@ -325,10 +324,10 @@ void rxrpc_new_incoming_peer(struct rxrpc_local *local, struct rxrpc_peer *peer)
325324
hash_key = rxrpc_peer_hash_key(local, &peer->srx);
326325
rxrpc_init_peer(local, peer, hash_key);
327326

328-
spin_lock_bh(&rxnet->peer_hash_lock);
327+
spin_lock(&rxnet->peer_hash_lock);
329328
hash_add_rcu(rxnet->peer_hash, &peer->hash_link, hash_key);
330329
list_add_tail(&peer->keepalive_link, &rxnet->peer_keepalive_new);
331-
spin_unlock_bh(&rxnet->peer_hash_lock);
330+
spin_unlock(&rxnet->peer_hash_lock);
332331
}
333332

334333
/*

net/rxrpc/rxperf.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -478,6 +478,18 @@ static int rxperf_deliver_request(struct rxperf_call *call)
478478
call->unmarshal++;
479479
fallthrough;
480480
case 2:
481+
ret = rxperf_extract_data(call, true);
482+
if (ret < 0)
483+
return ret;
484+
485+
/* Deal with the terminal magic cookie. */
486+
call->iov_len = 4;
487+
call->kvec[0].iov_len = call->iov_len;
488+
call->kvec[0].iov_base = call->tmp;
489+
iov_iter_kvec(&call->iter, READ, call->kvec, 1, call->iov_len);
490+
call->unmarshal++;
491+
fallthrough;
492+
case 3:
481493
ret = rxperf_extract_data(call, false);
482494
if (ret < 0)
483495
return ret;

0 commit comments

Comments
 (0)