From: Sakari Ailus <sakari.ailus@linux.intel.com>
To: linux-media@vger.kernel.org
Cc: hverkuil@xs4all.nl
Subject: [PATCH v14 05/36] media-request: Make request state an enum
Date: Mon, 21 May 2018 11:54:30 +0300 [thread overview]
Message-ID: <20180521085501.16861-6-sakari.ailus@linux.intel.com> (raw)
In-Reply-To: <20180521085501.16861-1-sakari.ailus@linux.intel.com>
Make the request state an enum in order to simplify serialising access to
the state as well as other fields in the request. Using the atomic would
be fine as such, but it conveys the suggestion that the atomic operations
alone will be enough for changing that state which is not true.
Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
---
drivers/media/media-request.c | 57 ++++++++++++++++++++++---------------------
include/media/media-request.h | 2 +-
2 files changed, 30 insertions(+), 29 deletions(-)
diff --git a/drivers/media/media-request.c b/drivers/media/media-request.c
index c7e11e816e272..a1576cf528605 100644
--- a/drivers/media/media-request.c
+++ b/drivers/media/media-request.c
@@ -36,7 +36,8 @@ static void media_request_clean(struct media_request *req)
{
struct media_request_object *obj, *obj_safe;
- WARN_ON(atomic_read(&req->state) != MEDIA_REQUEST_STATE_CLEANING);
+ /* Just a sanity check. No other code path is allowed to change this. */
+ WARN_ON(req->state != MEDIA_REQUEST_STATE_CLEANING);
list_for_each_entry_safe(obj, obj_safe, &req->objects, list) {
media_request_object_unbind(obj);
@@ -55,7 +56,8 @@ static void media_request_release(struct kref *kref)
dev_dbg(mdev->dev, "request: release %s\n", req->debug_str);
- atomic_set(&req->state, MEDIA_REQUEST_STATE_CLEANING);
+ /* No other users, no need for a spinlock */
+ req->state = MEDIA_REQUEST_STATE_CLEANING;
media_request_clean(req);
@@ -85,19 +87,16 @@ static unsigned int media_request_poll(struct file *filp,
struct media_request *req = filp->private_data;
unsigned long flags;
unsigned int ret = 0;
- enum media_request_state state;
if (!(poll_requested_events(wait) & POLLPRI))
return 0;
spin_lock_irqsave(&req->lock, flags);
- state = atomic_read(&req->state);
-
- if (state == MEDIA_REQUEST_STATE_COMPLETE) {
+ if (req->state == MEDIA_REQUEST_STATE_COMPLETE) {
ret = POLLPRI;
goto unlock;
}
- if (state != MEDIA_REQUEST_STATE_QUEUED) {
+ if (req->state != MEDIA_REQUEST_STATE_QUEUED) {
ret = POLLERR;
goto unlock;
}
@@ -127,10 +126,11 @@ static long media_request_ioctl_queue(struct media_request *req)
mutex_lock(&mdev->req_queue_mutex);
spin_lock_irqsave(&req->lock, flags);
- state = atomic_cmpxchg(&req->state, MEDIA_REQUEST_STATE_IDLE,
- MEDIA_REQUEST_STATE_VALIDATING);
+ if (req->state == MEDIA_REQUEST_STATE_IDLE)
+ req->state = MEDIA_REQUEST_STATE_VALIDATING;
+ state = req->state;
spin_unlock_irqrestore(&req->lock, flags);
- if (state != MEDIA_REQUEST_STATE_IDLE) {
+ if (state != MEDIA_REQUEST_STATE_VALIDATING) {
dev_dbg(mdev->dev,
"request: unable to queue %s, request in state %s\n",
req->debug_str, media_request_state_str(state));
@@ -155,8 +155,10 @@ static long media_request_ioctl_queue(struct media_request *req)
* canceled, and that uses the req_queue_mutex which is still locked
* while req_queue is called, so that's safe as well.
*/
- atomic_set(&req->state,
- ret ? MEDIA_REQUEST_STATE_IDLE : MEDIA_REQUEST_STATE_QUEUED);
+ spin_lock_irqsave(&req->lock, flags);
+ req->state = ret ? MEDIA_REQUEST_STATE_IDLE
+ : MEDIA_REQUEST_STATE_QUEUED;
+ spin_unlock_irqrestore(&req->lock, flags);
if (!ret)
mdev->ops->req_queue(req);
@@ -178,20 +180,22 @@ static long media_request_ioctl_reinit(struct media_request *req)
unsigned long flags;
spin_lock_irqsave(&req->lock, flags);
- if (atomic_read(&req->state) != MEDIA_REQUEST_STATE_IDLE &&
- atomic_read(&req->state) != MEDIA_REQUEST_STATE_COMPLETE) {
+ if (req->state != MEDIA_REQUEST_STATE_IDLE &&
+ req->state != MEDIA_REQUEST_STATE_COMPLETE) {
dev_dbg(mdev->dev,
"request: %s not in idle or complete state, cannot reinit\n",
req->debug_str);
spin_unlock_irqrestore(&req->lock, flags);
return -EBUSY;
}
- atomic_set(&req->state, MEDIA_REQUEST_STATE_CLEANING);
+ req->state = MEDIA_REQUEST_STATE_CLEANING;
spin_unlock_irqrestore(&req->lock, flags);
media_request_clean(req);
- atomic_set(&req->state, MEDIA_REQUEST_STATE_IDLE);
+ spin_lock_irqsave(&req->lock, flags);
+ req->state = MEDIA_REQUEST_STATE_IDLE;
+ spin_unlock_irqrestore(&req->lock, flags);
return 0;
}
@@ -284,7 +288,7 @@ int media_request_alloc(struct media_device *mdev,
filp->private_data = req;
req->mdev = mdev;
- atomic_set(&req->state, MEDIA_REQUEST_STATE_IDLE);
+ req->state = MEDIA_REQUEST_STATE_IDLE;
req->num_incomplete_objects = 0;
kref_init(&req->kref);
INIT_LIST_HEAD(&req->objects);
@@ -381,7 +385,7 @@ int media_request_object_bind(struct media_request *req,
spin_lock_irqsave(&req->lock, flags);
- if (WARN_ON(atomic_read(&req->state) != MEDIA_REQUEST_STATE_IDLE))
+ if (WARN_ON(req->state != MEDIA_REQUEST_STATE_IDLE))
goto unlock;
list_add_tail(&obj->list, &req->objects);
@@ -397,7 +401,6 @@ EXPORT_SYMBOL_GPL(media_request_object_bind);
void media_request_object_unbind(struct media_request_object *obj)
{
struct media_request *req = obj->req;
- enum media_request_state state;
unsigned long flags;
bool completed = false;
@@ -408,22 +411,20 @@ void media_request_object_unbind(struct media_request_object *obj)
list_del(&obj->list);
obj->req = NULL;
- state = atomic_read(&req->state);
-
- if (state == MEDIA_REQUEST_STATE_COMPLETE ||
- state == MEDIA_REQUEST_STATE_CLEANING)
+ if (req->state == MEDIA_REQUEST_STATE_COMPLETE ||
+ req->state == MEDIA_REQUEST_STATE_CLEANING)
goto unlock;
- if (WARN_ON(state == MEDIA_REQUEST_STATE_VALIDATING))
+ if (WARN_ON(req->state == MEDIA_REQUEST_STATE_VALIDATING))
goto unlock;
if (WARN_ON(!req->num_incomplete_objects))
goto unlock;
req->num_incomplete_objects--;
- if (state == MEDIA_REQUEST_STATE_QUEUED &&
+ if (req->state == MEDIA_REQUEST_STATE_QUEUED &&
!req->num_incomplete_objects) {
- atomic_set(&req->state, MEDIA_REQUEST_STATE_COMPLETE);
+ req->state = MEDIA_REQUEST_STATE_COMPLETE;
completed = true;
wake_up_interruptible_all(&req->poll_wait);
}
@@ -448,11 +449,11 @@ void media_request_object_complete(struct media_request_object *obj)
goto unlock;
obj->completed = true;
if (WARN_ON(!req->num_incomplete_objects) ||
- WARN_ON(atomic_read(&req->state) != MEDIA_REQUEST_STATE_QUEUED))
+ WARN_ON(req->state != MEDIA_REQUEST_STATE_QUEUED))
goto unlock;
if (!--req->num_incomplete_objects) {
- atomic_set(&req->state, MEDIA_REQUEST_STATE_COMPLETE);
+ req->state = MEDIA_REQUEST_STATE_COMPLETE;
wake_up_interruptible_all(&req->poll_wait);
completed = true;
}
diff --git a/include/media/media-request.h b/include/media/media-request.h
index 5367b4a2f91ca..e175538d3c669 100644
--- a/include/media/media-request.h
+++ b/include/media/media-request.h
@@ -55,7 +55,7 @@ struct media_request {
struct media_device *mdev;
struct kref kref;
char debug_str[TASK_COMM_LEN + 11];
- atomic_t state;
+ enum media_request_state state;
struct list_head objects;
unsigned int num_incomplete_objects;
struct wait_queue_head poll_wait;
--
2.11.0
next prev parent reply other threads:[~2018-05-21 8:55 UTC|newest]
Thread overview: 41+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-05-21 8:54 [PATCH v14 00/36] Request API Sakari Ailus
2018-05-21 8:54 ` [PATCH v14 01/36] uapi/linux/media.h: add request API Sakari Ailus
2018-05-21 8:54 ` [PATCH v14 02/36] media-request: implement media requests Sakari Ailus
2018-05-21 8:54 ` [PATCH v14 03/36] media-request: add media_request_get_by_fd Sakari Ailus
2018-05-21 8:54 ` [PATCH v14 04/36] media-request: add media_request_object_find Sakari Ailus
2018-05-21 8:54 ` Sakari Ailus [this message]
2018-05-21 8:54 ` [PATCH v14 06/36] media-request: Add support for updating request objects optimally Sakari Ailus
2018-05-21 10:29 ` [PATCH v14.1 " Sakari Ailus
2018-05-21 11:33 ` [PATCH v14.2 " Sakari Ailus
2018-05-23 9:50 ` [PATCH " Hans Verkuil
2018-05-21 8:54 ` [PATCH v14 07/36] media-request: Add a sanity check for the media request state Sakari Ailus
2018-05-21 8:54 ` [PATCH v14 08/36] media: doc: Add media-request.h header to documentation build Sakari Ailus
2018-05-21 8:54 ` [PATCH v14 09/36] v4l2-dev: lock req_queue_mutex Sakari Ailus
2018-05-21 8:54 ` [PATCH v14 10/36] videodev2.h: add request_fd field to v4l2_ext_controls Sakari Ailus
2018-05-21 8:54 ` [PATCH v14 11/36] v4l2-ctrls: v4l2_ctrl_add_handler: add from_other_dev Sakari Ailus
2018-05-21 8:54 ` [PATCH v14 12/36] v4l2-ctrls: prepare internal structs for request API Sakari Ailus
2018-05-21 8:54 ` [PATCH v14 13/36] v4l2-ctrls: alloc memory for p_req Sakari Ailus
2018-05-21 8:54 ` [PATCH v14 14/36] v4l2-ctrls: use ref in helper instead of ctrl Sakari Ailus
2018-05-21 8:54 ` [PATCH v14 15/36] v4l2-ctrls: add core request support Sakari Ailus
2018-05-21 8:54 ` [PATCH v14 16/36] v4l2-ctrls: Add documentation for control request support functions Sakari Ailus
2018-05-21 8:54 ` [PATCH v14 17/36] v4l2-ctrls: support g/s_ext_ctrls for requests Sakari Ailus
2018-05-21 8:54 ` [PATCH v14 18/36] v4l2-ctrls: Lock the request for updating during S_EXT_CTRLS Sakari Ailus
2018-05-21 8:54 ` [PATCH v14 19/36] videodev2.h: Add request_fd field to v4l2_buffer Sakari Ailus
2018-05-21 8:54 ` [PATCH v14 20/36] vb2: store userspace data in vb2_v4l2_buffer Sakari Ailus
2018-05-21 8:54 ` [PATCH v14 21/36] videobuf2-core: embed media_request_object Sakari Ailus
2018-05-21 8:54 ` [PATCH v14 22/36] videobuf2-core: integrate with media requests Sakari Ailus
2018-05-21 8:54 ` [PATCH v14 23/36] videobuf2-v4l2: " Sakari Ailus
2018-05-21 8:54 ` [PATCH v14 24/36] videobuf2-v4l2: Lock the media request for update for QBUF Sakari Ailus
2018-05-23 10:17 ` Hans Verkuil
2018-05-21 8:54 ` [PATCH v14 25/36] videobuf2-core: Make request state an enum Sakari Ailus
2018-05-21 8:54 ` [PATCH v14 26/36] videobuf2-core: add request helper functions Sakari Ailus
2018-05-21 8:54 ` [PATCH v14 27/36] videobuf2-v4l2: add vb2_request_queue/validate helpers Sakari Ailus
2018-05-21 8:54 ` [PATCH v14 28/36] v4l2-mem2mem: add vb2_m2m_request_queue Sakari Ailus
2018-05-21 8:54 ` [PATCH v14 29/36] Documentation: v4l: document request API Sakari Ailus
2018-05-21 8:54 ` [PATCH v14 30/36] media: vim2m: add media device Sakari Ailus
2018-05-21 8:54 ` [PATCH v14 31/36] vim2m: use workqueue Sakari Ailus
2018-05-21 8:54 ` [PATCH v14 32/36] vim2m: support requests Sakari Ailus
2018-05-21 8:54 ` [PATCH v14 33/36] vivid: add mc Sakari Ailus
2018-05-21 8:54 ` [PATCH v14 34/36] vivid: add request support Sakari Ailus
2018-05-21 8:55 ` [PATCH v14 35/36] RFC: media-requests: add debugfs node Sakari Ailus
2018-05-21 8:55 ` [PATCH v14 36/36] v4l: m2m: Simplify exiting the function in v4l2_m2m_try_schedule Sakari Ailus
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=20180521085501.16861-6-sakari.ailus@linux.intel.com \
--to=sakari.ailus@linux.intel.com \
--cc=hverkuil@xs4all.nl \
--cc=linux-media@vger.kernel.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).