From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Toshi Kani <toshi.kani@hp.com>, konrad.wilk@oracle.com
Cc: hpa@zytor.com, tglx@linutronix.de, mingo@redhat.com,
akpm@linux-foundation.org, arnd@arndb.de, linux-mm@kvack.org,
linux-kernel@vger.kernel.org, jgross@suse.com,
stefan.bader@canonical.com, luto@amacapital.net, hmh@hmh.eng.br,
yigal@plexistor.com
Subject: Re: [PATCH v2 4/6] x86, mm: Add set_memory_wt() for WT
Date: Fri, 12 Sep 2014 15:47:31 -0400 [thread overview]
Message-ID: <20140912194731.GK15656@laptop.dumpdata.com> (raw)
In-Reply-To: <1410367910-6026-5-git-send-email-toshi.kani@hp.com>
On Wed, Sep 10, 2014 at 10:51:48AM -0600, Toshi Kani wrote:
> This patch adds set_memory_wt(), set_memory_array_wt(), and
> set_pages_array_wt() for setting range(s) of memory to WT.
>
> Note that set_memory_wt() only works for non-RAM ranges at
> this point due to the current limitation in reserve_memtype().
> This may still be useful when a driver maps the entire NV-DIMM
> range with ioremap_cache() and then modifies a specific range
> to WT with set_memory_wt().
>
> Signed-off-by: Toshi Kani <toshi.kani@hp.com>
Reviewed-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
> ---
> arch/x86/include/asm/cacheflush.h | 6 +++
> arch/x86/mm/pageattr.c | 73 ++++++++++++++++++++++++++++++++++---
> 2 files changed, 72 insertions(+), 7 deletions(-)
>
> diff --git a/arch/x86/include/asm/cacheflush.h b/arch/x86/include/asm/cacheflush.h
> index c912680..5bfd5d0 100644
> --- a/arch/x86/include/asm/cacheflush.h
> +++ b/arch/x86/include/asm/cacheflush.h
> @@ -81,7 +81,7 @@ static inline void set_page_memtype(struct page *pg,
> /*
> * The set_memory_* API can be used to change various attributes of a virtual
> * address range. The attributes include:
> - * Cachability : UnCached, WriteCombining, WriteBack
> + * Cachability : UnCached, WriteCombining, WriteThrough, WriteBack
> * Executability : eXeutable, NoteXecutable
> * Read/Write : ReadOnly, ReadWrite
> * Presence : NotPresent
> @@ -108,9 +108,11 @@ static inline void set_page_memtype(struct page *pg,
>
> int _set_memory_uc(unsigned long addr, int numpages);
> int _set_memory_wc(unsigned long addr, int numpages);
> +int _set_memory_wt(unsigned long addr, int numpages);
> int _set_memory_wb(unsigned long addr, int numpages);
> int set_memory_uc(unsigned long addr, int numpages);
> int set_memory_wc(unsigned long addr, int numpages);
> +int set_memory_wt(unsigned long addr, int numpages);
> int set_memory_wb(unsigned long addr, int numpages);
> int set_memory_x(unsigned long addr, int numpages);
> int set_memory_nx(unsigned long addr, int numpages);
> @@ -121,10 +123,12 @@ int set_memory_4k(unsigned long addr, int numpages);
>
> int set_memory_array_uc(unsigned long *addr, int addrinarray);
> int set_memory_array_wc(unsigned long *addr, int addrinarray);
> +int set_memory_array_wt(unsigned long *addr, int addrinarray);
> int set_memory_array_wb(unsigned long *addr, int addrinarray);
>
> int set_pages_array_uc(struct page **pages, int addrinarray);
> int set_pages_array_wc(struct page **pages, int addrinarray);
> +int set_pages_array_wt(struct page **pages, int addrinarray);
> int set_pages_array_wb(struct page **pages, int addrinarray);
>
> /*
> diff --git a/arch/x86/mm/pageattr.c b/arch/x86/mm/pageattr.c
> index 6917b39..2dda151 100644
> --- a/arch/x86/mm/pageattr.c
> +++ b/arch/x86/mm/pageattr.c
> @@ -1484,12 +1484,10 @@ EXPORT_SYMBOL(set_memory_uc);
> static int _set_memory_array(unsigned long *addr, int addrinarray,
> enum page_cache_mode new_type)
> {
> + enum page_cache_mode set_type;
> int i, j;
> int ret;
>
> - /*
> - * for now UC MINUS. see comments in ioremap_nocache()
> - */
> for (i = 0; i < addrinarray; i++) {
> ret = reserve_memtype(__pa(addr[i]), __pa(addr[i]) + PAGE_SIZE,
> new_type, NULL);
> @@ -1497,9 +1495,12 @@ static int _set_memory_array(unsigned long *addr, int addrinarray,
> goto out_free;
> }
>
> + /* If WC, set to UC- first and then WC */
> + set_type = (new_type == _PAGE_CACHE_MODE_WC) ?
> + _PAGE_CACHE_MODE_UC_MINUS : new_type;
> +
> ret = change_page_attr_set(addr, addrinarray,
> - cachemode2pgprot(_PAGE_CACHE_MODE_UC_MINUS),
> - 1);
> + cachemode2pgprot(set_type), 1);
>
> if (!ret && new_type == _PAGE_CACHE_MODE_WC)
> ret = change_page_attr_set_clr(addr, addrinarray,
> @@ -1527,10 +1528,22 @@ EXPORT_SYMBOL(set_memory_array_uc);
>
> int set_memory_array_wc(unsigned long *addr, int addrinarray)
> {
> + if (!pat_enabled)
> + return set_memory_array_uc(addr, addrinarray);
> +
> return _set_memory_array(addr, addrinarray, _PAGE_CACHE_MODE_WC);
> }
> EXPORT_SYMBOL(set_memory_array_wc);
>
> +int set_memory_array_wt(unsigned long *addr, int addrinarray)
> +{
> + if (!pat_enabled)
> + return set_memory_array_uc(addr, addrinarray);
> +
> + return _set_memory_array(addr, addrinarray, _PAGE_CACHE_MODE_WT);
> +}
> +EXPORT_SYMBOL(set_memory_array_wt);
> +
> int _set_memory_wc(unsigned long addr, int numpages)
> {
> int ret;
> @@ -1574,6 +1587,37 @@ out_err:
> }
> EXPORT_SYMBOL(set_memory_wc);
>
> +int _set_memory_wt(unsigned long addr, int numpages)
> +{
> + return change_page_attr_set(&addr, numpages,
> + cachemode2pgprot(_PAGE_CACHE_MODE_WT), 0);
> +}
> +
> +int set_memory_wt(unsigned long addr, int numpages)
> +{
> + int ret;
> +
> + if (!pat_enabled)
> + return set_memory_uc(addr, numpages);
> +
> + ret = reserve_memtype(__pa(addr), __pa(addr) + numpages * PAGE_SIZE,
> + _PAGE_CACHE_MODE_WT, NULL);
> + if (ret)
> + goto out_err;
> +
> + ret = _set_memory_wt(addr, numpages);
> + if (ret)
> + goto out_free;
> +
> + return 0;
> +
> +out_free:
> + free_memtype(__pa(addr), __pa(addr) + numpages * PAGE_SIZE);
> +out_err:
> + return ret;
> +}
> +EXPORT_SYMBOL(set_memory_wt);
> +
> int _set_memory_wb(unsigned long addr, int numpages)
> {
> /* WB cache mode is hard wired to all cache attribute bits being 0 */
> @@ -1666,6 +1710,7 @@ static int _set_pages_array(struct page **pages, int addrinarray,
> {
> unsigned long start;
> unsigned long end;
> + enum page_cache_mode set_type;
> int i;
> int free_idx;
> int ret;
> @@ -1679,8 +1724,12 @@ static int _set_pages_array(struct page **pages, int addrinarray,
> goto err_out;
> }
>
> + /* If WC, set to UC- first and then WC */
> + set_type = (new_type == _PAGE_CACHE_MODE_WC) ?
> + _PAGE_CACHE_MODE_UC_MINUS : new_type;
> +
> ret = cpa_set_pages_array(pages, addrinarray,
> - cachemode2pgprot(_PAGE_CACHE_MODE_UC_MINUS));
> + cachemode2pgprot(set_type));
> if (!ret && new_type == _PAGE_CACHE_MODE_WC)
> ret = change_page_attr_set_clr(NULL, addrinarray,
> cachemode2pgprot(
> @@ -1710,10 +1759,22 @@ EXPORT_SYMBOL(set_pages_array_uc);
>
> int set_pages_array_wc(struct page **pages, int addrinarray)
> {
> + if (!pat_enabled)
> + return set_pages_array_uc(pages, addrinarray);
> +
> return _set_pages_array(pages, addrinarray, _PAGE_CACHE_MODE_WC);
> }
> EXPORT_SYMBOL(set_pages_array_wc);
>
> +int set_pages_array_wt(struct page **pages, int addrinarray)
> +{
> + if (!pat_enabled)
> + return set_pages_array_uc(pages, addrinarray);
> +
> + return _set_pages_array(pages, addrinarray, _PAGE_CACHE_MODE_WT);
> +}
> +EXPORT_SYMBOL(set_pages_array_wt);
> +
> int set_pages_wb(struct page *page, int numpages)
> {
> unsigned long addr = (unsigned long)page_address(page);
--
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: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Toshi Kani <toshi.kani@hp.com>, konrad.wilk@oracle.com
Cc: hpa@zytor.com, tglx@linutronix.de, mingo@redhat.com,
akpm@linux-foundation.org, arnd@arndb.de, linux-mm@kvack.org,
linux-kernel@vger.kernel.org, jgross@suse.com,
stefan.bader@canonical.com, luto@amacapital.net, hmh@hmh.eng.br,
yigal@plexistor.com
Subject: Re: [PATCH v2 4/6] x86, mm: Add set_memory_wt() for WT
Date: Fri, 12 Sep 2014 15:47:31 -0400 [thread overview]
Message-ID: <20140912194731.GK15656@laptop.dumpdata.com> (raw)
In-Reply-To: <1410367910-6026-5-git-send-email-toshi.kani@hp.com>
On Wed, Sep 10, 2014 at 10:51:48AM -0600, Toshi Kani wrote:
> This patch adds set_memory_wt(), set_memory_array_wt(), and
> set_pages_array_wt() for setting range(s) of memory to WT.
>
> Note that set_memory_wt() only works for non-RAM ranges at
> this point due to the current limitation in reserve_memtype().
> This may still be useful when a driver maps the entire NV-DIMM
> range with ioremap_cache() and then modifies a specific range
> to WT with set_memory_wt().
>
> Signed-off-by: Toshi Kani <toshi.kani@hp.com>
Reviewed-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
> ---
> arch/x86/include/asm/cacheflush.h | 6 +++
> arch/x86/mm/pageattr.c | 73 ++++++++++++++++++++++++++++++++++---
> 2 files changed, 72 insertions(+), 7 deletions(-)
>
> diff --git a/arch/x86/include/asm/cacheflush.h b/arch/x86/include/asm/cacheflush.h
> index c912680..5bfd5d0 100644
> --- a/arch/x86/include/asm/cacheflush.h
> +++ b/arch/x86/include/asm/cacheflush.h
> @@ -81,7 +81,7 @@ static inline void set_page_memtype(struct page *pg,
> /*
> * The set_memory_* API can be used to change various attributes of a virtual
> * address range. The attributes include:
> - * Cachability : UnCached, WriteCombining, WriteBack
> + * Cachability : UnCached, WriteCombining, WriteThrough, WriteBack
> * Executability : eXeutable, NoteXecutable
> * Read/Write : ReadOnly, ReadWrite
> * Presence : NotPresent
> @@ -108,9 +108,11 @@ static inline void set_page_memtype(struct page *pg,
>
> int _set_memory_uc(unsigned long addr, int numpages);
> int _set_memory_wc(unsigned long addr, int numpages);
> +int _set_memory_wt(unsigned long addr, int numpages);
> int _set_memory_wb(unsigned long addr, int numpages);
> int set_memory_uc(unsigned long addr, int numpages);
> int set_memory_wc(unsigned long addr, int numpages);
> +int set_memory_wt(unsigned long addr, int numpages);
> int set_memory_wb(unsigned long addr, int numpages);
> int set_memory_x(unsigned long addr, int numpages);
> int set_memory_nx(unsigned long addr, int numpages);
> @@ -121,10 +123,12 @@ int set_memory_4k(unsigned long addr, int numpages);
>
> int set_memory_array_uc(unsigned long *addr, int addrinarray);
> int set_memory_array_wc(unsigned long *addr, int addrinarray);
> +int set_memory_array_wt(unsigned long *addr, int addrinarray);
> int set_memory_array_wb(unsigned long *addr, int addrinarray);
>
> int set_pages_array_uc(struct page **pages, int addrinarray);
> int set_pages_array_wc(struct page **pages, int addrinarray);
> +int set_pages_array_wt(struct page **pages, int addrinarray);
> int set_pages_array_wb(struct page **pages, int addrinarray);
>
> /*
> diff --git a/arch/x86/mm/pageattr.c b/arch/x86/mm/pageattr.c
> index 6917b39..2dda151 100644
> --- a/arch/x86/mm/pageattr.c
> +++ b/arch/x86/mm/pageattr.c
> @@ -1484,12 +1484,10 @@ EXPORT_SYMBOL(set_memory_uc);
> static int _set_memory_array(unsigned long *addr, int addrinarray,
> enum page_cache_mode new_type)
> {
> + enum page_cache_mode set_type;
> int i, j;
> int ret;
>
> - /*
> - * for now UC MINUS. see comments in ioremap_nocache()
> - */
> for (i = 0; i < addrinarray; i++) {
> ret = reserve_memtype(__pa(addr[i]), __pa(addr[i]) + PAGE_SIZE,
> new_type, NULL);
> @@ -1497,9 +1495,12 @@ static int _set_memory_array(unsigned long *addr, int addrinarray,
> goto out_free;
> }
>
> + /* If WC, set to UC- first and then WC */
> + set_type = (new_type == _PAGE_CACHE_MODE_WC) ?
> + _PAGE_CACHE_MODE_UC_MINUS : new_type;
> +
> ret = change_page_attr_set(addr, addrinarray,
> - cachemode2pgprot(_PAGE_CACHE_MODE_UC_MINUS),
> - 1);
> + cachemode2pgprot(set_type), 1);
>
> if (!ret && new_type == _PAGE_CACHE_MODE_WC)
> ret = change_page_attr_set_clr(addr, addrinarray,
> @@ -1527,10 +1528,22 @@ EXPORT_SYMBOL(set_memory_array_uc);
>
> int set_memory_array_wc(unsigned long *addr, int addrinarray)
> {
> + if (!pat_enabled)
> + return set_memory_array_uc(addr, addrinarray);
> +
> return _set_memory_array(addr, addrinarray, _PAGE_CACHE_MODE_WC);
> }
> EXPORT_SYMBOL(set_memory_array_wc);
>
> +int set_memory_array_wt(unsigned long *addr, int addrinarray)
> +{
> + if (!pat_enabled)
> + return set_memory_array_uc(addr, addrinarray);
> +
> + return _set_memory_array(addr, addrinarray, _PAGE_CACHE_MODE_WT);
> +}
> +EXPORT_SYMBOL(set_memory_array_wt);
> +
> int _set_memory_wc(unsigned long addr, int numpages)
> {
> int ret;
> @@ -1574,6 +1587,37 @@ out_err:
> }
> EXPORT_SYMBOL(set_memory_wc);
>
> +int _set_memory_wt(unsigned long addr, int numpages)
> +{
> + return change_page_attr_set(&addr, numpages,
> + cachemode2pgprot(_PAGE_CACHE_MODE_WT), 0);
> +}
> +
> +int set_memory_wt(unsigned long addr, int numpages)
> +{
> + int ret;
> +
> + if (!pat_enabled)
> + return set_memory_uc(addr, numpages);
> +
> + ret = reserve_memtype(__pa(addr), __pa(addr) + numpages * PAGE_SIZE,
> + _PAGE_CACHE_MODE_WT, NULL);
> + if (ret)
> + goto out_err;
> +
> + ret = _set_memory_wt(addr, numpages);
> + if (ret)
> + goto out_free;
> +
> + return 0;
> +
> +out_free:
> + free_memtype(__pa(addr), __pa(addr) + numpages * PAGE_SIZE);
> +out_err:
> + return ret;
> +}
> +EXPORT_SYMBOL(set_memory_wt);
> +
> int _set_memory_wb(unsigned long addr, int numpages)
> {
> /* WB cache mode is hard wired to all cache attribute bits being 0 */
> @@ -1666,6 +1710,7 @@ static int _set_pages_array(struct page **pages, int addrinarray,
> {
> unsigned long start;
> unsigned long end;
> + enum page_cache_mode set_type;
> int i;
> int free_idx;
> int ret;
> @@ -1679,8 +1724,12 @@ static int _set_pages_array(struct page **pages, int addrinarray,
> goto err_out;
> }
>
> + /* If WC, set to UC- first and then WC */
> + set_type = (new_type == _PAGE_CACHE_MODE_WC) ?
> + _PAGE_CACHE_MODE_UC_MINUS : new_type;
> +
> ret = cpa_set_pages_array(pages, addrinarray,
> - cachemode2pgprot(_PAGE_CACHE_MODE_UC_MINUS));
> + cachemode2pgprot(set_type));
> if (!ret && new_type == _PAGE_CACHE_MODE_WC)
> ret = change_page_attr_set_clr(NULL, addrinarray,
> cachemode2pgprot(
> @@ -1710,10 +1759,22 @@ EXPORT_SYMBOL(set_pages_array_uc);
>
> int set_pages_array_wc(struct page **pages, int addrinarray)
> {
> + if (!pat_enabled)
> + return set_pages_array_uc(pages, addrinarray);
> +
> return _set_pages_array(pages, addrinarray, _PAGE_CACHE_MODE_WC);
> }
> EXPORT_SYMBOL(set_pages_array_wc);
>
> +int set_pages_array_wt(struct page **pages, int addrinarray)
> +{
> + if (!pat_enabled)
> + return set_pages_array_uc(pages, addrinarray);
> +
> + return _set_pages_array(pages, addrinarray, _PAGE_CACHE_MODE_WT);
> +}
> +EXPORT_SYMBOL(set_pages_array_wt);
> +
> int set_pages_wb(struct page *page, int numpages)
> {
> unsigned long addr = (unsigned long)page_address(page);
next prev parent reply other threads:[~2014-09-12 19:47 UTC|newest]
Thread overview: 80+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-09-10 16:51 [PATCH v2 0/6] Support Write-Through mapping on x86 Toshi Kani
2014-09-10 16:51 ` Toshi Kani
2014-09-10 16:51 ` [PATCH v2 1/6] x86, mm, pat: Set WT to PA4 slot of PAT MSR Toshi Kani
2014-09-10 16:51 ` Toshi Kani
2014-09-12 19:33 ` Konrad Rzeszutek Wilk
2014-09-12 19:33 ` Konrad Rzeszutek Wilk
2014-09-12 20:45 ` Toshi Kani
2014-09-12 20:45 ` Toshi Kani
2014-09-10 16:51 ` [PATCH v2 2/6] x86, mm, pat: Change reserve_memtype() to handle WT Toshi Kani
2014-09-10 16:51 ` Toshi Kani
2014-09-10 18:26 ` Andy Lutomirski
2014-09-10 18:26 ` Andy Lutomirski
2014-09-10 19:14 ` H. Peter Anvin
2014-09-10 19:14 ` H. Peter Anvin
2014-09-10 19:30 ` Toshi Kani
2014-09-10 19:30 ` Toshi Kani
2014-09-10 20:14 ` H. Peter Anvin
2014-09-10 20:14 ` H. Peter Anvin
2014-09-10 20:30 ` Toshi Kani
2014-09-10 20:30 ` Toshi Kani
2014-09-10 21:06 ` Andy Lutomirski
2014-09-10 21:06 ` Andy Lutomirski
2014-09-10 21:11 ` Toshi Kani
2014-09-10 21:11 ` Toshi Kani
2014-09-10 21:27 ` Andy Lutomirski
2014-09-10 21:27 ` Andy Lutomirski
2014-09-10 21:25 ` Toshi Kani
2014-09-10 21:25 ` Toshi Kani
2014-09-10 21:39 ` H. Peter Anvin
2014-09-10 21:39 ` H. Peter Anvin
2014-09-10 21:47 ` Toshi Kani
2014-09-10 21:47 ` Toshi Kani
2014-09-10 22:00 ` H. Peter Anvin
2014-09-10 22:00 ` H. Peter Anvin
2014-09-10 23:24 ` Toshi Kani
2014-09-10 23:24 ` Toshi Kani
2014-09-10 21:39 ` H. Peter Anvin
2014-09-10 21:39 ` H. Peter Anvin
2014-09-10 20:31 ` Andy Lutomirski
2014-09-10 20:31 ` Andy Lutomirski
2014-09-12 19:41 ` Konrad Rzeszutek Wilk
2014-09-12 19:41 ` Konrad Rzeszutek Wilk
2014-09-10 16:51 ` [PATCH v2 3/6] x86, mm, asm-gen: Add ioremap_wt() for WT Toshi Kani
2014-09-10 16:51 ` Toshi Kani
2014-09-10 18:29 ` Andy Lutomirski
2014-09-10 18:29 ` Andy Lutomirski
2014-09-10 19:40 ` Toshi Kani
2014-09-10 19:40 ` Toshi Kani
2014-09-10 20:08 ` Andy Lutomirski
2014-09-10 20:08 ` Andy Lutomirski
2014-09-12 19:42 ` Konrad Rzeszutek Wilk
2014-09-12 19:42 ` Konrad Rzeszutek Wilk
2014-09-10 16:51 ` [PATCH v2 4/6] x86, mm: Add set_memory_wt() " Toshi Kani
2014-09-10 16:51 ` Toshi Kani
2014-09-12 19:47 ` Konrad Rzeszutek Wilk [this message]
2014-09-12 19:47 ` Konrad Rzeszutek Wilk
2014-09-10 16:51 ` [PATCH v2 5/6] x86, mm, pat: Add pgprot_writethrough() " Toshi Kani
2014-09-10 16:51 ` Toshi Kani
2014-09-12 19:47 ` Konrad Rzeszutek Wilk
2014-09-12 19:47 ` Konrad Rzeszutek Wilk
2014-09-10 16:51 ` [PATCH v2 6/6] x86, pat: Update documentation for WT changes Toshi Kani
2014-09-10 16:51 ` Toshi Kani
2014-09-10 18:30 ` Andy Lutomirski
2014-09-10 18:30 ` Andy Lutomirski
2014-09-10 20:12 ` Toshi Kani
2014-09-10 20:12 ` Toshi Kani
2014-09-10 20:29 ` Andy Lutomirski
2014-09-10 20:29 ` Andy Lutomirski
2014-09-10 21:34 ` Toshi Kani
2014-09-10 21:34 ` Toshi Kani
2014-09-15 21:19 ` Toshi Kani
2014-09-15 21:19 ` Toshi Kani
2014-09-16 1:22 ` Andy Lutomirski
2014-09-16 1:22 ` Andy Lutomirski
2014-09-16 16:52 ` Toshi Kani
2014-09-16 16:52 ` Toshi Kani
2014-09-16 21:45 ` Yigal Korman
2014-09-16 21:45 ` Yigal Korman
2014-09-16 22:13 ` Toshi Kani
2014-09-16 22:13 ` Toshi Kani
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=20140912194731.GK15656@laptop.dumpdata.com \
--to=konrad.wilk@oracle.com \
--cc=akpm@linux-foundation.org \
--cc=arnd@arndb.de \
--cc=hmh@hmh.eng.br \
--cc=hpa@zytor.com \
--cc=jgross@suse.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=luto@amacapital.net \
--cc=mingo@redhat.com \
--cc=stefan.bader@canonical.com \
--cc=tglx@linutronix.de \
--cc=toshi.kani@hp.com \
--cc=yigal@plexistor.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: 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.