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;
}
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));
}
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;
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);
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);
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
*/
}
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 {
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;
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;
}
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));
}
} 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;
}
return;
}
- DBG_DEBUG("%s: END FLUSH\n", __location__);
smbd_smb2_flush_send_queue(xconn);
}