From: Mel Gorman <mel@csn.ul.ie>
To: Rik van Riel <riel@redhat.com>
Cc: Andrew Morton <akpm@linux-foundation.org>,
Andrea Arcangeli <aarcange@redhat.com>,
Minchan Kim <minchan.kim@gmail.com>,
Linux-MM <linux-mm@kvack.org>,
KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>,
LKML <linux-kernel@vger.kernel.org>,
Linus Torvalds <torvalds@linux-foundation.org>
Subject: Re: [PATCH 5/5] extend KSM refcounts to the anon_vma root
Date: Wed, 12 May 2010 22:07:07 +0100 [thread overview]
Message-ID: <20100512210706.GQ24989@csn.ul.ie> (raw)
In-Reply-To: <20100512134111.467fb6c2@annuminas.surriel.com>
On Wed, May 12, 2010 at 01:41:11PM -0400, Rik van Riel wrote:
> Subject: extend KSM refcounts to the anon_vma root
>
> KSM reference counts can cause an anon_vma to exist after the processe
> it belongs to have already exited. Because the anon_vma lock now lives
> in the root anon_vma, we need to ensure that the root anon_vma stays
> around until after all the "child" anon_vmas have been freed.
>
> The obvious way to do this is to have a "child" anon_vma take a
> reference to the root in anon_vma_fork. When the anon_vma is freed
> at munmap or process exit, we drop the refcount in anon_vma_unlink
> and possibly free the root anon_vma.
>
> The KSM anon_vma reference count function also needs to be modified
> to deal with the possibility of freeing 2 levels of anon_vma. The
> easiest way to do this is to break out the KSM magic and make it
> generic.
>
> When compiling without CONFIG_KSM, this code is compiled out.
>
> Signed-off-by: Rik van Riel <riel@redhat.com>
> ---
> include/linux/rmap.h | 12 ++++++++++++
> mm/ksm.c | 17 ++++++-----------
> mm/rmap.c | 45 ++++++++++++++++++++++++++++++++++++++++++++-
> 3 files changed, 62 insertions(+), 12 deletions(-)
>
> diff --git a/include/linux/rmap.h b/include/linux/rmap.h
> index 33ffe14..387d40c 100644
> --- a/include/linux/rmap.h
> +++ b/include/linux/rmap.h
> @@ -126,6 +126,18 @@ int anon_vma_fork(struct vm_area_struct *, struct vm_area_struct *);
> void __anon_vma_link(struct vm_area_struct *);
> void anon_vma_free(struct anon_vma *);
>
> +#ifdef CONFIG_KSM
> +static inline void get_anon_vma(struct anon_vma *anon_vma)
> +{
> + atomic_inc(&anon_vma->ksm_refcount);
> +}
> +
> +void drop_anon_vma(struct anon_vma *);
> +#else
> +#define get_anon_vma(x) do {} while(0)
> +#define drop_anon_vma(x) do {} while(0)
> +#endif
> +
> static inline void anon_vma_merge(struct vm_area_struct *vma,
> struct vm_area_struct *next)
> {
> diff --git a/mm/ksm.c b/mm/ksm.c
> index 7ca0dd7..9f2acc9 100644
> --- a/mm/ksm.c
> +++ b/mm/ksm.c
> @@ -318,19 +318,14 @@ static void hold_anon_vma(struct rmap_item *rmap_item,
> struct anon_vma *anon_vma)
> {
> rmap_item->anon_vma = anon_vma;
> - atomic_inc(&anon_vma->ksm_refcount);
> + get_anon_vma(anon_vma);
> }
I'm not quite getting this. Here, we get the local anon_vma so we
increment its reference count and later we drop it but without a
refcount taken on the root anon_vma, why is it guaranteed to stay
around?
>
> -static void drop_anon_vma(struct rmap_item *rmap_item)
> +static void ksm_drop_anon_vma(struct rmap_item *rmap_item)
> {
> struct anon_vma *anon_vma = rmap_item->anon_vma;
>
> - if (atomic_dec_and_lock(&anon_vma->ksm_refcount, &anon_vma->root->lock)) {
> - int empty = list_empty(&anon_vma->head);
> - anon_vma_unlock(anon_vma);
> - if (empty)
> - anon_vma_free(anon_vma);
> - }
> + drop_anon_vma(anon_vma);
> }
>
> /*
> @@ -415,7 +410,7 @@ static void break_cow(struct rmap_item *rmap_item)
> * It is not an accident that whenever we want to break COW
> * to undo, we also need to drop a reference to the anon_vma.
> */
> - drop_anon_vma(rmap_item);
> + ksm_drop_anon_vma(rmap_item);
>
> down_read(&mm->mmap_sem);
> if (ksm_test_exit(mm))
> @@ -470,7 +465,7 @@ static void remove_node_from_stable_tree(struct stable_node *stable_node)
> ksm_pages_sharing--;
> else
> ksm_pages_shared--;
> - drop_anon_vma(rmap_item);
> + ksm_drop_anon_vma(rmap_item);
> rmap_item->address &= PAGE_MASK;
> cond_resched();
> }
> @@ -558,7 +553,7 @@ static void remove_rmap_item_from_tree(struct rmap_item *rmap_item)
> else
> ksm_pages_shared--;
>
> - drop_anon_vma(rmap_item);
> + ksm_drop_anon_vma(rmap_item);
> rmap_item->address &= PAGE_MASK;
>
> } else if (rmap_item->address & UNSTABLE_FLAG) {
> diff --git a/mm/rmap.c b/mm/rmap.c
> index f0ba648..d63cd91 100644
> --- a/mm/rmap.c
> +++ b/mm/rmap.c
> @@ -238,6 +238,12 @@ int anon_vma_fork(struct vm_area_struct *vma, struct vm_area_struct *pvma)
> */
> root_avc = list_entry(vma->anon_vma_chain.prev, struct anon_vma_chain, same_vma);
> anon_vma->root = root_avc->anon_vma;
> + /*
> + * With KSM refcounts, an anon_vma can stay around longer than the
> + * process it belongs to. The root anon_vma needs to be pinned,
> + * because that is where the lock lives.
> + */
> + get_anon_vma(anon_vma->root);
> /* Mark this anon_vma as the one where our new (COWed) pages go. */
> vma->anon_vma = anon_vma;
> anon_vma_chain_link(vma, avc, anon_vma);
> @@ -267,8 +273,11 @@ static void anon_vma_unlink(struct anon_vma_chain *anon_vma_chain)
> empty = list_empty(&anon_vma->head) && !ksm_refcount(anon_vma);
> anon_vma_unlock(anon_vma);
>
> - if (empty)
> + if (empty) {
> + /* We no longer need the root anon_vma */
> + drop_anon_vma(anon_vma->root);
> anon_vma_free(anon_vma);
> + }
> }
>
> void unlink_anon_vmas(struct vm_area_struct *vma)
> @@ -1355,6 +1364,40 @@ int try_to_munlock(struct page *page)
> return try_to_unmap_file(page, TTU_MUNLOCK);
> }
>
> +#ifdef CONFIG_KSM
> +/*
> + * Drop an anon_vma refcount, freeing the anon_vma and anon_vma->root
> + * if necessary. Be careful to do all the tests under the lock. Once
> + * we know we are the last user, nobody else can get a reference and we
> + * can do the freeing without the lock.
> + */
> +void drop_anon_vma(struct anon_vma *anon_vma)
> +{
> + if (atomic_dec_and_lock(&anon_vma->ksm_refcount, &anon_vma->root->lock)) {
> + struct anon_vma *root = anon_vma->root;
> + int empty list_empty(&anon_vma->head);
> + int last_root_user = 0;
> + int root_empty = 0;
> +
> + /*
> + * The refcount on a non-root anon_vma got dropped. Drop
> + * the refcount on the root and check if we need to free it.
> + */
> + if (empty && anon_vma != root) {
> + last_root_user = atomic_dec_and_test(&root->ksm_refcount);
> + root_empty = list_empty(&root->head);
> + }
> + anon_vma_unlock(anon_vma);
> +
> + if (empty) {
> + anon_vma_free(anon_vma);
> + if (root_empty && last_root_user)
> + anon_vma_free(root);
> + }
> + }
> +}
> +#endif
> +
> #ifdef CONFIG_MIGRATION
> /*
> * rmap_walk() and its helpers rmap_walk_anon() and rmap_walk_file():
>
--
Mel Gorman
Part-time Phd Student Linux Technology Center
University of Limerick IBM Dublin Software Lab
WARNING: multiple messages have this Message-ID (diff)
From: Mel Gorman <mel@csn.ul.ie>
To: Rik van Riel <riel@redhat.com>
Cc: Andrew Morton <akpm@linux-foundation.org>,
Andrea Arcangeli <aarcange@redhat.com>,
Minchan Kim <minchan.kim@gmail.com>,
Linux-MM <linux-mm@kvack.org>,
KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>,
LKML <linux-kernel@vger.kernel.org>,
Linus Torvalds <torvalds@linux-foundation.org>
Subject: Re: [PATCH 5/5] extend KSM refcounts to the anon_vma root
Date: Wed, 12 May 2010 22:07:07 +0100 [thread overview]
Message-ID: <20100512210706.GQ24989@csn.ul.ie> (raw)
In-Reply-To: <20100512134111.467fb6c2@annuminas.surriel.com>
On Wed, May 12, 2010 at 01:41:11PM -0400, Rik van Riel wrote:
> Subject: extend KSM refcounts to the anon_vma root
>
> KSM reference counts can cause an anon_vma to exist after the processe
> it belongs to have already exited. Because the anon_vma lock now lives
> in the root anon_vma, we need to ensure that the root anon_vma stays
> around until after all the "child" anon_vmas have been freed.
>
> The obvious way to do this is to have a "child" anon_vma take a
> reference to the root in anon_vma_fork. When the anon_vma is freed
> at munmap or process exit, we drop the refcount in anon_vma_unlink
> and possibly free the root anon_vma.
>
> The KSM anon_vma reference count function also needs to be modified
> to deal with the possibility of freeing 2 levels of anon_vma. The
> easiest way to do this is to break out the KSM magic and make it
> generic.
>
> When compiling without CONFIG_KSM, this code is compiled out.
>
> Signed-off-by: Rik van Riel <riel@redhat.com>
> ---
> include/linux/rmap.h | 12 ++++++++++++
> mm/ksm.c | 17 ++++++-----------
> mm/rmap.c | 45 ++++++++++++++++++++++++++++++++++++++++++++-
> 3 files changed, 62 insertions(+), 12 deletions(-)
>
> diff --git a/include/linux/rmap.h b/include/linux/rmap.h
> index 33ffe14..387d40c 100644
> --- a/include/linux/rmap.h
> +++ b/include/linux/rmap.h
> @@ -126,6 +126,18 @@ int anon_vma_fork(struct vm_area_struct *, struct vm_area_struct *);
> void __anon_vma_link(struct vm_area_struct *);
> void anon_vma_free(struct anon_vma *);
>
> +#ifdef CONFIG_KSM
> +static inline void get_anon_vma(struct anon_vma *anon_vma)
> +{
> + atomic_inc(&anon_vma->ksm_refcount);
> +}
> +
> +void drop_anon_vma(struct anon_vma *);
> +#else
> +#define get_anon_vma(x) do {} while(0)
> +#define drop_anon_vma(x) do {} while(0)
> +#endif
> +
> static inline void anon_vma_merge(struct vm_area_struct *vma,
> struct vm_area_struct *next)
> {
> diff --git a/mm/ksm.c b/mm/ksm.c
> index 7ca0dd7..9f2acc9 100644
> --- a/mm/ksm.c
> +++ b/mm/ksm.c
> @@ -318,19 +318,14 @@ static void hold_anon_vma(struct rmap_item *rmap_item,
> struct anon_vma *anon_vma)
> {
> rmap_item->anon_vma = anon_vma;
> - atomic_inc(&anon_vma->ksm_refcount);
> + get_anon_vma(anon_vma);
> }
I'm not quite getting this. Here, we get the local anon_vma so we
increment its reference count and later we drop it but without a
refcount taken on the root anon_vma, why is it guaranteed to stay
around?
>
> -static void drop_anon_vma(struct rmap_item *rmap_item)
> +static void ksm_drop_anon_vma(struct rmap_item *rmap_item)
> {
> struct anon_vma *anon_vma = rmap_item->anon_vma;
>
> - if (atomic_dec_and_lock(&anon_vma->ksm_refcount, &anon_vma->root->lock)) {
> - int empty = list_empty(&anon_vma->head);
> - anon_vma_unlock(anon_vma);
> - if (empty)
> - anon_vma_free(anon_vma);
> - }
> + drop_anon_vma(anon_vma);
> }
>
> /*
> @@ -415,7 +410,7 @@ static void break_cow(struct rmap_item *rmap_item)
> * It is not an accident that whenever we want to break COW
> * to undo, we also need to drop a reference to the anon_vma.
> */
> - drop_anon_vma(rmap_item);
> + ksm_drop_anon_vma(rmap_item);
>
> down_read(&mm->mmap_sem);
> if (ksm_test_exit(mm))
> @@ -470,7 +465,7 @@ static void remove_node_from_stable_tree(struct stable_node *stable_node)
> ksm_pages_sharing--;
> else
> ksm_pages_shared--;
> - drop_anon_vma(rmap_item);
> + ksm_drop_anon_vma(rmap_item);
> rmap_item->address &= PAGE_MASK;
> cond_resched();
> }
> @@ -558,7 +553,7 @@ static void remove_rmap_item_from_tree(struct rmap_item *rmap_item)
> else
> ksm_pages_shared--;
>
> - drop_anon_vma(rmap_item);
> + ksm_drop_anon_vma(rmap_item);
> rmap_item->address &= PAGE_MASK;
>
> } else if (rmap_item->address & UNSTABLE_FLAG) {
> diff --git a/mm/rmap.c b/mm/rmap.c
> index f0ba648..d63cd91 100644
> --- a/mm/rmap.c
> +++ b/mm/rmap.c
> @@ -238,6 +238,12 @@ int anon_vma_fork(struct vm_area_struct *vma, struct vm_area_struct *pvma)
> */
> root_avc = list_entry(vma->anon_vma_chain.prev, struct anon_vma_chain, same_vma);
> anon_vma->root = root_avc->anon_vma;
> + /*
> + * With KSM refcounts, an anon_vma can stay around longer than the
> + * process it belongs to. The root anon_vma needs to be pinned,
> + * because that is where the lock lives.
> + */
> + get_anon_vma(anon_vma->root);
> /* Mark this anon_vma as the one where our new (COWed) pages go. */
> vma->anon_vma = anon_vma;
> anon_vma_chain_link(vma, avc, anon_vma);
> @@ -267,8 +273,11 @@ static void anon_vma_unlink(struct anon_vma_chain *anon_vma_chain)
> empty = list_empty(&anon_vma->head) && !ksm_refcount(anon_vma);
> anon_vma_unlock(anon_vma);
>
> - if (empty)
> + if (empty) {
> + /* We no longer need the root anon_vma */
> + drop_anon_vma(anon_vma->root);
> anon_vma_free(anon_vma);
> + }
> }
>
> void unlink_anon_vmas(struct vm_area_struct *vma)
> @@ -1355,6 +1364,40 @@ int try_to_munlock(struct page *page)
> return try_to_unmap_file(page, TTU_MUNLOCK);
> }
>
> +#ifdef CONFIG_KSM
> +/*
> + * Drop an anon_vma refcount, freeing the anon_vma and anon_vma->root
> + * if necessary. Be careful to do all the tests under the lock. Once
> + * we know we are the last user, nobody else can get a reference and we
> + * can do the freeing without the lock.
> + */
> +void drop_anon_vma(struct anon_vma *anon_vma)
> +{
> + if (atomic_dec_and_lock(&anon_vma->ksm_refcount, &anon_vma->root->lock)) {
> + struct anon_vma *root = anon_vma->root;
> + int empty list_empty(&anon_vma->head);
> + int last_root_user = 0;
> + int root_empty = 0;
> +
> + /*
> + * The refcount on a non-root anon_vma got dropped. Drop
> + * the refcount on the root and check if we need to free it.
> + */
> + if (empty && anon_vma != root) {
> + last_root_user = atomic_dec_and_test(&root->ksm_refcount);
> + root_empty = list_empty(&root->head);
> + }
> + anon_vma_unlock(anon_vma);
> +
> + if (empty) {
> + anon_vma_free(anon_vma);
> + if (root_empty && last_root_user)
> + anon_vma_free(root);
> + }
> + }
> +}
> +#endif
> +
> #ifdef CONFIG_MIGRATION
> /*
> * rmap_walk() and its helpers rmap_walk_anon() and rmap_walk_file():
>
--
Mel Gorman
Part-time Phd Student Linux Technology Center
University of Limerick IBM Dublin Software Lab
--
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>
next prev parent reply other threads:[~2010-05-12 21:07 UTC|newest]
Thread overview: 108+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-05-12 17:38 [PATCH 0/5] always lock the root anon_vma Rik van Riel
2010-05-12 17:38 ` Rik van Riel
2010-05-12 17:39 ` [PATCH 1/5] rename anon_vma_lock to vma_lock_anon_vma Rik van Riel
2010-05-12 17:39 ` Rik van Riel
2010-05-12 20:57 ` Mel Gorman
2010-05-12 20:57 ` Mel Gorman
2010-05-13 0:30 ` KAMEZAWA Hiroyuki
2010-05-13 0:30 ` KAMEZAWA Hiroyuki
2010-05-12 17:39 ` [PATCH 3/5] track the root (oldest) anon_vma Rik van Riel
2010-05-12 17:39 ` Rik van Riel
2010-05-12 20:59 ` Mel Gorman
2010-05-12 20:59 ` Mel Gorman
2010-05-12 21:01 ` Rik van Riel
2010-05-12 21:01 ` Rik van Riel
2010-05-13 0:38 ` KAMEZAWA Hiroyuki
2010-05-13 0:38 ` KAMEZAWA Hiroyuki
2010-05-13 2:25 ` Rik van Riel
2010-05-13 2:25 ` Rik van Riel
2010-05-14 0:04 ` KAMEZAWA Hiroyuki
2010-05-14 0:04 ` KAMEZAWA Hiroyuki
2010-05-12 17:40 ` [PATCH 4/5] always lock " Rik van Riel
2010-05-12 17:40 ` Rik van Riel
2010-05-12 21:02 ` Mel Gorman
2010-05-12 21:02 ` Mel Gorman
2010-05-12 21:08 ` Rik van Riel
2010-05-12 21:08 ` Rik van Riel
2010-05-13 9:54 ` Mel Gorman
2010-05-13 9:54 ` Mel Gorman
2010-05-13 14:33 ` [PATCH -v2 " Rik van Riel
2010-05-13 14:33 ` Rik van Riel
2010-05-13 21:09 ` Andrew Morton
2010-05-13 21:09 ` Andrew Morton
2010-05-13 22:50 ` Rik van Riel
2010-05-13 22:50 ` Rik van Riel
2010-05-14 9:33 ` Mel Gorman
2010-05-14 9:33 ` Mel Gorman
2010-05-26 4:00 ` Rik van Riel
2010-05-26 4:00 ` Rik van Riel
2010-05-26 4:15 ` Andrew Morton
2010-05-26 4:15 ` Andrew Morton
2010-05-26 5:46 ` james toy
2010-05-26 5:46 ` james toy
2010-06-01 0:57 ` james toy
2010-06-01 0:57 ` james toy
2010-05-26 15:24 ` [PATCH -v2 0/5] always lock the root anon_vma Rik van Riel
2010-05-26 15:24 ` Rik van Riel
2010-05-26 15:25 ` [PATCH 1/5] rename anon_vma_lock to vma_lock_anon_vma Rik van Riel
2010-05-26 15:25 ` Rik van Riel
2010-05-26 17:25 ` Linus Torvalds
2010-05-26 17:25 ` Linus Torvalds
2010-05-26 19:01 ` Rik van Riel
2010-05-26 19:01 ` Rik van Riel
2010-05-26 19:25 ` Linus Torvalds
2010-05-26 19:25 ` Linus Torvalds
2010-05-26 19:35 ` Rik van Riel
2010-05-26 19:35 ` Rik van Riel
2010-05-26 15:25 ` [PATCH 2/5] change direct call of spin_lock(anon_vma->lock) to inline function Rik van Riel
2010-05-26 15:25 ` Rik van Riel
2010-05-26 15:26 ` [PATCH 3/5] track the root (oldest) anon_vma Rik van Riel
2010-05-26 15:26 ` Rik van Riel
2010-05-26 15:27 ` [PATCH 4/5] always lock " Rik van Riel
2010-05-26 15:27 ` Rik van Riel
2010-05-26 15:27 ` [PATCH 5/5] extend KSM refcounts to the anon_vma root Rik van Riel
2010-05-26 15:27 ` Rik van Riel
2010-05-12 21:55 ` [PATCH 4/5] always lock the root (oldest) anon_vma Linus Torvalds
2010-05-12 21:55 ` Linus Torvalds
2010-05-12 22:18 ` Rik van Riel
2010-05-12 22:18 ` Rik van Riel
2010-05-12 22:26 ` Linus Torvalds
2010-05-12 22:26 ` Linus Torvalds
2010-05-12 17:41 ` [PATCH 5/5] extend KSM refcounts to the anon_vma root Rik van Riel
2010-05-12 17:41 ` Rik van Riel
2010-05-12 21:07 ` Mel Gorman [this message]
2010-05-12 21:07 ` Mel Gorman
2010-05-12 21:09 ` Rik van Riel
2010-05-12 21:09 ` Rik van Riel
2010-05-13 11:26 ` Mel Gorman
2010-05-13 11:26 ` Mel Gorman
2010-05-13 13:11 ` Rik van Riel
2010-05-13 13:11 ` Rik van Riel
2010-05-13 13:24 ` Mel Gorman
2010-05-13 13:24 ` Mel Gorman
2010-05-13 14:34 ` [PATCH -v2 " Rik van Riel
2010-05-13 14:34 ` Rik van Riel
2010-05-19 1:05 ` Andrea Arcangeli
2010-05-19 1:05 ` Andrea Arcangeli
2010-05-12 17:41 ` [PATCH 2/5] change direct call of spin_lock(anon_vma->lock) to inline function Rik van Riel
2010-05-12 17:41 ` Rik van Riel
2010-05-12 20:58 ` Mel Gorman
2010-05-12 20:58 ` Mel Gorman
2010-05-13 0:32 ` KAMEZAWA Hiroyuki
2010-05-13 0:32 ` KAMEZAWA Hiroyuki
2010-05-20 22:42 ` [PATCH 6/5] adjust mm_take_all_locks to anon-vma-root locking Andrea Arcangeli
2010-05-20 22:42 ` Andrea Arcangeli
2010-05-20 23:07 ` Rik van Riel
2010-05-20 23:07 ` Rik van Riel
-- strict thread matches above, loose matches on Subject: below --
2010-05-26 19:38 [PATCH -v3 0/5] always lock the root anon_vma Rik van Riel
2010-05-26 19:41 ` [PATCH 5/5] extend KSM refcounts to the anon_vma root Rik van Riel
2010-05-26 19:41 ` Rik van Riel
2010-05-26 20:47 ` Larry Woodman
2010-05-26 20:47 ` Larry Woodman
2010-05-27 14:02 ` Minchan Kim
2010-05-27 14:02 ` Minchan Kim
2010-05-27 14:09 ` Rik van Riel
2010-05-27 14:09 ` Rik van Riel
2010-05-27 14:31 ` Minchan Kim
2010-05-27 14:31 ` Minchan Kim
2010-05-27 17:50 ` Mel Gorman
2010-05-27 17:50 ` Mel Gorman
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=20100512210706.GQ24989@csn.ul.ie \
--to=mel@csn.ul.ie \
--cc=aarcange@redhat.com \
--cc=akpm@linux-foundation.org \
--cc=kamezawa.hiroyu@jp.fujitsu.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=minchan.kim@gmail.com \
--cc=riel@redhat.com \
--cc=torvalds@linux-foundation.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.