Commit c38a1bc0 authored by Ziye Yang's avatar Ziye Yang Committed by Tomasz Zawadzki
Browse files

sock: create spdk_sock_prep_reqs function.



The purpose is to reduce the duplicated functions
in posix and uring implmentation.

Signed-off-by: default avatarZiye Yang <ziye.yang@intel.com>
Change-Id: Ia0568b2490d362e7e78fa59b3ca88a60313ba0bd
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/5284


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Community-CI: Mellanox Build Bot
Reviewed-by: default avatarShuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-by: default avatarAleksey Marchuk <alexeymar@mellanox.com>
parent 0e99c68d
Loading
Loading
Loading
Loading
+56 −0
Original line number Diff line number Diff line
@@ -41,6 +41,7 @@
#include "spdk/stdinc.h"
#include "spdk/sock.h"
#include "spdk/queue.h"
#include "spdk/likely.h"

#ifdef __cplusplus
extern "C" {
@@ -51,6 +52,7 @@ extern "C" {
#define MIN_SOCK_PIPE_SIZE 1024
#define MIN_SO_RCVBUF_SIZE (2 * 1024 * 1024)
#define MIN_SO_SNDBUF_SIZE (2 * 1024 * 1024)
#define IOV_BATCH_SIZE 64

struct spdk_sock {
	struct spdk_net_impl		*net_impl;
@@ -221,6 +223,60 @@ spdk_sock_abort_requests(struct spdk_sock *sock)
	return rc;
}

static inline int
spdk_sock_prep_reqs(struct spdk_sock *_sock, struct iovec *iovs, int index,
		    struct spdk_sock_request **last_req)
{
	int iovcnt, i;
	struct spdk_sock_request *req;
	unsigned int offset;

	/* Gather an iov */
	iovcnt = index;
	if (spdk_unlikely(iovcnt >= IOV_BATCH_SIZE)) {
		goto end;
	}

	if (last_req != NULL && *last_req != NULL) {
		req = TAILQ_NEXT(*last_req, internal.link);
	} else {
		req = TAILQ_FIRST(&_sock->queued_reqs);
	}

	while (req) {
		offset = req->internal.offset;

		for (i = 0; i < req->iovcnt; i++) {
			/* Consume any offset first */
			if (offset >= SPDK_SOCK_REQUEST_IOV(req, i)->iov_len) {
				offset -= SPDK_SOCK_REQUEST_IOV(req, i)->iov_len;
				continue;
			}

			iovs[iovcnt].iov_base = SPDK_SOCK_REQUEST_IOV(req, i)->iov_base + offset;
			iovs[iovcnt].iov_len = SPDK_SOCK_REQUEST_IOV(req, i)->iov_len - offset;
			iovcnt++;

			offset = 0;

			if (iovcnt >= IOV_BATCH_SIZE) {
				break;
			}
		}
		if (iovcnt >= IOV_BATCH_SIZE) {
			break;
		}

		if (last_req != NULL) {
			*last_req = req;
		}
		req = TAILQ_NEXT(req, internal.link);
	}

end:
	return iovcnt;
}

#ifdef __cplusplus
}
#endif
+1 −32
Original line number Diff line number Diff line
@@ -44,12 +44,10 @@
#include "spdk/pipe.h"
#include "spdk/sock.h"
#include "spdk/util.h"
#include "spdk/likely.h"
#include "spdk_internal/sock.h"

#define MAX_TMPBUF 1024
#define PORTNUMLEN 32
#define IOV_BATCH_SIZE 64

#if defined(SO_ZEROCOPY) && defined(MSG_ZEROCOPY)
#define SPDK_ZEROCOPY
@@ -750,36 +748,7 @@ _sock_flush(struct spdk_sock *sock)
		return 0;
	}

	/* Gather an iov */
	iovcnt = 0;
	req = TAILQ_FIRST(&sock->queued_reqs);
	while (req) {
		offset = req->internal.offset;

		for (i = 0; i < req->iovcnt; i++) {
			/* Consume any offset first */
			if (offset >= SPDK_SOCK_REQUEST_IOV(req, i)->iov_len) {
				offset -= SPDK_SOCK_REQUEST_IOV(req, i)->iov_len;
				continue;
			}

			iovs[iovcnt].iov_base = SPDK_SOCK_REQUEST_IOV(req, i)->iov_base + offset;
			iovs[iovcnt].iov_len = SPDK_SOCK_REQUEST_IOV(req, i)->iov_len - offset;
			iovcnt++;

			offset = 0;

			if (iovcnt >= IOV_BATCH_SIZE) {
				break;
			}
		}

		if (iovcnt >= IOV_BATCH_SIZE) {
			break;
		}

		req = TAILQ_NEXT(req, internal.link);
	}
	iovcnt = spdk_sock_prep_reqs(sock, iovs, 0, NULL);

	if (iovcnt == 0) {
		return 0;
+2 −58
Original line number Diff line number Diff line
@@ -38,7 +38,6 @@
#include <liburing.h>

#include "spdk/barrier.h"
#include "spdk/likely.h"
#include "spdk/log.h"
#include "spdk/pipe.h"
#include "spdk/sock.h"
@@ -51,7 +50,6 @@
#define MAX_TMPBUF 1024
#define PORTNUMLEN 32
#define SPDK_SOCK_GROUP_QUEUE_DEPTH 4096
#define IOV_BATCH_SIZE 64

enum spdk_sock_task_type {
	SPDK_SOCK_TASK_POLLIN = 0,
@@ -720,60 +718,6 @@ uring_sock_writev(struct spdk_sock *_sock, struct iovec *iov, int iovcnt)
	return writev(sock->fd, iov, iovcnt);
}

static int
sock_prep_reqs(struct spdk_sock *_sock, struct iovec *iovs, int index,
	       struct spdk_sock_request **last_req)
{
	int iovcnt, i;
	struct spdk_sock_request *req;
	unsigned int offset;

	/* Gather an iov */
	iovcnt = index;
	if (spdk_unlikely(iovcnt >= IOV_BATCH_SIZE)) {
		goto end;
	}

	if (last_req != NULL && *last_req != NULL) {
		req = TAILQ_NEXT(*last_req, internal.link);
	} else {
		req = TAILQ_FIRST(&_sock->queued_reqs);
	}

	while (req) {
		offset = req->internal.offset;

		for (i = 0; i < req->iovcnt; i++) {
			/* Consume any offset first */
			if (offset >= SPDK_SOCK_REQUEST_IOV(req, i)->iov_len) {
				offset -= SPDK_SOCK_REQUEST_IOV(req, i)->iov_len;
				continue;
			}

			iovs[iovcnt].iov_base = SPDK_SOCK_REQUEST_IOV(req, i)->iov_base + offset;
			iovs[iovcnt].iov_len = SPDK_SOCK_REQUEST_IOV(req, i)->iov_len - offset;
			iovcnt++;

			offset = 0;

			if (iovcnt >= IOV_BATCH_SIZE) {
				break;
			}
		}
		if (iovcnt >= IOV_BATCH_SIZE) {
			break;
		}

		if (last_req != NULL) {
			*last_req = req;
		}
		req = TAILQ_NEXT(req, internal.link);
	}

end:
	return iovcnt;
}

static int
sock_complete_reqs(struct spdk_sock *_sock, ssize_t rc)
{
@@ -838,7 +782,7 @@ _sock_flush(struct spdk_sock *_sock)
		return;
	}

	iovcnt = sock_prep_reqs(&sock->base, task->iovs, task->iov_cnt, &task->last_req);
	iovcnt = spdk_sock_prep_reqs(&sock->base, task->iovs, task->iov_cnt, &task->last_req);
	if (!iovcnt) {
		return;
	}
@@ -1010,7 +954,7 @@ _sock_flush_client(struct spdk_sock *_sock)
	}

	/* Gather an iov */
	iovcnt = sock_prep_reqs(_sock, iovs, 0, NULL);
	iovcnt = spdk_sock_prep_reqs(_sock, iovs, 0, NULL);
	if (iovcnt == 0) {
		return 0;
	}
