lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <16eb88083b68e3701f22799d8ccc20b800b59d61.camel@ndufresne.ca>
Date: Mon, 05 Jan 2026 13:08:08 -0500
From: Nicolas Dufresne <nicolas@...fresne.ca>
To: Ulf Hansson <ulf.hansson@...aro.org>, ming.qian@....nxp.com
Cc: linux-media@...r.kernel.org, mchehab@...nel.org,
 hverkuil-cisco@...all.nl, 	benjamin.gaignard@...labora.com,
 p.zabel@...gutronix.de, 	sebastian.fricke@...labora.com,
 shawnguo@...nel.org, s.hauer@...gutronix.de, 	kernel@...gutronix.de,
 festevam@...il.com, linux-imx@....com, 	l.stach@...gutronix.de,
 Frank.li@....com, peng.fan@....com, eagle.zhou@....com, 
	imx@...ts.linux.dev, linux-pm@...r.kernel.org,
 linux-kernel@...r.kernel.org, 	linux-arm-kernel@...ts.infradead.org
Subject: Re: [PATCH v4 1/3] media: v4l2-mem2mem: Add a kref to the
 v4l2_m2m_dev structure

Hi,

Le mardi 30 décembre 2025 à 14:39 +0100, Ulf Hansson a écrit :
> On Fri, 5 Dec 2025 at 02:55, <ming.qian@....nxp.com> wrote:
> > 
> > From: Nicolas Dufresne <nicolas.dufresne@...labora.com>
> > 
> > Adding a reference count to the v4l2_m2m_dev structure allow safely
> > sharing it across multiple hardware nodes. This can be used to prevent
> > running jobs concurrently on m2m cores that have some internal resource
> > sharing.
> > 
> > Signed-off-by: Nicolas Dufresne <nicolas.dufresne@...labora.com>
> > Signed-off-by: Ming Qian <ming.qian@....nxp.com>
> 
> I certainly don't have the complete picture for how this needs to work.
> 
> However, I was thinking that rather than using a kref and having to
> share two specific functions to update it (v4l2_m2m_get|put), couldn't
> we just use a device-link instead?

The device link seems to be intended for power management, I'm effectively not
familiar with it, so thanks for the information. However, my impression is that
this is indented to describe power management dependencies on siblings, but this
was done differently on this SoC (way before my time here), the DT seems to
describe a block controller which is common to the two (defective) cores. So
power management wise, its already handled.

Be aware that my intent is to rename v4l2_m2m_dev into v4l2_m2m_sched. Its not a
dev wrapper, but a helper object that will schedule work coming from N
v4l2_m2m_ctx (per open() calls). Making this helper object ref counted makes the
live-time management a lot simpler, and since its not a dev wrapper, this patch
is not creating a second refcount for the same object.

regards,
Nicolas


