sock: Add new API to set default sock implementation

When uring is enabled, uring socket implementation is
used to create sockets. We may want to use posix sockets
for some reasons (e.g. performance tests). This patch adds
a new API function to set the socket implementation which
will be used by default, e.g. when no impl_name is passed
to spdk_sock_connect/spdk_sock_listen functions.

Misc changes: include spdk_internal/log.h to register
SOCK log component. The new include header already
includes spdk/sock.h and spdk/queue.h, sow remove
direct inclusion of these headers.

Change-Id: I4abad0a59cd033b15bd43a00e3dbdf313fa6b06c
Signed-off-by: Alexey Marchuk <alexeymar@mellanox.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/4327
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
This commit is contained in:
Alexey Marchuk 2020-09-21 14:07:52 +03:00 committed by Tomasz Zawadzki
parent d0b8347d9e
commit 079f2d0abe
4 changed files with 66 additions and 4 deletions

View File

@ -477,6 +477,17 @@ int spdk_sock_impl_get_opts(const char *impl_name, struct spdk_sock_impl_opts *o
int spdk_sock_impl_set_opts(const char *impl_name, const struct spdk_sock_impl_opts *opts, int spdk_sock_impl_set_opts(const char *impl_name, const struct spdk_sock_impl_opts *opts,
size_t len); size_t len);
/**
* Set the given sock implementation to be used a default one.
*
* Note: passing a specific sock implementation name in some sock API functions
* (such as @ref spdk_sock_connect, @ref spdk_sock_listen and etc) ignores the default value set by this function.
*
* \param impl_name The socket implementation to use, such as "posix".
* \return 0 on success, -1 on failure. errno is set to indicate the reason of failure.
*/
int spdk_sock_set_default_impl(const char *impl_name);
/** /**
* Write socket subsystem configuration into provided JSON context. * Write socket subsystem configuration into provided JSON context.
* *

View File

@ -2,6 +2,7 @@
# BSD LICENSE # BSD LICENSE
# #
# Copyright (c) Intel Corporation. # Copyright (c) Intel Corporation.
# Copyright (c) 2020 Mellanox Technologies LTD
# All rights reserved. # All rights reserved.
# #
# Redistribution and use in source and binary forms, with or without # Redistribution and use in source and binary forms, with or without

View File

@ -33,16 +33,16 @@
#include "spdk/stdinc.h" #include "spdk/stdinc.h"
#include "spdk/log.h"
#include "spdk/sock.h" #include "spdk/sock.h"
#include "spdk_internal/sock.h" #include "spdk_internal/sock.h"
#include "spdk/queue.h" #include "spdk_internal/log.h"
#define SPDK_SOCK_DEFAULT_PRIORITY 0 #define SPDK_SOCK_DEFAULT_PRIORITY 0
#define SPDK_SOCK_DEFAULT_ZCOPY true #define SPDK_SOCK_DEFAULT_ZCOPY true
#define SPDK_SOCK_OPTS_FIELD_OK(opts, field) (offsetof(struct spdk_sock_opts, field) + sizeof(opts->field) <= (opts->opts_size)) #define SPDK_SOCK_OPTS_FIELD_OK(opts, field) (offsetof(struct spdk_sock_opts, field) + sizeof(opts->field) <= (opts->opts_size))
static STAILQ_HEAD(, spdk_net_impl) g_net_impls = STAILQ_HEAD_INITIALIZER(g_net_impls); static STAILQ_HEAD(, spdk_net_impl) g_net_impls = STAILQ_HEAD_INITIALIZER(g_net_impls);
static struct spdk_net_impl *g_default_impl;
struct spdk_sock_placement_id_entry { struct spdk_sock_placement_id_entry {
int placement_id; int placement_id;
@ -233,22 +233,30 @@ spdk_sock_connect(const char *ip, int port, char *impl_name)
} }
struct spdk_sock * struct spdk_sock *
spdk_sock_connect_ext(const char *ip, int port, char *impl_name, struct spdk_sock_opts *opts) spdk_sock_connect_ext(const char *ip, int port, char *_impl_name, struct spdk_sock_opts *opts)
{ {
struct spdk_net_impl *impl = NULL; struct spdk_net_impl *impl = NULL;
struct spdk_sock *sock; struct spdk_sock *sock;
struct spdk_sock_opts opts_local; struct spdk_sock_opts opts_local;
const char *impl_name = NULL;
if (opts == NULL) { if (opts == NULL) {
SPDK_ERRLOG("the opts should not be NULL pointer\n"); SPDK_ERRLOG("the opts should not be NULL pointer\n");
return NULL; return NULL;
} }
if (_impl_name) {
impl_name = _impl_name;
} else if (g_default_impl) {
impl_name = g_default_impl->name;
}
STAILQ_FOREACH_FROM(impl, &g_net_impls, link) { STAILQ_FOREACH_FROM(impl, &g_net_impls, link) {
if (impl_name && strncmp(impl_name, impl->name, strlen(impl->name) + 1)) { if (impl_name && strncmp(impl_name, impl->name, strlen(impl->name) + 1)) {
continue; continue;
} }
SPDK_DEBUGLOG(SPDK_LOG_SOCK, "Creating a client socket using impl %s\n", impl->name);
sock_init_opts(&opts_local, opts); sock_init_opts(&opts_local, opts);
sock = impl->connect(ip, port, &opts_local); sock = impl->connect(ip, port, &opts_local);
if (sock != NULL) { if (sock != NULL) {
@ -275,22 +283,30 @@ spdk_sock_listen(const char *ip, int port, char *impl_name)
} }
struct spdk_sock * struct spdk_sock *
spdk_sock_listen_ext(const char *ip, int port, char *impl_name, struct spdk_sock_opts *opts) spdk_sock_listen_ext(const char *ip, int port, char *_impl_name, struct spdk_sock_opts *opts)
{ {
struct spdk_net_impl *impl = NULL; struct spdk_net_impl *impl = NULL;
struct spdk_sock *sock; struct spdk_sock *sock;
struct spdk_sock_opts opts_local; struct spdk_sock_opts opts_local;
const char *impl_name = NULL;
if (opts == NULL) { if (opts == NULL) {
SPDK_ERRLOG("the opts should not be NULL pointer\n"); SPDK_ERRLOG("the opts should not be NULL pointer\n");
return NULL; return NULL;
} }
if (_impl_name) {
impl_name = _impl_name;
} else if (g_default_impl) {
impl_name = g_default_impl->name;
}
STAILQ_FOREACH_FROM(impl, &g_net_impls, link) { STAILQ_FOREACH_FROM(impl, &g_net_impls, link) {
if (impl_name && strncmp(impl_name, impl->name, strlen(impl->name) + 1)) { if (impl_name && strncmp(impl_name, impl->name, strlen(impl->name) + 1)) {
continue; continue;
} }
SPDK_DEBUGLOG(SPDK_LOG_SOCK, "Creating a listening socket using impl %s\n", impl->name);
sock_init_opts(&opts_local, opts); sock_init_opts(&opts_local, opts);
sock = impl->listen(ip, port, &opts_local); sock = impl->listen(ip, port, &opts_local);
if (sock != NULL) { if (sock != NULL) {
@ -832,3 +848,36 @@ spdk_net_impl_register(struct spdk_net_impl *impl, int priority)
STAILQ_INSERT_HEAD(&g_net_impls, impl, link); STAILQ_INSERT_HEAD(&g_net_impls, impl, link);
} }
} }
int spdk_sock_set_default_impl(const char *impl_name)
{
struct spdk_net_impl *impl;
if (!impl_name) {
errno = EINVAL;
return -1;
}
impl = sock_get_impl_by_name(impl_name);
if (!impl) {
errno = EINVAL;
return -1;
}
if (impl == g_default_impl) {
return 0;
}
if (g_default_impl) {
SPDK_DEBUGLOG(SPDK_LOG_SOCK, "Change the default sock impl from %s to %s\n", g_default_impl->name,
impl->name);
} else {
SPDK_DEBUGLOG(SPDK_LOG_SOCK, "Set default sock implementation to %s\n", impl_name);
}
g_default_impl = impl;
return 0;
}
SPDK_LOG_REGISTER_COMPONENT("sock", SPDK_LOG_SOCK)

View File

@ -31,6 +31,7 @@
spdk_sock_get_optimal_sock_group; spdk_sock_get_optimal_sock_group;
spdk_sock_impl_get_opts; spdk_sock_impl_get_opts;
spdk_sock_impl_set_opts; spdk_sock_impl_set_opts;
spdk_sock_set_default_impl;
spdk_sock_write_config_json; spdk_sock_write_config_json;
# public functions in spdk/net.h # public functions in spdk/net.h