From: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> To: David Laight <David.Laight@ACULAB.COM> Cc: "linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>, "netfilter-devel@vger.kernel.org" <netfilter-devel@vger.kernel.org>, "netdev@vger.kernel.org" <netdev@vger.kernel.org>, "oleg@redhat.com" <oleg@redhat.com>, "akpm@linux-foundation.org" <akpm@linux-foundation.org>, "mingo@redhat.com" <mingo@redhat.com>, "dave@stgolabs.net" <dave@stgolabs.net>, "manfred@colorfullife.com" <manfred@colorfullife.com>, "tj@kernel.org" <tj@kernel.org>, "arnd@arndb.de" <arnd@arndb.de>, "linux-arch@vger.kernel.org" <linux-arch@vger.kernel.org>, "will.deacon@arm.com" <will.deacon@arm.com>, "peterz@infradead.org" <peterz@infradead.org>, "stern@rowland.harvard.edu" <stern@rowland.harvard.edu>, "parri.andrea@gmail.com" <parri.andrea@gmail.com>, "torvalds@linux-foundation.org" <torvalds@linux> Subject: Re: [PATCH v2 0/9] Remove spin_unlock_wait() Date: Thu, 6 Jul 2017 08:21:10 -0700 [thread overview] Message-ID: <20170706152110.GZ2393@linux.vnet.ibm.com> (raw) In-Reply-To: <063D6719AE5E284EB5DD2968C1650D6DD0033F01@AcuExch.aculab.com> On Thu, Jul 06, 2017 at 02:12:24PM +0000, David Laight wrote: > From: Paul E. McKenney > > Sent: 06 July 2017 00:30 > > There is no agreed-upon definition of spin_unlock_wait()'s semantics, > > and it appears that all callers could do just as well with a lock/unlock > > pair. This series therefore removes spin_unlock_wait() and changes > > its users to instead use a lock/unlock pair. The commits are as follows, > > in three groups: > > > > 1-7. Change uses of spin_unlock_wait() and raw_spin_unlock_wait() > > to instead use a spin_lock/spin_unlock pair. These may be > > applied in any order, but must be applied before any later > > commits in this series. The commit logs state why I believe > > that these commits won't noticeably degrade performance. > > I can't help feeling that it might be better to have a spin_lock_sync() > call that is equivalent to a spin_lock/spin_unlock pair. > The default implementation being an inline function that does exactly that. > This would let an architecture implement a more efficient version. > > It might even be that this is the defined semantics of spin_unlock_wait(). That was in fact my first proposal, see the comment header in current mainline for spin_unlock_wait() in include/linux/spinlock.h. But Linus quite rightly pointed out that if spin_unlock_wait() was to be defined in this way, we should get rid of spin_unlock_wait() entirely, especially given that there are not very many calls to spin_unlock_wait() and also given that none of them are particularly performance critical. Hence the current patch set, which does just that. > Note that it can only be useful to do a spin_lock/unlock pair if it is > impossible for another code path to try to acquire the lock. > (Or, at least, the code can't care if the lock is acquired just after.) Indeed! As Oleg Nesterov pointed out, a spin_lock()/spin_unlock() pair is sort of like synchronize_rcu() for a given lock, where that lock's critical sections play the role of RCU read-side critical sections. So anything before the pair is visible to later critical sections, and anything in prior critical sections is visible to anything after the pair. But again, as Linus pointed out, if we are going to have these semantics, just do spin_lock() immediately followed by spin_unlock(). > So if it can de determined that the lock isn't held (a READ_ONCE() > might be enough) the lock itself need not be acquired (with the > associated slow bus cycles). If you want the full semantics of a spin_lock()/spin_unlock() pair, you need a full memory barrier before the READ_ONCE(), even on x86. Without that memory barrier, you don't get the effect of the release implicit in spin_unlock(). For weaker architectures, such as PowerPC and ARM, a READ_ONCE() does -not- suffice, not at all, even with smp_mb() before and after. I encourage you to take a look at arch_spin_unlock_wait() in arm64 and powerpc if youi are interested. There were also some lengthy LKML threads discussing this about 18 months ago that could be illuminating. And yes, there are architecture-specific optimizations for an empty spin_lock()/spin_unlock() critical section, and the current arch_spin_unlock_wait() implementations show some of these optimizations. But I expect that performance benefits would need to be demonstrated at the system level. Thanx, Paul
WARNING: multiple messages have this Message-ID (diff)
From: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> To: David Laight <David.Laight@ACULAB.COM> Cc: "linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>, "netfilter-devel@vger.kernel.org" <netfilter-devel@vger.kernel.org>, "netdev@vger.kernel.org" <netdev@vger.kernel.org>, "oleg@redhat.com" <oleg@redhat.com>, "akpm@linux-foundation.org" <akpm@linux-foundation.org>, "mingo@redhat.com" <mingo@redhat.com>, "dave@stgolabs.net" <dave@stgolabs.net>, "manfred@colorfullife.com" <manfred@colorfullife.com>, "tj@kernel.org" <tj@kernel.org>, "arnd@arndb.de" <arnd@arndb.de>, "linux-arch@vger.kernel.org" <linux-arch@vger.kernel.org>, "will.deacon@arm.com" <will.deacon@arm.com>, "peterz@infradead.org" <peterz@infradead.org>, "stern@rowland.harvard.edu" <stern@rowland.harvard.edu>, "parri.andrea@gmail.com" <parri.andrea@gmail.com>, "torvalds@linux-foundation.org" <torvalds@linux-foundation.org> Subject: Re: [PATCH v2 0/9] Remove spin_unlock_wait() Date: Thu, 6 Jul 2017 08:21:10 -0700 [thread overview] Message-ID: <20170706152110.GZ2393@linux.vnet.ibm.com> (raw) Message-ID: <20170706152110.JTBB7t1bOhHjrcSZH6inAblB2D1uP2a-WuQoUPGt7XU@z> (raw) In-Reply-To: <063D6719AE5E284EB5DD2968C1650D6DD0033F01@AcuExch.aculab.com> On Thu, Jul 06, 2017 at 02:12:24PM +0000, David Laight wrote: > From: Paul E. McKenney > > Sent: 06 July 2017 00:30 > > There is no agreed-upon definition of spin_unlock_wait()'s semantics, > > and it appears that all callers could do just as well with a lock/unlock > > pair. This series therefore removes spin_unlock_wait() and changes > > its users to instead use a lock/unlock pair. The commits are as follows, > > in three groups: > > > > 1-7. Change uses of spin_unlock_wait() and raw_spin_unlock_wait() > > to instead use a spin_lock/spin_unlock pair. These may be > > applied in any order, but must be applied before any later > > commits in this series. The commit logs state why I believe > > that these commits won't noticeably degrade performance. > > I can't help feeling that it might be better to have a spin_lock_sync() > call that is equivalent to a spin_lock/spin_unlock pair. > The default implementation being an inline function that does exactly that. > This would let an architecture implement a more efficient version. > > It might even be that this is the defined semantics of spin_unlock_wait(). That was in fact my first proposal, see the comment header in current mainline for spin_unlock_wait() in include/linux/spinlock.h. But Linus quite rightly pointed out that if spin_unlock_wait() was to be defined in this way, we should get rid of spin_unlock_wait() entirely, especially given that there are not very many calls to spin_unlock_wait() and also given that none of them are particularly performance critical. Hence the current patch set, which does just that. > Note that it can only be useful to do a spin_lock/unlock pair if it is > impossible for another code path to try to acquire the lock. > (Or, at least, the code can't care if the lock is acquired just after.) Indeed! As Oleg Nesterov pointed out, a spin_lock()/spin_unlock() pair is sort of like synchronize_rcu() for a given lock, where that lock's critical sections play the role of RCU read-side critical sections. So anything before the pair is visible to later critical sections, and anything in prior critical sections is visible to anything after the pair. But again, as Linus pointed out, if we are going to have these semantics, just do spin_lock() immediately followed by spin_unlock(). > So if it can de determined that the lock isn't held (a READ_ONCE() > might be enough) the lock itself need not be acquired (with the > associated slow bus cycles). If you want the full semantics of a spin_lock()/spin_unlock() pair, you need a full memory barrier before the READ_ONCE(), even on x86. Without that memory barrier, you don't get the effect of the release implicit in spin_unlock(). For weaker architectures, such as PowerPC and ARM, a READ_ONCE() does -not- suffice, not at all, even with smp_mb() before and after. I encourage you to take a look at arch_spin_unlock_wait() in arm64 and powerpc if youi are interested. There were also some lengthy LKML threads discussing this about 18 months ago that could be illuminating. And yes, there are architecture-specific optimizations for an empty spin_lock()/spin_unlock() critical section, and the current arch_spin_unlock_wait() implementations show some of these optimizations. But I expect that performance benefits would need to be demonstrated at the system level. Thanx, Paul
next prev parent reply other threads:[~2017-07-06 15:21 UTC|newest] Thread overview: 221+ messages / expand[flat|nested] mbox.gz Atom feed top 2017-06-29 23:59 [PATCH RFC 0/26] Remove spin_unlock_wait() Paul E. McKenney 2017-06-29 23:59 ` Paul E. McKenney 2017-06-30 0:01 ` [PATCH RFC 01/26] netfilter: Replace spin_unlock_wait() with lock/unlock pair Paul E. McKenney 2017-06-30 0:01 ` Paul E. McKenney [not found] ` <a6642feb-2f3a-980f-5ed6-2deb79563e6b@colorfullife.com> 2017-07-02 2:00 ` Paul E. McKenney 2017-07-02 2:00 ` Paul E. McKenney 2017-07-03 14:39 ` Alan Stern 2017-07-03 14:39 ` Alan Stern 2017-07-03 17:14 ` Paul E. McKenney 2017-07-03 17:14 ` Paul E. McKenney 2017-07-03 19:01 ` Manfred Spraul 2017-07-03 19:01 ` Manfred Spraul 2017-07-03 19:57 ` Alan Stern 2017-07-06 18:43 ` Manfred Spraul 2017-07-06 18:43 ` Manfred Spraul 2017-07-03 20:04 ` Alan Stern 2017-07-03 20:53 ` Paul E. McKenney 2017-07-03 20:53 ` Paul E. McKenney 2017-06-30 0:01 ` [PATCH RFC 02/26] task_work: " Paul E. McKenney 2017-06-30 0:01 ` Paul E. McKenney 2017-06-30 11:04 ` Oleg Nesterov 2017-06-30 11:04 ` Oleg Nesterov 2017-06-30 12:50 ` Paul E. McKenney 2017-06-30 12:50 ` Paul E. McKenney 2017-06-30 15:20 ` Oleg Nesterov 2017-06-30 16:16 ` Paul E. McKenney 2017-06-30 16:16 ` Paul E. McKenney 2017-06-30 17:21 ` Paul E. McKenney 2017-06-30 17:21 ` Paul E. McKenney 2017-06-30 19:21 ` Oleg Nesterov 2017-06-30 19:21 ` Oleg Nesterov 2017-06-30 19:50 ` Alan Stern 2017-06-30 19:50 ` Alan Stern 2017-06-30 20:04 ` Paul E. McKenney 2017-06-30 20:02 ` Paul E. McKenney 2017-06-30 20:02 ` Paul E. McKenney 2017-06-30 20:19 ` Paul E. McKenney 2017-06-30 0:01 ` [PATCH RFC 03/26] sched: " Paul E. McKenney 2017-06-30 10:31 ` Arnd Bergmann 2017-06-30 10:31 ` Arnd Bergmann 2017-06-30 12:35 ` Paul E. McKenney 2017-06-30 12:35 ` Paul E. McKenney 2017-06-30 0:01 ` [PATCH RFC 04/26] completion: " Paul E. McKenney 2017-06-30 0:01 ` Paul E. McKenney 2017-06-30 0:01 ` [PATCH RFC 05/26] exit: " Paul E. McKenney 2017-06-30 0:01 ` Paul E. McKenney 2017-06-30 0:01 ` [PATCH RFC 06/26] ipc: " Paul E. McKenney 2017-06-30 0:01 ` Paul E. McKenney 2017-07-01 19:23 ` Manfred Spraul 2017-07-02 3:16 ` Paul E. McKenney 2017-07-02 3:16 ` Paul E. McKenney 2017-06-30 0:01 ` [PATCH RFC 07/26] drivers/ata: " Paul E. McKenney 2017-06-30 0:01 ` Paul E. McKenney 2017-06-30 0:01 ` [PATCH RFC 08/26] locking: Remove spin_unlock_wait() generic definitions Paul E. McKenney 2017-06-30 0:01 ` Paul E. McKenney 2017-06-30 9:19 ` Will Deacon 2017-06-30 9:19 ` Will Deacon 2017-06-30 12:38 ` Paul E. McKenney 2017-06-30 12:38 ` Paul E. McKenney 2017-06-30 13:13 ` Will Deacon 2017-06-30 13:13 ` Will Deacon 2017-06-30 22:18 ` Paul E. McKenney 2017-06-30 22:18 ` Paul E. McKenney 2017-07-03 13:15 ` Will Deacon 2017-07-03 13:15 ` Will Deacon 2017-07-03 16:18 ` Paul E. McKenney 2017-07-03 16:18 ` Paul E. McKenney 2017-07-03 16:40 ` Linus Torvalds 2017-07-03 17:13 ` Will Deacon 2017-07-03 22:30 ` Paul E. McKenney 2017-07-03 22:49 ` Linus Torvalds 2017-07-03 22:49 ` Linus Torvalds 2017-07-04 0:39 ` Paul E. McKenney 2017-07-04 0:39 ` Paul E. McKenney 2017-07-04 0:54 ` Paul E. McKenney 2017-07-03 21:10 ` Paul E. McKenney 2017-07-03 21:10 ` Paul E. McKenney 2017-06-30 0:01 ` [PATCH RFC 09/26] alpha: Remove spin_unlock_wait() arch-specific definitions Paul E. McKenney 2017-06-30 0:01 ` Paul E. McKenney 2017-06-30 0:01 ` [PATCH RFC 10/26] arc: " Paul E. McKenney 2017-06-30 0:01 ` Paul E. McKenney 2017-06-30 0:01 ` [PATCH RFC 11/26] arm: " Paul E. McKenney 2017-06-30 0:01 ` Paul E. McKenney 2017-06-30 0:01 ` [PATCH RFC 12/26] arm64: " Paul E. McKenney 2017-06-30 0:01 ` Paul E. McKenney 2017-06-30 9:20 ` Will Deacon 2017-06-30 17:29 ` Paul E. McKenney 2017-06-30 0:01 ` [PATCH RFC 13/26] blackfin: " Paul E. McKenney 2017-06-30 0:01 ` Paul E. McKenney 2017-06-30 0:01 ` [PATCH RFC 14/26] hexagon: " Paul E. McKenney 2017-06-30 0:01 ` Paul E. McKenney 2017-06-30 0:01 ` [PATCH RFC 15/26] ia64: " Paul E. McKenney 2017-06-30 0:01 ` [PATCH RFC 16/26] m32r: " Paul E. McKenney 2017-06-30 0:01 ` [PATCH RFC 17/26] metag: " Paul E. McKenney 2017-06-30 0:01 ` [PATCH RFC 18/26] mips: " Paul E. McKenney 2017-06-30 0:01 ` Paul E. McKenney 2017-06-30 0:01 ` [PATCH RFC 19/26] mn10300: " Paul E. McKenney 2017-06-30 0:01 ` [PATCH RFC 20/26] parisc: " Paul E. McKenney 2017-06-30 0:01 ` Paul E. McKenney 2017-06-30 0:01 ` [PATCH RFC 21/26] powerpc: " Paul E. McKenney 2017-06-30 0:01 ` Paul E. McKenney 2017-07-02 3:58 ` Boqun Feng 2017-07-05 23:57 ` Paul E. McKenney 2017-07-05 23:57 ` Paul E. McKenney 2017-06-30 0:01 ` [PATCH RFC 22/26] s390: " Paul E. McKenney 2017-06-30 0:01 ` [PATCH RFC 23/26] sh: " Paul E. McKenney 2017-06-30 0:01 ` [PATCH RFC 24/26] sparc: " Paul E. McKenney 2017-06-30 0:01 ` Paul E. McKenney 2017-06-30 0:01 ` [PATCH RFC 25/26] tile: " Paul E. McKenney 2017-06-30 0:06 ` Linus Torvalds 2017-06-30 0:06 ` Linus Torvalds 2017-06-30 0:09 ` Paul E. McKenney 2017-06-30 0:09 ` Paul E. McKenney 2017-06-30 0:14 ` Paul E. McKenney 2017-06-30 0:10 ` Linus Torvalds 2017-06-30 0:10 ` Linus Torvalds 2017-06-30 0:24 ` Paul E. McKenney 2017-06-30 0:24 ` Paul E. McKenney 2017-06-30 0:01 ` [PATCH RFC 26/26] xtensa: " Paul E. McKenney 2017-06-30 0:01 ` Paul E. McKenney 2017-07-05 23:29 ` [PATCH v2 0/9] Remove spin_unlock_wait() Paul E. McKenney 2017-07-05 23:29 ` Paul E. McKenney 2017-07-05 23:31 ` [PATCH v2 1/9] net/netfilter/nf_conntrack_core: Fix net_conntrack_lock() Paul E. McKenney 2017-07-05 23:31 ` Paul E. McKenney 2017-07-06 18:45 ` Manfred Spraul 2017-07-06 18:45 ` Manfred Spraul 2017-07-06 20:26 ` Paul E. McKenney 2017-07-06 20:26 ` Paul E. McKenney 2017-07-05 23:31 ` [PATCH v2 2/9] task_work: Replace spin_unlock_wait() with lock/unlock pair Paul E. McKenney 2017-07-05 23:31 ` [PATCH v2 3/9] sched: " Paul E. McKenney 2017-07-05 23:31 ` Paul E. McKenney 2017-07-05 23:31 ` [PATCH v2 4/9] completion: " Paul E. McKenney 2017-07-05 23:31 ` Paul E. McKenney 2017-07-05 23:31 ` [PATCH v2 5/9] exit: " Paul E. McKenney 2017-07-05 23:31 ` Paul E. McKenney 2017-07-05 23:31 ` [PATCH v2 6/9] ipc: " Paul E. McKenney 2017-07-05 23:31 ` [PATCH v2 7/9] drivers/ata: " Paul E. McKenney 2017-07-05 23:31 ` Paul E. McKenney 2017-07-05 23:31 ` [PATCH v2 8/9] locking: Remove spin_unlock_wait() generic definitions Paul E. McKenney 2017-07-05 23:31 ` Paul E. McKenney 2017-07-05 23:31 ` [PATCH v2 9/9] arch: Remove spin_unlock_wait() arch-specific definitions Paul E. McKenney 2017-07-05 23:31 ` Paul E. McKenney 2017-07-06 14:12 ` [PATCH v2 0/9] Remove spin_unlock_wait() David Laight 2017-07-06 14:12 ` David Laight 2017-07-06 15:21 ` Paul E. McKenney [this message] 2017-07-06 15:21 ` Paul E. McKenney 2017-07-06 16:10 ` Peter Zijlstra 2017-07-06 16:10 ` Peter Zijlstra 2017-07-06 16:24 ` Paul E. McKenney 2017-07-06 16:24 ` Paul E. McKenney 2017-07-06 16:41 ` Peter Zijlstra 2017-07-06 16:41 ` Peter Zijlstra 2017-07-06 17:03 ` Paul E. McKenney 2017-07-06 17:03 ` Paul E. McKenney 2017-07-06 16:49 ` Alan Stern 2017-07-06 16:49 ` Alan Stern 2017-07-06 16:54 ` Peter Zijlstra 2017-07-06 16:54 ` Peter Zijlstra 2017-07-06 19:37 ` Alan Stern 2017-07-06 16:05 ` Peter Zijlstra 2017-07-06 16:05 ` Peter Zijlstra 2017-07-06 16:20 ` Paul E. McKenney 2017-07-06 16:20 ` Paul E. McKenney 2017-07-06 16:50 ` Peter Zijlstra 2017-07-06 16:50 ` Peter Zijlstra 2017-07-06 17:08 ` Will Deacon 2017-07-06 17:08 ` Will Deacon 2017-07-06 17:29 ` Paul E. McKenney 2017-07-06 17:29 ` Paul E. McKenney 2017-07-06 17:18 ` Paul E. McKenney 2017-07-06 17:18 ` Paul E. McKenney 2017-07-07 8:31 ` Ingo Molnar 2017-07-07 8:31 ` Ingo Molnar 2017-07-07 8:44 ` Peter Zijlstra 2017-07-07 8:44 ` Peter Zijlstra 2017-07-07 10:33 ` Ingo Molnar 2017-07-07 10:33 ` Ingo Molnar 2017-07-07 11:23 ` Peter Zijlstra 2017-07-07 11:23 ` Peter Zijlstra 2017-07-07 14:41 ` Paul E. McKenney 2017-07-07 14:41 ` Paul E. McKenney 2017-07-08 8:43 ` Ingo Molnar 2017-07-08 8:43 ` Ingo Molnar 2017-07-08 11:41 ` Paul E. McKenney 2017-07-08 11:41 ` Paul E. McKenney 2017-07-07 17:47 ` Manfred Spraul 2017-07-07 17:47 ` Manfred Spraul 2017-07-08 8:35 ` Ingo Molnar 2017-07-08 8:35 ` Ingo Molnar 2017-07-08 11:39 ` Paul E. McKenney 2017-07-08 11:39 ` Paul E. McKenney 2017-07-08 12:30 ` Ingo Molnar 2017-07-08 12:30 ` Ingo Molnar 2017-07-08 14:45 ` Paul E. McKenney 2017-07-08 14:45 ` Paul E. McKenney 2017-07-08 16:21 ` Alan Stern 2017-07-08 16:21 ` Alan Stern 2017-07-10 17:22 ` Manfred Spraul 2017-07-10 17:22 ` Manfred Spraul 2017-07-07 8:06 ` Ingo Molnar 2017-07-07 8:06 ` Ingo Molnar 2017-07-07 9:32 ` Ingo Molnar 2017-07-07 9:32 ` Ingo Molnar 2017-07-07 19:27 ` [PATCH v3 " Paul E. McKenney 2017-07-07 19:28 ` [PATCH v3 1/9] net/netfilter/nf_conntrack_core: Fix net_conntrack_lock() Paul E. McKenney 2017-07-07 19:28 ` Paul E. McKenney 2017-07-07 19:28 ` [PATCH v3 2/9] task_work: Replace spin_unlock_wait() with lock/unlock pair Paul E. McKenney 2017-07-07 19:28 ` Paul E. McKenney 2017-07-07 19:28 ` [PATCH v3 3/9] sched: " Paul E. McKenney 2017-07-07 19:28 ` Paul E. McKenney 2017-07-07 19:28 ` [PATCH v3 4/9] completion: " Paul E. McKenney 2017-07-07 19:28 ` Paul E. McKenney 2017-07-07 19:28 ` [PATCH v3 5/9] exit: " Paul E. McKenney 2017-07-07 19:28 ` Paul E. McKenney 2017-07-07 19:28 ` [PATCH v3 6/9] ipc: " Paul E. McKenney 2017-07-07 19:28 ` Paul E. McKenney 2017-07-07 19:28 ` [PATCH v3 7/9] drivers/ata: " Paul E. McKenney 2017-07-07 19:28 ` Paul E. McKenney 2017-07-07 19:28 ` [PATCH v3 8/9] locking: Remove spin_unlock_wait() generic definitions Paul E. McKenney 2017-07-07 19:28 ` Paul E. McKenney 2017-07-07 19:28 ` [PATCH v3 9/9] arch: Remove spin_unlock_wait() arch-specific definitions 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=20170706152110.GZ2393@linux.vnet.ibm.com \ --to=paulmck@linux.vnet.ibm.com \ --cc=David.Laight@ACULAB.COM \ --cc=akpm@linux-foundation.org \ --cc=arnd@arndb.de \ --cc=dave@stgolabs.net \ --cc=linux-arch@vger.kernel.org \ --cc=linux-kernel@vger.kernel.org \ --cc=manfred@colorfullife.com \ --cc=mingo@redhat.com \ --cc=netdev@vger.kernel.org \ --cc=netfilter-devel@vger.kernel.org \ --cc=oleg@redhat.com \ --cc=parri.andrea@gmail.com \ --cc=peterz@infradead.org \ --cc=stern@rowland.harvard.edu \ --cc=tj@kernel.org \ --cc=torvalds@linux \ --cc=will.deacon@arm.com \ /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: linkBe 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).