All of lore.kernel.org
 help / color / mirror / Atom feed
From: Felipe Balbi <felipe.balbi@linux.intel.com>
To: Alexander Shishkin <alexander.shishkin@linux.intel.com>,
	Steven Rostedt <rostedt@goodmis.org>,
	Ingo Molnar <mingo@redhat.com>
Cc: Linux USB <linux-usb@vger.kernel.org>,
	linux-kernel@vger.kernel.org,
	Chunyan Zhang <zhang.chunyan@linaro.org>
Subject: Re: [PATCH] usb: gadget: functions: add ftrace export over USB
Date: Fri, 09 Jun 2017 14:15:37 +0300	[thread overview]
Message-ID: <87h8zpquna.fsf@linux.intel.com> (raw)
In-Reply-To: <87mv9hqwt8.fsf@linux.intel.com>

[-- Attachment #1: Type: text/plain, Size: 5227 bytes --]

Felipe Balbi <felipe.balbi@linux.intel.com> writes:

> Felipe Balbi <felipe.balbi@linux.intel.com> writes:
>
>> Allow for ftrace data to be exported over a USB Gadget
>> Controller. With this, we have a potentially very fast pipe for
>> transmitting ftrace data to a Host PC for further analysis.
>>
>> Note that in order to decode the data, one needs access to kernel
>> symbols in order to convert binary data into function names and what
>> not.
>>
>> Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com>
>> ---
>>
>> I wanted to take this through the gadget tree, but there is a
>> dependency with a previous patch of mine adding and extra argument to
>> the ->write() function. Hoping someone else will take it.
>
> just as an extra note here. In order for this to be really useful, it
> would be nice to be able to control what is going to be traced over USB
> as well, but that means exporting a few extra functions to GPL drivers.
>
> Would that be okay? I could have a set of vendor-specific control
> requests to set buffer size and to read/write ftrace filter functions.
>
> The idea is that things like e.g. Android SDK could rely on this on
> debug builds and the SDK itself would make sure to keep a copy of
> vmlinux around to processing of the data coming through USB.

something along these lines (although I think trace buffer size doesn't
matter for trace export, but it serves well enough to illustrate a
point):

modified   drivers/usb/gadget/function/f-trace.c
@@ -33,6 +33,8 @@ struct usb_ftrace {
 
 	struct usb_ep *in;
 
+	u32 buffer_size;
+	u16 version;
 	u8 intf_id;
 };
 #define ftrace_to_trace(f)	(container_of((f), struct usb_ftrace, ftrace))
@@ -40,6 +42,12 @@ struct usb_ftrace {
 #define to_trace(f)		(container_of((f), struct usb_ftrace, function))
 
 #define FTRACE_REQUEST_QUEUE_LENGTH	250
+#define FTRACE_VERSION			0x0100 /* bcd 1.00 */
+
+/* FTrace vendor-specific requests */
+#define USB_FTRACE_GET_VERSION		0x00
+#define USB_FTRACE_GET_TRACE_BUF_SIZE	0x01
+#define USB_FTRACE_SET_TRACE_BUF_SIZE	0x02
 
 static inline struct usb_request *next_request(struct list_head *list)
 {
@@ -142,6 +150,13 @@ static void ftrace_complete(struct usb_ep *ep, struct usb_request *req)
 	list_move_tail(&req->list, &trace->list);
 }
 
+static void ftrace_set_trace_buf_size_complete(struct usb_ep *ep, struct usb_request *req)
+{
+	struct usb_ftrace		*trace = req->context;
+
+	trace_set_buf_size(le32_to_cpu(trace->buffer_size));
+}
+
 static void ftrace_queue_work(struct work_struct *work)
 {
 	struct usb_ftrace		*trace = work_to_trace(work);
@@ -237,6 +252,71 @@ static int ftrace_set_alt(struct usb_function *f, unsigned intf, unsigned alt)
 	return -EINVAL;
 }
 
+extern unsigned long trace_get_buf_size(void);
+
+static int ftrace_setup(struct usb_function *f, const struct usb_ctrlrequest *ctrl)
+{
+	struct usb_configuration	*c = f->config;
+	struct usb_request		*req = c->cdev->req;
+	struct usb_ftrace		*trace = to_trace(f);
+
+	int				ret;
+
+	u16				index = le16_to_cpu(ctrl->wIndex);
+	u16				value = le16_to_cpu(ctrl->wValue);
+	u16				length = le16_to_cpu(ctrl->wLength);
+
+	if (value != 0 || index != 0)
+		return -EINVAL;
+
+	switch (ctrl->bRequest) {
+	case USB_FTRACE_GET_VERSION:
+		if (ctrl->bRequestType != (USB_DIR_IN | USB_TYPE_VENDOR |
+					   USB_RECIP_INTERFACE))
+			return -EINVAL;
+
+		if (length != 2)
+			return -EINVAL;
+
+		req->zero = 0;
+		req->length = 2;
+		req->buf = &trace->version;
+		break;
+	case USB_FTRACE_GET_TRACE_BUF_SIZE:
+		if (ctrl->bRequestType != (USB_DIR_IN | USB_TYPE_VENDOR |
+					   USB_RECIP_INTERFACE))
+			return -EINVAL;
+
+		if (length != 2)
+			return -EINVAL;
+
+		trace->buffer_size = cpu_to_le32(trace_get_buf_size());
+
+		req->zero = 0;
+		req->length = 2;
+		req->buf = &trace->buffer_size;
+		break;
+	case USB_FTRACE_SET_TRACE_BUF_SIZE:
+		if (ctrl->bRequestType != (USB_DIR_OUT | USB_TYPE_VENDOR |
+					   USB_RECIP_INTERFACE))
+			return -EINVAL;
+
+		if (length != 4)
+			return -EINVAL;
+
+		req->zero = 0;
+		req->length = 4;
+		req->context = trace;
+		req->complete = ftrace_set_trace_buf_size_complete;
+		req->buf = &trace->buffer_size;
+		break;
+	default:
+		return -EINVAL;
+	}
+
+	return usb_ep_queue(c->cdev->gadget->ep0, req, GFP_ATOMIC);
+}
+
 static int ftrace_bind(struct usb_configuration *c, struct usb_function *f)
 {
 	struct usb_composite_dev	*cdev = c->cdev;
@@ -247,6 +327,8 @@ static int ftrace_bind(struct usb_configuration *c, struct usb_function *f)
 	int				ret;
 	int				i;
 
+	trace->version = cpu_to_le16(FTRACE_VERSION);
+
 	us = usb_gstrings_attach(cdev, ftrace_strings,
 				 ARRAY_SIZE(ftrace_string_defs));
 	if (IS_ERR(us))
modified   kernel/trace/trace.c
@@ -618,6 +618,12 @@ int tracing_is_enabled(void)
 
 static unsigned long		trace_buf_size = TRACE_BUF_SIZE_DEFAULT;
 
+unsigned long trace_get_buf_size(void)
+{
+	return trace_buf_size;
+}
+EXPORT_SYMBOL_GPL(trace_get_buf_size);
+
 /* trace_types holds a link list of available tracers. */
 static struct tracer		*trace_types __read_mostly;
 

-- 
balbi

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 832 bytes --]

  reply	other threads:[~2017-06-09 11:16 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-06-09  6:13 [PATCH] usb: gadget: functions: add ftrace export over USB Felipe Balbi
2017-06-09 10:28 ` Felipe Balbi
2017-06-09 11:15   ` Felipe Balbi [this message]
2017-07-14  5:52   ` Pratyush Anand
2017-07-14  6:53     ` Felipe Balbi
2017-07-14 21:44     ` Steven Rostedt
2017-06-09 14:02 ` Steven Rostedt
2017-06-09 14:05   ` Felipe Balbi
2017-06-09 15:07     ` Steven Rostedt
2017-06-10  3:38 ` kbuild test robot
2017-06-12 10:39   ` Felipe Balbi
2017-06-10  4:02 ` kbuild test robot
2017-07-13 11:40 ` Felipe Balbi
2017-07-14  5:31 ` Pratyush Anand
2017-07-14  6:56   ` Felipe Balbi
2019-03-21  9:38 ` Felipe Balbi
2019-03-21 16:37   ` Steven Rostedt
2019-03-22 11:49     ` Felipe Balbi
2019-03-22 12:22       ` Steven Rostedt
2019-03-22 12:27         ` Felipe Balbi

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87h8zpquna.fsf@linux.intel.com \
    --to=felipe.balbi@linux.intel.com \
    --cc=alexander.shishkin@linux.intel.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-usb@vger.kernel.org \
    --cc=mingo@redhat.com \
    --cc=rostedt@goodmis.org \
    --cc=zhang.chunyan@linaro.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.