]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
ntb: Add mutex to make link_event_callback executed linearly.
authorfuyuanli <fuyuanli0722@gmail.com>
Mon, 25 Aug 2025 09:15:08 +0000 (17:15 +0800)
committerJon Mason <jdmason@kudzu.us>
Mon, 22 Sep 2025 13:35:21 +0000 (09:35 -0400)
Since the CPU selected by schedule_work is uncertain, multiple link_event
callbacks may be executed at same time. For example, after peer's link is
up, it is down quickly before local link_work completed. If link_cleanup
is added to the workqueue of another CPU, then link_work and link_cleanup
may be executed at the same time. So add a mutex to prevent them from being
executed concurrently.

Signed-off-by: fuyuanli <fuyuanli@didiglobal.com>
Reviewed-by: Logan Gunthorpe <logang@deltatee.com>
Reviewed-by: Dave Jiang <dave.jiang@intel.com>
Signed-off-by: Jon Mason <jdmason@kudzu.us>
drivers/ntb/ntb_transport.c

index 4f775c3e218f45c35e7ee1ad198da7ef70eade52..eb875e3db2e3b9f7ddd8c27e2ea560ac8a6405b7 100644 (file)
@@ -59,6 +59,7 @@
 #include <linux/slab.h>
 #include <linux/types.h>
 #include <linux/uaccess.h>
+#include <linux/mutex.h>
 #include "linux/ntb.h"
 #include "linux/ntb_transport.h"
 
@@ -241,6 +242,9 @@ struct ntb_transport_ctx {
        struct work_struct link_cleanup;
 
        struct dentry *debugfs_node_dir;
+
+       /* Make sure workq of link event be executed serially */
+       struct mutex link_event_lock;
 };
 
 enum {
@@ -1024,6 +1028,7 @@ static void ntb_transport_link_cleanup_work(struct work_struct *work)
        struct ntb_transport_ctx *nt =
                container_of(work, struct ntb_transport_ctx, link_cleanup);
 
+       guard(mutex)(&nt->link_event_lock);
        ntb_transport_link_cleanup(nt);
 }
 
@@ -1047,6 +1052,8 @@ static void ntb_transport_link_work(struct work_struct *work)
        u32 val;
        int rc = 0, i, spad;
 
+       guard(mutex)(&nt->link_event_lock);
+
        /* send the local info, in the opposite order of the way we read it */
 
        if (nt->use_msi) {