]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
smb: smbdirect: introduce smbdirect_socket.mr_io.*
authorStefan Metzmacher <metze@samba.org>
Tue, 19 Aug 2025 07:34:27 +0000 (09:34 +0200)
committerSteve French <stfrench@microsoft.com>
Sun, 28 Sep 2025 23:29:48 +0000 (18:29 -0500)
This will be used by the client and will allow us to move to
common code...

Cc: Steve French <smfrench@gmail.com>
Cc: Tom Talpey <tom@talpey.com>
Cc: Long Li <longli@microsoft.com>
Acked-by: Namjae Jeon <linkinjeon@kernel.org>
Cc: linux-cifs@vger.kernel.org
Cc: samba-technical@lists.samba.org
Signed-off-by: Stefan Metzmacher <metze@samba.org>
Signed-off-by: Steve French <stfrench@microsoft.com>
fs/smb/common/smbdirect/smbdirect_socket.h

index f220891ab290dbe9a0e3357a7e39bc7cada742b7..5d403b1beceab507af8e3658571b8394cb26287a 100644 (file)
@@ -206,6 +206,44 @@ struct smbdirect_socket {
                } reassembly;
        } recv_io;
 
+       /*
+        * The state for Memory registrations on the client
+        */
+       struct {
+               enum ib_mr_type type;
+
+               /*
+                * The list of free smbdirect_mr_io
+                * structures
+                */
+               struct {
+                       struct list_head list;
+                       spinlock_t lock;
+               } all;
+
+               /*
+                * The number of available MRs ready for memory registration
+                */
+               struct {
+                       atomic_t count;
+                       wait_queue_head_t wait_queue;
+               } ready;
+
+               /*
+                * The number of used MRs
+                */
+               struct {
+                       atomic_t count;
+               } used;
+
+               struct work_struct recovery_work;
+
+               /* Used by transport to wait until all MRs are returned */
+               struct {
+                       wait_queue_head_t wait_queue;
+               } cleanup;
+       } mr_io;
+
        /*
         * The state for RDMA read/write requests on the server
         */
@@ -269,6 +307,13 @@ static __always_inline void smbdirect_socket_init(struct smbdirect_socket *sc)
 
        atomic_set(&sc->rw_io.credits.count, 0);
        init_waitqueue_head(&sc->rw_io.credits.wait_queue);
+
+       spin_lock_init(&sc->mr_io.all.lock);
+       INIT_LIST_HEAD(&sc->mr_io.all.list);
+       atomic_set(&sc->mr_io.ready.count, 0);
+       init_waitqueue_head(&sc->mr_io.ready.wait_queue);
+       atomic_set(&sc->mr_io.used.count, 0);
+       init_waitqueue_head(&sc->mr_io.cleanup.wait_queue);
 }
 
 struct smbdirect_send_io {