mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-05 13:29:17 -04:00
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>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
1dc2527ce8
commit
757f5d0b61
@@ -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
|
||||
|
||||
11
drivers/usb/gadget/function/uvc_trace.c
Normal file
11
drivers/usb/gadget/function/uvc_trace.c
Normal file
@@ -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"
|
||||
60
drivers/usb/gadget/function/uvc_trace.h
Normal file
60
drivers/usb/gadget/function/uvc_trace.h
Normal file
@@ -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>
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user