virtualization.lists.linux-foundation.org archive mirror
 help / color / mirror / Atom feed
From: Jeremy Fitzhardinge <jeremy@goop.org>
To: Ingo Molnar <mingo@elte.hu>
Cc: Zachary Amsden <zach@vmware.com>,
	xen-devel@lists.xensource.com, virtualization@lists.osdl.org,
	Rusty Russell <rusty@rustcorp.com.au>,
	linux-kernel@vger.kernel.org, Chris Wright <chrisw@sous-sol.org>,
	Andi Kleen <ak@muc.de>, Andrew Morton <akpm@linux-foundation.org>
Subject: Re: [patch 00/26] Xen-paravirt_ops: Xen guest implementation for paravirt_ops interface
Date: Fri, 16 Mar 2007 10:26:55 -0700	[thread overview]
Message-ID: <45FAD35F.8040404@goop.org> (raw)
In-Reply-To: <20070316092137.GL23174@elte.hu>

Ingo Molnar wrote:
> * Jeremy Fitzhardinge <jeremy@goop.org> wrote:
>
>   
>> This patch series implements the Linux Xen guest as a paravirt_ops 
>> backend. [...]
>>     
>
> 19/26 seems to be missing (lkml size limit?) so i couldnt review it.
>   

Shouldn't think so; its a fairly small patch.  Here it is.

    J

Subject: add kmap_atomic_pte for mapping highpte pages

Xen and VMI both have special requirements when mapping a highmem pte
page into the kernel address space.  These can be dealt with by adding
a new kmap_atomic_pte() function for mapping highptes, and hooking it
into the paravirt_ops infrastructure.

Xen specifically wants to map the pte page RO, so this patch exposes a
helper function, _kmap_atomic, which maps the page with the specified
page protections.

This also adds a kmap_flush_unused() function to clear out the cached
kmap mappings.  Xen needs this to clear out any potential stray RW
mappings of pages which will become part of a pagetable.

Signed-off-by: Jeremy Fitzhardinge <jeremy@xensource.com>
Cc: Zachary Amsden <zach@vmware.com>

---
 arch/i386/kernel/paravirt.c |    7 +++++++
 arch/i386/mm/highmem.c      |    9 +++++++--
 include/asm-i386/highmem.h  |   11 +++++++++++
 include/asm-i386/paravirt.h |   14 +++++++++++++-
 include/asm-i386/pgtable.h  |    4 ++--
 include/linux/highmem.h     |    6 ++++++
 mm/highmem.c                |    9 +++++++++
 7 files changed, 55 insertions(+), 5 deletions(-)

===================================================================
--- a/arch/i386/kernel/paravirt.c
+++ b/arch/i386/kernel/paravirt.c
@@ -20,6 +20,7 @@
 #include <linux/efi.h>
 #include <linux/bcd.h>
 #include <linux/start_kernel.h>
+#include <linux/highmem.h>
 
 #include <asm/bug.h>
 #include <asm/paravirt.h>
