sq P4.1: prepare smbd_smb2_flush_with_io_uring smb2srv:send_uring smb2srv:send_uring_...
authorStefan Metzmacher <metze@samba.org>
Tue, 27 Sep 2022 17:58:08 +0000 (19:58 +0200)
committerStefan Metzmacher <metze@samba.org>
Mon, 16 Oct 2023 11:03:47 +0000 (13:03 +0200)
source3/smbd/globals.h
source3/smbd/smb2_server.c

index a4b4b5d6d03256bc6d6b6cdc7969c3fd2f59bc63..5501b5bcb1904b89234aa157cbd2e35df24d2fdf 100644 (file)
@@ -698,7 +698,7 @@ struct smbd_smb2_send_queue {
        int count;
 
        struct {
-               bool pending;
+               bool pending_snd;
                size_t pending_zc;
                struct samba_io_uring_completion completion;
                struct samba_io_uring_submission submission;
index 0485b2a80793493112b021532a0682e4a7c79442..2ee8dda78488650308989a5db32674577257e932 100644 (file)
@@ -407,26 +407,26 @@ static void smbd_smb2_send_queue_destruction_completion_io_uring(struct samba_io
        uint64_t user_data = io_uring_cqe_get_data64(cqe);
 
        sqe = samba_io_uring_submission_sqe(&e->io_uring.submission);
-               DBG_DEBUG("opcode[%u][%s] cqe->res[%d][0x%x] cqe->flags[0x%x] cqe->user_data[%llu][0x%llx] e[%p]->io_uring.pending[%u] e->io_uring.pending_zc[%zu]\n",
+               DBG_DEBUG("opcode[%u][%s] cqe->res[%d][0x%x] cqe->flags[0x%x] cqe->user_data[%llu][0x%llx] e[%p]->io_uring.pending_snd[%u] e->io_uring.pending_zc[%zu]\n",
                             sqe->opcode,
                             (sqe->opcode == IORING_OP_SENDMSG_ZC) ? "SENDMSG_ZC" : "SENDMSG",
                             cqe->res, cqe->res, cqe->flags,
                             (unsigned long long)user_data,
                             (unsigned long long)user_data,
-                            e, e->io_uring.pending, e->io_uring.pending_zc);
+                            e, e->io_uring.pending_snd, e->io_uring.pending_zc);
        if (sqe->opcode == IORING_OP_SENDMSG_ZC) {
                SMB_ASSERT(e->ack.req == NULL);
                if (cqe->flags & IORING_CQE_F_MORE) {
                                DBG_DEBUG("%s:\n", __location__);
-                       SMB_ASSERT(e->io_uring.pending);
-                       e->io_uring.pending = false;
+                       SMB_ASSERT(e->io_uring.pending_snd);
+                       e->io_uring.pending_snd = false;
                        SMB_ASSERT(completion == &e->io_uring.completion);
                        samba_io_uring_completion_get(&e->io_uring.completion);
                        e->io_uring.pending_zc += 1;
                } else if (cqe->flags & IORING_CQE_F_NOTIF) {
                        SMB_ASSERT(e->io_uring.pending_zc > 0);
                        e->io_uring.pending_zc -= 1;
-                       if (e->io_uring.pending || e->io_uring.pending_zc > 0) {
+                       if (e->io_uring.pending_snd || e->io_uring.pending_zc > 0) {
                                DBG_DEBUG("%s: IORING_CQE_F_NOTIF still pending\n", __location__);
                                return;
                        }
@@ -435,14 +435,14 @@ static void smbd_smb2_send_queue_destruction_completion_io_uring(struct samba_io
                                DBG_DEBUG("%s: IORING_CQE_F_NOTIF after talloc_free\n", __location__);
                        return;
                } else {
-                       SMB_ASSERT(e->io_uring.pending);
-                       e->io_uring.pending = false;
+                       SMB_ASSERT(e->io_uring.pending_snd);
+                       e->io_uring.pending_snd = false;
                                DBG_DEBUG("%s: NO_FLAG!!!!\n", __location__);
                }
        } else {
                                DBG_DEBUG("%s: NORMAL SENDMSG\n", __location__);
-               SMB_ASSERT(e->io_uring.pending);
-               e->io_uring.pending = false;
+               SMB_ASSERT(e->io_uring.pending_snd);
+               e->io_uring.pending_snd = false;
                SMB_ASSERT(!(cqe->flags & IORING_CQE_F_MORE));
                SMB_ASSERT(!(cqe->flags & IORING_CQE_F_NOTIF));
        }
@@ -453,7 +453,15 @@ static void smbd_smb2_send_queue_destruction_completion_io_uring(struct samba_io
 
 static int smbd_smb2_send_queue_destruction(struct smbd_smb2_send_queue *e)
 {
-       if (!e->io_uring.pending && e->io_uring.pending_zc == 0) {
+       size_t pending;
+
+       if (e->xconn != NULL && e->xconn->smb2.send_uring != NULL) {
+               samba_io_uring_cancel_submissions(e->xconn->smb2.send_uring,
+                                                 &e->io_uring.submission);
+       }
+
+       pending = samba_io_uring_completion_pending(&e->io_uring.completion);
+       if (pending == 0) {
                if (e->mem_ctx == NULL) {
                        DBG_DEBUG("e[%p] not queued \n", e);
                        return 0;
@@ -466,9 +474,10 @@ static int smbd_smb2_send_queue_destruction(struct smbd_smb2_send_queue *e)
                return 0;
        }
 
-       DBG_DEBUG("e[%p]->io_uring.pending[%u] e->io_uring.pending_zc[%zu]\n", e, e->io_uring.pending, e->io_uring.pending_zc);
-       e->io_uring.completion.completion_fn = smbd_smb2_send_queue_destruction_completion_io_uring;
-       e->io_uring.completion.completion_private = e;
+       DBG_DEBUG("e[%p]->io_uring.pending_snd[%u] e->io_uring.pending_zc[%zu]\n", e, e->io_uring.pending_snd, e->io_uring.pending_zc);
+       samba_io_uring_completion_update(&e->io_uring.completion,
+                                        smbd_smb2_send_queue_destruction_completion_io_uring,
+                                        e);
 
        if (e->xconn != NULL) {
                DBG_DEBUG("e[%p] steal...\n", e);
@@ -4873,8 +4882,8 @@ static NTSTATUS smbd_smb2_advance_send_queue(struct smbXsrv_connection *xconn,
 
        xconn->ack.unacked_bytes += n;
 
-               DBG_DEBUG("n[%zu] e[%p]->io_uring.pending[%u] e->io_uring.pending_zc[%zu]\n",
-                            n, e, e->io_uring.pending, e->io_uring.pending_zc);
+               DBG_DEBUG("n[%zu] e[%p]->io_uring.pending_snd[%u] e->io_uring.pending_zc[%zu]\n",
+                            n, e, e->io_uring.pending_snd, e->io_uring.pending_zc);
        debug_iovec(e->vector, e->count);
 
        ok = iov_advance(&e->vector, &e->count, n);
@@ -5055,10 +5064,10 @@ static NTSTATUS smbd_smb2_flush_with_io_uring(struct smbXsrv_connection *xconn)
 
                SMB_ASSERT(e->sendfile_header == NULL);
 
-               DBG_DEBUG("e[%p]->io_uring.pending[%u] e->io_uring.pending_zc[%zu]\n",
-                            e, e->io_uring.pending, e->io_uring.pending_zc);
+               DBG_DEBUG("e[%p]->io_uring.pending_snd[%u] e->io_uring.pending_zc[%zu]\n",
+                            e, e->io_uring.pending_snd, e->io_uring.pending_zc);
                debug_iovec(e->vector, e->count);
-               if (e->io_uring.pending) {
+               if (e->io_uring.pending_snd) {
                        /*
                         * This is already in progress
                         */
@@ -5111,9 +5120,9 @@ static NTSTATUS smbd_smb2_flush_with_io_uring(struct smbXsrv_connection *xconn)
                        }
 
                                DBG_DEBUG("%s:\n", __location__);
-                       e->io_uring.pending = true;
+                       e->io_uring.pending_snd = true;
                        submission = &e->io_uring.submission;
-               } else if (e->io_uring.pending_zc > 0) {
+               } else if (0 && e->io_uring.pending_zc > 0) {
                                DBG_ERR("%s: RETRY with PENDING e->io_uring.pending_zc[%zu]\n", __location__, e->io_uring.pending_zc);
                        return NT_STATUS_OK;
                } else {
@@ -5122,8 +5131,8 @@ static NTSTATUS smbd_smb2_flush_with_io_uring(struct smbXsrv_connection *xconn)
 
                                DBG_DEBUG("%s:\n", __location__);
                samba_io_uring_queue_submissions(xconn->smb2.send_uring, submission);
-               DBG_DEBUG("e[%p]->io_uring.pending[%u] e->io_uring.pending_zc[%zu]\n",
-                            e, e->io_uring.pending, e->io_uring.pending_zc);
+               DBG_DEBUG("e[%p]->io_uring.pending_snd[%u] e->io_uring.pending_zc[%zu]\n",
+                            e, e->io_uring.pending_snd, e->io_uring.pending_zc);
        }
 
        return NT_STATUS_MORE_PROCESSING_REQUIRED;
@@ -5142,26 +5151,26 @@ static void smbd_smb2_flush_completion_io_uring(struct samba_io_uring_completion
        uint64_t user_data = io_uring_cqe_get_data64(cqe);
 
        sqe = samba_io_uring_submission_sqe(&e->io_uring.submission);
-               DBG_DEBUG("opcode[%u][%s] cqe->res[%d][0x%x] cqe->flags[0x%x] cqe->user_data[%llu][0x%llx] e[%p]->io_uring.pending[%u] e->io_uring.pending_zc[%zu]\n",
+               DBG_DEBUG("opcode[%u][%s] cqe->res[%d][0x%x] cqe->flags[0x%x] cqe->user_data[%llu][0x%llx] e[%p]->io_uring.pending_snd[%u] e->io_uring.pending_zc[%zu]\n",
                             sqe->opcode,
                             (sqe->opcode == IORING_OP_SENDMSG_ZC) ? "SENDMSG_ZC" : "SENDMSG",
                             cqe->res, cqe->res, cqe->flags,
                             (unsigned long long)user_data,
                             (unsigned long long)user_data,
-                            e, e->io_uring.pending, e->io_uring.pending_zc);
+                            e, e->io_uring.pending_snd, e->io_uring.pending_zc);
        if (sqe->opcode == IORING_OP_SENDMSG_ZC) {
                SMB_ASSERT(e->ack.req == NULL);
                if (cqe->flags & IORING_CQE_F_MORE) {
                                DBG_DEBUG("%s:\n", __location__);
-                       SMB_ASSERT(e->io_uring.pending);
-                       e->io_uring.pending = false;
+                       SMB_ASSERT(e->io_uring.pending_snd);
+                       e->io_uring.pending_snd = false;
                        SMB_ASSERT(completion == &e->io_uring.completion);
                        samba_io_uring_completion_get(&e->io_uring.completion);
                        e->io_uring.pending_zc += 1;
                } else if (cqe->flags & IORING_CQE_F_NOTIF) {
                        SMB_ASSERT(e->io_uring.pending_zc > 0);
                        e->io_uring.pending_zc -= 1;
-                       if (e->io_uring.pending || e->io_uring.pending_zc > 0) {
+                       if (e->io_uring.pending_snd || e->io_uring.pending_zc > 0) {
                                DBG_DEBUG("%s: IORING_CQE_F_NOTIF still pending\n", __location__);
                                return;
                        }
@@ -5173,14 +5182,14 @@ static void smbd_smb2_flush_completion_io_uring(struct samba_io_uring_completion
        smbd_smb2_flush_send_queue(xconn);
                        return;
                } else {
-                       SMB_ASSERT(e->io_uring.pending);
-                       e->io_uring.pending = false;
+                       SMB_ASSERT(e->io_uring.pending_snd);
+                       e->io_uring.pending_snd = false;
                                DBG_DEBUG("%s: NO_FLAG!!!!\n", __location__);
                }
        } else {
                                DBG_DEBUG("%s: NORMAL SENDMSG\n", __location__);
-               SMB_ASSERT(e->io_uring.pending);
-               e->io_uring.pending = false;
+               SMB_ASSERT(e->io_uring.pending_snd);
+               e->io_uring.pending_snd = false;
                SMB_ASSERT(!(cqe->flags & IORING_CQE_F_MORE));
                SMB_ASSERT(!(cqe->flags & IORING_CQE_F_NOTIF));
        }
@@ -5194,21 +5203,13 @@ static void smbd_smb2_flush_completion_io_uring(struct samba_io_uring_completion
        } else if (ret < 0) {
                status = map_nt_error_from_unix_common(-ret);
        }
-                               DBG_DEBUG("%s: %s\n", __location__, nt_errstr(status));
        if (!NT_STATUS_IS_OK(status)) {
                smbd_server_connection_terminate(xconn, nt_errstr(status));
                return;
        }
 
-                               DBG_DEBUG("%s:\n", __location__);
        status = smbd_smb2_advance_send_queue(xconn, &e, ret);
-                               DBG_DEBUG("%s: %s\n", __location__, nt_errstr(status));
        if (NT_STATUS_EQUAL(status, NT_STATUS_RETRY)) {
-               //size_t pending_zc = e->io_uring.pending_zc;
-               ///* retry later */
-               //ZERO_STRUCT(e->io_uring);
-               //e->io_uring.pending_zc = pending_zc;
-               //              DBG_ERR("%s:\n", __location__);
                smbd_smb2_flush_send_queue(xconn);
                return;
        }
@@ -5217,7 +5218,6 @@ static void smbd_smb2_flush_completion_io_uring(struct samba_io_uring_completion
                return;
        }
 
-                               DBG_DEBUG("%s: END FLUSH\n", __location__);
        smbd_smb2_flush_send_queue(xconn);
 }