virtio_blk: added virtio_blk_get_transports RPC

This patch adds virtio_blk_get_transports matching the
virtio_blk_create_transport RPC. Allowing for querying
existing virtio_blk transports and displaying their options.

Signed-off-by: Krystyna Szybalska <krystyna.szybalska@gmail.com>
Change-Id: I0ec49c5f2ad11962feb5087dd376407ad125c349
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/16303
Reviewed-by: Konrad Sztyber <konrad.sztyber@intel.com>
Reviewed-by: Tomasz Zawadzki <tomasz.zawadzki@intel.com>
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
This commit is contained in:
Krystyna Szybalska 2023-01-16 12:33:44 +01:00 committed by Tomasz Zawadzki
parent e64728f092
commit 537929e1d4
6 changed files with 164 additions and 2 deletions

View File

@ -8911,6 +8911,43 @@ Example response:
} }
~~~ ~~~
### virtio_blk_get_transports {#rpc_virtio_blk_get_transports}
#### Parameters
The user may specify no parameters in order to list all transports,
or a transport name may be specified.
Name | Optional | Type | Description
--------------------------- | -------- | ------------| -----------
name | Optional | string | Transport name.
#### Example
Example request:
~~~json
{
"jsonrpc": "2.0",
"method": "virtio_blk_get_transports",
"id": 1
}
~~~
Example response:
~~~json
{
"jsonrpc": "2.0",
"id": 1,
"result": [
{
"name": "vhost_user_blk"
}
]
}
~~~
### vhost_create_blk_controller {#rpc_vhost_create_blk_controller} ### vhost_create_blk_controller {#rpc_vhost_create_blk_controller}
Create vhost block controller Create vhost block controller

View File

@ -13,6 +13,8 @@
#include "spdk/barrier.h" #include "spdk/barrier.h"
#include "spdk/vhost.h" #include "spdk/vhost.h"
#include "vhost_internal.h" #include "vhost_internal.h"
#include "spdk/queue.h"
static struct spdk_cpuset g_vhost_core_mask; static struct spdk_cpuset g_vhost_core_mask;
@ -450,6 +452,46 @@ virtio_blk_transport_create(const char *transport_name,
return 0; return 0;
} }
struct spdk_virtio_blk_transport *
virtio_blk_transport_get_first(void)
{
return TAILQ_FIRST(&g_virtio_blk_transports);
}
struct spdk_virtio_blk_transport *
virtio_blk_transport_get_next(struct spdk_virtio_blk_transport *transport)
{
return TAILQ_NEXT(transport, tailq);
}
void
virtio_blk_transport_dump_opts(struct spdk_virtio_blk_transport *transport,
struct spdk_json_write_ctx *w)
{
spdk_json_write_object_begin(w);
spdk_json_write_named_string(w, "name", transport->ops->name);
if (transport->ops->dump_opts) {
transport->ops->dump_opts(transport, w);
}
spdk_json_write_object_end(w);
}
struct spdk_virtio_blk_transport *
virtio_blk_tgt_get_transport(const char *transport_name)
{
struct spdk_virtio_blk_transport *transport;
TAILQ_FOREACH(transport, &g_virtio_blk_transports, tailq) {
if (strcasecmp(transport->ops->name, transport_name) == 0) {
return transport;
}
}
return NULL;
}
int int
virtio_blk_transport_destroy(struct spdk_virtio_blk_transport *transport, virtio_blk_transport_destroy(struct spdk_virtio_blk_transport *transport,
spdk_vhost_fini_cb cb_fn) spdk_vhost_fini_cb cb_fn)

View File