@@ -600,6 +601,12 @@ struct paravirt_ops paravirt_ops = {
 
 	.ptep_get_and_clear = native_ptep_get_and_clear,
 
+#ifdef CONFIG_HIGHPTE
+	.kmap_atomic_pte = native_kmap_atomic_pte,
+#else
+	.kmap_atomic_pte = paravirt_nop,
+#endif
+
 #ifdef CONFIG_X86_PAE
 	.set_pte_atomic = native_set_pte_atomic,
 	.set_pte_present = native_set_pte_present,
===================================================================
--- a/arch/i386/mm/highmem.c
+++ b/arch/i386/mm/highmem.c
@@ -26,7 +26,7 @@ void kunmap(struct page *page)
  * However when holding an atomic kmap is is not legal to sleep, so atomic
  * kmaps are appropriate for short, tight code paths only.
  */
-void *kmap_atomic(struct page *page, enum km_type type)
+void *_kmap_atomic(struct page *page, enum km_type type, pgprot_t prot)
 {
 	enum fixed_addresses idx;
 	unsigned long vaddr;
@@ -41,9 +41,14 @@ void *kmap_atomic(struct page *page, enu
 		return page_address(page);
 
 	vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx);
-	set_pte(kmap_pte-idx, mk_pte(page, kmap_prot));
+	set_pte(kmap_pte-idx, mk_pte(page, prot));
 
 	return (void*) vaddr;
+}
+
+void *kmap_atomic(struct page *page, enum km_type type)
+{
+	return _kmap_atomic(page, type, kmap_prot);
 }
 
 void kunmap_atomic(void *kvaddr, enum km_type type)
===================================================================
--- a/include/asm-i386/highmem.h
+++ b/include/asm-i386/highmem.h
@@ -24,6 +24,7 @@
 #include <linux/threads.h>
 #include <asm/kmap_types.h>
 #include <asm/tlbflush.h>
+#include <asm/paravirt.h>
 
 /* declarations for highmem.c */
 extern unsigned long highstart_pfn, highend_pfn;
@@ -67,10 +68,20 @@ extern void FASTCALL(kunmap_high(struct 
 
 void *kmap(struct page *page);
 void kunmap(struct page *page);
+void *_kmap_atomic(struct page *page, enum km_type type, pgprot_t prot);
 void *kmap_atomic(struct page *page, enum km_type type);
 void kunmap_atomic(void *kvaddr, enum km_type type);
 void *kmap_atomic_pfn(unsigned long pfn, enum km_type type);
 struct page *kmap_atomic_to_page(void *ptr);
+
+static inline void *native_kmap_atomic_pte(struct page *page, enum km_type type)
+{
+	return kmap_atomic(page, type);
+}
+
+#ifndef CONFIG_PARAVIRT
+#define kmap_atomic_pte(page, type)	kmap_atomic(page, type)
+#endif
 
 #define flush_cache_kmaps()	do { } while (0)
 
===================================================================
--- a/include/asm-i386/paravirt.h
+++ b/include/asm-i386/paravirt.h
@@ -16,11 +16,14 @@
 #ifndef __ASSEMBLY__
 #include <linux/types.h>
 #include <linux/cpumask.h>
-
+#include <asm/kmap_types.h>
+
+struct page;
 struct thread_struct;
 struct Xgt_desc_struct;
 struct tss_struct;
 struct mm_struct;
+
 struct paravirt_ops
 {
 	unsigned int kernel_rpl;
@@ -138,6 +141,8 @@ struct paravirt_ops
 	void (*pte_update_defer)(struct mm_struct *mm, unsigned long addr, pte_t *ptep);
 
  	pte_t (*ptep_get_and_clear)(pte_t *ptep);
+
+	void *(*kmap_atomic_pte)(struct page *page, enum km_type type);
 
 #ifdef CONFIG_X86_PAE
 	void (*set_pte_atomic)(pte_t *ptep, pte_t pteval);
@@ -667,6 +672,13 @@ static inline void flush_tlb_others(cpum
 	PVOP_VCALL4(alloc_pd_clone, pfn, clonepfn, start, count)
 #define paravirt_release_pd(pfn) PVOP_VCALL1(release_pd, pfn)
 
+static inline void *kmap_atomic_pte(struct page *page, enum km_type type)
+{
+	unsigned long ret;
+	ret = PVOP_CALL2(unsigned long, kmap_atomic_pte, page, type);
+	return (void *)ret;
+}
+
 static inline void pte_update(struct mm_struct *mm, unsigned long addr, pte_t *ptep)
 {
 	PVOP_VCALL3(pte_update, mm, addr, ptep);
===================================================================
--- a/include/asm-i386/pgtable.h
+++ b/include/asm-i386/pgtable.h
@@ -479,9 +479,9 @@ extern pte_t *lookup_address(unsigned lo
 
 #if defined(CONFIG_HIGHPTE)
 #define pte_offset_map(dir, address) \
-	((pte_t *)kmap_atomic(pmd_page(*(dir)),KM_PTE0) + pte_index(address))
+	((pte_t *)kmap_atomic_pte(pmd_page(*(dir)),KM_PTE0) + pte_index(address))
 #define pte_offset_map_nested(dir, address) \
-	((pte_t *)kmap_atomic(pmd_page(*(dir)),KM_PTE1) + pte_index(address))
+	((pte_t *)kmap_atomic_pte(pmd_page(*(dir)),KM_PTE1) + pte_index(address))
 #define pte_unmap(pte) kunmap_atomic(pte, KM_PTE0)
 #define pte_unmap_nested(pte) kunmap_atomic(pte, KM_PTE1)
 #else
===================================================================
--- a/include/linux/highmem.h
+++ b/include/linux/highmem.h
@@ -27,6 +27,8 @@ unsigned int nr_free_highpages(void);
 unsigned int nr_free_highpages(void);
 extern unsigned long totalhigh_pages;
 
+void kmap_flush_unused(void);
+
 #else /* CONFIG_HIGHMEM */
 
 static inline unsigned int nr_free_highpages(void) { return 0; }
@@ -44,9 +46,13 @@ static inline void *kmap(struct page *pa
 
 #define kmap_atomic(page, idx) \
 	({ pagefault_disable(); page_address(page); })
+#define _kmap_atomic(page, idx, prot)	kmap_atomic(page, idx)
+
 #define kunmap_atomic(addr, idx)	do { pagefault_enable(); } while (0)
 #define kmap_atomic_pfn(pfn, idx)	kmap_atomic(pfn_to_page(pfn), (idx))
 #define kmap_atomic_to_page(ptr)	virt_to_page(ptr)
+
+#define kmap_flush_unused()	do {} while(0)
 #endif
 
 #endif /* CONFIG_HIGHMEM */
===================================================================
--- a/mm/highmem.c
+++ b/mm/highmem.c
@@ -97,6 +97,15 @@ static void flush_all_zero_pkmaps(void)
 		set_page_address(page, NULL);
 	}
 	flush_tlb_kernel_range(PKMAP_ADDR(0), PKMAP_ADDR(LAST_PKMAP));
+}
+
+/* Flush all unused kmap mappings in order to remove stray
+   mappings. */
+void kmap_flush_unused(void)
+{
+	spin_lock(&kmap_lock);
+	flush_all_zero_pkmaps();
+	spin_unlock(&kmap_lock);
 }
 
 static inline unsigned long map_new_virtual(struct page *page)

  reply	other threads:[~2007-03-16 17:26 UTC|newest]

Thread overview: 201+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-03-01 23:24 [patch 00/26] Xen-paravirt_ops: Xen guest implementation for paravirt_ops interface Jeremy Fitzhardinge
2007-03-01 23:24 ` [patch 01/26] Xen-paravirt_ops: Fix typo in sync_constant_test_bit()s name Jeremy Fitzhardinge
2007-03-16  9:45   ` Ingo Molnar
2007-03-01 23:24 ` [patch 02/26] Xen-paravirt_ops: ignore vgacon if hardware not present Jeremy Fitzhardinge
2007-03-16  9:45   ` Ingo Molnar
2007-03-01 23:24 ` [patch 03/26] Xen-paravirt_ops: use paravirt_nop to consistently mark no-op operations Jeremy Fitzhardinge
2007-03-16  9:44   ` Ingo Molnar
2007-03-16 18:43     ` Jeremy Fitzhardinge
2007-03-16 19:49       ` Chris Wright
2007-03-16 20:00         ` Jeremy Fitzhardinge
2007-03-16 21:59           ` Chris Wright
2007-03-16 22:10             ` Jeremy Fitzhardinge
2007-03-16 22:18               ` Chris Wright
2007-03-01 23:24 ` [patch 04/26] Xen-paravirt_ops: Add pagetable accessors to pack and unpack pagetable entries Jeremy Fitzhardinge
2007-03-16  9:38   ` Ingo Molnar
2007-03-16 18:42     ` Jeremy Fitzhardinge
2007-03-01 23:24 ` [patch 05/26] Xen-paravirt_ops: paravirt_ops: hooks to set up initial pagetable Jeremy Fitzhardinge
2007-03-16  9:33   ` Ingo Molnar
2007-03-16 18:39     ` Jeremy Fitzhardinge
2007-03-16 19:35       ` Steven Rostedt
2007-03-17  9:47       ` Rusty Russell
2007-03-01 23:24 ` [patch 06/26] Xen-paravirt_ops: paravirt_ops: allocate a fixmap slot Jeremy Fitzhardinge
2007-03-16  9:31   ` Ingo Molnar
2007-03-01 23:24 ` [patch 07/26] Xen-paravirt_ops: Allow paravirt backend to choose kernel PMD sharing Jeremy Fitzhardinge
2007-03-16  9:31   ` Ingo Molnar
2007-03-01 23:24 ` [patch 08/26] Xen-paravirt_ops: add hooks to intercept mm creation and destruction Jeremy Fitzhardinge
2007-03-16  9:30   ` Ingo Molnar
2007-03-16 17:38     ` Jeremy Fitzhardinge
2007-03-01 23:24 ` [patch 09/26] Xen-paravirt_ops: remove HAVE_ARCH_MM_LIFETIME, define no-op architecture implementations Jeremy Fitzhardinge
2007-03-16  9:27   ` Ingo Molnar
2007-03-01 23:24 ` [patch 10/26] Xen-paravirt_ops: rename struct paravirt_patch to paravirt_patch_site for clarity Jeremy Fitzhardinge
2007-03-01 23:24 ` [patch 11/26] Xen-paravirt_ops: Use patch site IDs computed from offset in paravirt_ops structure Jeremy Fitzhardinge
2007-03-01 23:24 ` [patch 12/26] Xen-paravirt_ops: Fix patch site clobbers to include return register Jeremy Fitzhardinge
2007-03-02  0:45   ` Zachary Amsden
2007-03-02  0:49     ` Jeremy Fitzhardinge
2007-03-02  0:52       ` Zachary Amsden
2007-03-02  0:58         ` Jeremy Fitzhardinge
2007-03-02  1:18           ` Zachary Amsden
2007-03-16  9:26   ` Ingo Molnar
2007-03-16 17:37     ` Jeremy Fitzhardinge
2007-03-01 23:24 ` [patch 13/26] Xen-paravirt_ops: Consistently wrap paravirt ops callsites to make them patchable Jeremy Fitzhardinge
2007-03-16  9:24   ` Ingo Molnar
2007-03-16  9:33     ` David Miller
2007-03-16  9:57       ` Ingo Molnar
2007-03-16 19:16         ` Jeremy Fitzhardinge
2007-03-16 20:38       ` Jeremy Fitzhardinge
2007-03-17 10:33         ` Rusty Russell
2007-03-18  7:33           ` David Miller
2007-03-18  7:59             ` Jeremy Fitzhardinge
2007-03-18 12:08             ` Andi Kleen
2007-03-18 15:58               ` Jeremy Fitzhardinge
2007-03-18 17:04                 ` Andi Kleen
2007-03-18 17:29                   ` Jeremy Fitzhardinge
2007-03-18 19:30                     ` Andi Kleen
2007-03-18 23:46                       ` Jeremy Fitzhardinge
2007-03-19 10:57                         ` Andi Kleen
2007-03-19 17:58                           ` Jeremy Fitzhardinge
2007-03-19 19:08                           ` David Miller
2007-03-19 20:59                             ` Andi Kleen
2007-03-20  3:18                               ` Linus Torvalds
2007-03-20  3:47                                 ` David Miller
2007-03-20  4:19                                   ` Eric W. Biederman
2007-03-20 13:28                                     ` Andi Kleen
2007-03-20 16:25                                       ` Eric W. Biederman
2007-03-20 17:42                                         ` Andi Kleen
2007-03-20 16:52                                           ` Linus Torvalds
2007-03-20 18:03                                             ` Andi Kleen
2007-03-20 17:27                                               ` Linus Torvalds
2007-03-20 19:21                                                 ` Andi Kleen
2007-03-20 18:49                                                   ` Linus Torvalds
2007-03-20 20:23                                                     ` Andi Kleen
2007-03-20 21:39                                                       ` Alan Cox
2007-03-20 21:49                                                         ` [Xen-devel] " Andi Kleen
2007-03-20 23:51                                                           ` Linus Torvalds
2007-03-20 23:43                                                       ` Linus Torvalds
2007-03-21  6:08                                                       ` Andrew Morton
2007-03-20 16:12                                     ` Chuck Ebbert
2007-03-20  1:23                         ` Zachary Amsden
2007-03-20  1:45                           ` Jeremy Fitzhardinge
2007-03-19  2:47               ` Rusty Russell
2007-03-19 18:25                 ` Eric W. Biederman
2007-03-19 18:38                   ` Linus Torvalds
2007-03-19 18:44                     ` Linus Torvalds
2007-03-19 19:33                     ` Jeremy Fitzhardinge
2007-03-20  0:01                     ` Rusty Russell
2007-03-20  2:00                       ` Zachary Amsden
2007-03-20  4:20                         ` Rusty Russell
2007-03-20  5:54                         ` Jeremy Fitzhardinge
2007-03-20 11:33                           ` Andreas Kleen
2007-03-20 15:09                           ` Linus Torvalds
2007-03-20 15:58                             ` Eric W. Biederman
2007-03-20 16:06                               ` Linus Torvalds
2007-03-20 16:31                                 ` Jeremy Fitzhardinge
2007-03-20 22:09                                   ` Zachary Amsden
2007-03-21  0:24                                     ` Linus Torvalds
2007-03-21  2:53                                       ` Zachary Amsden
2007-03-21  2:15                                         ` Linus Torvalds
2007-03-21  3:43                                           ` Zachary Amsden
2007-03-20 22:43                                   ` Matt Mackall
2007-03-20 23:08                                     ` Zachary Amsden
2007-03-20 23:33                                       ` Jeremy Fitzhardinge
2007-03-21  1:14                                         ` Zachary Amsden
2007-03-20 23:41                                       ` Matt Mackall
2007-03-21  0:20                                     ` Jeremy Fitzhardinge
2007-03-20 19:28                                 ` Andi Kleen
2007-03-20 19:54                                   ` Zachary Amsden
2007-03-20 20:02                                     ` Andi Kleen
2007-03-20 16:26                               ` Jeremy Fitzhardinge
2007-03-20 22:41                               ` Rusty Russell
2007-03-20 17:00                             ` Ingo Molnar
2007-03-21  0:03                             ` Paul Mackerras
2007-04-12 23:16                               ` David Miller
2007-03-19 18:41                   ` Chris Wright
2007-03-19 19:10                   ` Jeremy Fitzhardinge
2007-03-19 19:46                     ` David Miller
2007-03-19 20:06                       ` Jeremy Fitzhardinge
2007-03-19 23:42                     ` Andi Kleen
2007-03-16 17:36     ` Jeremy Fitzhardinge
2007-03-16 23:29       ` Zachary Amsden
2007-03-17  0:40         ` Jeremy Fitzhardinge
2007-03-17  9:10           ` Zachary Amsden
2007-03-17  9:26     ` Rusty Russell
2007-03-01 23:24 ` [patch 14/26] Xen-paravirt_ops: add common patching machinery Jeremy Fitzhardinge
2007-03-16  9:20   ` Ingo Molnar
2007-03-17  9:15     ` Rusty Russell
2007-03-01 23:24 ` [patch 15/26] Xen-paravirt_ops: Add apply_to_page_range() which applies a function to a pte range Jeremy Fitzhardinge
2007-03-16  9:19   ` Ingo Molnar
2007-03-16 16:47     ` Chris Wright
2007-03-16 17:08     ` Jeremy Fitzhardinge
2007-03-01 23:24 ` [patch 16/26] Xen-paravirt_ops: Allocate and free vmalloc areas Jeremy Fitzhardinge
2007-03-16  9:16   ` Ingo Molnar
2007-03-16 17:05     ` Jeremy Fitzhardinge
2007-03-01 23:25 ` [patch 17/26] Xen-paravirt_ops: Add nosegneg capability to the vsyscall page notes Jeremy Fitzhardinge
2007-03-16  9:15   ` Ingo Molnar
2007-03-16 21:26     ` Roland McGrath
2007-03-16 21:56       ` Jeremy Fitzhardinge
2007-03-16 22:20         ` Roland McGrath
2007-03-01 23:25 ` [patch 18/26] Xen-paravirt_ops: Add XEN config options Jeremy Fitzhardinge
2007-03-16  9:14   ` Ingo Molnar
2007-03-16 17:04     ` Jeremy Fitzhardinge
2007-03-01 23:25 ` [patch 19/26] Xen-paravirt_ops: Add Xen interface header files Jeremy Fitzhardinge
2007-03-01 23:25 ` [patch 20/26] Xen-paravirt_ops: Core Xen implementation Jeremy Fitzhardinge
2007-03-16  9:14   ` Ingo Molnar
2007-03-16 12:00     ` Christoph Hellwig
2007-03-16 16:33     ` Chris Wright
2007-03-16 16:44       ` Jeremy Fitzhardinge
2007-03-16 16:57         ` Chris Wright
2007-03-16 17:12     ` Chris Wright
2007-03-19 18:05       ` Eric W. Biederman
2007-03-19 18:13         ` Jeremy Fitzhardinge
2007-03-19 18:15         ` Chris Wright
2007-03-17  9:13     ` Rusty Russell
2007-03-18  7:03       ` [Xen-devel] " Jeremy Fitzhardinge
2007-03-01 23:25 ` [patch 21/26] Xen-paravirt_ops: Use the hvc console infrastructure for Xen console Jeremy Fitzhardinge
2007-03-16  8:54   ` Ingo Molnar
2007-03-16  9:28     ` [Xen-devel] " Keir Fraser
     [not found]     ` <C22013C9.B9E6%keir@xensource.com>
2007-03-16  9:58       ` Ingo Molnar
2007-03-16 10:31         ` [Xen-devel] " Keir Fraser
2007-03-16 10:31         ` Keir Fraser
     [not found]         ` <C2202295.BA49%keir@xensource.com>
2007-03-16 11:41           ` Andrew Morton
2007-03-16 11:58             ` Keir Fraser
2007-03-16 11:58             ` Keir Fraser
2007-03-16 17:02     ` Jeremy Fitzhardinge
2007-03-01 23:25 ` [patch 22/26] Xen-paravirt_ops: Add early printk support via hvc console Jeremy Fitzhardinge
2007-03-16  8:52   ` Ingo Molnar
2007-03-01 23:25 ` [patch 23/26] Xen-paravirt_ops: Add Xen grant table support Jeremy Fitzhardinge
2007-03-16  8:51   ` Ingo Molnar
2007-03-16 17:00     ` Jeremy Fitzhardinge
2007-03-01 23:25 ` [patch 24/26] Xen-paravirt_ops: Add the Xenbus sysfs and virtual device hotplug driver Jeremy Fitzhardinge
2007-03-16  8:47   ` Ingo Molnar
2007-03-16 16:18     ` Chris Wright
2007-03-16 16:19       ` Ingo Molnar
2007-03-16 16:40         ` Chris Wright
2007-03-16 17:53           ` Greg KH
2007-03-16 16:57     ` Jeremy Fitzhardinge
2007-03-01 23:25 ` [patch 25/26] Xen-paravirt_ops: Add Xen virtual block device driver Jeremy Fitzhardinge
2007-03-01 23:25 ` [patch 26/26] Xen-paravirt_ops: Add the Xen virtual network " Jeremy Fitzhardinge
2007-03-02  0:42   ` Stephen Hemminger
2007-03-02  0:56     ` Jeremy Fitzhardinge
2007-03-02  1:30       ` [RFC] Arp announce (for Xen) Stephen Hemminger
2007-03-02  8:46         ` Keir Fraser
2007-03-02 12:54         ` Andi Kleen
2007-03-02 14:08           ` jamal
2007-03-02 18:08         ` Chris Wright
2007-03-06  4:35         ` David Miller
2007-03-06 18:51           ` [RFC] ARP notify option Stephen Hemminger
2007-03-06 19:04             ` Jeremy Fitzhardinge
2007-03-06 19:07             ` Chris Wright
2007-03-06 21:18             ` Chris Friesen
2007-03-06 22:52               ` Stephen Hemminger
2007-03-07  6:42               ` Pekka Savola
2007-03-07 17:00                 ` Stephen Hemminger
2007-03-02  1:21     ` [patch 26/26] Xen-paravirt_ops: Add the Xen virtual network device driver Christoph Hellwig
2007-03-02  1:26       ` Chris Wright
2007-03-16  8:42 ` [patch 00/26] Xen-paravirt_ops: Xen guest implementation for paravirt_ops interface Ingo Molnar
2007-03-16 16:55   ` Jeremy Fitzhardinge
2007-03-16  9:21 ` Ingo Molnar
2007-03-16 17:26   ` Jeremy Fitzhardinge [this message]
2007-03-16 18:59     ` Christoph Hellwig
2007-03-16 19:26       ` Jeremy Fitzhardinge
  -- strict thread matches above, loose matches on Subject: below --
2007-02-27  8:13 Jeremy Fitzhardinge

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=45FAD35F.8040404@goop.org \
    --to=jeremy@goop.org \
    --cc=ak@muc.de \
    --cc=akpm@linux-foundation.org \
    --cc=chrisw@sous-sol.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@elte.hu \
    --cc=rusty@rustcorp.com.au \
    --cc=virtualization@lists.osdl.org \
    --cc=xen-devel@lists.xensource.com \
    --cc=zach@vmware.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 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).