From: Laurent Pinchart <laurent.pinchart-ryLnwIuWjnjg/C1BVhZhaw@public.gmane.org>
To: Sakari Ailus <sakari.ailus-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
Cc: linux-media-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
niklas.soderlund-1zkq55x86MTxsAP9Fp7wbw@public.gmane.org,
maxime.ripard-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org,
robh-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org,
hverkuil-qWit8jRvyhVmR6Xm/wNWPw@public.gmane.org,
devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
pavel-+ZI9xUNit7I@public.gmane.org,
sre-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org
Subject: Re: [PATCH v13 14/25] v4l: async: Allow binding notifiers to sub-devices
Date: Tue, 19 Sep 2017 16:52:29 +0300 [thread overview]
Message-ID: <3338675.o4HGi8X83V@avalon> (raw)
In-Reply-To: <20170915141724.23124-15-sakari.ailus-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
Hi Sakari,
Thank you for the patch.
On Friday, 15 September 2017 17:17:13 EEST Sakari Ailus wrote:
> Registering a notifier has required the knowledge of struct v4l2_device
> for the reason that sub-devices generally are registered to the
> v4l2_device (as well as the media device, also available through
> v4l2_device).
>
> This information is not available for sub-device drivers at probe time.
>
> What this patch does is that it allows registering notifiers without
> having v4l2_device around. Instead the sub-device pointer is stored in the
> notifier. Once the sub-device of the driver that registered the notifier
> is registered, the notifier will gain the knowledge of the v4l2_device,
> and the binding of async sub-devices from the sub-device driver's notifier
> may proceed.
>
> The root notifier's complete callback is only called when all sub-device
> notifiers are completed.
This is a bit hard to review, shouldn't it be split in two patches, one that
refactors the functions, and another one that allows binding notifiers to
subdevs ?
> Signed-off-by: Sakari Ailus <sakari.ailus-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
> ---
> drivers/media/v4l2-core/v4l2-async.c | 218 +++++++++++++++++++++++++++-----
> include/media/v4l2-async.h | 16 ++-
> 2 files changed, 203 insertions(+), 31 deletions(-)
>
> diff --git a/drivers/media/v4l2-core/v4l2-async.c
> b/drivers/media/v4l2-core/v4l2-async.c index 4be2f16af051..52fe22b9b6b4
> 100644
> --- a/drivers/media/v4l2-core/v4l2-async.c
> +++ b/drivers/media/v4l2-core/v4l2-async.c
> @@ -53,6 +53,10 @@ static int v4l2_async_notifier_call_complete(struct
> v4l2_async_notifier *n) return n->ops->complete(n);
> }
>
> +static int v4l2_async_match_notify(struct v4l2_async_notifier *notifier,
> + struct v4l2_subdev *sd,
> + struct v4l2_async_subdev *asd);
Forward declarations are often a sign that something is wrong :-/ If you
really need to keep this I'd move it right before the function that needs it.
> static bool match_i2c(struct v4l2_subdev *sd, struct v4l2_async_subdev
> *asd) {
> #if IS_ENABLED(CONFIG_I2C)
> @@ -124,14 +128,127 @@ static struct v4l2_async_subdev
> *v4l2_async_find_match( return NULL;
> }
>
> +/* Find the sub-device notifier registered by a sub-device driver. */
> +static struct v4l2_async_notifier *v4l2_async_find_subdev_notifier(
> + struct v4l2_subdev *sd)
> +{
> + struct v4l2_async_notifier *n;
> +
> + list_for_each_entry(n, ¬ifier_list, list)
> + if (n->sd == sd)
> + return n;
> +
> + return NULL;
> +}
> +
> +/* Return true if all sub-device notifiers are complete, false otherwise.
> */
> +static bool v4l2_async_subdev_notifiers_complete(
> + struct v4l2_async_notifier *notifier)
> +{
> + struct v4l2_subdev *sd;
> +
> + if (!list_empty(¬ifier->waiting))
> + return false;
> +
> + list_for_each_entry(sd, ¬ifier->done, async_list) {
> + struct v4l2_async_notifier *subdev_notifier =
> + v4l2_async_find_subdev_notifier(sd);
> +
> + if (subdev_notifier &&
> + !v4l2_async_subdev_notifiers_complete(subdev_notifier))
> + return false;
This will loop forever if two subdevs add each other to their respective
notifiers. We might not have any use case for that right now, but it's bound
to happen, at least as a bug during development, and an infinite loop (with an
additional stack overflow bonus) isn't very nice to debug.
> + }
> +
> + return true;
> +}
> +
> +/* Get v4l2_device related to the notifier if one can be found. */
> +static struct v4l2_device *v4l2_async_notifier_find_v4l2_dev(
> + struct v4l2_async_notifier *notifier)
> +{
> + while (notifier->parent)
> + notifier = notifier->parent;
> +
> + return notifier->v4l2_dev;
> +}
> +
> +/* Test all async sub-devices in a notifier for a match. */
> +static int v4l2_async_notifier_try_all_subdevs(
> + struct v4l2_async_notifier *notifier)
> +{
> + struct v4l2_subdev *sd;
> +
> + if (!v4l2_async_notifier_find_v4l2_dev(notifier))
> + return 0;
> +
> +again:
> + list_for_each_entry(sd, &subdev_list, async_list) {
> + struct v4l2_async_subdev *asd;
> + int ret;
> +
> + asd = v4l2_async_find_match(notifier, sd);
> + if (!asd)
> + continue;
> +
> + ret = v4l2_async_match_notify(notifier, sd, asd);
> + if (ret < 0)
> + return ret;
> +
> + /*
> + * v4l2_async_match_notify() may lead to registering a
> + * new notifier and thus changing the async subdevs
> + * list. In order to proceed safely from here, restart
> + * parsing the list from the beginning.
> + */
> + goto again;
> + }
> +
> + return 0;
> +}
> +
> +/* Try completing a notifier. */
> +static int v4l2_async_notifier_try_complete(
> + struct v4l2_async_notifier *notifier)
> +{
> + do {
> + int ret;
> +
> + /* Any local async sub-devices left? */
> + if (!list_empty(¬ifier->waiting))
> + return 0;
> +
> + /*
> + * Any sub-device notifiers waiting for async subdevs
> + * to be bound?
> + */
> + if (!v4l2_async_subdev_notifiers_complete(notifier))
> + return 0;
> +
> + /* Proceed completing the notifier */
> + ret = v4l2_async_notifier_call_complete(notifier);
> + if (ret < 0)
> + return ret;
> +
> + /*
> + * Obtain notifier's parent. If there is one, repeat
> + * the process, otherwise we're done here.
> + */
> + notifier = notifier->parent;
> + } while (notifier);
> +
> + return 0;
> +}
> +
> static int v4l2_async_match_notify(struct v4l2_async_notifier *notifier,
> struct v4l2_subdev *sd,
> struct v4l2_async_subdev *asd)
> {
> + struct v4l2_async_notifier *subdev_notifier;
> int ret;
>
> - ret = v4l2_device_register_subdev(notifier->v4l2_dev, sd);
> - if (ret < 0)
> + ret = v4l2_device_register_subdev(
> + v4l2_async_notifier_find_v4l2_dev(notifier), sd);
> + if (ret)
> return ret;
>
> ret = v4l2_async_notifier_call_bound(notifier, sd, asd);
> @@ -148,10 +265,20 @@ static int v4l2_async_match_notify(struct
> v4l2_async_notifier *notifier, /* Move from the global subdevice list to
> notifier's done */
> list_move(&sd->async_list, ¬ifier->done);
>
> - if (list_empty(¬ifier->waiting))
> - return v4l2_async_notifier_call_complete(notifier);
> + /*
> + * See if the sub-device has a notifier. If it does, proceed
> + * with checking for its async sub-devices.
> + */
> + subdev_notifier = v4l2_async_find_subdev_notifier(sd);
> + if (subdev_notifier && !subdev_notifier->parent) {
> + subdev_notifier->parent = notifier;
> + ret = v4l2_async_notifier_try_all_subdevs(subdev_notifier);
> + if (ret)
> + return ret;
> + }
>
> - return 0;
> + /* Try completing the notifier and its parent(s). */
> + return v4l2_async_notifier_try_complete(notifier);
> }
>
> static void v4l2_async_cleanup(struct v4l2_subdev *sd)
> @@ -163,17 +290,15 @@ static void v4l2_async_cleanup(struct v4l2_subdev *sd)
> sd->dev = NULL;
> }
>
> -int v4l2_async_notifier_register(struct v4l2_device *v4l2_dev,
> - struct v4l2_async_notifier *notifier)
> +static int __v4l2_async_notifier_register(struct v4l2_async_notifier
> *notifier) {
> - struct v4l2_subdev *sd, *tmp;
> struct v4l2_async_subdev *asd;
> + int ret;
> int i;
>
> - if (!v4l2_dev || notifier->num_subdevs > V4L2_MAX_SUBDEVS)
> + if (notifier->num_subdevs > V4L2_MAX_SUBDEVS)
> return -EINVAL;
>
> - notifier->v4l2_dev = v4l2_dev;
> INIT_LIST_HEAD(¬ifier->waiting);
> INIT_LIST_HEAD(¬ifier->done);
>
> @@ -200,18 +325,10 @@ int v4l2_async_notifier_register(struct v4l2_device
> *v4l2_dev,
>
> mutex_lock(&list_lock);
>
> - list_for_each_entry_safe(sd, tmp, &subdev_list, async_list) {
> - int ret;
> -
> - asd = v4l2_async_find_match(notifier, sd);
> - if (!asd)
> - continue;
> -
> - ret = v4l2_async_match_notify(notifier, sd, asd);
> - if (ret < 0) {
> - mutex_unlock(&list_lock);
> - return ret;
> - }
> + ret = v4l2_async_notifier_try_all_subdevs(notifier);
> + if (ret) {
> + mutex_unlock(&list_lock);
> + return ret;
> }
>
> /* Keep also completed notifiers on the list */
> @@ -221,29 +338,70 @@ int v4l2_async_notifier_register(struct v4l2_device
> *v4l2_dev,
>
> return 0;
> }
> +
> +int v4l2_async_notifier_register(struct v4l2_device *v4l2_dev,
> + struct v4l2_async_notifier *notifier)
> +{
> + if (WARN_ON(!v4l2_dev || notifier->sd))
> + return -EINVAL;
> +
> + notifier->v4l2_dev = v4l2_dev;
> +
> + return __v4l2_async_notifier_register(notifier);
> +}
> EXPORT_SYMBOL(v4l2_async_notifier_register);
>
> -void v4l2_async_notifier_unregister(struct v4l2_async_notifier *notifier)
> +int v4l2_async_subdev_notifier_register(struct v4l2_subdev *sd,
> + struct v4l2_async_notifier *notifier)
> {
> - struct v4l2_subdev *sd, *tmp;
> + if (WARN_ON(!sd || notifier->v4l2_dev))
> + return -EINVAL;
>
> - if (!notifier->v4l2_dev)
> - return;
> + notifier->sd = sd;
>
> - mutex_lock(&list_lock);
> + return __v4l2_async_notifier_register(notifier);
> +}
> +EXPORT_SYMBOL(v4l2_async_subdev_notifier_register);
>
> - list_del(¬ifier->list);
> +/* Unbind all sub-devices in the notifier tree. */
> +static void v4l2_async_notifier_unbind_all_subdevs(
> + struct v4l2_async_notifier *notifier)
> +{
> + struct v4l2_subdev *sd, *tmp;
>
> list_for_each_entry_safe(sd, tmp, ¬ifier->done, async_list) {
> + struct v4l2_async_notifier *subdev_notifier =
> + v4l2_async_find_subdev_notifier(sd);
> +
> + if (subdev_notifier)
> + v4l2_async_notifier_unbind_all_subdevs(subdev_notifier);
> +
> v4l2_async_cleanup(sd);
>
> v4l2_async_notifier_call_unbind(notifier, sd, sd->asd);
> - }
>
> - mutex_unlock(&list_lock);
> + list_del(&sd->async_list);
> + list_add(&sd->async_list, &subdev_list);
How about list_move() ?
This seems to be new code, and by the look of it, I wonder whether it doesn't
belong in the reprobing removal patch.
> + }
>
> + notifier->parent = NULL;
> + notifier->sd = NULL;
> notifier->v4l2_dev = NULL;
> }
> +
> +void v4l2_async_notifier_unregister(struct v4l2_async_notifier *notifier)
> +{
> + if (!notifier->v4l2_dev && !notifier->sd)
> + return;
> +
> + mutex_lock(&list_lock);
> +
> + v4l2_async_notifier_unbind_all_subdevs(notifier);
> +
> + list_del(¬ifier->list);
> +
> + mutex_unlock(&list_lock);
> +}
> EXPORT_SYMBOL(v4l2_async_notifier_unregister);
>
> void v4l2_async_notifier_release(struct v4l2_async_notifier *notifier)
[snip]
--
Regards,
Laurent Pinchart
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
next prev parent reply other threads:[~2017-09-19 13:52 UTC|newest]
Thread overview: 91+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-09-15 14:16 [PATCH v13 00/25] Unified fwnode endpoint parser, async sub-device notifier support, N9 flash DTS Sakari Ailus
2017-09-15 14:17 ` [PATCH v13 02/25] v4l: async: Remove re-probing support Sakari Ailus
[not found] ` <20170915141724.23124-3-sakari.ailus-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
2017-09-19 9:21 ` Laurent Pinchart
2017-09-15 14:17 ` [PATCH v13 04/25] v4l: async: Add V4L2 async documentation to the documentation build Sakari Ailus
2017-09-15 14:17 ` [PATCH v13 06/25] omap3isp: Use generic parser for parsing fwnode endpoints Sakari Ailus
2017-09-16 7:04 ` Pavel Machek
2017-09-16 7:18 ` Pavel Machek
2017-09-19 11:40 ` Laurent Pinchart
2017-09-19 12:41 ` Sakari Ailus
2017-09-19 12:43 ` Sakari Ailus
2017-09-19 12:46 ` Laurent Pinchart
2017-09-19 14:47 ` Sakari Ailus
2017-09-19 16:12 ` Laurent Pinchart
2017-09-21 8:46 ` Sakari Ailus
2017-09-20 15:50 ` Sakari Ailus
2017-09-15 14:17 ` [PATCH v13 08/25] omap3isp: Fix check for our own sub-devices Sakari Ailus
[not found] ` <20170915141724.23124-9-sakari.ailus-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
2017-09-19 11:55 ` Laurent Pinchart
[not found] ` <20170915141724.23124-1-sakari.ailus-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
2017-09-15 14:17 ` [PATCH v13 01/25] v4l: fwnode: Move KernelDoc documentation to the header Sakari Ailus
[not found] ` <20170915141724.23124-2-sakari.ailus-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
2017-09-19 10:48 ` Laurent Pinchart
2017-09-19 11:04 ` Hans Verkuil
[not found] ` <29354478-ec46-278b-c457-4e6f3cc6848c-qWit8jRvyhVmR6Xm/wNWPw@public.gmane.org>
2017-09-19 11:07 ` Laurent Pinchart
2017-09-19 11:22 ` Sakari Ailus
2017-09-19 11:10 ` Sakari Ailus
[not found] ` <20170919111036.5va2unwqh2vymojr-S+BSfZ9RZZmRSg0ZkenSGLdO1Tsj/99ntUK59QYPAWc@public.gmane.org>
2017-09-19 11:14 ` Laurent Pinchart
2017-09-19 11:25 ` Sakari Ailus
2017-09-15 14:17 ` [PATCH v13 03/25] v4l: async: Use more intuitive names for internal functions Sakari Ailus
2017-09-15 14:17 ` [PATCH v13 05/25] v4l: fwnode: Support generic parsing of graph endpoints in a device Sakari Ailus
2017-09-19 8:03 ` Hans Verkuil
2017-09-19 8:20 ` Sakari Ailus
[not found] ` <20170919082015.vt6olgirnvmpcrpa-z7MJbOB4PBP+e+fPlCVrcFDQ4js95KgL@public.gmane.org>
2017-09-19 8:40 ` Hans Verkuil
[not found] ` <af99e12c-6fb8-a633-eec2-c1eb9d82226a-qWit8jRvyhVmR6Xm/wNWPw@public.gmane.org>
2017-09-19 9:30 ` Laurent Pinchart
2017-09-19 11:37 ` Sakari Ailus
2017-09-19 10:00 ` Sakari Ailus
2017-09-19 10:10 ` Hans Verkuil
2017-09-19 11:35 ` Laurent Pinchart
2017-09-19 12:11 ` Sakari Ailus
[not found] ` <20170919121131.6m4cf4ftzhq7vpnc-z7MJbOB4PBP+e+fPlCVrcFDQ4js95KgL@public.gmane.org>
2017-09-19 12:34 ` Laurent Pinchart
2017-09-26 20:56 ` Sakari Ailus
2017-09-15 14:17 ` [PATCH v13 07/25] rcar-vin: Use generic parser for parsing fwnode endpoints Sakari Ailus
[not found] ` <20170915141724.23124-8-sakari.ailus-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
2017-09-19 11:53 ` Laurent Pinchart
2017-09-19 12:39 ` Sakari Ailus
2017-09-15 14:17 ` [PATCH v13 09/25] omap3isp: Print the name of the entity where no source pads could be found Sakari Ailus
2017-09-19 11:56 ` Laurent Pinchart
2017-09-15 14:17 ` [PATCH v13 11/25] v4l: async: Introduce helpers for calling async ops callbacks Sakari Ailus
[not found] ` <20170915141724.23124-12-sakari.ailus-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
2017-09-16 7:13 ` Pavel Machek
2017-09-19 12:01 ` Laurent Pinchart
2017-09-19 12:13 ` Sakari Ailus
2017-09-19 12:43 ` Laurent Pinchart
2017-09-19 14:50 ` Sakari Ailus
2017-09-19 16:27 ` Laurent Pinchart
2017-09-20 15:54 ` Sakari Ailus
2017-09-15 14:17 ` [PATCH v13 14/25] v4l: async: Allow binding notifiers to sub-devices Sakari Ailus
[not found] ` <20170915141724.23124-15-sakari.ailus-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
2017-09-19 8:06 ` Hans Verkuil
2017-09-19 13:52 ` Laurent Pinchart [this message]
2017-09-19 15:17 ` Sakari Ailus
[not found] ` <20170919151732.4yafxfcxrreizd7r-S+BSfZ9RZZmRSg0ZkenSGLdO1Tsj/99ntUK59QYPAWc@public.gmane.org>
2017-09-19 17:52 ` Laurent Pinchart
2017-09-20 9:42 ` Sakari Ailus
2017-09-15 14:17 ` [PATCH v13 19/25] v4l: fwnode: Add convenience function for parsing common external refs Sakari Ailus
2017-09-15 14:17 ` [PATCH v13 21/25] smiapp: Add support for flash and lens devices Sakari Ailus
[not found] ` <20170915141724.23124-22-sakari.ailus-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
2017-09-19 12:08 ` Laurent Pinchart
2017-09-19 12:20 ` Sakari Ailus
2017-09-19 12:38 ` Laurent Pinchart
2017-09-15 14:17 ` [PATCH v13 23/25] ov5670: " Sakari Ailus
2017-09-15 14:17 ` [PATCH v13 24/25] ov13858: " Sakari Ailus
2017-09-15 14:17 ` [PATCH v13 10/25] v4l: async: Move async subdev notifier operations to a separate structure Sakari Ailus
2017-09-15 14:17 ` [PATCH v13 12/25] v4l: async: Register sub-devices before calling bound callback Sakari Ailus
2017-09-19 12:01 ` Laurent Pinchart
2017-09-15 14:17 ` [PATCH v13 13/25] v4l: async: Allow async notifier register call succeed with no subdevs Sakari Ailus
2017-09-19 12:04 ` Laurent Pinchart
2017-09-19 12:52 ` Laurent Pinchart
2017-09-19 14:58 ` Sakari Ailus
[not found] ` <20170919145831.uztphjdtd3fdxzvr-S+BSfZ9RZZmRSg0ZkenSGLdO1Tsj/99ntUK59QYPAWc@public.gmane.org>
2017-09-19 15:03 ` Sakari Ailus
2017-09-19 17:54 ` Laurent Pinchart
2017-09-20 10:51 ` Sakari Ailus
2017-09-15 14:17 ` [PATCH v13 15/25] dt: bindings: Add a binding for flash LED devices associated to a sensor Sakari Ailus
[not found] ` <20170915141724.23124-16-sakari.ailus-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
2017-09-19 12:12 ` Laurent Pinchart
2017-09-19 12:16 ` Sakari Ailus
2017-09-15 14:17 ` [PATCH v13 16/25] dt: bindings: Add lens-focus binding for image sensors Sakari Ailus
2017-09-15 14:17 ` [PATCH v13 17/25] v4l: fwnode: Add a helper function for parsing generic references Sakari Ailus
[not found] ` <20170915141724.23124-18-sakari.ailus-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
2017-09-19 8:14 ` Hans Verkuil
2017-09-19 12:19 ` Laurent Pinchart
2017-09-19 13:04 ` Sakari Ailus
[not found] ` <20170919130453.ii5kz54qxlot4of2-z7MJbOB4PBP+e+fPlCVrcFDQ4js95KgL@public.gmane.org>
2017-09-19 14:01 ` Laurent Pinchart
2017-09-15 14:17 ` [PATCH v13 18/25] v4l: fwnode: Add a helper function to obtain device / integer references Sakari Ailus
2017-09-19 8:31 ` Hans Verkuil
2017-09-19 8:45 ` Sakari Ailus
2017-09-19 9:21 ` Hans Verkuil
[not found] ` <09f8ce37-c6e0-e448-c773-e1f3510d1024-qWit8jRvyhVmR6Xm/wNWPw@public.gmane.org>
2017-09-19 10:16 ` Sakari Ailus
2017-09-15 14:17 ` [PATCH v13 20/25] dt: bindings: smiapp: Document lens-focus and flash-leds properties Sakari Ailus
2017-09-15 14:17 ` [PATCH v13 22/25] et8ek8: Add support for flash and lens devices Sakari Ailus
2017-09-15 14:17 ` [PATCH v13 25/25] arm: dts: omap3: N9/N950: Add flash references to the camera 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=3338675.o4HGi8X83V@avalon \
--to=laurent.pinchart-rylnwiuwjnjg/c1bvhzhaw@public.gmane.org \
--cc=devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=hverkuil-qWit8jRvyhVmR6Xm/wNWPw@public.gmane.org \
--cc=linux-media-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=maxime.ripard-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org \
--cc=niklas.soderlund-1zkq55x86MTxsAP9Fp7wbw@public.gmane.org \
--cc=pavel-+ZI9xUNit7I@public.gmane.org \
--cc=robh-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org \
--cc=sakari.ailus-VuQAYsv1563Yd54FQh9/CA@public.gmane.org \
--cc=sre-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.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).