From: Petr Mladek <pmladek-IBi9RG/b67k@public.gmane.org>
To: Tejun Heo <tj-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
Cc: Andrew Morton
<akpm-de/tnXTf+JLsfHDXvbKv3WD2FQJk+8+b@public.gmane.org>,
Oleg Nesterov <oleg-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>,
Ingo Molnar <mingo-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>,
Peter Zijlstra <peterz-wEGCiKHe2LqWVfeAwA7xHQ@public.gmane.org>,
Steven Rostedt <rostedt-nx8X9YLhiw1AfugRpC6u6w@public.gmane.org>,
"Paul E. McKenney"
<paulmck-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8@public.gmane.org>,
Josh Triplett <josh-iaAMLnmF4UmaiuxdJuQwMA@public.gmane.org>,
Thomas Gleixner <tglx-hfZtesqFncYOwBW4kG4KsQ@public.gmane.org>,
Linus Torvalds
<torvalds-de/tnXTf+JLsfHDXvbKv3WD2FQJk+8+b@public.gmane.org>,
Jiri Kosina <jkosina-AlSwsSmVLrQ@public.gmane.org>,
Borislav Petkov <bp-l3A5Bk7waGM@public.gmane.org>,
Michal Hocko <mhocko-AlSwsSmVLrQ@public.gmane.org>,
linux-mm-Bw31MaZKKs3YtjvyW6yDsg@public.gmane.org,
Vlastimil Babka <vbabka-AlSwsSmVLrQ@public.gmane.org>,
live-patching-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
linux-api-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
Subject: Re: [RFC v2 07/18] kthread: Allow to cancel kthread work
Date: Fri, 25 Sep 2015 13:26:17 +0200 [thread overview]
Message-ID: <20150925112617.GA3122@pathway.suse.cz> (raw)
In-Reply-To: <20150922193513.GE17659-qYNAdHglDFBN0TnZuCh8vA@public.gmane.org>
On Tue 2015-09-22 15:35:13, Tejun Heo wrote:
> On Mon, Sep 21, 2015 at 03:03:48PM +0200, Petr Mladek wrote:
> > /**
> > + * try_to_grab_pending_kthread_work - steal kthread work item from worklist,
> > + * and disable irq
> > + * @work: work item to steal
> > + * @is_dwork: @work is a delayed_work
> > + * @flags: place to store irq state
> > + *
> > + * Try to grab PENDING bit of @work. This function can handle @work in any
> > + * stable state - idle, on timer or on worklist.
> > + *
> > + * Return:
> > + * 1 if @work was pending and we successfully stole PENDING
> > + * 0 if @work was idle and we claimed PENDING
> > + * -EAGAIN if PENDING couldn't be grabbed at the moment, safe to busy-retry
> > + * -ENOENT if someone else is canceling @work, this state may persist
> > + * for arbitrarily long
> > + *
> > + * Note:
> > + * On >= 0 return, the caller owns @work's PENDING bit. To avoid getting
> > + * interrupted while holding PENDING and @work off queue, irq must be
> > + * disabled on return. This, combined with delayed_work->timer being
> > + * irqsafe, ensures that we return -EAGAIN for finite short period of time.
> > + *
> > + * On successful return, >= 0, irq is disabled and the caller is
> > + * responsible for releasing it using local_irq_restore(*@flags).
> > + *
> > + * This function is safe to call from any context including IRQ handler.
> > + */
>
> Ugh... I think this is way too much for kthread_worker. Workqueue is
> as complex as it is partly for historical reasons and partly because
> it's used so widely and heavily. kthread_worker is always guaranteed
> to have a single worker and in most cases maybe several work items.
> There's no reason to bring this level of complexity onto it.
> Providing simliar semantics is fine but it should be possible to do
> this in a lot simpler way if the requirements on space and concurrency
> is this much lower.
>
> e.g. always embed timer_list in a work item and use per-worker
> spinlock to synchronize access to both the work item and timer and use
> per-work-item mutex to synchronize multiple cancelers. Let's please
> keep it simple.
I thought about it a lot and I do not see a way how to make it easier
using the locks.
I guess that you are primary interested into the two rather
complicated things:
1) PENDING state plus -EAGAIN/busy loop cycle
---------------------------------------------
IMHO, we want to use the timer because it is an elegant solution.
Then we must release the lock when the timer is running. The lock
must be taken by the timer->function(). And there is a small window
when the timer is not longer pending but timer->function is not running:
CPU0 CPU1
run_timer_softirq()
__run_timers()
detach_expired_timer()
detach_timer()
#clear_pending
try_to_grab_pending_kthread_work()
del_timer()
# fails because not pending
test_and_set_bit(KTHREAD_WORK_PENDING_BIT)
# fails because already set
if (!list_empty(&work->node))
# fails because still not queued
!!! problematic window !!!
call_timer_fn()
queue_kthraed_work()
2) CANCEL state plus custom waitqueue
-------------------------------------
cancel_kthread_work_sync() has to wait for the running work. It might take
quite some time. Therefore we could not block others by a spinlock.
Also others could not wait for the spin lock in a busy wait.
IMHO, the proposed and rather complex solutions are needed in both cases.
Or did I miss a possible trick, please?
Best Regards,
Petr
WARNING: multiple messages have this Message-ID (diff)
From: Petr Mladek <pmladek@suse.com>
To: Tejun Heo <tj@kernel.org>
Cc: Andrew Morton <akpm@linux-foundation.org>,
Oleg Nesterov <oleg@redhat.com>, Ingo Molnar <mingo@redhat.com>,
Peter Zijlstra <peterz@infradead.org>,
Steven Rostedt <rostedt@goodmis.org>,
"Paul E. McKenney" <paulmck@linux.vnet.ibm.com>,
Josh Triplett <josh@joshtriplett.org>,
Thomas Gleixner <tglx@linutronix.de>,
Linus Torvalds <torvalds@linux-foundation.org>,
Jiri Kosina <jkosina@suse.cz>, Borislav Petkov <bp@suse.de>,
Michal Hocko <mhocko@suse.cz>,
linux-mm@kvack.org, Vlastimil Babka <vbabka@suse.cz>,
live-patching@vger.kernel.org, linux-api@vger.kernel.org,
linux-kernel@vger.kernel.org
Subject: Re: [RFC v2 07/18] kthread: Allow to cancel kthread work
Date: Fri, 25 Sep 2015 13:26:17 +0200 [thread overview]
Message-ID: <20150925112617.GA3122@pathway.suse.cz> (raw)
In-Reply-To: <20150922193513.GE17659@mtj.duckdns.org>
On Tue 2015-09-22 15:35:13, Tejun Heo wrote:
> On Mon, Sep 21, 2015 at 03:03:48PM +0200, Petr Mladek wrote:
> > /**
> > + * try_to_grab_pending_kthread_work - steal kthread work item from worklist,
> > + * and disable irq
> > + * @work: work item to steal
> > + * @is_dwork: @work is a delayed_work
> > + * @flags: place to store irq state
> > + *
> > + * Try to grab PENDING bit of @work. This function can handle @work in any
> > + * stable state - idle, on timer or on worklist.
> > + *
> > + * Return:
> > + * 1 if @work was pending and we successfully stole PENDING
> > + * 0 if @work was idle and we claimed PENDING
> > + * -EAGAIN if PENDING couldn't be grabbed at the moment, safe to busy-retry
> > + * -ENOENT if someone else is canceling @work, this state may persist
> > + * for arbitrarily long
> > + *
> > + * Note:
> > + * On >= 0 return, the caller owns @work's PENDING bit. To avoid getting
> > + * interrupted while holding PENDING and @work off queue, irq must be
> > + * disabled on return. This, combined with delayed_work->timer being
> > + * irqsafe, ensures that we return -EAGAIN for finite short period of time.
> > + *
> > + * On successful return, >= 0, irq is disabled and the caller is
> > + * responsible for releasing it using local_irq_restore(*@flags).
> > + *
> > + * This function is safe to call from any context including IRQ handler.
> > + */
>
> Ugh... I think this is way too much for kthread_worker. Workqueue is
> as complex as it is partly for historical reasons and partly because
> it's used so widely and heavily. kthread_worker is always guaranteed
> to have a single worker and in most cases maybe several work items.
> There's no reason to bring this level of complexity onto it.
> Providing simliar semantics is fine but it should be possible to do
> this in a lot simpler way if the requirements on space and concurrency
> is this much lower.
>
> e.g. always embed timer_list in a work item and use per-worker
> spinlock to synchronize access to both the work item and timer and use
> per-work-item mutex to synchronize multiple cancelers. Let's please
> keep it simple.
I thought about it a lot and I do not see a way how to make it easier
using the locks.
I guess that you are primary interested into the two rather
complicated things:
1) PENDING state plus -EAGAIN/busy loop cycle
---------------------------------------------
IMHO, we want to use the timer because it is an elegant solution.
Then we must release the lock when the timer is running. The lock
must be taken by the timer->function(). And there is a small window
when the timer is not longer pending but timer->function is not running:
CPU0 CPU1
run_timer_softirq()
__run_timers()
detach_expired_timer()
detach_timer()
#clear_pending
try_to_grab_pending_kthread_work()
del_timer()
# fails because not pending
test_and_set_bit(KTHREAD_WORK_PENDING_BIT)
# fails because already set
if (!list_empty(&work->node))
# fails because still not queued
!!! problematic window !!!
call_timer_fn()
queue_kthraed_work()
2) CANCEL state plus custom waitqueue
-------------------------------------
cancel_kthread_work_sync() has to wait for the running work. It might take
quite some time. Therefore we could not block others by a spinlock.
Also others could not wait for the spin lock in a busy wait.
IMHO, the proposed and rather complex solutions are needed in both cases.
Or did I miss a possible trick, please?
Best Regards,
Petr
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
WARNING: multiple messages have this Message-ID (diff)
From: Petr Mladek <pmladek@suse.com>
To: Tejun Heo <tj@kernel.org>
Cc: Andrew Morton <akpm@linux-foundation.org>,
Oleg Nesterov <oleg@redhat.com>, Ingo Molnar <mingo@redhat.com>,
Peter Zijlstra <peterz@infradead.org>,
Steven Rostedt <rostedt@goodmis.org>,
"Paul E. McKenney" <paulmck@linux.vnet.ibm.com>,
Josh Triplett <josh@joshtriplett.org>,
Thomas Gleixner <tglx@linutronix.de>,
Linus Torvalds <torvalds@linux-foundation.org>,
Jiri Kosina <jkosina@suse.cz>, Borislav Petkov <bp@suse.de>,
Michal Hocko <mhocko@suse.cz>,
linux-mm@kvack.org, Vlastimil Babka <vbabka@suse.cz>,
live-patching@vger.kernel.org, linux-api@vger.kernel.org,
linux-kernel@vger.kernel.org
Subject: Re: [RFC v2 07/18] kthread: Allow to cancel kthread work
Date: Fri, 25 Sep 2015 13:26:17 +0200 [thread overview]
Message-ID: <20150925112617.GA3122@pathway.suse.cz> (raw)
In-Reply-To: <20150922193513.GE17659@mtj.duckdns.org>
On Tue 2015-09-22 15:35:13, Tejun Heo wrote:
> On Mon, Sep 21, 2015 at 03:03:48PM +0200, Petr Mladek wrote:
> > /**
> > + * try_to_grab_pending_kthread_work - steal kthread work item from worklist,
> > + * and disable irq
> > + * @work: work item to steal
> > + * @is_dwork: @work is a delayed_work
> > + * @flags: place to store irq state
> > + *
> > + * Try to grab PENDING bit of @work. This function can handle @work in any
> > + * stable state - idle, on timer or on worklist.
> > + *
> > + * Return:
> > + * 1 if @work was pending and we successfully stole PENDING
> > + * 0 if @work was idle and we claimed PENDING
> > + * -EAGAIN if PENDING couldn't be grabbed at the moment, safe to busy-retry
> > + * -ENOENT if someone else is canceling @work, this state may persist
> > + * for arbitrarily long
> > + *
> > + * Note:
> > + * On >= 0 return, the caller owns @work's PENDING bit. To avoid getting
> > + * interrupted while holding PENDING and @work off queue, irq must be
> > + * disabled on return. This, combined with delayed_work->timer being
> > + * irqsafe, ensures that we return -EAGAIN for finite short period of time.
> > + *
> > + * On successful return, >= 0, irq is disabled and the caller is
> > + * responsible for releasing it using local_irq_restore(*@flags).
> > + *
> > + * This function is safe to call from any context including IRQ handler.
> > + */
>
> Ugh... I think this is way too much for kthread_worker. Workqueue is
> as complex as it is partly for historical reasons and partly because
> it's used so widely and heavily. kthread_worker is always guaranteed
> to have a single worker and in most cases maybe several work items.
> There's no reason to bring this level of complexity onto it.
> Providing simliar semantics is fine but it should be possible to do
> this in a lot simpler way if the requirements on space and concurrency
> is this much lower.
>
> e.g. always embed timer_list in a work item and use per-worker
> spinlock to synchronize access to both the work item and timer and use
> per-work-item mutex to synchronize multiple cancelers. Let's please
> keep it simple.
I thought about it a lot and I do not see a way how to make it easier
using the locks.
I guess that you are primary interested into the two rather
complicated things:
1) PENDING state plus -EAGAIN/busy loop cycle
---------------------------------------------
IMHO, we want to use the timer because it is an elegant solution.
Then we must release the lock when the timer is running. The lock
must be taken by the timer->function(). And there is a small window
when the timer is not longer pending but timer->function is not running:
CPU0 CPU1
run_timer_softirq()
__run_timers()
detach_expired_timer()
detach_timer()
#clear_pending
try_to_grab_pending_kthread_work()
del_timer()
# fails because not pending
test_and_set_bit(KTHREAD_WORK_PENDING_BIT)
# fails because already set
if (!list_empty(&work->node))
# fails because still not queued
!!! problematic window !!!
call_timer_fn()
queue_kthraed_work()
2) CANCEL state plus custom waitqueue
-------------------------------------
cancel_kthread_work_sync() has to wait for the running work. It might take
quite some time. Therefore we could not block others by a spinlock.
Also others could not wait for the spin lock in a busy wait.
IMHO, the proposed and rather complex solutions are needed in both cases.
Or did I miss a possible trick, please?
Best Regards,
Petr
next prev parent reply other threads:[~2015-09-25 11:26 UTC|newest]
Thread overview: 97+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-09-21 13:03 [RFC v2 00/18] kthread: Use kthread worker API more widely Petr Mladek
2015-09-21 13:03 ` Petr Mladek
2015-09-21 13:03 ` [RFC v2 01/18] kthread: Allow to call __kthread_create_on_node() with va_list args Petr Mladek
2015-09-21 13:03 ` Petr Mladek
2015-09-21 13:03 ` [RFC v2 02/18] kthread: Add create_kthread_worker*() Petr Mladek
2015-09-21 13:03 ` Petr Mladek
2015-09-22 18:20 ` Tejun Heo
2015-09-22 18:20 ` Tejun Heo
2015-09-21 13:03 ` [RFC v2 03/18] kthread: Add drain_kthread_worker() Petr Mladek
2015-09-21 13:03 ` Petr Mladek
2015-09-22 18:26 ` Tejun Heo
2015-09-22 18:26 ` Tejun Heo
2015-09-21 13:03 ` [RFC v2 04/18] kthread: Add destroy_kthread_worker() Petr Mladek
2015-09-21 13:03 ` Petr Mladek
2015-09-22 18:30 ` Tejun Heo
2015-09-22 18:30 ` Tejun Heo
2015-09-21 13:03 ` [RFC v2 05/18] kthread: Add pending flag to kthread work Petr Mladek
2015-09-21 13:03 ` Petr Mladek
2015-09-21 13:03 ` [RFC v2 06/18] kthread: Initial support for delayed " Petr Mladek
2015-09-21 13:03 ` Petr Mladek
2015-09-21 13:03 ` [RFC v2 07/18] kthread: Allow to cancel " Petr Mladek
2015-09-21 13:03 ` Petr Mladek
[not found] ` <1442840639-6963-8-git-send-email-pmladek-IBi9RG/b67k@public.gmane.org>
2015-09-22 19:35 ` Tejun Heo
2015-09-22 19:35 ` Tejun Heo
2015-09-22 19:35 ` Tejun Heo
[not found] ` <20150922193513.GE17659-qYNAdHglDFBN0TnZuCh8vA@public.gmane.org>
2015-09-25 11:26 ` Petr Mladek [this message]
2015-09-25 11:26 ` Petr Mladek
2015-09-25 11:26 ` Petr Mladek
2015-09-28 17:03 ` Tejun Heo
2015-09-28 17:03 ` Tejun Heo
2015-10-02 15:43 ` Petr Mladek
2015-10-02 15:43 ` Petr Mladek
[not found] ` <20151002154336.GC3122-KsEp0d+Q8qECVLCxKZUutA@public.gmane.org>
2015-10-02 19:24 ` Tejun Heo
2015-10-02 19:24 ` Tejun Heo
2015-10-02 19:24 ` Tejun Heo
[not found] ` <20151002192453.GA7564-qYNAdHglDFBN0TnZuCh8vA@public.gmane.org>
2015-10-05 10:07 ` Petr Mladek
2015-10-05 10:07 ` Petr Mladek
2015-10-05 10:07 ` Petr Mladek
[not found] ` <20151005100758.GK9603-KsEp0d+Q8qECVLCxKZUutA@public.gmane.org>
2015-10-05 11:09 ` Petr Mladek
2015-10-05 11:09 ` Petr Mladek
2015-10-05 11:09 ` Petr Mladek
[not found] ` <20151005110924.GL9603-KsEp0d+Q8qECVLCxKZUutA@public.gmane.org>
2015-10-07 9:21 ` Petr Mladek
2015-10-07 9:21 ` Petr Mladek
2015-10-07 9:21 ` Petr Mladek
2015-10-07 14:24 ` Tejun Heo
2015-10-07 14:24 ` Tejun Heo
[not found] ` <20151007142446.GA2012-qYNAdHglDFBN0TnZuCh8vA@public.gmane.org>
2015-10-14 10:20 ` Petr Mladek
2015-10-14 10:20 ` Petr Mladek
2015-10-14 10:20 ` Petr Mladek
2015-10-14 17:30 ` Tejun Heo
2015-10-14 17:30 ` Tejun Heo
2015-09-21 13:03 ` [RFC v2 08/18] kthread: Allow to modify delayed " Petr Mladek
2015-09-21 13:03 ` Petr Mladek
2015-09-21 13:03 ` [RFC v2 09/18] mm/huge_page: Convert khugepaged() into kthread worker API Petr Mladek
2015-09-21 13:03 ` Petr Mladek
2015-09-22 20:26 ` Tejun Heo
2015-09-22 20:26 ` Tejun Heo
2015-09-23 9:50 ` Petr Mladek
2015-09-23 9:50 ` Petr Mladek
2015-09-21 13:03 ` [RFC v2 10/18] ring_buffer: Do no not complete benchmark reader too early Petr Mladek
2015-09-21 13:03 ` Petr Mladek
2015-09-21 13:03 ` [RFC v2 11/18] ring_buffer: Fix more races when terminating the producer in the benchmark Petr Mladek
2015-09-21 13:03 ` Petr Mladek
2015-09-21 13:03 ` [RFC v2 12/18] ring_buffer: Convert benchmark kthreads into kthread worker API Petr Mladek
2015-09-21 13:03 ` Petr Mladek
2015-09-21 13:03 ` [RFC v2 13/18] rcu: Finish folding ->fqs_state into ->gp_state Petr Mladek
2015-09-21 13:03 ` Petr Mladek
2015-09-21 13:03 ` [RFC v2 14/18] rcu: Store first_gp_fqs into struct rcu_state Petr Mladek
2015-09-21 13:03 ` Petr Mladek
2015-09-21 13:03 ` [RFC v2 15/18] rcu: Clean up timeouts for forcing the quiescent state Petr Mladek
2015-09-21 13:03 ` Petr Mladek
2015-09-21 13:03 ` [RFC v2 16/18] rcu: Check actual RCU_GP_FLAG_FQS when handling " Petr Mladek
2015-09-21 13:03 ` Petr Mladek
2015-09-21 13:03 ` [RFC v2 17/18] rcu: Convert RCU gp kthreads into kthread worker API Petr Mladek
2015-09-21 13:03 ` Petr Mladek
2015-09-28 17:14 ` Paul E. McKenney
2015-09-28 17:14 ` Paul E. McKenney
[not found] ` <20150928171437.GB5182-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8@public.gmane.org>
2015-10-01 15:43 ` Petr Mladek
2015-10-01 15:43 ` Petr Mladek
2015-10-01 15:43 ` Petr Mladek
2015-10-01 16:33 ` Paul E. McKenney
2015-10-01 16:33 ` Paul E. McKenney
2015-09-21 13:03 ` [RFC v2 18/18] kthread: Better support freezable kthread workers Petr Mladek
2015-09-21 13:03 ` Petr Mladek
2015-09-22 20:32 ` [RFC v2 00/18] kthread: Use kthread worker API more widely Tejun Heo
2015-09-22 20:32 ` Tejun Heo
2015-09-30 5:08 ` Paul E. McKenney
2015-09-30 5:08 ` Paul E. McKenney
[not found] ` <20150930050833.GA4412-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8@public.gmane.org>
2015-10-01 15:59 ` Petr Mladek
2015-10-01 15:59 ` Petr Mladek
2015-10-01 15:59 ` Petr Mladek
2015-10-01 17:00 ` Paul E. McKenney
2015-10-01 17:00 ` Paul E. McKenney
2015-10-02 12:00 ` Petr Mladek
2015-10-02 12:00 ` Petr Mladek
2015-10-02 13:59 ` Paul E. McKenney
2015-10-02 13:59 ` Paul E. McKenney
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=20150925112617.GA3122@pathway.suse.cz \
--to=pmladek-ibi9rg/b67k@public.gmane.org \
--cc=akpm-de/tnXTf+JLsfHDXvbKv3WD2FQJk+8+b@public.gmane.org \
--cc=bp-l3A5Bk7waGM@public.gmane.org \
--cc=jkosina-AlSwsSmVLrQ@public.gmane.org \
--cc=josh-iaAMLnmF4UmaiuxdJuQwMA@public.gmane.org \
--cc=linux-api-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=linux-mm-Bw31MaZKKs3YtjvyW6yDsg@public.gmane.org \
--cc=live-patching-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=mhocko-AlSwsSmVLrQ@public.gmane.org \
--cc=mingo-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org \
--cc=oleg-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org \
--cc=paulmck-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8@public.gmane.org \
--cc=peterz-wEGCiKHe2LqWVfeAwA7xHQ@public.gmane.org \
--cc=rostedt-nx8X9YLhiw1AfugRpC6u6w@public.gmane.org \
--cc=tglx-hfZtesqFncYOwBW4kG4KsQ@public.gmane.org \
--cc=tj-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org \
--cc=torvalds-de/tnXTf+JLsfHDXvbKv3WD2FQJk+8+b@public.gmane.org \
--cc=vbabka-AlSwsSmVLrQ@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.