+3 −3
Original line number Diff line number Diff line
@@ -203,7 +203,7 @@ flush_server(void)
	 * that is fully completed. */
	spdk_sock_request_queue(sock, req1);
	cb_arg1 = false;
	rc = sock_prep_reqs(sock, usock.write_task.iovs, 0, NULL);
	rc = spdk_sock_prep_reqs(sock, usock.write_task.iovs, 0, NULL);
	CU_ASSERT(rc == 2);
	sock_complete_reqs(sock, 128);
	CU_ASSERT(cb_arg1 == true);
@@ -214,7 +214,7 @@ flush_server(void)
	spdk_sock_request_queue(sock, req2);
	cb_arg1 = false;
	cb_arg2 = false;
	rc = sock_prep_reqs(sock, usock.write_task.iovs, 0, NULL);
	rc = spdk_sock_prep_reqs(sock, usock.write_task.iovs, 0, NULL);
	CU_ASSERT(rc == 4);
	sock_complete_reqs(sock, 192);
	CU_ASSERT(cb_arg1 == true);
@@ -225,7 +225,7 @@ flush_server(void)
	/* One request that is partially sent. */
	spdk_sock_request_queue(sock, req1);
	cb_arg1 = false;
	rc = sock_prep_reqs(sock, usock.write_task.iovs, 0, NULL);
	rc = spdk_sock_prep_reqs(sock, usock.write_task.iovs, 0, NULL);
	CU_ASSERT(rc == 2);
	sock_complete_reqs(sock, 92);
	CU_ASSERT(rc == 2);