xref: /spdk/module/event/subsystems/iobuf/iobuf_rpc.c (revision 42d1bd28396630ca9cfb81bf7934fb8872df47f0)
1 /*   SPDX-License-Identifier: BSD-3-Clause
2  *   Copyright (C) 2022 Intel Corporation.
3  *   All rights reserved.
4  */
5 
6 #include "spdk/stdinc.h"
7 #include "spdk/thread.h"
8 #include "spdk/rpc.h"
9 #include "spdk/string.h"
10 #include "spdk_internal/init.h"
11 
12 static const struct spdk_json_object_decoder rpc_iobuf_set_options_decoders[] = {
13 	{"small_pool_count", offsetof(struct spdk_iobuf_opts, small_pool_count), spdk_json_decode_uint64, true},
14 	{"large_pool_count", offsetof(struct spdk_iobuf_opts, large_pool_count), spdk_json_decode_uint64, true},
15 	{"small_bufsize", offsetof(struct spdk_iobuf_opts, small_bufsize), spdk_json_decode_uint32, true},
16 	{"large_bufsize", offsetof(struct spdk_iobuf_opts, large_bufsize), spdk_json_decode_uint32, true},
17 	{"enable_numa", offsetof(struct spdk_iobuf_opts, enable_numa), spdk_json_decode_bool, true},
18 };
19 
20 static void
21 rpc_iobuf_set_options(struct spdk_jsonrpc_request *request, const struct spdk_json_val *params)
22 {
23 	struct spdk_iobuf_opts opts;
24 	int rc;
25 
26 	spdk_iobuf_get_opts(&opts, sizeof(opts));
27 	rc = spdk_json_decode_object(params, rpc_iobuf_set_options_decoders,
28 				     SPDK_COUNTOF(rpc_iobuf_set_options_decoders), &opts);
29 	if (rc != 0) {
30 		spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INVALID_PARAMS,
31 						 "spdk_json_decode_object failed");
32 		return;
33 	}
34 
35 	rc = spdk_iobuf_set_opts(&opts);
36 	if (rc != 0) {
37 		spdk_jsonrpc_send_error_response(request, rc, spdk_strerror(-rc));
38 		return;
39 	}
40 
41 	spdk_jsonrpc_send_bool_response(request, true);
42 }
43 SPDK_RPC_REGISTER("iobuf_set_options", rpc_iobuf_set_options, SPDK_RPC_STARTUP)
44 
45 static void
46 rpc_iobuf_get_stats_done(struct spdk_iobuf_module_stats *modules, uint32_t num_modules,
47 			 void *cb_arg)
48 {
49 	struct spdk_jsonrpc_request *request = cb_arg;
50 	struct spdk_json_write_ctx *w;
51 	struct spdk_iobuf_module_stats *it;
52 	uint32_t i;
53 
54 	w = spdk_jsonrpc_begin_result(request);
55 	spdk_json_write_array_begin(w);
56 
57 	for (i = 0; i < num_modules; ++i) {
58 		it = &modules[i];
59 
60 		spdk_json_write_object_begin(w);
61 		spdk_json_write_named_string(w, "module", it->module);
62 
63 		spdk_json_write_named_object_begin(w, "small_pool");
64 		spdk_json_write_named_uint64(w, "cache", it->small_pool.cache);
65 		spdk_json_write_named_uint64(w, "main", it->small_pool.main);
66 		spdk_json_write_named_uint64(w, "retry", it->small_pool.retry);
67 		spdk_json_write_object_end(w);
68 
69 		spdk_json_write_named_object_begin(w, "large_pool");
70 		spdk_json_write_named_uint64(w, "cache", it->large_pool.cache);
71 		spdk_json_write_named_uint64(w, "main", it->large_pool.main);
72 		spdk_json_write_named_uint64(w, "retry", it->large_pool.retry);
73 		spdk_json_write_object_end(w);
74 
75 		spdk_json_write_object_end(w);
76 	}
77 
78 	spdk_json_write_array_end(w);
79 	spdk_jsonrpc_end_result(request, w);
80 }
81 
82 static void
83 rpc_iobuf_get_stats(struct spdk_jsonrpc_request *request, const struct spdk_json_val *params)
84 {
85 	int rc;
86 
87 	rc = spdk_iobuf_get_stats(rpc_iobuf_get_stats_done, request);
88 	if (rc != 0) {
89 		spdk_jsonrpc_send_error_response(request, rc, spdk_strerror(-rc));
90 	}
91 }
92 SPDK_RPC_REGISTER("iobuf_get_stats", rpc_iobuf_get_stats, SPDK_RPC_RUNTIME)
93