The branch main has been updated by kib:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=18905fc31b31fd72a1a1918b26ebbf6c4f0fb5aa

commit 18905fc31b31fd72a1a1918b26ebbf6c4f0fb5aa
Author:     Konstantin Belousov <k...@freebsd.org>
AuthorDate: 2025-07-03 17:59:30 +0000
Commit:     Konstantin Belousov <k...@freebsd.org>
CommitDate: 2025-07-10 14:42:27 +0000

    sysctl net.inet.tcp.ktcplist: try to handle EDEADLK
    
    If EDEADLK is returned from the locked handler, restart it.  Do it
    limited number of times.  Catch signals between tries.
    
    Reviewed by:    glebius, markj
    Sponsored by:   Nvidia networking
    Differential revision:  https://reviews.freebsd.org/D51143
---
 sys/netinet/tcp_subr.c | 27 +++++++++++++++++----------
 1 file changed, 17 insertions(+), 10 deletions(-)

diff --git a/sys/netinet/tcp_subr.c b/sys/netinet/tcp_subr.c
index f8811649fe19..45048fb3848d 100644
--- a/sys/netinet/tcp_subr.c
+++ b/sys/netinet/tcp_subr.c
@@ -2869,21 +2869,28 @@ tcp_ktlslist_locked(SYSCTL_HANDLER_ARGS, bool 
export_keys)
 
        zfree(buf, M_TEMP);
        return (error);
-
-again_reset:
-       req->oldidx = 0;
-       goto again;
 }
 
 static int
 tcp_ktlslist1(SYSCTL_HANDLER_ARGS, bool export_keys)
 {
-       int res;
-
-       sx_xlock(&ktlslist_lock);
-       res = tcp_ktlslist_locked(oidp, arg1, arg2, req, export_keys);
-       sx_xunlock(&ktlslist_lock);
-       return (res);
+       int repeats, error;
+
+       for (repeats = 0; repeats < 100; repeats++) {
+               if (sx_xlock_sig(&ktlslist_lock))
+                       return (EINTR);
+               error = tcp_ktlslist_locked(oidp, arg1, arg2, req,
+                   export_keys);
+               sx_xunlock(&ktlslist_lock);
+               if (error != EDEADLK)
+                       break;
+               if (sig_intr() != 0) {
+                       error = EINTR;
+                       break;
+               }
+               req->oldidx = 0;
+       }
+       return (error);
 }
        
 static int

Reply via email to