xref: /spdk/lib/trace/trace_rpc.c (revision cd4ac9c7921328d35a618344680da499d9af9c80)
1488570ebSJim Harris /*   SPDX-License-Identifier: BSD-3-Clause
2a6dbe372Spaul luse  *   Copyright (C) 2018 Intel Corporation.
3bc83adc2SSeth Howell  *   All rights reserved.
4bc83adc2SSeth Howell  */
5bc83adc2SSeth Howell 
6bc83adc2SSeth Howell #include "spdk/rpc.h"
7bc83adc2SSeth Howell #include "spdk/util.h"
8bc83adc2SSeth Howell #include "spdk/trace.h"
94e8e97c8STomasz Zawadzki #include "spdk/log.h"
10*cd4ac9c7SXinrui Mao #include "trace_internal.h"
11bc83adc2SSeth Howell 
12bc83adc2SSeth Howell struct rpc_tpoint_group {
13bc83adc2SSeth Howell 	char *name;
14aa499efdSKrzysztof Karas 	uint64_t tpoint_mask;
15bc83adc2SSeth Howell };
16bc83adc2SSeth Howell 
17bc83adc2SSeth Howell static void
free_rpc_tpoint_group(struct rpc_tpoint_group * p)18bc83adc2SSeth Howell free_rpc_tpoint_group(struct rpc_tpoint_group *p)
19bc83adc2SSeth Howell {
20bc83adc2SSeth Howell 	free(p->name);
21bc83adc2SSeth Howell }
22bc83adc2SSeth Howell 
23aa499efdSKrzysztof Karas static const struct spdk_json_object_decoder rpc_tpoint_mask_decoders[] = {
24aa499efdSKrzysztof Karas 	{"name", offsetof(struct rpc_tpoint_group, name), spdk_json_decode_string},
25aa499efdSKrzysztof Karas 	{"tpoint_mask", offsetof(struct rpc_tpoint_group, tpoint_mask), spdk_json_decode_uint64, true},
26aa499efdSKrzysztof Karas };
27aa499efdSKrzysztof Karas 
28aa499efdSKrzysztof Karas static void
rpc_trace_set_tpoint_mask(struct spdk_jsonrpc_request * request,const struct spdk_json_val * params)29aa499efdSKrzysztof Karas rpc_trace_set_tpoint_mask(struct spdk_jsonrpc_request *request,
30aa499efdSKrzysztof Karas 			  const struct spdk_json_val *params)
31aa499efdSKrzysztof Karas {
32aa499efdSKrzysztof Karas 	struct rpc_tpoint_group req = {};
33aa499efdSKrzysztof Karas 	uint64_t tpoint_group_mask = 0;
34aa499efdSKrzysztof Karas 
35aa499efdSKrzysztof Karas 	if (spdk_json_decode_object(params, rpc_tpoint_mask_decoders,
36aa499efdSKrzysztof Karas 				    SPDK_COUNTOF(rpc_tpoint_mask_decoders), &req)) {
37aa499efdSKrzysztof Karas 		SPDK_DEBUGLOG(trace, "spdk_json_decode_object failed\n");
38aa499efdSKrzysztof Karas 		goto invalid;
39aa499efdSKrzysztof Karas 	}
40aa499efdSKrzysztof Karas 
41aa499efdSKrzysztof Karas 	if (req.name == NULL) {
42aa499efdSKrzysztof Karas 		SPDK_DEBUGLOG(trace, "flag was NULL\n");
43aa499efdSKrzysztof Karas 		goto invalid;
44aa499efdSKrzysztof Karas 	}
45aa499efdSKrzysztof Karas 
46aa499efdSKrzysztof Karas 	tpoint_group_mask = spdk_trace_create_tpoint_group_mask(req.name);
47aa499efdSKrzysztof Karas 	if (tpoint_group_mask == 0) {
48aa499efdSKrzysztof Karas 		goto invalid;
49aa499efdSKrzysztof Karas 	}
50aa499efdSKrzysztof Karas 
51aa499efdSKrzysztof Karas 	spdk_trace_set_tpoints(spdk_u64log2(tpoint_group_mask), req.tpoint_mask);
52aa499efdSKrzysztof Karas 
53aa499efdSKrzysztof Karas 	free_rpc_tpoint_group(&req);
54aa499efdSKrzysztof Karas 
55aa499efdSKrzysztof Karas 	spdk_jsonrpc_send_bool_response(request, true);
56aa499efdSKrzysztof Karas 	return;
57aa499efdSKrzysztof Karas 
58aa499efdSKrzysztof Karas invalid:
59aa499efdSKrzysztof Karas 	spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INVALID_PARAMS, "Invalid parameters");
60aa499efdSKrzysztof Karas 	free_rpc_tpoint_group(&req);
61aa499efdSKrzysztof Karas }
62aa499efdSKrzysztof Karas SPDK_RPC_REGISTER("trace_set_tpoint_mask", rpc_trace_set_tpoint_mask,
63aa499efdSKrzysztof Karas 		  SPDK_RPC_STARTUP | SPDK_RPC_RUNTIME)
64aa499efdSKrzysztof Karas 
65aa499efdSKrzysztof Karas static void
rpc_trace_clear_tpoint_mask(struct spdk_jsonrpc_request * request,const struct spdk_json_val * params)66aa499efdSKrzysztof Karas rpc_trace_clear_tpoint_mask(struct spdk_jsonrpc_request *request,
67aa499efdSKrzysztof Karas 			    const struct spdk_json_val *params)
68aa499efdSKrzysztof Karas {
69aa499efdSKrzysztof Karas 	struct rpc_tpoint_group req = {};
70aa499efdSKrzysztof Karas 	uint64_t tpoint_group_mask = 0;
71aa499efdSKrzysztof Karas 
72aa499efdSKrzysztof Karas 	if (spdk_json_decode_object(params, rpc_tpoint_mask_decoders,
73aa499efdSKrzysztof Karas 				    SPDK_COUNTOF(rpc_tpoint_mask_decoders), &req)) {
74aa499efdSKrzysztof Karas 		SPDK_DEBUGLOG(trace, "spdk_json_decode_object failed\n");
75aa499efdSKrzysztof Karas 		goto invalid;
76aa499efdSKrzysztof Karas 	}
77aa499efdSKrzysztof Karas 
78aa499efdSKrzysztof Karas 	if (req.name == NULL) {
79aa499efdSKrzysztof Karas 		SPDK_DEBUGLOG(trace, "flag was NULL\n");
80aa499efdSKrzysztof Karas 		goto invalid;
81aa499efdSKrzysztof Karas 	}
82aa499efdSKrzysztof Karas 
83aa499efdSKrzysztof Karas 	tpoint_group_mask = spdk_trace_create_tpoint_group_mask(req.name);
84aa499efdSKrzysztof Karas 	if (tpoint_group_mask == 0) {
85aa499efdSKrzysztof Karas 		goto invalid;
86aa499efdSKrzysztof Karas 	}
87aa499efdSKrzysztof Karas 
88aa499efdSKrzysztof Karas 	spdk_trace_clear_tpoints(spdk_u64log2(tpoint_group_mask), req.tpoint_mask);
89aa499efdSKrzysztof Karas 
90aa499efdSKrzysztof Karas 	free_rpc_tpoint_group(&req);
91aa499efdSKrzysztof Karas 
92aa499efdSKrzysztof Karas 	spdk_jsonrpc_send_bool_response(request, true);
93aa499efdSKrzysztof Karas 	return;
94aa499efdSKrzysztof Karas 
95aa499efdSKrzysztof Karas invalid:
96aa499efdSKrzysztof Karas 	spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INVALID_PARAMS, "Invalid parameters");
97aa499efdSKrzysztof Karas 	free_rpc_tpoint_group(&req);
98aa499efdSKrzysztof Karas }
99aa499efdSKrzysztof Karas SPDK_RPC_REGISTER("trace_clear_tpoint_mask", rpc_trace_clear_tpoint_mask,
100aa499efdSKrzysztof Karas 		  SPDK_RPC_STARTUP | SPDK_RPC_RUNTIME)
101aa499efdSKrzysztof Karas 
102bc83adc2SSeth Howell static const struct spdk_json_object_decoder rpc_tpoint_group_decoders[] = {
103bc83adc2SSeth Howell 	{"name", offsetof(struct rpc_tpoint_group, name), spdk_json_decode_string},
104bc83adc2SSeth Howell };
105bc83adc2SSeth Howell 
106bc83adc2SSeth Howell static void
rpc_trace_enable_tpoint_group(struct spdk_jsonrpc_request * request,const struct spdk_json_val * params)107f8d51895SSeth Howell rpc_trace_enable_tpoint_group(struct spdk_jsonrpc_request *request,
108bc83adc2SSeth Howell 			      const struct spdk_json_val *params)
109bc83adc2SSeth Howell {
110bc83adc2SSeth Howell 	struct rpc_tpoint_group req = {};
111bc83adc2SSeth Howell 
112bc83adc2SSeth Howell 	if (spdk_json_decode_object(params, rpc_tpoint_group_decoders,
113bc83adc2SSeth Howell 				    SPDK_COUNTOF(rpc_tpoint_group_decoders), &req)) {
1142172c432STomasz Zawadzki 		SPDK_DEBUGLOG(trace, "spdk_json_decode_object failed\n");
115bc83adc2SSeth Howell 		goto invalid;
116bc83adc2SSeth Howell 	}
117bc83adc2SSeth Howell 
118bc83adc2SSeth Howell 	if (req.name == NULL) {
1192172c432STomasz Zawadzki 		SPDK_DEBUGLOG(trace, "flag was NULL\n");
120bc83adc2SSeth Howell 		goto invalid;
121bc83adc2SSeth Howell 	}
122bc83adc2SSeth Howell 
123bc83adc2SSeth Howell 	if (spdk_trace_enable_tpoint_group(req.name)) {
124bc83adc2SSeth Howell 		goto invalid;
125bc83adc2SSeth Howell 	}
126bc83adc2SSeth Howell 
127bc83adc2SSeth Howell 	free_rpc_tpoint_group(&req);
128bc83adc2SSeth Howell 
129d73077b8Syidong0635 	spdk_jsonrpc_send_bool_response(request, true);
130bc83adc2SSeth Howell 	return;
131bc83adc2SSeth Howell 
132bc83adc2SSeth Howell invalid:
133bc83adc2SSeth Howell 	spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INVALID_PARAMS, "Invalid parameters");
134bc83adc2SSeth Howell 	free_rpc_tpoint_group(&req);
135bc83adc2SSeth Howell }
136f8d51895SSeth Howell SPDK_RPC_REGISTER("trace_enable_tpoint_group", rpc_trace_enable_tpoint_group,
137bc83adc2SSeth Howell 		  SPDK_RPC_STARTUP | SPDK_RPC_RUNTIME)
138bc83adc2SSeth Howell 
139bc83adc2SSeth Howell static void
rpc_trace_disable_tpoint_group(struct spdk_jsonrpc_request * request,const struct spdk_json_val * params)140f8d51895SSeth Howell rpc_trace_disable_tpoint_group(struct spdk_jsonrpc_request *request,
141bc83adc2SSeth Howell 			       const struct spdk_json_val *params)
142bc83adc2SSeth Howell {
143bc83adc2SSeth Howell 	struct rpc_tpoint_group req = {};
144bc83adc2SSeth Howell 
145bc83adc2SSeth Howell 	if (spdk_json_decode_object(params, rpc_tpoint_group_decoders,
146bc83adc2SSeth Howell 				    SPDK_COUNTOF(rpc_tpoint_group_decoders), &req)) {
1472172c432STomasz Zawadzki 		SPDK_DEBUGLOG(trace, "spdk_json_decode_object failed\n");
148bc83adc2SSeth Howell 		goto invalid;
149bc83adc2SSeth Howell 	}
150bc83adc2SSeth Howell 
151bc83adc2SSeth Howell 	if (req.name == NULL) {
1522172c432STomasz Zawadzki 		SPDK_DEBUGLOG(trace, "flag was NULL\n");
153bc83adc2SSeth Howell 		goto invalid;
154bc83adc2SSeth Howell 	}
155bc83adc2SSeth Howell 
156bc83adc2SSeth Howell 	if (spdk_trace_disable_tpoint_group(req.name)) {
157bc83adc2SSeth Howell 		goto invalid;
158bc83adc2SSeth Howell 	}
159bc83adc2SSeth Howell 
160bc83adc2SSeth Howell 	free_rpc_tpoint_group(&req);
161bc83adc2SSeth Howell 
162d73077b8Syidong0635 	spdk_jsonrpc_send_bool_response(request, true);
163bc83adc2SSeth Howell 	return;
164bc83adc2SSeth Howell 
165bc83adc2SSeth Howell invalid:
166bc83adc2SSeth Howell 	spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INVALID_PARAMS, "Invalid parameters");
167bc83adc2SSeth Howell 	free_rpc_tpoint_group(&req);
168bc83adc2SSeth Howell }
169f8d51895SSeth Howell SPDK_RPC_REGISTER("trace_disable_tpoint_group", rpc_trace_disable_tpoint_group,
170bc83adc2SSeth Howell 		  SPDK_RPC_STARTUP | SPDK_RPC_RUNTIME)
171bc83adc2SSeth Howell 
172bc83adc2SSeth Howell static void
rpc_trace_get_tpoint_group_mask(struct spdk_jsonrpc_request * request,const struct spdk_json_val * params)173f8d51895SSeth Howell rpc_trace_get_tpoint_group_mask(struct spdk_jsonrpc_request *request,
174bc83adc2SSeth Howell 				const struct spdk_json_val *params)
175bc83adc2SSeth Howell {
176bc83adc2SSeth Howell 	uint64_t tpoint_group_mask;
17736b5a69bSZiye Yang 	char mask_str[20];
178bc83adc2SSeth Howell 	bool enabled;
179bc83adc2SSeth Howell 	struct spdk_json_write_ctx *w;
180bc83adc2SSeth Howell 	struct spdk_trace_register_fn *register_fn;
181bc83adc2SSeth Howell 
182bc83adc2SSeth Howell 	if (params != NULL) {
183bc83adc2SSeth Howell 		spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INVALID_PARAMS,
1843650a733SPawel Kaminski 						 "trace_get_tpoint_group_mask requires no parameters");
185bc83adc2SSeth Howell 		return;
186bc83adc2SSeth Howell 	}
187bc83adc2SSeth Howell 
188bc83adc2SSeth Howell 	w = spdk_jsonrpc_begin_result(request);
189bc83adc2SSeth Howell 	tpoint_group_mask = spdk_trace_get_tpoint_group_mask();
190bc83adc2SSeth Howell 
191bc83adc2SSeth Howell 	spdk_json_write_object_begin(w);
192bc83adc2SSeth Howell 
193b8c99a3aSNick Connolly 	snprintf(mask_str, sizeof(mask_str), "0x%" PRIx64, tpoint_group_mask);
194bc83adc2SSeth Howell 	spdk_json_write_named_string(w, "tpoint_group_mask", mask_str);
195bc83adc2SSeth Howell 
196bc83adc2SSeth Howell 	register_fn = spdk_trace_get_first_register_fn();
197bc83adc2SSeth Howell 	while (register_fn) {
198bc83adc2SSeth Howell 		enabled = spdk_trace_get_tpoint_mask(register_fn->tgroup_id) != 0;
199bc83adc2SSeth Howell 
200bc83adc2SSeth Howell 		spdk_json_write_named_object_begin(w, register_fn->name);
201bc83adc2SSeth Howell 		spdk_json_write_named_bool(w, "enabled", enabled);
202bc83adc2SSeth Howell 
203bc83adc2SSeth Howell 		snprintf(mask_str, sizeof(mask_str), "0x%lx", (1UL << register_fn->tgroup_id));
204bc83adc2SSeth Howell 		spdk_json_write_named_string(w, "mask", mask_str);
205bc83adc2SSeth Howell 		spdk_json_write_object_end(w);
206bc83adc2SSeth Howell 
207bc83adc2SSeth Howell 		register_fn = spdk_trace_get_next_register_fn(register_fn);
208bc83adc2SSeth Howell 	}
209bc83adc2SSeth Howell 
210bc83adc2SSeth Howell 	spdk_json_write_object_end(w);
211bc83adc2SSeth Howell 	spdk_jsonrpc_end_result(request, w);
212bc83adc2SSeth Howell }
213f8d51895SSeth Howell SPDK_RPC_REGISTER("trace_get_tpoint_group_mask", rpc_trace_get_tpoint_group_mask,
214bc83adc2SSeth Howell 		  SPDK_RPC_STARTUP | SPDK_RPC_RUNTIME)
215*cd4ac9c7SXinrui Mao 
216*cd4ac9c7SXinrui Mao static void
rpc_trace_get_info(struct spdk_jsonrpc_request * request,const struct spdk_json_val * params)217*cd4ac9c7SXinrui Mao rpc_trace_get_info(struct spdk_jsonrpc_request *request,
218*cd4ac9c7SXinrui Mao 		   const struct spdk_json_val *params)
219*cd4ac9c7SXinrui Mao {
220*cd4ac9c7SXinrui Mao 	char shm_path[128];
221*cd4ac9c7SXinrui Mao 	uint64_t tpoint_group_mask;
222*cd4ac9c7SXinrui Mao 	uint64_t tpoint_mask;
223*cd4ac9c7SXinrui Mao 	char tpoint_mask_str[20];
224*cd4ac9c7SXinrui Mao 	char mask_str[20];
225*cd4ac9c7SXinrui Mao 	struct spdk_json_write_ctx *w;
226*cd4ac9c7SXinrui Mao 	struct spdk_trace_register_fn *register_fn;
227*cd4ac9c7SXinrui Mao 
228*cd4ac9c7SXinrui Mao 	if (params != NULL) {
229*cd4ac9c7SXinrui Mao 		spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INVALID_PARAMS,
230*cd4ac9c7SXinrui Mao 						 "trace_get_info requires no parameters");
231*cd4ac9c7SXinrui Mao 		return;
232*cd4ac9c7SXinrui Mao 	}
233*cd4ac9c7SXinrui Mao 
234*cd4ac9c7SXinrui Mao 	snprintf(shm_path, sizeof(shm_path), "/dev/shm%s", trace_get_shm_name());
235*cd4ac9c7SXinrui Mao 	tpoint_group_mask = spdk_trace_get_tpoint_group_mask();
236*cd4ac9c7SXinrui Mao 
237*cd4ac9c7SXinrui Mao 	w = spdk_jsonrpc_begin_result(request);
238*cd4ac9c7SXinrui Mao 	spdk_json_write_object_begin(w);
239*cd4ac9c7SXinrui Mao 	spdk_json_write_named_string(w, "tpoint_shm_path", shm_path);
240*cd4ac9c7SXinrui Mao 
241*cd4ac9c7SXinrui Mao 	snprintf(mask_str, sizeof(mask_str), "0x%" PRIx64, tpoint_group_mask);
242*cd4ac9c7SXinrui Mao 	spdk_json_write_named_string(w, "tpoint_group_mask", mask_str);
243*cd4ac9c7SXinrui Mao 
244*cd4ac9c7SXinrui Mao 	register_fn = spdk_trace_get_first_register_fn();
245*cd4ac9c7SXinrui Mao 	while (register_fn) {
246*cd4ac9c7SXinrui Mao 
247*cd4ac9c7SXinrui Mao 		tpoint_mask = spdk_trace_get_tpoint_mask(register_fn->tgroup_id);
248*cd4ac9c7SXinrui Mao 
249*cd4ac9c7SXinrui Mao 		spdk_json_write_named_object_begin(w, register_fn->name);
250*cd4ac9c7SXinrui Mao 		snprintf(mask_str, sizeof(mask_str), "0x%lx", (1UL << register_fn->tgroup_id));
251*cd4ac9c7SXinrui Mao 		spdk_json_write_named_string(w, "mask", mask_str);
252*cd4ac9c7SXinrui Mao 		snprintf(tpoint_mask_str, sizeof(tpoint_mask_str), "0x%lx", tpoint_mask);
253*cd4ac9c7SXinrui Mao 		spdk_json_write_named_string(w, "tpoint_mask", tpoint_mask_str);
254*cd4ac9c7SXinrui Mao 		spdk_json_write_object_end(w);
255*cd4ac9c7SXinrui Mao 
256*cd4ac9c7SXinrui Mao 		register_fn = spdk_trace_get_next_register_fn(register_fn);
257*cd4ac9c7SXinrui Mao 	}
258*cd4ac9c7SXinrui Mao 
259*cd4ac9c7SXinrui Mao 	spdk_json_write_object_end(w);
260*cd4ac9c7SXinrui Mao 	spdk_jsonrpc_end_result(request, w);
261*cd4ac9c7SXinrui Mao }
262*cd4ac9c7SXinrui Mao SPDK_RPC_REGISTER("trace_get_info", rpc_trace_get_info,
263*cd4ac9c7SXinrui Mao 		  SPDK_RPC_STARTUP | SPDK_RPC_RUNTIME)
264