> 
> Kind regards
> Uffe
> 
> > ---
> > v4
> > - Add my Signed-off-by
> > 
> >  drivers/media/v4l2-core/v4l2-mem2mem.c | 23 +++++++++++++++++++++++
> >  include/media/v4l2-mem2mem.h           | 21 +++++++++++++++++++++
> >  2 files changed, 44 insertions(+)
> > 
> > diff --git a/drivers/media/v4l2-core/v4l2-mem2mem.c b/drivers/media/v4l2-
> > core/v4l2-mem2mem.c
> > index fec93c1a9231..ae0de54d4c3e 100644
> > --- a/drivers/media/v4l2-core/v4l2-mem2mem.c
> > +++ b/drivers/media/v4l2-core/v4l2-mem2mem.c
> > @@ -90,6 +90,7 @@ static const char * const m2m_entity_name[] = {
> >   * @job_work:          worker to run queued jobs.
> >   * @job_queue_flags:   flags of the queue status, %QUEUE_PAUSED.
> >   * @m2m_ops:           driver callbacks
> > + * @kref:              device reference count
> >   */
> >  struct v4l2_m2m_dev {
> >         struct v4l2_m2m_ctx     *curr_ctx;
> > @@ -109,6 +110,8 @@ struct v4l2_m2m_dev {
> >         unsigned long           job_queue_flags;
> > 
> >         const struct v4l2_m2m_ops *m2m_ops;
> > +
> > +       struct kref kref;
> >  };
> > 
> >  static struct v4l2_m2m_queue_ctx *get_queue_ctx(struct v4l2_m2m_ctx
> > *m2m_ctx,
> > @@ -1200,6 +1203,7 @@ struct v4l2_m2m_dev *v4l2_m2m_init(const struct
> > v4l2_m2m_ops *m2m_ops)
> >         INIT_LIST_HEAD(&m2m_dev->job_queue);
> >         spin_lock_init(&m2m_dev->job_spinlock);
> >         INIT_WORK(&m2m_dev->job_work, v4l2_m2m_device_run_work);
> > +       kref_init(&m2m_dev->kref);
> > 
> >         return m2m_dev;
> >  }
> > @@ -1211,6 +1215,25 @@ void v4l2_m2m_release(struct v4l2_m2m_dev *m2m_dev)
> >  }
> >  EXPORT_SYMBOL_GPL(v4l2_m2m_release);
> > 
> > +void v4l2_m2m_get(struct v4l2_m2m_dev *m2m_dev)
> > +{
> > +       kref_get(&m2m_dev->kref);
> > +}
> > +EXPORT_SYMBOL_GPL(v4l2_m2m_get);
> > +
> > +static void v4l2_m2m_release_from_kref(struct kref *kref)
> > +{
> > +       struct v4l2_m2m_dev *m2m_dev = container_of(kref, struct
> > v4l2_m2m_dev, kref);
> > +
> > +       v4l2_m2m_release(m2m_dev);
> > +}
> > +
> > +void v4l2_m2m_put(struct v4l2_m2m_dev *m2m_dev)
> > +{
> > +       kref_put(&m2m_dev->kref, v4l2_m2m_release_from_kref);
> > +}
> > +EXPORT_SYMBOL_GPL(v4l2_m2m_put);
> > +
> >  struct v4l2_m2m_ctx *v4l2_m2m_ctx_init(struct v4l2_m2m_dev *m2m_dev,
> >                 void *drv_priv,
> >                 int (*queue_init)(void *priv, struct vb2_queue *src_vq,
> > struct vb2_queue *dst_vq))
> > diff --git a/include/media/v4l2-mem2mem.h b/include/media/v4l2-mem2mem.h
> > index bf6a09a04dcf..ca295c660c7f 100644
> > --- a/include/media/v4l2-mem2mem.h
> > +++ b/include/media/v4l2-mem2mem.h
> > @@ -547,6 +547,27 @@ v4l2_m2m_register_media_controller(struct v4l2_m2m_dev
> > *m2m_dev,
> >   */
> >  void v4l2_m2m_release(struct v4l2_m2m_dev *m2m_dev);
> > 
> > +/**
> > + * v4l2_m2m_get() - take a reference to the m2m_dev structure
> > + *
> > + * @m2m_dev: opaque pointer to the internal data to handle M2M context
> > + *
> > + * This is used to share the M2M device across multiple devices. This
> > + * can be used to avoid scheduling two hardware nodes concurrently.
> > + */
> > +void v4l2_m2m_get(struct v4l2_m2m_dev *m2m_dev);
> > +
> > +/**
> > + * v4l2_m2m_put() - remove a reference to the m2m_dev structure
> > + *
> > + * @m2m_dev: opaque pointer to the internal data to handle M2M context
> > + *
> > + * Once the M2M device have no more references, v4l2_m2m_realse() will be
> > + * called automatically. Users of this method should never call
> > + * v4l2_m2m_release() directly. See v4l2_m2m_get() for more details.
> > + */
> > +void v4l2_m2m_put(struct v4l2_m2m_dev *m2m_dev);
> > +
> >  /**
> >   * v4l2_m2m_ctx_init() - allocate and initialize a m2m context
> >   *
> > --
> > 2.52.0
> > 

Download attachment "signature.asc" of type "application/pgp-signature" (229 bytes)

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