]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
usb: gadget: uvc: add trace of enqueued and completed requests
authorMichael Grzeschik <m.grzeschik@pengutronix.de>
Wed, 16 Oct 2024 13:58:13 +0000 (15:58 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 17 Oct 2024 06:42:23 +0000 (08:42 +0200)
This patch is adding trace events for each request that is being
enqueued into the hw and will be completed. This way it is possible
to track the fill status of the gadget hardware and find potential
issues.

Signed-off-by: Michael Grzeschik <m.grzeschik@pengutronix.de>
Link: https://lore.kernel.org/r/20240403-uvc_request_length_by_interval-v7-8-e224bb1035f0@pengutronix.de
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/gadget/function/Makefile
drivers/usb/gadget/function/uvc_trace.c [new file with mode: 0644]
drivers/usb/gadget/function/uvc_trace.h [new file with mode: 0644]
drivers/usb/gadget/function/uvc_video.c

index 87917a7d4a9be89f30fc34878978f08446ea6aae..7ce1637276f099398d695b174afc072c36c5dd93 100644 (file)
@@ -41,6 +41,10 @@ obj-$(CONFIG_USB_F_UAC1_LEGACY)      += usb_f_uac1_legacy.o
 usb_f_uac2-y                   := f_uac2.o
 obj-$(CONFIG_USB_F_UAC2)       += usb_f_uac2.o
 usb_f_uvc-y                    := f_uvc.o uvc_queue.o uvc_v4l2.o uvc_video.o uvc_configfs.o
+ifneq ($(CONFIG_TRACING),)
+    CFLAGS_uvc_trace.o         := -I$(src)
+    usb_f_uvc-y                        += uvc_trace.o
+endif
 obj-$(CONFIG_USB_F_UVC)                += usb_f_uvc.o
 usb_f_midi-y                   := f_midi.o
 obj-$(CONFIG_USB_F_MIDI)       += usb_f_midi.o
diff --git a/drivers/usb/gadget/function/uvc_trace.c b/drivers/usb/gadget/function/uvc_trace.c
new file mode 100644 (file)
index 0000000..d384f6d
--- /dev/null
@@ -0,0 +1,11 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * trace.c - USB UVC Gadget Trace Support
+ *
+ * Copyright (C) 2024 Pengutronix e.K.
+ *
+ * Author: Michael Grzeschik <m.grzeschik@pengutronix.de>
+ */
+
+#define CREATE_TRACE_POINTS
+#include "uvc_trace.h"
diff --git a/drivers/usb/gadget/function/uvc_trace.h b/drivers/usb/gadget/function/uvc_trace.h
new file mode 100644 (file)
index 0000000..04c33cf
--- /dev/null
@@ -0,0 +1,60 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * trace.h - USB UVC Gadget Trace Support
+ *
+ * Copyright (C) 2024 Pengutronix e.K.
+ *
+ * Author: Michael Grzeschik <m.grzeschik@pengutronix.de>
+ */
+
+#undef TRACE_SYSTEM
+#define TRACE_SYSTEM uvcg
+
+#if !defined(__UVCG_TRACE_H) || defined(TRACE_HEADER_MULTI_READ)
+#define __UVCG_TRACE_H
+
+#include <linux/types.h>
+#include <linux/tracepoint.h>
+#include <linux/usb/gadget.h>
+#include <asm/byteorder.h>
+
+DECLARE_EVENT_CLASS(uvcg_video_req,
+       TP_PROTO(struct usb_request *req, u32 queued),
+       TP_ARGS(req, queued),
+       TP_STRUCT__entry(
+               __field(struct usb_request *, req)
+               __field(u32, length)
+               __field(u32, queued)
+       ),
+       TP_fast_assign(
+               __entry->req = req;
+               __entry->length = req->length;
+               __entry->queued = queued;
+       ),
+       TP_printk("req %p length %u queued %u",
+               __entry->req,
+               __entry->length,
+               __entry->queued)
+);
+
+DEFINE_EVENT(uvcg_video_req, uvcg_video_complete,
+       TP_PROTO(struct usb_request *req, u32 queued),
+       TP_ARGS(req, queued)
+);
+
+DEFINE_EVENT(uvcg_video_req, uvcg_video_queue,
+       TP_PROTO(struct usb_request *req, u32 queued),
+       TP_ARGS(req, queued)
+);
+
+#endif /* __UVCG_TRACE_H */
+
+/* this part has to be here */
+
+#undef TRACE_INCLUDE_PATH
+#define TRACE_INCLUDE_PATH .
+
+#undef TRACE_INCLUDE_FILE
+#define TRACE_INCLUDE_FILE uvc_trace
+
+#include <trace/define_trace.h>
index 677eaf5b7e4d0d166c0134282671f75349c4930a..23fad3bc72c030322f5247da2829f23a61dccf46 100644 (file)
@@ -19,6 +19,7 @@
 #include "uvc.h"
 #include "uvc_queue.h"
 #include "uvc_video.h"
+#include "uvc_trace.h"
 
 /* --------------------------------------------------------------------------
  * Video codecs
@@ -271,6 +272,8 @@ static int uvcg_video_ep_queue(struct uvc_video *video, struct usb_request *req)
 
        atomic_inc(&video->queued);
 
+       trace_uvcg_video_queue(req, atomic_read(&video->queued));
+
        return ret;
 }
 
@@ -408,6 +411,8 @@ uvc_video_complete(struct usb_ep *ep, struct usb_request *req)
         */
        queue_work(video->async_wq, &video->pump);
 
+       trace_uvcg_video_complete(req, atomic_read(&video->queued));
+
        spin_unlock_irqrestore(&video->req_lock, flags);
 
        kthread_queue_work(video->kworker, &video->hw_submit);