UPSTREAM: usb: gadget: uvc: only schedule stream in streaming state

This patch ensures that the video pump thread will only be scheduled if
the uvc is really in streaming state. This way the worker will not have
to run on an empty queue.

Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>
Signed-off-by: Michael Grzeschik <m.grzeschik@pengutronix.de>
Link: https://lore.kernel.org/r/20211017215017.18392-5-m.grzeschik@pengutronix.de
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Bug: 229140375
(cherry picked from commit 5fc49d8bee73648a706f5892663f5bd728ab07ea)
Signed-off-by: Dan Vacura <w36195@motorola.com>
Change-Id: I5724e6c41a4b298f42d4009bdfe2f0232ae16517
This commit is contained in:
Michael Grzeschik 2021-10-17 23:50:15 +02:00 committed by Dan Vacura
parent 1c14550b60
commit 6692312df6
2 changed files with 5 additions and 2 deletions

View File

@ -169,7 +169,8 @@ uvc_v4l2_qbuf(struct file *file, void *fh, struct v4l2_buffer *b)
if (ret < 0)
return ret;
schedule_work(&video->pump);
if (uvc->state == UVC_STATE_STREAMING)
schedule_work(&video->pump);
return ret;
}

View File

@ -148,6 +148,7 @@ uvc_video_complete(struct usb_ep *ep, struct usb_request *req)
struct uvc_request *ureq = req->context;
struct uvc_video *video = ureq->video;
struct uvc_video_queue *queue = &video->queue;
struct uvc_device *uvc = video->uvc;
unsigned long flags;
switch (req->status) {
@ -170,7 +171,8 @@ uvc_video_complete(struct usb_ep *ep, struct usb_request *req)
list_add_tail(&req->list, &video->req_free);
spin_unlock_irqrestore(&video->req_lock, flags);
schedule_work(&video->pump);
if (uvc->state == UVC_STATE_STREAMING)
schedule_work(&video->pump);
}
static int