From: Artem Blagodarenko Date: Sat, 9 Oct 2021 04:35:19 +0000 (-0400) Subject: LU-15076 socklnd: lock ksnc_tx_queue list processing X-Git-Tag: 2.14.56~148 X-Git-Url: https://git.whamcloud.com/?a=commitdiff_plain;h=13c7c2e3c248c8cdba4853852bfaecceb7a75afe;p=fs%2Flustre-release.git LU-15076 socklnd: lock ksnc_tx_queue list processing A GFP occurred in the ksocknal_find_timed_out_conn() while processing ksnc_tx_queue list. Add locking to this list. Change-Id: I1f76683e5798c5015f11e3fa285db9613b1af906 Signed-off-by: Artem Blagodarenko HPE-bug-id: LUS-10248 Fixes: 25c1cb2c4d ("LU-9120 lnet: handle socklnd tx failure") Reviewed-by: Chris Horn Reviewed-by: Alexander Boyko Reviewed-on: https://review.whamcloud.com/45179 Tested-by: jenkins Reviewed-by: Chris Horn Tested-by: Maloo Reviewed-by: Oleg Drokin --- diff --git a/lnet/klnds/socklnd/socklnd_cb.c b/lnet/klnds/socklnd/socklnd_cb.c index fcdbd16..614b864 100644 --- a/lnet/klnds/socklnd/socklnd_cb.c +++ b/lnet/klnds/socklnd/socklnd_cb.c @@ -2309,12 +2309,14 @@ ksocknal_find_timed_out_conn(struct ksock_peer_ni *peer_ni) /* We're called with a shared lock on ksnd_global_lock */ struct ksock_conn *conn; struct ksock_tx *tx; + struct ksock_sched *sched; list_for_each_entry(conn, &peer_ni->ksnp_conns, ksnc_list) { int error; /* Don't need the {get,put}connsock dance to deref ksnc_sock */ LASSERT (!conn->ksnc_closing); + sched = conn->ksnc_scheduler; error = conn->ksnc_sock->sk->sk_err; if (error != 0) { @@ -2355,6 +2357,7 @@ ksocknal_find_timed_out_conn(struct ksock_peer_ni *peer_ni) return conn; } + spin_lock_bh(&sched->kss_lock); if ((!list_empty(&conn->ksnc_tx_queue) || conn->ksnc_sock->sk->sk_wmem_queued != 0) && ktime_get_seconds() >= conn->ksnc_tx_deadline) { @@ -2369,8 +2372,10 @@ ksocknal_find_timed_out_conn(struct ksock_peer_ni *peer_ni) CNETERR("Timeout sending data to %s (%pISp) the network or that node may be down.\n", libcfs_idstr(&peer_ni->ksnp_id), &conn->ksnc_peeraddr); + spin_unlock_bh(&sched->kss_lock); return conn; } + spin_unlock_bh(&sched->kss_lock); } return (NULL);