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