sock: Don't cache placement_id in generic sock struct

Instead, move it down to the modules. This allows modules
to potentially change the value, if they are able.

Change-Id: I08f5fbadf5d1e96b489ddaaca72aa051ce2cb85c
Signed-off-by: Ben Walker <benjamin.walker@intel.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/7212
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Changpeng Liu <changpeng.liu@intel.com>
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
This commit is contained in:
Ben Walker 2021-03-30 13:01:23 -07:00 committed by Jim Harris
parent 1d2613fe36
commit e8bcf36a81
4 changed files with 52 additions and 76 deletions

View File

@ -66,7 +66,6 @@ struct spdk_sock {
int cb_cnt;
spdk_sock_cb cb_fn;
void *cb_arg;
int placement_id;
struct {
uint8_t closed : 1;
uint8_t reserved : 7;
@ -271,6 +270,35 @@ end:
return iovcnt;
}
static inline void
spdk_sock_get_placement_id(int fd, enum spdk_placement_mode mode, int *placement_id)
{
*placement_id = -1;
switch (mode) {
case PLACEMENT_NONE:
break;
case PLACEMENT_NAPI: {
#if defined(SO_INCOMING_NAPI_ID)
socklen_t len = sizeof(int);
getsockopt(fd, SOL_SOCKET, SO_INCOMING_NAPI_ID, placement_id, &len);
#endif
break;
}
case PLACEMENT_CPU: {
#if defined(SO_INCOMING_CPU)
socklen_t len = sizeof(int);
getsockopt(fd, SOL_SOCKET, SO_INCOMING_CPU, placement_id, &len);
#endif
break;
}
default:
break;
}
}
#ifdef __cplusplus
}
#endif

View File

@ -166,16 +166,14 @@ static int
sock_get_placement_id(struct spdk_sock *sock)
{
int rc;
int placement_id = -1;
int placement_id;
if (sock->placement_id == -1) {
rc = sock->net_impl->get_placement_id(sock, &placement_id);
if (!rc && (placement_id != -1)) {
sock->placement_id = placement_id;
}
rc = sock->net_impl->get_placement_id(sock, &placement_id);
if (rc) {
placement_id = -1;
}
return sock->placement_id;
return placement_id;
}
int
@ -278,8 +276,6 @@ spdk_sock_connect_ext(const char *ip, int port, char *_impl_name, struct spdk_so
/* Copy the contents, both the two structures are the same ABI version */
memcpy(&sock->opts, &opts_local, sizeof(sock->opts));
sock->net_impl = impl;
/* Set the placement_id to -1 explicitly */
sock->placement_id = -1;
TAILQ_INIT(&sock->queued_reqs);
TAILQ_INIT(&sock->pending_reqs);
return sock;
@ -350,8 +346,6 @@ spdk_sock_accept(struct spdk_sock *sock)
new_sock->opts = sock->opts;
memcpy(&new_sock->opts, &sock->opts, sizeof(new_sock->opts));
new_sock->net_impl = sock->net_impl;
/* Set the placement_id to -1 explicitly */
new_sock->placement_id = -1;
TAILQ_INIT(&new_sock->queued_reqs);
TAILQ_INIT(&new_sock->pending_reqs);
}

View File

@ -70,6 +70,8 @@ struct spdk_posix_sock {
bool pending_recv;
bool zcopy;
int placement_id;
TAILQ_ENTRY(spdk_posix_sock) link;
};
@ -349,6 +351,9 @@ posix_sock_alloc(int fd, bool enable_zero_copy)
SPDK_ERRLOG("quickack was failed to set\n");
}
}
spdk_sock_get_placement_id(sock->fd, g_spdk_posix_sock_impl_opts.enable_placement_id,
&sock->placement_id);
#endif
return sock;
@ -1104,41 +1109,13 @@ posix_sock_is_connected(struct spdk_sock *_sock)
static int
posix_sock_get_placement_id(struct spdk_sock *_sock, int *placement_id)
{
int rc = -1;
struct spdk_posix_sock *sock = __posix_sock(_sock);
if (!g_spdk_posix_sock_impl_opts.enable_placement_id) {
return rc;
}
assert(placement_id);
if (g_spdk_posix_sock_impl_opts.enable_placement_id != PLACEMENT_NONE) {
switch (g_spdk_posix_sock_impl_opts.enable_placement_id) {
case PLACEMENT_NAPI: {
#if defined(SO_INCOMING_NAPI_ID)
struct spdk_posix_sock *sock = __posix_sock(_sock);
socklen_t len = sizeof(int);
*placement_id = sock->placement_id;
rc = getsockopt(sock->fd, SOL_SOCKET, SO_INCOMING_NAPI_ID, placement_id, &len);
#endif
break;
}
case PLACEMENT_CPU: {
#if defined(SO_INCOMING_CPU)
struct spdk_posix_sock *sock = __posix_sock(_sock);
socklen_t len = sizeof(int);
rc = getsockopt(sock->fd, SOL_SOCKET, SO_INCOMING_CPU, placement_id, &len);
#endif
break;
}
default:
break;
}
}
if (rc != 0) {
SPDK_ERRLOG("getsockopt() failed (errno=%d)\n", errno);
}
return rc;
return 0;
}
static struct spdk_sock_group_impl *

View File

@ -85,6 +85,7 @@ struct spdk_uring_sock {
int recv_buf_sz;
bool pending_recv;
int connection_status;
int placement_id;
TAILQ_ENTRY(spdk_uring_sock) link;
};
@ -356,7 +357,11 @@ uring_sock_alloc(int fd)
SPDK_ERRLOG("quickack was failed to set\n");
}
}
spdk_sock_get_placement_id(sock->fd, g_spdk_uring_sock_impl_opts.enable_placement_id,
&sock->placement_id);
#endif
return sock;
}
@ -1092,41 +1097,13 @@ uring_sock_is_connected(struct spdk_sock *_sock)
static int
uring_sock_get_placement_id(struct spdk_sock *_sock, int *placement_id)
{
int rc = -1;
struct spdk_uring_sock *sock = __uring_sock(_sock);
if (!g_spdk_uring_sock_impl_opts.enable_placement_id) {
return rc;
}
assert(placement_id);
if (g_spdk_uring_sock_impl_opts.enable_placement_id != PLACEMENT_NONE) {
switch (g_spdk_uring_sock_impl_opts.enable_placement_id) {
case PLACEMENT_NAPI: {
#if defined(SO_INCOMING_NAPI_ID)
struct spdk_uring_sock *sock = __uring_sock(_sock);
socklen_t len = sizeof(int);
*placement_id = sock->placement_id;
rc = getsockopt(sock->fd, SOL_SOCKET, SO_INCOMING_NAPI_ID, placement_id, &len);
#endif
break;
}
case PLACEMENT_CPU: {
#if defined(SO_INCOMING_CPU)
struct spdk_uring_sock *sock = __uring_sock(_sock);
socklen_t len = sizeof(int);
rc = getsockopt(sock->fd, SOL_SOCKET, SO_INCOMING_CPU, placement_id, &len);
#endif
break;
}
default:
break;
}
}
if (rc != 0) {
SPDK_ERRLOG("getsockopt() failed (errno=%d)\n", errno);
}
return rc;
return 0;
}
static struct spdk_sock_group_impl *