Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

usb: gadget: uvc: add trace of enqueued and completed requests

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>

authored by

Michael Grzeschik and committed by
Greg Kroah-Hartman
757f5d0b 1dc2527c

+80
+4
drivers/usb/gadget/function/Makefile
··· 41 41 usb_f_uac2-y := f_uac2.o 42 42 obj-$(CONFIG_USB_F_UAC2) += usb_f_uac2.o 43 43 usb_f_uvc-y := f_uvc.o uvc_queue.o uvc_v4l2.o uvc_video.o uvc_configfs.o 44 + ifneq ($(CONFIG_TRACING),) 45 + CFLAGS_uvc_trace.o := -I$(src) 46 + usb_f_uvc-y += uvc_trace.o 47 + endif 44 48 obj-$(CONFIG_USB_F_UVC) += usb_f_uvc.o 45 49 usb_f_midi-y := f_midi.o 46 50 obj-$(CONFIG_USB_F_MIDI) += usb_f_midi.o
+11
drivers/usb/gadget/function/uvc_trace.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + /* 3 + * trace.c - USB UVC Gadget Trace Support 4 + * 5 + * Copyright (C) 2024 Pengutronix e.K. 6 + * 7 + * Author: Michael Grzeschik <m.grzeschik@pengutronix.de> 8 + */ 9 + 10 + #define CREATE_TRACE_POINTS 11 + #include "uvc_trace.h"
+60
drivers/usb/gadget/function/uvc_trace.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0 */ 2 + /* 3 + * trace.h - USB UVC Gadget Trace Support 4 + * 5 + * Copyright (C) 2024 Pengutronix e.K. 6 + * 7 + * Author: Michael Grzeschik <m.grzeschik@pengutronix.de> 8 + */ 9 + 10 + #undef TRACE_SYSTEM 11 + #define TRACE_SYSTEM uvcg 12 + 13 + #if !defined(__UVCG_TRACE_H) || defined(TRACE_HEADER_MULTI_READ) 14 + #define __UVCG_TRACE_H 15 + 16 + #include <linux/types.h> 17 + #include <linux/tracepoint.h> 18 + #include <linux/usb/gadget.h> 19 + #include <asm/byteorder.h> 20 + 21 + DECLARE_EVENT_CLASS(uvcg_video_req, 22 + TP_PROTO(struct usb_request *req, u32 queued), 23 + TP_ARGS(req, queued), 24 + TP_STRUCT__entry( 25 + __field(struct usb_request *, req) 26 + __field(u32, length) 27 + __field(u32, queued) 28 + ), 29 + TP_fast_assign( 30 + __entry->req = req; 31 + __entry->length = req->length; 32 + __entry->queued = queued; 33 + ), 34 + TP_printk("req %p length %u queued %u", 35 + __entry->req, 36 + __entry->length, 37 + __entry->queued) 38 + ); 39 + 40 + DEFINE_EVENT(uvcg_video_req, uvcg_video_complete, 41 + TP_PROTO(struct usb_request *req, u32 queued), 42 + TP_ARGS(req, queued) 43 + ); 44 + 45 + DEFINE_EVENT(uvcg_video_req, uvcg_video_queue, 46 + TP_PROTO(struct usb_request *req, u32 queued), 47 + TP_ARGS(req, queued) 48 + ); 49 + 50 + #endif /* __UVCG_TRACE_H */ 51 + 52 + /* this part has to be here */ 53 + 54 + #undef TRACE_INCLUDE_PATH 55 + #define TRACE_INCLUDE_PATH . 56 + 57 + #undef TRACE_INCLUDE_FILE 58 + #define TRACE_INCLUDE_FILE uvc_trace 59 + 60 + #include <trace/define_trace.h>
+5
drivers/usb/gadget/function/uvc_video.c
··· 19 19 #include "uvc.h" 20 20 #include "uvc_queue.h" 21 21 #include "uvc_video.h" 22 + #include "uvc_trace.h" 22 23 23 24 /* -------------------------------------------------------------------------- 24 25 * Video codecs ··· 272 271 273 272 atomic_inc(&video->queued); 274 273 274 + trace_uvcg_video_queue(req, atomic_read(&video->queued)); 275 + 275 276 return ret; 276 277 } 277 278 ··· 410 407 * happen. Since there are is a new free request wake up the pump. 411 408 */ 412 409 queue_work(video->async_wq, &video->pump); 410 + 411 + trace_uvcg_video_complete(req, atomic_read(&video->queued)); 413 412 414 413 spin_unlock_irqrestore(&video->req_lock, flags); 415 414