From: Mauro Carvalho Chehab <mchehab@s-opensource.com>
To: Sakari Ailus <sakari.ailus@iki.fi>
Cc: Hans Verkuil <hverkuil@xs4all.nl>,
linux-media@vger.kernel.org,
Hans Verkuil <hans.verkuil@cisco.com>
Subject: Re: [RFCv11 PATCH 04/29] media-request: core request support
Date: Tue, 10 Apr 2018 11:51:43 -0300 [thread overview]
Message-ID: <20180410115143.41178f68@vento.lan> (raw)
In-Reply-To: <20180410123234.ifo6v23wztsslmdp@valkosipuli.retiisi.org.uk>
Em Tue, 10 Apr 2018 15:32:34 +0300
Sakari Ailus <sakari.ailus@iki.fi> escreveu:
> Hi Mauro and Hans,
>
> On Tue, Apr 10, 2018 at 07:32:06AM -0300, Mauro Carvalho Chehab wrote:
> ...
> > > +static void media_request_release(struct kref *kref)
> > > +{
> > > + struct media_request *req =
> > > + container_of(kref, struct media_request, kref);
> > > + struct media_device *mdev = req->mdev;
> > > + unsigned long flags;
> > > +
> > > + dev_dbg(mdev->dev, "request: release %s\n", req->debug_str);
> > > +
> > > + spin_lock_irqsave(&req->lock, flags);
> > > + req->state = MEDIA_REQUEST_STATE_CLEANING;
> > > + spin_unlock_irqrestore(&req->lock, flags);
> > > +
> > > + media_request_clean(req);
> > > +
> > > + if (mdev->ops->req_free)
> > > + mdev->ops->req_free(req);
> > > + else
> > > + kfree(req);
> >
> > Without looking at req_free() implementation, I would actually prefer
> > to always do a kfree(req) here. So, a req_free() function would only
> > free "extra" allocations, and not the request itself. e. g.:
> >
> > ...
> > if (mdev->ops->req_free)
> > mdev->ops->req_free(req);
> >
> > kfree(req);
> > }
>
> The idea is that you can embed the request object in a driver specific
> struct. The drivers can store information related to that request rather
> easily that way, without requiring to be aware of two objects with
> references pointing to each other. I rather prefer the current
> implementation. It same pattern is actually used on videobuf2 buffers.
Ok, then document it so.
Btw, one of the things it is missing is a kAPI documentation patch,
describing things like that.
>
> ...
>
> > > +static unsigned int media_request_poll(struct file *filp,
> > > + struct poll_table_struct *wait)
> > > +{
> > > + struct media_request *req = filp->private_data;
> > > + unsigned long flags;
> > > + enum media_request_state state;
> > > +
> > > + if (!(poll_requested_events(wait) & POLLPRI))
> > > + return 0;
> > > +
> > > + spin_lock_irqsave(&req->lock, flags);
> > > + state = req->state;
> > > + spin_unlock_irqrestore(&req->lock, flags);
> >
> > IMO, it would be better to use an atomic var for state, having a
> > lockless access to it.
>
> The lock serialises access to the whole request, not just to its state.
>From what I understood at the code is that the spin lock
is used *sometimes* to protect just the state. I didn't
see it used to protect the hole data struct.
Instead, the mutex is used for that purpose, but, again,
it is *sometimes* used, but on several parts, neither the
spin lock nor the mutex is used.
It should be noticed that the data, itself, should be protected
by *either* mutex or spin lock.
> While it doesn't matter here as you're just reading the state, writing it
> would still require taking the lock. Using atomic_t might suggest
> otherwise, and could end up being a source of bugs.
There are already a lot of bugs at the locking, from what I noticed.
We should do it right: it should use *just one* kind of memory
protection for struct media_request. On the places where it is
safe to just read the status without locking, atomic_t() should
be used. Where it doesn't, probably the entire code should be
protected by the lock.
> >
> > > +
> > > + if (state == MEDIA_REQUEST_STATE_COMPLETE)
> > > + return POLLPRI;
> > > + if (state == MEDIA_REQUEST_STATE_IDLE)
> > > + return POLLERR;
> > > +
> > > + poll_wait(filp, &req->poll_wait, wait);
> > > + return 0;
> > > +}
> > > +
> > > +static long media_request_ioctl(struct file *filp, unsigned int cmd,
> > > + unsigned long __arg)
> > > +{
> > > + return -ENOIOCTLCMD;
> > > +}
> > > +
> > > +static const struct file_operations request_fops = {
> > > + .owner = THIS_MODULE,
> > > + .poll = media_request_poll,
> > > + .unlocked_ioctl = media_request_ioctl,
> > > + .release = media_request_close,
> > > +};
> > > +
> > > int media_request_alloc(struct media_device *mdev,
> > > struct media_request_alloc *alloc)
> > > {
> > > - return -ENOMEM;
> > > + struct media_request *req;
> > > + struct file *filp;
> > > + char comm[TASK_COMM_LEN];
> > > + int fd;
> > > + int ret;
> > > +
> > > + fd = get_unused_fd_flags(O_CLOEXEC);
> > > + if (fd < 0)
> > > + return fd;
> > > +
> > > + filp = anon_inode_getfile("request", &request_fops, NULL, O_CLOEXEC);
> > > + if (IS_ERR(filp)) {
> > > + ret = PTR_ERR(filp);
> > > + goto err_put_fd;
> > > + }
> > > +
> > > + if (mdev->ops->req_alloc)
> > > + req = mdev->ops->req_alloc(mdev);
> > > + else
> > > + req = kzalloc(sizeof(*req), GFP_KERNEL);
> > > + if (!req) {
> > > + ret = -ENOMEM;
> > > + goto err_fput;
> > > + }
> > > +
> > > + filp->private_data = req;
> > > + req->mdev = mdev;
> > > + req->state = MEDIA_REQUEST_STATE_IDLE;
> > > + req->num_incomplete_objects = 0;
> > > + kref_init(&req->kref);
> > > + INIT_LIST_HEAD(&req->objects);
> > > + spin_lock_init(&req->lock);
> > > + init_waitqueue_head(&req->poll_wait);
> > > +
> > > + alloc->fd = fd;
> >
> > Btw, this is a very good reason why you should define the ioctl to
> > have an integer argument instead of a struct with a __s32 field
> > on it, as per my comment to patch 02/29:
> >
> > #define MEDIA_IOC_REQUEST_ALLOC _IOWR('|', 0x05, int)
> >
> > At 64 bit architectures, you're truncating the file descriptor!
>
> I'm not quite sure what do you mean. int is 32 bits on 64-bit systems as
> well.
Hmm.. you're right. I was thinking that it could be 64 bits on some
archs like sparc64 (Tru64 C compiler declares it with 64 bits), but,
according with:
https://www.gnu.org/software/gnu-c-manual/gnu-c-manual.html
This is not the case on gcc.
> We actually replaced int by __s32 or __u32 everywhere in uAPI (apart from
> one particular struct; time to send a patch) about five years ago.
>
> >
> > > + get_task_comm(comm, current);
> > > + snprintf(req->debug_str, sizeof(req->debug_str), "%s:%d",
> > > + comm, fd);
> >
> > Not sure if it is a good idea to store the task that allocated
> > the request. While it makes sense for the dev_dbg() below, it
> > may not make sense anymore on other dev_dbg() you would be
> > using it.
>
> The lifetime of the file handle roughly matches that of the request. It's
> for debug only anyway.
>
> Better proposals are always welcome of course. But I think we should have
> something here that helps debugging by meaningfully making the requests
> identifiable from logs.
What I meant to say is that one PID could be allocating the
request, while some other one could be actually doing Q/DQ_BUF.
On such scenario, the debug string could provide mislead prints.
>
> ...
>
> > > +#ifdef CONFIG_MEDIA_CONTROLLER
> > > +static inline void media_request_object_get(struct media_request_object *obj)
> > > +{
> > > + kref_get(&obj->kref);
> > > +}
> >
> > Why do you need a function? Just use kref_get() were needed, instead of
> > aliasing it for no good reason.
>
> We have similar functions for get and put in many places in the kernel. If
> this were a static function only used in a single .c file, I'd most likely
> agree. Here it avoids having to know the internals of request objects
> elsewhere.
>
> I wonder if this could be moved to the .c file actually; I haven't looked
> at the other patches.
>
Thanks,
Mauro
next prev parent reply other threads:[~2018-04-10 14:51 UTC|newest]
Thread overview: 135+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-04-09 14:19 [RFCv11 PATCH 00/29] Request API Hans Verkuil
2018-04-09 14:19 ` [RFCv11 PATCH 01/29] v4l2-device.h: always expose mdev Hans Verkuil
2018-04-17 4:34 ` Alexandre Courbot
2018-04-09 14:19 ` [RFCv11 PATCH 02/29] uapi/linux/media.h: add request API Hans Verkuil
2018-04-10 5:26 ` Tomasz Figa
2018-04-23 9:55 ` Hans Verkuil
2018-04-10 9:38 ` Mauro Carvalho Chehab
2018-04-10 11:00 ` Sakari Ailus
2018-04-23 11:41 ` Hans Verkuil
2018-04-23 13:32 ` Mauro Carvalho Chehab
2018-04-17 4:34 ` Alexandre Courbot
2018-04-09 14:20 ` [RFCv11 PATCH 03/29] media-request: allocate media requests Hans Verkuil
2018-04-10 5:35 ` Tomasz Figa
2018-04-10 9:54 ` Mauro Carvalho Chehab
2018-04-23 9:59 ` Hans Verkuil
2018-04-10 9:52 ` Mauro Carvalho Chehab
2018-04-10 11:14 ` Sakari Ailus
2018-04-11 10:13 ` Mauro Carvalho Chehab
2018-04-23 9:46 ` Hans Verkuil
2018-04-23 11:49 ` Hans Verkuil
2018-04-23 13:35 ` Mauro Carvalho Chehab
2018-04-17 4:34 ` Alexandre Courbot
2018-04-09 14:20 ` [RFCv11 PATCH 04/29] media-request: core request support Hans Verkuil
2018-04-10 8:21 ` Tomasz Figa
2018-04-10 13:04 ` Sakari Ailus
2018-04-23 11:24 ` Hans Verkuil
2018-04-23 12:14 ` Hans Verkuil
2018-04-10 10:32 ` Mauro Carvalho Chehab
2018-04-10 12:32 ` Sakari Ailus
2018-04-10 14:51 ` Mauro Carvalho Chehab [this message]
2018-04-11 13:21 ` Sakari Ailus
2018-04-11 13:49 ` Mauro Carvalho Chehab
2018-04-11 15:02 ` Sakari Ailus
2018-04-11 15:17 ` Mauro Carvalho Chehab
2018-04-11 15:35 ` Sakari Ailus
2018-04-11 16:13 ` Mauro Carvalho Chehab
2018-04-12 7:11 ` Sakari Ailus
2018-04-23 12:43 ` Hans Verkuil
2018-05-07 10:05 ` Sakari Ailus
2018-04-23 12:23 ` Hans Verkuil
2018-04-23 14:07 ` Mauro Carvalho Chehab
2018-04-10 12:17 ` Sakari Ailus
2018-04-17 4:35 ` Alexandre Courbot
2018-04-23 14:28 ` Hans Verkuil
2018-04-09 14:20 ` [RFCv11 PATCH 05/29] media-request: add request ioctls Hans Verkuil
2018-04-10 8:59 ` Tomasz Figa
2018-04-12 7:35 ` Sakari Ailus
2018-04-23 12:40 ` Hans Verkuil
2018-04-23 11:34 ` Hans Verkuil
2018-04-10 10:57 ` Mauro Carvalho Chehab
2018-04-12 10:40 ` Sakari Ailus
2018-04-23 13:45 ` Hans Verkuil
2018-04-12 7:31 ` Sakari Ailus
2018-04-09 14:20 ` [RFCv11 PATCH 06/29] media-request: add media_request_find Hans Verkuil
2018-04-10 11:04 ` Mauro Carvalho Chehab
2018-04-12 10:52 ` Sakari Ailus
2018-04-12 12:08 ` Sakari Ailus
2018-04-23 13:50 ` Hans Verkuil
2018-04-09 14:20 ` [RFCv11 PATCH 07/29] media-request: add media_request_object_find Hans Verkuil
2018-04-10 11:07 ` Mauro Carvalho Chehab
2018-04-10 11:10 ` Hans Verkuil
2018-04-12 12:23 ` Sakari Ailus
2018-04-23 13:55 ` Hans Verkuil
2018-04-17 4:36 ` Alexandre Courbot
2018-04-23 14:32 ` Hans Verkuil
2018-04-09 14:20 ` [RFCv11 PATCH 08/29] videodev2.h: add request_fd field to v4l2_ext_controls Hans Verkuil
2018-04-10 11:11 ` Mauro Carvalho Chehab
2018-04-12 12:24 ` Sakari Ailus
2018-04-09 14:20 ` [RFCv11 PATCH 09/29] videodev2.h: add V4L2_CTRL_FLAG_IN_REQUEST Hans Verkuil
2018-04-09 14:20 ` [RFCv11 PATCH 10/29] v4l2-ctrls: v4l2_ctrl_add_handler: add from_other_dev Hans Verkuil
2018-04-10 11:42 ` Mauro Carvalho Chehab
2018-04-12 13:35 ` Sakari Ailus
2018-04-09 14:20 ` [RFCv11 PATCH 11/29] v4l2-ctrls: prepare internal structs for request API Hans Verkuil
2018-04-09 14:20 ` [RFCv11 PATCH 12/29] v4l2-ctrls: alloc memory for p_req Hans Verkuil
2018-04-10 9:32 ` Tomasz Figa
2018-04-10 13:57 ` Mauro Carvalho Chehab
2018-04-23 11:39 ` Hans Verkuil
2018-04-09 14:20 ` [RFCv11 PATCH 13/29] v4l2-ctrls: use ref in helper instead of ctrl Hans Verkuil
2018-04-10 12:47 ` Mauro Carvalho Chehab
2018-04-09 14:20 ` [RFCv11 PATCH 14/29] v4l2-ctrls: add core request support Hans Verkuil
2018-04-11 8:37 ` Paul Kocialkowski
2018-04-11 9:43 ` Tomasz Figa
2018-04-23 9:23 ` Hans Verkuil
2018-04-09 14:20 ` [RFCv11 PATCH 15/29] v4l2-ctrls: support g/s_ext_ctrls for requests Hans Verkuil
2018-04-10 13:00 ` Mauro Carvalho Chehab
2018-04-09 14:20 ` [RFCv11 PATCH 16/29] videodev2.h: Add request_fd field to v4l2_buffer Hans Verkuil
2018-04-09 14:20 ` [RFCv11 PATCH 17/29] vb2: store userspace data in vb2_v4l2_buffer Hans Verkuil
2018-04-09 15:11 ` Kieran Bingham
2018-04-23 9:53 ` Hans Verkuil
2018-04-10 13:32 ` Mauro Carvalho Chehab
2018-04-09 14:20 ` [RFCv11 PATCH 18/29] videobuf2-core: embed media_request_object Hans Verkuil
2018-04-09 14:20 ` [RFCv11 PATCH 19/29] videobuf2-core: integrate with media requests Hans Verkuil
2018-04-12 8:13 ` Tomasz Figa
2018-04-23 12:49 ` Hans Verkuil
2018-04-09 14:20 ` [RFCv11 PATCH 20/29] videobuf2-v4l2: " Hans Verkuil
2018-04-10 13:52 ` Mauro Carvalho Chehab
2018-04-17 4:36 ` Alexandre Courbot
2018-04-23 14:53 ` Hans Verkuil
2018-04-09 14:20 ` [RFCv11 PATCH 21/29] videobuf2-core: add vb2_core_request_has_buffers Hans Verkuil
2018-04-10 13:53 ` Mauro Carvalho Chehab
2018-04-09 14:20 ` [RFCv11 PATCH 22/29] videobuf2-v4l2: add vb2_request_queue helper Hans Verkuil
2018-04-12 8:29 ` Tomasz Figa
2018-04-23 12:51 ` Hans Verkuil
2018-04-09 14:20 ` [RFCv11 PATCH 23/29] videobuf2-v4l2: export request_fd Hans Verkuil
2018-04-10 13:59 ` Mauro Carvalho Chehab
2018-04-09 14:20 ` [RFCv11 PATCH 24/29] Documentation: v4l: document request API Hans Verkuil
2018-04-10 14:19 ` Mauro Carvalho Chehab
2018-04-12 8:51 ` Tomasz Figa
2018-04-09 14:20 ` [RFCv11 PATCH 25/29] media: vim2m: add media device Hans Verkuil
2018-04-12 8:54 ` Tomasz Figa
2018-04-23 13:23 ` Hans Verkuil
2018-04-17 4:37 ` Alexandre Courbot
2018-04-09 14:20 ` [RFCv11 PATCH 26/29] vim2m: use workqueue Hans Verkuil
2018-04-11 14:06 ` Paul Kocialkowski
2018-04-30 14:51 ` Hans Verkuil
2018-04-12 9:02 ` Tomasz Figa
2018-04-30 14:58 ` Hans Verkuil
2018-04-09 14:20 ` [RFCv11 PATCH 27/29] vim2m: support requests Hans Verkuil
2018-04-11 14:01 ` Paul Kocialkowski
2018-04-12 9:15 ` Tomasz Figa
2018-04-23 13:30 ` Hans Verkuil
2018-04-17 4:37 ` Alexandre Courbot
2018-04-23 15:06 ` Hans Verkuil
2018-04-17 11:42 ` Paul Kocialkowski
2018-04-23 15:10 ` Hans Verkuil
2018-04-09 14:20 ` [RFCv11 PATCH 28/29] vivid: add mc Hans Verkuil
2018-04-09 14:20 ` [RFCv11 PATCH 29/29] vivid: add request support Hans Verkuil
2018-04-10 14:31 ` [RFCv11 PATCH 00/29] Request API Mauro Carvalho Chehab
2018-04-17 4:33 ` Alexandre Courbot
2018-04-17 6:12 ` Hans Verkuil
2018-04-17 6:17 ` Alexandre Courbot
2018-04-17 11:40 ` Paul Kocialkowski
2018-04-18 2:06 ` Alexandre Courbot
2018-04-19 7:48 ` Paul Kocialkowski
2018-04-23 15:10 ` Hans Verkuil
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=20180410115143.41178f68@vento.lan \
--to=mchehab@s-opensource.com \
--cc=hans.verkuil@cisco.com \
--cc=hverkuil@xs4all.nl \
--cc=linux-media@vger.kernel.org \
--cc=sakari.ailus@iki.fi \
/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