@ -586,7 +586,12 @@ void virtio_blk_transport_register(const struct spdk_virtio_blk_transport_ops *o
int virtio_blk_transport_create(const char *transport_name, const struct spdk_json_val *params); int virtio_blk_transport_create(const char *transport_name, const struct spdk_json_val *params);
int virtio_blk_transport_destroy(struct spdk_virtio_blk_transport *transport, int virtio_blk_transport_destroy(struct spdk_virtio_blk_transport *transport,
spdk_vhost_fini_cb cb_fn); spdk_vhost_fini_cb cb_fn);
struct spdk_virtio_blk_transport *virtio_blk_transport_get_first(void);
struct spdk_virtio_blk_transport *virtio_blk_transport_get_next(
struct spdk_virtio_blk_transport *transport);
void virtio_blk_transport_dump_opts(struct spdk_virtio_blk_transport *transport,
struct spdk_json_write_ctx *w);
struct spdk_virtio_blk_transport *virtio_blk_tgt_get_transport(const char *transport_name);
const struct spdk_virtio_blk_transport_ops *virtio_blk_get_transport_ops( const struct spdk_virtio_blk_transport_ops *virtio_blk_get_transport_ops(
const char *transport_name); const char *transport_name);

View File

@ -10,7 +10,7 @@
#include "spdk/util.h" #include "spdk/util.h"
#include "spdk/string.h" #include "spdk/string.h"
#include "spdk/env.h" #include "spdk/env.h"
#include "spdk/log.h"
#include "spdk/scsi.h" #include "spdk/scsi.h"
#include "spdk/vhost.h" #include "spdk/vhost.h"
#include "vhost_internal.h" #include "vhost_internal.h"
@ -472,6 +472,60 @@ invalid:
SPDK_RPC_REGISTER("vhost_controller_set_coalescing", rpc_vhost_controller_set_coalescing, SPDK_RPC_REGISTER("vhost_controller_set_coalescing", rpc_vhost_controller_set_coalescing,
SPDK_RPC_RUNTIME) SPDK_RPC_RUNTIME)
struct rpc_get_transport {
char *name;
};
static const struct spdk_json_object_decoder rpc_get_transport_decoders[] = {
{"name", offsetof(struct rpc_get_transport, name), spdk_json_decode_string, true},
};
static void
rpc_virtio_blk_get_transports(struct spdk_jsonrpc_request *request,
const struct spdk_json_val *params)
{
struct rpc_get_transport req = { 0 };
struct spdk_json_write_ctx *w;
struct spdk_virtio_blk_transport *transport = NULL;
if (params) {
if (spdk_json_decode_object(params, rpc_get_transport_decoders,
SPDK_COUNTOF(rpc_get_transport_decoders),
&req)) {
SPDK_ERRLOG("spdk_json_decode_object failed\n");
spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INVALID_PARAMS, "Invalid parameters");
return;
}
}
if (req.name) {
transport = virtio_blk_tgt_get_transport(req.name);
if (transport == NULL) {
SPDK_ERRLOG("transport '%s' does not exist\n", req.name);
spdk_jsonrpc_send_error_response(request, -ENODEV, spdk_strerror(ENODEV));
free(req.name);
return;
}
}
w = spdk_jsonrpc_begin_result(request);
spdk_json_write_array_begin(w);
if (transport) {
virtio_blk_transport_dump_opts(transport, w);
} else {
for (transport = virtio_blk_transport_get_first(); transport != NULL;
transport = virtio_blk_transport_get_next(transport)) {
virtio_blk_transport_dump_opts(transport, w);
}
}
spdk_json_write_array_end(w);
spdk_jsonrpc_end_result(request, w);
free(req.name);
}
SPDK_RPC_REGISTER("virtio_blk_get_transports", rpc_virtio_blk_get_transports, SPDK_RPC_RUNTIME)
struct rpc_virtio_blk_create_transport { struct rpc_virtio_blk_create_transport {
char *name; char *name;
}; };

View File

@ -20,6 +20,23 @@ def vhost_controller_set_coalescing(client, ctrlr, delay_base_us, iops_threshold
return client.call('vhost_controller_set_coalescing', params) return client.call('vhost_controller_set_coalescing', params)
def virtio_blk_get_transports(client, name=None):
"""Get list of virtio-blk transports.
Args:
name: name of the virtio-blk transport (optional).
Returns:
List of virtio-blk transport objects.
"""
params = {}
if name:
params['name'] = name
return client.call('virtio_blk_get_transports', params)
def virtio_blk_create_transport(client, **params): def virtio_blk_create_transport(client, **params):
"""Create virtio blk transport. """Create virtio blk transport.
Args: Args:

View File

@ -2601,6 +2601,13 @@ Format: 'user:u1 secret:s1 muser:mu1 msecret:ms1,user:u2 secret:s2 muser:mu2 mse
p.add_argument('name', help='transport name') p.add_argument('name', help='transport name')
p.set_defaults(func=virtio_blk_create_transport) p.set_defaults(func=virtio_blk_create_transport)
def virtio_blk_get_transports(args):
print_dict(rpc.vhost.virtio_blk_get_transports(args.client, name=args.name))
p = subparsers.add_parser('virtio_blk_get_transports', help='Display virtio-blk transports or requested transport')
p.add_argument('--name', help='Transport name (optional)', type=str)
p.set_defaults(func=virtio_blk_get_transports)
def vhost_create_scsi_controller(args): def vhost_create_scsi_controller(args):
rpc.vhost.vhost_create_scsi_controller(args.client, rpc.vhost.vhost_create_scsi_controller(args.client,
ctrlr=args.ctrlr, ctrlr=args.ctrlr,