Commit: 324bf62
GitHub URL: https://github.com/SCST-project/scst/commit/324bf62e28189cd52abfcd6a05047452d04dd846
Author: Gleb Chesnokov
Date: 2023-07-10T10:34:57+03:00
Log Message:
-----------
iscsi-scst: Refactor sendpage functionality in write_data()
This patch carries out a refactoring of the sendpage functionality in
the write_data() function:
1. Reorganize the logic used to select the sock_sendpage function.
2. Streamline the data sending loop by reducing conditional branches and
eliminating labels.
3. Adjust the error handling for -EINTR and -EAGAIN to make the code
cleaner and easier to follow.
This patch doesn't change any functionality.
Modified Paths:
--------------
iscsi-scst/kernel/nthread.c | 98 ++++++---------
1 file changed, 36 insertions(+), 62 deletions(-)
===================================================================
diff --git a/iscsi-scst/kernel/nthread.c b/iscsi-scst/kernel/nthread.c
index 2806142..d335340 100644
--- a/iscsi-scst/kernel/nthread.c
+++ b/iscsi-scst/kernel/nthread.c
@@ -1185,15 +1185,15 @@ static int write_data(struct iscsi_conn *conn)
}
sock = conn->sock;
+ flags = MSG_DONTWAIT;
- if (parent_req->scst_cmd &&
- parent_req->scst_state != ISCSI_CMD_STATE_AEN &&
- scst_cmd_get_dh_data_buff_alloced(parent_req->scst_cmd))
- sock_sendpage = sock_no_sendpage;
- else
+ if (sg != write_cmnd->rsp_sg &&
+ (!parent_req->scst_cmd || parent_req->scst_state == ISCSI_CMD_STATE_AEN ||
+ !scst_cmd_get_dh_data_buff_alloced(parent_req->scst_cmd)))
sock_sendpage = sock->ops->sendpage;
+ else
+ sock_sendpage = sock_no_sendpage;
- flags = MSG_DONTWAIT;
sg_size = size;
if (sg != write_cmnd->rsp_sg) {
@@ -1222,7 +1222,6 @@ static int write_data(struct iscsi_conn *conn)
}
length = sg[idx].length - offset;
offset += sg[idx].offset;
- sock_sendpage = sock_no_sendpage;
TRACE_WRITE("rsp_sg: write_offset %d, sg_size %lu, idx %d, offset %d, length %lu",
conn->write_offset, sg_size, idx, offset, length);
}
@@ -1230,84 +1229,59 @@ static int write_data(struct iscsi_conn *conn)
while (true) {
sendsize = min_t(size_t, size, length);
- if (size <= sendsize) {
-retry2:
- res = sock_sendpage(sock, page, offset, size, flags);
+
+ if (sendsize == size)
+ flags &= ~MSG_MORE;
+ else
+ flags |= MSG_MORE;
+
+ while (sendsize) {
+ res = sock_sendpage(sock, page, offset, sendsize, flags);
TRACE_WRITE(
- "Final %s sid %#Lx, cid %u, res %d (page index %lu, offset %u, size %lu, cmd %p, page %p)",
+ "%s sid %#Lx, cid %u, res %d (page index %lu, offset %u, sendsize %lu, size %lu, cmd %p, page %p)",
(sock_sendpage != sock_no_sendpage) ?
"sendpage" : "sock_no_sendpage",
- (unsigned long long)conn->session->sid,
- conn->cid, res, page->index,
- offset, size, write_cmnd, page);
+ (unsigned long long)conn->session->sid, conn->cid,
+ res, page->index, offset, sendsize, size,
+ write_cmnd, page);
+
if (unlikely(res <= 0)) {
if (res == -EINTR)
- goto retry2;
- else
- goto out_res;
- }
+ continue;
+
+ if (res == -EAGAIN) {
+ conn->write_offset += sg_size - size;
+ goto out_iov;
+ }
- if (res == size) {
- conn->write_size = 0;
- res = saved_size;
- goto out;
+ goto out_err;
}
offset += res;
+ sendsize -= res;
size -= res;
- goto retry2;
- }
-
-retry1:
- res = sock_sendpage(sock, page, offset, sendsize, flags | MSG_MORE);
- TRACE_WRITE(
- "%s sid %#Lx, cid %u, res %d (page index %lu, offset %u, sendsize %lu, size %lu, cmd %p, page %p)",
- (sock_sendpage != sock_no_sendpage) ?
- "sendpage" : "sock_no_sendpage",
- (unsigned long long)conn->session->sid, conn->cid,
- res, page->index, offset, sendsize, size,
- write_cmnd, page);
- if (unlikely(res <= 0)) {
- if (res == -EINTR)
- goto retry1;
- else
- goto out_res;
}
- size -= res;
+ if (size == 0)
+ goto out_iov;
- if (res == sendsize) {
- idx++;
- EXTRACHECKS_BUG_ON(idx >= ref_cmd->sg_cnt);
- page = sg_page(&sg[idx]);
- length = sg[idx].length;
- offset = sg[idx].offset;
- } else {
- offset += res;
- sendsize -= res;
- goto retry1;
- }
+ idx++;
+ EXTRACHECKS_BUG_ON(idx >= ref_cmd->sg_cnt);
+ page = sg_page(&sg[idx]);
+ length = sg[idx].length;
+ offset = sg[idx].offset;
}
-out_off:
- conn->write_offset += sg_size - size;
-
out_iov:
conn->write_size = size;
- if ((saved_size == size) && res == -EAGAIN)
- goto out;
- res = saved_size - size;
+ if (res != -EAGAIN || saved_size != size)
+ res = saved_size - size;
out:
TRACE_EXIT_RES(res);
return res;
-out_res:
- if (res == -EAGAIN)
- goto out_off;
- /* else go through */
-
out_err:
#ifndef CONFIG_SCST_DEBUG
if (!conn->closing) {
|