All of lore.kernel.org
 help / color / mirror / Atom feed
From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
To: <linux-kernel@vger.kernel.org>
Cc: <xen-devel@lists.xensource.com>,
	<Stefano.Stabellini@eu.citrix.com>, <konrad.wilk@oracle.com>,
	<Ian.Campbell@citrix.com>, <tim@xen.org>,
	<linux-arm-kernel@lists.infradead.org>,
	<linaro-dev@lists.linaro.org>, <catalin.marinas@arm.com>,
	<arnd@arndb.de>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: [PATCH 24/24] [HACK] xen/arm: implement xen_remap_domain_mfn_range
Date: Thu, 26 Jul 2012 16:34:06 +0100	[thread overview]
Message-ID: <1343316846-25860-24-git-send-email-stefano.stabellini@eu.citrix.com> (raw)
In-Reply-To: <alpine.DEB.2.02.1207251741470.26163@kaball.uk.xensource.com>

From: Ian Campbell <Ian.Campbell@citrix.com>

Do not apply!

This is a simple, hacky implementation of xen_remap_domain_mfn_range,
using XENMAPSPACE_gmfn_foreign.

It should use same interface as hybrid x86.

Signed-off-by: Ian Campbell <Ian.Campbell@citrix.com>
Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
---
 arch/arm/xen/enlighten.c       |   79 +++++++++++++++++++++++++++++++++++++++-
 drivers/xen/privcmd.c          |   16 +++++----
 drivers/xen/xenfs/super.c      |    7 ++++
 include/xen/interface/memory.h |   10 ++++--
 4 files changed, 101 insertions(+), 11 deletions(-)

diff --git a/arch/arm/xen/enlighten.c b/arch/arm/xen/enlighten.c
index 1476b0b..7092015 100644
--- a/arch/arm/xen/enlighten.c
+++ b/arch/arm/xen/enlighten.c
@@ -16,6 +16,10 @@
 #include <linux/of.h>
 #include <linux/of_irq.h>
 #include <linux/of_address.h>
+#include <linux/mm.h>
+#include <linux/ioport.h>
+
+#include <asm/pgtable.h>
 
 struct start_info _xen_start_info;
 struct start_info *xen_start_info = &_xen_start_info;
@@ -38,12 +42,85 @@ EXPORT_SYMBOL_GPL(xen_platform_pci_unplug);
 
 static __read_mostly int xen_events_irq = -1;
 
+#define FOREIGN_MAP_BUFFER 0x90000000UL
+#define FOREIGN_MAP_BUFFER_SIZE 0x10000000UL
+struct resource foreign_map_resource = {
+	.start = FOREIGN_MAP_BUFFER,
+	.end = FOREIGN_MAP_BUFFER + FOREIGN_MAP_BUFFER_SIZE,
+	.name = "Xen foreign map buffer",
+	.flags = 0,
+};
+
+static unsigned long foreign_map_buffer_pfn = FOREIGN_MAP_BUFFER >> PAGE_SHIFT;
+
+struct remap_data {
+	struct mm_struct *mm;
+	unsigned long mfn;
+	pgprot_t prot;
+};
+
+static int remap_area_mfn_pte_fn(pte_t *ptep, pgtable_t token,
+				 unsigned long addr, void *data)
+{
+	struct remap_data *rmd = data;
+	pte_t pte = pfn_pte(rmd->mfn, rmd->prot);
+
+	if (rmd->mfn < 0x90010)
+		pr_crit("%s: ptep %p addr %#lx => %#x / %#lx\n",
+		       __func__, ptep, addr, pte_val(pte), rmd->mfn);
+
+	set_pte_at(rmd->mm, addr, ptep, pte);
+
+	rmd->mfn++;
+	return 0;
+}
+
 int xen_remap_domain_mfn_range(struct vm_area_struct *vma,
 			       unsigned long addr,
 			       unsigned long mfn, int nr,
 			       pgprot_t prot, unsigned domid)
 {
-	return -ENOSYS;
+	int i, rc = 0;
+	struct remap_data rmd = {
+		.mm = vma->vm_mm,
+		.prot = prot,
+	};
+	struct xen_add_to_physmap xatp = {
+		.domid = DOMID_SELF,
+		.space = XENMAPSPACE_gmfn_foreign,
+
+		.foreign_domid = domid,
+	};
+
+	if (foreign_map_buffer_pfn + nr > ((FOREIGN_MAP_BUFFER +
+					FOREIGN_MAP_BUFFER_SIZE)>>PAGE_SHIFT)) {
+		pr_crit("RAM out of foreign map buffers...\n");
+		return -EBUSY;
+	}
+
+	for (i = 0; i < nr; i++) {
+		xatp.idx = mfn + i;
+		xatp.gpfn = foreign_map_buffer_pfn + i;
+		rc = HYPERVISOR_memory_op(XENMEM_add_to_physmap, &xatp);
+		if (rc != 0) {
+			pr_crit("foreign map add_to_physmap failed, err=%d\n", rc);
+			goto out;
+		}
+	}
+
+	rmd.mfn = foreign_map_buffer_pfn;
+	rc = apply_to_page_range(vma->vm_mm,
+				 addr,
+				 (unsigned long)nr << PAGE_SHIFT,
+				 remap_area_mfn_pte_fn, &rmd);
+	if (rc != 0) {
+		pr_crit("apply_to_page_range failed rc=%d\n", rc);
+		goto out;
+	}
+
+	foreign_map_buffer_pfn += nr;
+out:
+	return rc;
 }
 EXPORT_SYMBOL_GPL(xen_remap_domain_mfn_range);
 
diff --git a/drivers/xen/privcmd.c b/drivers/xen/privcmd.c
index 85226cb..3e15c22 100644
--- a/drivers/xen/privcmd.c
+++ b/drivers/xen/privcmd.c
@@ -20,6 +20,8 @@
 #include <linux/pagemap.h>
 #include <linux/seq_file.h>
 #include <linux/miscdevice.h>
+#include <linux/resource.h>
+#include <linux/ioport.h>
 
 #include <asm/pgalloc.h>
 #include <asm/pgtable.h>
@@ -196,9 +198,6 @@ static long privcmd_ioctl_mmap(void __user *udata)
 	LIST_HEAD(pagelist);
 	struct mmap_mfn_state state;
 
-	if (!xen_initial_domain())
-		return -EPERM;
-
 	if (copy_from_user(&mmapcmd, udata, sizeof(mmapcmd)))
 		return -EFAULT;
 
@@ -286,9 +285,6 @@ static long privcmd_ioctl_mmap_batch(void __user *udata)
 	LIST_HEAD(pagelist);
 	struct mmap_batch_state state;
 
-	if (!xen_initial_domain())
-		return -EPERM;
-
 	if (copy_from_user(&m, udata, sizeof(m)))
 		return -EFAULT;
 
@@ -365,6 +361,11 @@ static long privcmd_ioctl(struct file *file,
 	return ret;
 }
 
+static void privcmd_close(struct vm_area_struct *vma)
+{
+	/* TODO: unmap VMA */
+}
+
 static int privcmd_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
 {
 	printk(KERN_DEBUG "privcmd_fault: vma=%p %lx-%lx, pgoff=%lx, uv=%p\n",
@@ -375,7 +376,8 @@ static int privcmd_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
 }
 
 static struct vm_operations_struct privcmd_vm_ops = {
-	.fault = privcmd_fault
+	.fault = privcmd_fault,
+	.close = privcmd_close,
 };
 
 static int privcmd_mmap(struct file *file, struct vm_area_struct *vma)
diff --git a/drivers/xen/xenfs/super.c b/drivers/xen/xenfs/super.c
index a84b53c..edbe22f 100644
--- a/drivers/xen/xenfs/super.c
+++ b/drivers/xen/xenfs/super.c
@@ -12,6 +12,7 @@
 #include <linux/module.h>
 #include <linux/fs.h>
 #include <linux/magic.h>
+#include <linux/ioport.h>
 
 #include <xen/xen.h>
 
@@ -80,6 +81,8 @@ static const struct file_operations capabilities_file_ops = {
 	.llseek = default_llseek,
 };
 
+extern struct resource foreign_map_resource;
+
 static int xenfs_fill_super(struct super_block *sb, void *data, int silent)
 {
 	static struct tree_descr xenfs_files[] = {
@@ -100,6 +103,10 @@ static int xenfs_fill_super(struct super_block *sb, void *data, int silent)
 				  &xsd_kva_file_ops, NULL, S_IRUSR|S_IWUSR);
 		xenfs_create_file(sb, sb->s_root, "xsd_port",
 				  &xsd_port_file_ops, NULL, S_IRUSR|S_IWUSR);
+		rc = request_resource(&iomem_resource, &foreign_map_resource);
+		if (rc < 0)
+			pr_crit("failed to register foreign map resource\n");
+		rc = 0; /* ignore */
 	}
 
 	return rc;
diff --git a/include/xen/interface/memory.h b/include/xen/interface/memory.h
index d8e33a9..ec68945 100644
--- a/include/xen/interface/memory.h
+++ b/include/xen/interface/memory.h
@@ -167,9 +167,13 @@ struct xen_add_to_physmap {
     uint16_t    size;
 
     /* Source mapping space. */
-#define XENMAPSPACE_shared_info 0 /* shared info page */
-#define XENMAPSPACE_grant_table 1 /* grant table page */
-    unsigned int space;
+#define XENMAPSPACE_shared_info  0 /* shared info page */
+#define XENMAPSPACE_grant_table  1 /* grant table page */
+#define XENMAPSPACE_gmfn         2 /* GMFN */
+#define XENMAPSPACE_gmfn_range   3 /* GMFN range */
+#define XENMAPSPACE_gmfn_foreign 4 /* GMFN from another guest */
+    uint16_t space;
+    domid_t foreign_domid; /* IFF gmfn_foreign */
 
     /* Index into source mapping space. */
     unsigned long idx;
-- 
1.7.2.5


WARNING: multiple messages have this Message-ID (diff)
From: stefano.stabellini@eu.citrix.com (Stefano Stabellini)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 24/24] [HACK] xen/arm: implement xen_remap_domain_mfn_range
Date: Thu, 26 Jul 2012 16:34:06 +0100	[thread overview]
Message-ID: <1343316846-25860-24-git-send-email-stefano.stabellini@eu.citrix.com> (raw)
In-Reply-To: <alpine.DEB.2.02.1207251741470.26163@kaball.uk.xensource.com>

From: Ian Campbell <Ian.Campbell@citrix.com>

Do not apply!

This is a simple, hacky implementation of xen_remap_domain_mfn_range,
using XENMAPSPACE_gmfn_foreign.

It should use same interface as hybrid x86.

Signed-off-by: Ian Campbell <Ian.Campbell@citrix.com>
Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
---
 arch/arm/xen/enlighten.c       |   79 +++++++++++++++++++++++++++++++++++++++-
 drivers/xen/privcmd.c          |   16 +++++----
 drivers/xen/xenfs/super.c      |    7 ++++
 include/xen/interface/memory.h |   10 ++++--
 4 files changed, 101 insertions(+), 11 deletions(-)

diff --git a/arch/arm/xen/enlighten.c b/arch/arm/xen/enlighten.c
index 1476b0b..7092015 100644
--- a/arch/arm/xen/enlighten.c
+++ b/arch/arm/xen/enlighten.c
@@ -16,6 +16,10 @@
 #include <linux/of.h>
 #include <linux/of_irq.h>
 #include <linux/of_address.h>
+#include <linux/mm.h>
+#include <linux/ioport.h>
+
+#include <asm/pgtable.h>
 
 struct start_info _xen_start_info;
 struct start_info *xen_start_info = &_xen_start_info;
@@ -38,12 +42,85 @@ EXPORT_SYMBOL_GPL(xen_platform_pci_unplug);
 
 static __read_mostly int xen_events_irq = -1;
 
+#define FOREIGN_MAP_BUFFER 0x90000000UL
+#define FOREIGN_MAP_BUFFER_SIZE 0x10000000UL
+struct resource foreign_map_resource = {
+	.start = FOREIGN_MAP_BUFFER,
+	.end = FOREIGN_MAP_BUFFER + FOREIGN_MAP_BUFFER_SIZE,
+	.name = "Xen foreign map buffer",
+	.flags = 0,
+};
+
+static unsigned long foreign_map_buffer_pfn = FOREIGN_MAP_BUFFER >> PAGE_SHIFT;
+
+struct remap_data {
+	struct mm_struct *mm;
+	unsigned long mfn;
+	pgprot_t prot;
+};
+
+static int remap_area_mfn_pte_fn(pte_t *ptep, pgtable_t token,
+				 unsigned long addr, void *data)
+{
+	struct remap_data *rmd = data;
+	pte_t pte = pfn_pte(rmd->mfn, rmd->prot);
+
+	if (rmd->mfn < 0x90010)
+		pr_crit("%s: ptep %p addr %#lx => %#x / %#lx\n",
+		       __func__, ptep, addr, pte_val(pte), rmd->mfn);
+
+	set_pte_at(rmd->mm, addr, ptep, pte);
+
+	rmd->mfn++;
+	return 0;
+}
+
 int xen_remap_domain_mfn_range(struct vm_area_struct *vma,
 			       unsigned long addr,
 			       unsigned long mfn, int nr,
 			       pgprot_t prot, unsigned domid)
 {
-	return -ENOSYS;
+	int i, rc = 0;
+	struct remap_data rmd = {
+		.mm = vma->vm_mm,
+		.prot = prot,
+	};
+	struct xen_add_to_physmap xatp = {
+		.domid = DOMID_SELF,
+		.space = XENMAPSPACE_gmfn_foreign,
+
+		.foreign_domid = domid,
+	};
+
+	if (foreign_map_buffer_pfn + nr > ((FOREIGN_MAP_BUFFER +
+					FOREIGN_MAP_BUFFER_SIZE)>>PAGE_SHIFT)) {
+		pr_crit("RAM out of foreign map buffers...\n");
+		return -EBUSY;
+	}
+
+	for (i = 0; i < nr; i++) {
+		xatp.idx = mfn + i;
+		xatp.gpfn = foreign_map_buffer_pfn + i;
+		rc = HYPERVISOR_memory_op(XENMEM_add_to_physmap, &xatp);
+		if (rc != 0) {
+			pr_crit("foreign map add_to_physmap failed, err=%d\n", rc);
+			goto out;
+		}
+	}
+
+	rmd.mfn = foreign_map_buffer_pfn;
+	rc = apply_to_page_range(vma->vm_mm,
+				 addr,
+				 (unsigned long)nr << PAGE_SHIFT,
+				 remap_area_mfn_pte_fn, &rmd);
+	if (rc != 0) {
+		pr_crit("apply_to_page_range failed rc=%d\n", rc);
+		goto out;
+	}
+
+	foreign_map_buffer_pfn += nr;
+out:
+	return rc;
 }
 EXPORT_SYMBOL_GPL(xen_remap_domain_mfn_range);
 
diff --git a/drivers/xen/privcmd.c b/drivers/xen/privcmd.c
index 85226cb..3e15c22 100644
--- a/drivers/xen/privcmd.c
+++ b/drivers/xen/privcmd.c
@@ -20,6 +20,8 @@
 #include <linux/pagemap.h>
 #include <linux/seq_file.h>
 #include <linux/miscdevice.h>
+#include <linux/resource.h>
+#include <linux/ioport.h>
 
 #include <asm/pgalloc.h>
 #include <asm/pgtable.h>
@@ -196,9 +198,6 @@ static long privcmd_ioctl_mmap(void __user *udata)
 	LIST_HEAD(pagelist);
 	struct mmap_mfn_state state;
 
-	if (!xen_initial_domain())
-		return -EPERM;
-
 	if (copy_from_user(&mmapcmd, udata, sizeof(mmapcmd)))
 		return -EFAULT;
 
@@ -286,9 +285,6 @@ static long privcmd_ioctl_mmap_batch(void __user *udata)
 	LIST_HEAD(pagelist);
 	struct mmap_batch_state state;
 
-	if (!xen_initial_domain())
-		return -EPERM;
-
 	if (copy_from_user(&m, udata, sizeof(m)))
 		return -EFAULT;
 
@@ -365,6 +361,11 @@ static long privcmd_ioctl(struct file *file,
 	return ret;
 }
 
+static void privcmd_close(struct vm_area_struct *vma)
+{
+	/* TODO: unmap VMA */
+}
+
 static int privcmd_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
 {
 	printk(KERN_DEBUG "privcmd_fault: vma=%p %lx-%lx, pgoff=%lx, uv=%p\n",
@@ -375,7 +376,8 @@ static int privcmd_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
 }
 
 static struct vm_operations_struct privcmd_vm_ops = {
-	.fault = privcmd_fault
+	.fault = privcmd_fault,
+	.close = privcmd_close,
 };
 
 static int privcmd_mmap(struct file *file, struct vm_area_struct *vma)
diff --git a/drivers/xen/xenfs/super.c b/drivers/xen/xenfs/super.c
index a84b53c..edbe22f 100644
--- a/drivers/xen/xenfs/super.c
+++ b/drivers/xen/xenfs/super.c
@@ -12,6 +12,7 @@
 #include <linux/module.h>
 #include <linux/fs.h>
 #include <linux/magic.h>
+#include <linux/ioport.h>
 
 #include <xen/xen.h>
 
@@ -80,6 +81,8 @@ static const struct file_operations capabilities_file_ops = {
 	.llseek = default_llseek,
 };
 
+extern struct resource foreign_map_resource;
+
 static int xenfs_fill_super(struct super_block *sb, void *data, int silent)
 {
 	static struct tree_descr xenfs_files[] = {
@@ -100,6 +103,10 @@ static int xenfs_fill_super(struct super_block *sb, void *data, int silent)
 				  &xsd_kva_file_ops, NULL, S_IRUSR|S_IWUSR);
 		xenfs_create_file(sb, sb->s_root, "xsd_port",
 				  &xsd_port_file_ops, NULL, S_IRUSR|S_IWUSR);
+		rc = request_resource(&iomem_resource, &foreign_map_resource);
+		if (rc < 0)
+			pr_crit("failed to register foreign map resource\n");
+		rc = 0; /* ignore */
 	}
 
 	return rc;
diff --git a/include/xen/interface/memory.h b/include/xen/interface/memory.h
index d8e33a9..ec68945 100644
--- a/include/xen/interface/memory.h
+++ b/include/xen/interface/memory.h
@@ -167,9 +167,13 @@ struct xen_add_to_physmap {
     uint16_t    size;
 
     /* Source mapping space. */
-#define XENMAPSPACE_shared_info 0 /* shared info page */
-#define XENMAPSPACE_grant_table 1 /* grant table page */
-    unsigned int space;
+#define XENMAPSPACE_shared_info  0 /* shared info page */
+#define XENMAPSPACE_grant_table  1 /* grant table page */
+#define XENMAPSPACE_gmfn         2 /* GMFN */
+#define XENMAPSPACE_gmfn_range   3 /* GMFN range */
+#define XENMAPSPACE_gmfn_foreign 4 /* GMFN from another guest */
+    uint16_t space;
+    domid_t foreign_domid; /* IFF gmfn_foreign */
 
     /* Index into source mapping space. */
     unsigned long idx;
-- 
1.7.2.5

WARNING: multiple messages have this Message-ID (diff)
From: Stefano Stabellini <stefano.stabellini-mvvWK6WmYclDPfheJLI6IQ@public.gmane.org>
To: linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
Cc: xen-devel-GuqFBffKawuULHF6PoxzQEEOCMrvLtNR@public.gmane.org,
	linaro-dev-cunTk1MwBs8s++Sfvej+rw@public.gmane.org,
	Ian.Campbell-Sxgqhf6Nn4DQT0dZR+AlfA@public.gmane.org,
	arnd-r2nGTMty4D4@public.gmane.org,
	konrad.wilk-QHcLZuEGTsvQT0dZR+AlfA@public.gmane.org,
	catalin.marinas-5wv7dgnIgG8@public.gmane.org,
	tim-LM2mM/qkH7s@public.gmane.org,
	linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org
Subject: [PATCH 24/24] [HACK] xen/arm: implement xen_remap_domain_mfn_range
Date: Thu, 26 Jul 2012 16:34:06 +0100	[thread overview]
Message-ID: <1343316846-25860-24-git-send-email-stefano.stabellini@eu.citrix.com> (raw)
In-Reply-To: <alpine.DEB.2.02.1207251741470.26163-7Z66fg9igcxYtxbxJUhB2Dgeux46jI+i@public.gmane.org>

From: Ian Campbell <Ian.Campbell-Sxgqhf6Nn4DQT0dZR+AlfA@public.gmane.org>

Do not apply!

This is a simple, hacky implementation of xen_remap_domain_mfn_range,
using XENMAPSPACE_gmfn_foreign.

It should use same interface as hybrid x86.

Signed-off-by: Ian Campbell <Ian.Campbell-Sxgqhf6Nn4DQT0dZR+AlfA@public.gmane.org>
Signed-off-by: Stefano Stabellini <stefano.stabellini-mvvWK6WmYclDPfheJLI6IQ@public.gmane.org>
---
 arch/arm/xen/enlighten.c       |   79 +++++++++++++++++++++++++++++++++++++++-
 drivers/xen/privcmd.c          |   16 +++++----
 drivers/xen/xenfs/super.c      |    7 ++++
 include/xen/interface/memory.h |   10 ++++--
 4 files changed, 101 insertions(+), 11 deletions(-)

diff --git a/arch/arm/xen/enlighten.c b/arch/arm/xen/enlighten.c
index 1476b0b..7092015 100644
--- a/arch/arm/xen/enlighten.c
+++ b/arch/arm/xen/enlighten.c
@@ -16,6 +16,10 @@
 #include <linux/of.h>
 #include <linux/of_irq.h>
 #include <linux/of_address.h>
+#include <linux/mm.h>
+#include <linux/ioport.h>
+
+#include <asm/pgtable.h>
 
 struct start_info _xen_start_info;
 struct start_info *xen_start_info = &_xen_start_info;
@@ -38,12 +42,85 @@ EXPORT_SYMBOL_GPL(xen_platform_pci_unplug);
 
 static __read_mostly int xen_events_irq = -1;
 
+#define FOREIGN_MAP_BUFFER 0x90000000UL
+#define FOREIGN_MAP_BUFFER_SIZE 0x10000000UL
+struct resource foreign_map_resource = {
+	.start = FOREIGN_MAP_BUFFER,
+	.end = FOREIGN_MAP_BUFFER + FOREIGN_MAP_BUFFER_SIZE,
+	.name = "Xen foreign map buffer",
+	.flags = 0,
+};
+
+static unsigned long foreign_map_buffer_pfn = FOREIGN_MAP_BUFFER >> PAGE_SHIFT;
+
+struct remap_data {
+	struct mm_struct *mm;
+	unsigned long mfn;
+	pgprot_t prot;
+};
+
+static int remap_area_mfn_pte_fn(pte_t *ptep, pgtable_t token,
+				 unsigned long addr, void *data)
+{
+	struct remap_data *rmd = data;
+	pte_t pte = pfn_pte(rmd->mfn, rmd->prot);
+
+	if (rmd->mfn < 0x90010)
+		pr_crit("%s: ptep %p addr %#lx => %#x / %#lx\n",
+		       __func__, ptep, addr, pte_val(pte), rmd->mfn);
+
+	set_pte_at(rmd->mm, addr, ptep, pte);
+
+	rmd->mfn++;
+	return 0;
+}
+
 int xen_remap_domain_mfn_range(struct vm_area_struct *vma,
 			       unsigned long addr,
 			       unsigned long mfn, int nr,
 			       pgprot_t prot, unsigned domid)
 {
-	return -ENOSYS;
+	int i, rc = 0;
+	struct remap_data rmd = {
+		.mm = vma->vm_mm,
+		.prot = prot,
+	};
+	struct xen_add_to_physmap xatp = {
+		.domid = DOMID_SELF,
+		.space = XENMAPSPACE_gmfn_foreign,
+
+		.foreign_domid = domid,
+	};
+
+	if (foreign_map_buffer_pfn + nr > ((FOREIGN_MAP_BUFFER +
+					FOREIGN_MAP_BUFFER_SIZE)>>PAGE_SHIFT)) {
+		pr_crit("RAM out of foreign map buffers...\n");
+		return -EBUSY;
+	}
+
+	for (i = 0; i < nr; i++) {
+		xatp.idx = mfn + i;
+		xatp.gpfn = foreign_map_buffer_pfn + i;
+		rc = HYPERVISOR_memory_op(XENMEM_add_to_physmap, &xatp);
+		if (rc != 0) {
+			pr_crit("foreign map add_to_physmap failed, err=%d\n", rc);
+			goto out;
+		}
+	}
+
+	rmd.mfn = foreign_map_buffer_pfn;
+	rc = apply_to_page_range(vma->vm_mm,
+				 addr,
+				 (unsigned long)nr << PAGE_SHIFT,
+				 remap_area_mfn_pte_fn, &rmd);
+	if (rc != 0) {
+		pr_crit("apply_to_page_range failed rc=%d\n", rc);
+		goto out;
+	}
+
+	foreign_map_buffer_pfn += nr;
+out:
+	return rc;
 }
 EXPORT_SYMBOL_GPL(xen_remap_domain_mfn_range);
 
diff --git a/drivers/xen/privcmd.c b/drivers/xen/privcmd.c
index 85226cb..3e15c22 100644
--- a/drivers/xen/privcmd.c
+++ b/drivers/xen/privcmd.c
@@ -20,6 +20,8 @@
 #include <linux/pagemap.h>
 #include <linux/seq_file.h>
 #include <linux/miscdevice.h>
+#include <linux/resource.h>
+#include <linux/ioport.h>
 
 #include <asm/pgalloc.h>
 #include <asm/pgtable.h>
@@ -196,9 +198,6 @@ static long privcmd_ioctl_mmap(void __user *udata)
 	LIST_HEAD(pagelist);
 	struct mmap_mfn_state state;
 
-	if (!xen_initial_domain())
-		return -EPERM;
-
 	if (copy_from_user(&mmapcmd, udata, sizeof(mmapcmd)))
 		return -EFAULT;
 
@@ -286,9 +285,6 @@ static long privcmd_ioctl_mmap_batch(void __user *udata)
 	LIST_HEAD(pagelist);
 	struct mmap_batch_state state;
 
-	if (!xen_initial_domain())
-		return -EPERM;
-
 	if (copy_from_user(&m, udata, sizeof(m)))
 		return -EFAULT;
 
@@ -365,6 +361,11 @@ static long privcmd_ioctl(struct file *file,
 	return ret;
 }
 
+static void privcmd_close(struct vm_area_struct *vma)
+{
+	/* TODO: unmap VMA */
+}
+
 static int privcmd_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
 {
 	printk(KERN_DEBUG "privcmd_fault: vma=%p %lx-%lx, pgoff=%lx, uv=%p\n",
@@ -375,7 +376,8 @@ static int privcmd_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
 }
 
 static struct vm_operations_struct privcmd_vm_ops = {
-	.fault = privcmd_fault
+	.fault = privcmd_fault,
+	.close = privcmd_close,
 };
 
 static int privcmd_mmap(struct file *file, struct vm_area_struct *vma)
diff --git a/drivers/xen/xenfs/super.c b/drivers/xen/xenfs/super.c
index a84b53c..edbe22f 100644
--- a/drivers/xen/xenfs/super.c
+++ b/drivers/xen/xenfs/super.c
@@ -12,6 +12,7 @@
 #include <linux/module.h>
 #include <linux/fs.h>
 #include <linux/magic.h>
+#include <linux/ioport.h>
 
 #include <xen/xen.h>
 
@@ -80,6 +81,8 @@ static const struct file_operations capabilities_file_ops = {
 	.llseek = default_llseek,
 };
 
+extern struct resource foreign_map_resource;
+
 static int xenfs_fill_super(struct super_block *sb, void *data, int silent)
 {
 	static struct tree_descr xenfs_files[] = {
@@ -100,6 +103,10 @@ static int xenfs_fill_super(struct super_block *sb, void *data, int silent)
 				  &xsd_kva_file_ops, NULL, S_IRUSR|S_IWUSR);
 		xenfs_create_file(sb, sb->s_root, "xsd_port",
 				  &xsd_port_file_ops, NULL, S_IRUSR|S_IWUSR);
+		rc = request_resource(&iomem_resource, &foreign_map_resource);
+		if (rc < 0)
+			pr_crit("failed to register foreign map resource\n");
+		rc = 0; /* ignore */
 	}
 
 	return rc;
diff --git a/include/xen/interface/memory.h b/include/xen/interface/memory.h
index d8e33a9..ec68945 100644
--- a/include/xen/interface/memory.h
+++ b/include/xen/interface/memory.h
@@ -167,9 +167,13 @@ struct xen_add_to_physmap {
     uint16_t    size;
 
     /* Source mapping space. */
-#define XENMAPSPACE_shared_info 0 /* shared info page */
-#define XENMAPSPACE_grant_table 1 /* grant table page */
-    unsigned int space;
+#define XENMAPSPACE_shared_info  0 /* shared info page */
+#define XENMAPSPACE_grant_table  1 /* grant table page */
+#define XENMAPSPACE_gmfn         2 /* GMFN */
+#define XENMAPSPACE_gmfn_range   3 /* GMFN range */
+#define XENMAPSPACE_gmfn_foreign 4 /* GMFN from another guest */
+    uint16_t space;
+    domid_t foreign_domid; /* IFF gmfn_foreign */
 
     /* Index into source mapping space. */
     unsigned long idx;
-- 
1.7.2.5

  parent reply	other threads:[~2012-07-26 15:57 UTC|newest]

Thread overview: 283+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-07-26 15:33 [PATCH 00/24] Introduce Xen support on ARM Stefano Stabellini
2012-07-26 15:33 ` Stefano Stabellini
2012-07-26 15:33 ` Stefano Stabellini
2012-07-26 15:33 ` [PATCH 01/24] arm: initial Xen support Stefano Stabellini
2012-07-26 15:33   ` Stefano Stabellini
2012-07-26 15:33   ` Stefano Stabellini
2012-07-26 16:30   ` [Xen-devel] " Konrad Rzeszutek Wilk
2012-07-26 16:30     ` Konrad Rzeszutek Wilk
2012-07-27 11:56     ` Stefano Stabellini
2012-07-27 11:56       ` Stefano Stabellini
2012-07-27 11:56       ` Stefano Stabellini
2012-08-01 10:42       ` Konrad Rzeszutek Wilk
2012-08-01 10:42         ` Konrad Rzeszutek Wilk
2012-08-01 10:42         ` Konrad Rzeszutek Wilk
2012-08-06 10:55         ` Stefano Stabellini
2012-08-06 10:55           ` Stefano Stabellini
2012-08-06 10:55           ` Stefano Stabellini
2012-08-01 18:27   ` Rob Herring
2012-08-01 18:27     ` Rob Herring
2012-08-02  7:35     ` Ian Campbell
2012-08-02  7:35       ` Ian Campbell
2012-08-02  7:35       ` Ian Campbell
2012-08-02 14:13       ` [Xen-devel] " Konrad Rzeszutek Wilk
2012-08-02 14:13         ` Konrad Rzeszutek Wilk
2012-08-02 14:13         ` Konrad Rzeszutek Wilk
2012-08-06 10:46         ` Stefano Stabellini
2012-08-06 10:46           ` Stefano Stabellini
2012-08-06 10:46           ` Stefano Stabellini
2012-07-26 15:33 ` [PATCH 02/24] xen/arm: hypercalls Stefano Stabellini
2012-07-26 15:33   ` Stefano Stabellini
2012-07-26 15:33   ` Stefano Stabellini
2012-07-26 16:33   ` [Xen-devel] " Konrad Rzeszutek Wilk
2012-07-26 16:33     ` Konrad Rzeszutek Wilk
2012-07-27  9:17     ` Ian Campbell
2012-07-27  9:17       ` Ian Campbell
2012-07-27  9:17       ` Ian Campbell
2012-07-27 13:02       ` Stefano Stabellini
2012-07-27 13:02         ` Stefano Stabellini
2012-07-27 13:02         ` Stefano Stabellini
2012-07-27 13:18         ` Ian Campbell
2012-07-27 13:18           ` Ian Campbell
2012-07-27 13:18           ` Ian Campbell
2012-07-27 13:41           ` Stefano Stabellini
2012-07-27 13:41             ` Stefano Stabellini
2012-07-27 13:41             ` Stefano Stabellini
2012-07-27 14:21         ` Russell King - ARM Linux
2012-07-27 14:21           ` Russell King - ARM Linux
2012-07-27 14:21           ` Russell King - ARM Linux
2012-07-27 14:36           ` Stefano Stabellini
2012-07-27 14:36             ` Stefano Stabellini
2012-07-27 14:36             ` Stefano Stabellini
2012-07-27 14:39           ` Ian Campbell
2012-07-27 14:39             ` Ian Campbell
2012-07-27 14:39             ` Ian Campbell
2012-07-27 14:59             ` Russell King - ARM Linux
2012-07-27 14:59               ` Russell King - ARM Linux
2012-07-27 14:59               ` Russell King - ARM Linux
2012-07-26 16:56   ` David Vrabel
2012-07-26 16:56     ` David Vrabel
2012-07-26 17:19     ` Stefano Stabellini
2012-07-26 17:19       ` Stefano Stabellini
2012-07-26 17:19       ` Stefano Stabellini
2012-07-27  9:00     ` Ian Campbell
2012-07-27  9:00       ` Ian Campbell
2012-07-27  9:00       ` Ian Campbell
2012-07-26 19:19   ` Christopher Covington
2012-07-26 19:19     ` Christopher Covington
2012-07-27  9:19     ` Ian Campbell
2012-07-27  9:19       ` Ian Campbell
2012-07-27  9:19       ` Ian Campbell
2012-07-27 12:56       ` Christopher Covington
2012-07-27 12:56         ` Christopher Covington
2012-07-27 12:56         ` Christopher Covington
2012-07-27 13:57         ` Stefano Stabellini
2012-07-27 13:57           ` Stefano Stabellini
2012-07-27 13:57           ` Stefano Stabellini
2012-07-26 15:33 ` [PATCH 03/24] xen/arm: page.h definitions Stefano Stabellini
2012-07-26 15:33   ` Stefano Stabellini
2012-07-26 15:33   ` Stefano Stabellini
2012-07-26 16:36   ` [Xen-devel] " Konrad Rzeszutek Wilk
2012-07-26 16:36     ` Konrad Rzeszutek Wilk
2012-07-27 13:47     ` Stefano Stabellini
2012-07-27 13:47       ` Stefano Stabellini
2012-07-27 13:47       ` Stefano Stabellini
2012-07-26 15:33 ` [PATCH 04/24] xen/arm: sync_bitops Stefano Stabellini
2012-07-26 15:33   ` Stefano Stabellini
2012-07-26 15:33   ` Stefano Stabellini
2012-07-26 16:37   ` [Xen-devel] " Konrad Rzeszutek Wilk
2012-07-26 16:37     ` Konrad Rzeszutek Wilk
2012-07-27  9:28     ` Ian Campbell
2012-07-27  9:28       ` Ian Campbell
2012-07-27  9:28       ` Ian Campbell
2012-08-01 14:35       ` Konrad Rzeszutek Wilk
2012-08-01 14:35         ` Konrad Rzeszutek Wilk
2012-08-01 14:35         ` Konrad Rzeszutek Wilk
2012-08-01 16:07         ` Stefano Stabellini
2012-08-01 16:07           ` Stefano Stabellini
2012-08-01 16:07           ` Stefano Stabellini
2012-07-26 15:33 ` [PATCH 05/24] xen/arm: empty implementation of grant_table arch specific functions Stefano Stabellini
2012-07-26 15:33   ` Stefano Stabellini
2012-07-26 15:33   ` Stefano Stabellini
2012-08-01 14:16   ` Konrad Rzeszutek Wilk
2012-08-01 14:16     ` Konrad Rzeszutek Wilk
2012-08-01 15:46     ` Stefano Stabellini
2012-08-01 15:46       ` Stefano Stabellini
2012-08-01 15:46       ` Stefano Stabellini
2012-07-26 15:33 ` [PATCH 06/24] xen: missing includes Stefano Stabellini
2012-07-26 15:33   ` Stefano Stabellini
2012-07-26 15:33   ` Stefano Stabellini
2012-07-27  6:57   ` [Xen-devel] " Jan Beulich
2012-07-27  6:57     ` Jan Beulich
2012-07-27  6:57     ` Jan Beulich
2012-07-27 16:47     ` Stefano Stabellini
2012-07-27 16:47       ` Stefano Stabellini
2012-07-27 16:47       ` Stefano Stabellini
2012-07-26 15:33 ` [PATCH 07/24] xen/arm: Xen detection and shared_info page mapping Stefano Stabellini
2012-07-26 15:33   ` Stefano Stabellini
2012-07-26 15:33   ` Stefano Stabellini
2012-07-27  9:36   ` Ian Campbell
2012-07-27  9:36     ` Ian Campbell
2012-07-27  9:36     ` Ian Campbell
2012-07-27 14:48     ` Stefano Stabellini
2012-07-27 14:48       ` Stefano Stabellini
2012-07-27 14:48       ` Stefano Stabellini
2012-07-27 14:51       ` Ian Campbell
2012-07-27 14:51         ` Ian Campbell
2012-07-27 14:51         ` Ian Campbell
2012-08-01 14:19   ` Konrad Rzeszutek Wilk
2012-08-01 14:19     ` Konrad Rzeszutek Wilk
2012-08-01 15:45     ` Stefano Stabellini
2012-08-01 15:45       ` Stefano Stabellini
2012-08-01 15:45       ` Stefano Stabellini
2012-07-26 15:33 ` [PATCH 08/24] xen/arm: Introduce xen_pfn_t for pfn and mfn types Stefano Stabellini
2012-07-26 15:33   ` Stefano Stabellini
2012-07-26 15:33   ` Stefano Stabellini
2012-08-01 14:22   ` Konrad Rzeszutek Wilk
2012-08-01 14:22     ` Konrad Rzeszutek Wilk
2012-08-01 14:22     ` Konrad Rzeszutek Wilk
2012-08-01 15:50     ` Stefano Stabellini
2012-08-01 15:50       ` Stefano Stabellini
2012-08-01 15:50       ` Stefano Stabellini
2012-07-26 15:33 ` [PATCH 09/24] xen/arm: compile and run xenbus Stefano Stabellini
2012-07-26 15:33   ` Stefano Stabellini
2012-07-26 15:33   ` Stefano Stabellini
2012-08-01 14:28   ` Konrad Rzeszutek Wilk
2012-08-01 14:28     ` Konrad Rzeszutek Wilk
2012-08-01 14:28     ` Konrad Rzeszutek Wilk
2012-08-06 11:17     ` Stefano Stabellini
2012-08-06 11:17       ` Stefano Stabellini
2012-08-06 11:17       ` Stefano Stabellini
2012-07-26 15:33 ` [PATCH 10/24] xen: do not compile manage, balloon, pci, acpi and cpu_hotplug on ARM Stefano Stabellini
2012-07-26 15:33   ` Stefano Stabellini
2012-07-26 15:33   ` Stefano Stabellini
2012-07-27  7:01   ` [Xen-devel] " Jan Beulich
2012-07-27  7:01     ` Jan Beulich
2012-07-27  7:01     ` Jan Beulich
2012-07-27 16:51     ` Stefano Stabellini
2012-07-27 16:51       ` Stefano Stabellini
2012-07-27 16:51       ` Stefano Stabellini
2012-07-26 15:33 ` [PATCH 11/24] xen/arm: introduce CONFIG_XEN " Stefano Stabellini
2012-07-26 15:33   ` Stefano Stabellini
2012-07-26 15:33   ` Stefano Stabellini
2012-08-01 14:34   ` [Xen-devel] " Konrad Rzeszutek Wilk
2012-08-01 14:34     ` Konrad Rzeszutek Wilk
2012-07-26 15:33 ` [PATCH 12/24] xen/arm: Introduce xen_guest_init Stefano Stabellini
2012-07-26 15:33   ` Stefano Stabellini
2012-07-26 15:33   ` Stefano Stabellini
2012-07-27  9:42   ` Ian Campbell
2012-07-27  9:42     ` Ian Campbell
2012-07-27  9:42     ` Ian Campbell
2012-07-27 15:54     ` Stefano Stabellini
2012-07-27 15:54       ` Stefano Stabellini
2012-07-27 15:54       ` Stefano Stabellini
2012-07-27 16:11       ` Ian Campbell
2012-07-27 16:11         ` Ian Campbell
2012-07-27 16:11         ` Ian Campbell
2012-08-01 14:38   ` Konrad Rzeszutek Wilk
2012-08-01 14:38     ` Konrad Rzeszutek Wilk
2012-07-26 15:33 ` [PATCH 13/24] xen/arm: get privilege status Stefano Stabellini
2012-07-26 15:33   ` Stefano Stabellini
2012-07-26 15:33   ` Stefano Stabellini
2012-07-27  9:44   ` Ian Campbell
2012-07-27  9:44     ` Ian Campbell
2012-07-27  9:44     ` Ian Campbell
2012-07-27 14:25     ` Stefano Stabellini
2012-07-27 14:25       ` Stefano Stabellini
2012-07-27 14:25       ` Stefano Stabellini
2012-07-27 14:33       ` Ian Campbell
2012-07-27 14:33         ` Ian Campbell
2012-07-27 14:33         ` Ian Campbell
2012-08-01 14:39         ` Konrad Rzeszutek Wilk
2012-08-01 14:39           ` Konrad Rzeszutek Wilk
2012-08-01 14:39           ` Konrad Rzeszutek Wilk
2012-08-01 16:21           ` Stefano Stabellini
2012-08-01 16:21             ` Stefano Stabellini
2012-08-01 16:21             ` Stefano Stabellini
2012-07-26 15:33 ` [PATCH 14/24] xen/arm: initialize grant_table on ARM Stefano Stabellini
2012-07-26 15:33   ` Stefano Stabellini
2012-07-26 15:33   ` Stefano Stabellini
2012-08-01 14:40   ` Konrad Rzeszutek Wilk
2012-08-01 14:40     ` Konrad Rzeszutek Wilk
2012-08-01 17:08     ` Stefano Stabellini
2012-08-01 17:08       ` Stefano Stabellini
2012-08-01 17:08       ` Stefano Stabellini
2012-07-26 15:33 ` [PATCH 15/24] xen/arm: receive Xen events " Stefano Stabellini
2012-07-26 15:33   ` Stefano Stabellini
2012-07-26 15:33   ` Stefano Stabellini
2012-08-01 14:44   ` Konrad Rzeszutek Wilk
2012-08-01 14:44     ` Konrad Rzeszutek Wilk
2012-08-01 14:44     ` Konrad Rzeszutek Wilk
2012-08-06 10:31     ` Stefano Stabellini
2012-08-06 10:31       ` Stefano Stabellini
2012-08-06 10:31       ` Stefano Stabellini
2012-07-26 15:33 ` [PATCH 16/24] xen/arm: implement alloc/free_xenballooned_pages with alloc_pages/kfree Stefano Stabellini
2012-07-26 15:33   ` Stefano Stabellini
2012-07-26 15:33   ` Stefano Stabellini
2012-07-26 15:33 ` [PATCH 17/24] xen: allow privcmd for HVM guests Stefano Stabellini
2012-07-26 15:33   ` Stefano Stabellini
2012-07-26 15:33   ` Stefano Stabellini
2012-07-27  7:04   ` [Xen-devel] " Jan Beulich
2012-07-27  7:04     ` Jan Beulich
2012-07-27  7:04     ` Jan Beulich
2012-07-27 14:10     ` Stefano Stabellini
2012-07-27 14:10       ` Stefano Stabellini
2012-07-27 14:10       ` Stefano Stabellini
2012-08-01 14:47       ` Konrad Rzeszutek Wilk
2012-08-01 14:47         ` Konrad Rzeszutek Wilk
2012-08-01 14:47         ` Konrad Rzeszutek Wilk
2012-07-26 15:34 ` [PATCH 18/24] xen/arm: compile blkfront and blkback Stefano Stabellini
2012-07-26 15:34   ` Stefano Stabellini
2012-07-26 15:34   ` Stefano Stabellini
2012-07-27  9:48   ` Ian Campbell
2012-07-27  9:48     ` Ian Campbell
2012-07-27  9:48     ` Ian Campbell
2012-07-27 16:25     ` Stefano Stabellini
2012-07-27 16:25       ` Stefano Stabellini
2012-07-27 16:25       ` Stefano Stabellini
2012-08-01 14:48   ` Konrad Rzeszutek Wilk
2012-08-01 14:48     ` Konrad Rzeszutek Wilk
2012-08-01 14:48     ` Konrad Rzeszutek Wilk
2012-08-01 16:19     ` Stefano Stabellini
2012-08-01 16:19       ` Stefano Stabellini
2012-08-01 16:19       ` Stefano Stabellini
2012-07-26 15:34 ` [PATCH 19/24] xen/arm: compile netback Stefano Stabellini
2012-07-26 15:34   ` Stefano Stabellini
2012-07-26 15:34   ` Stefano Stabellini
2012-07-26 15:34 ` [PATCH 20/24] xen: update xen_add_to_physmap interface Stefano Stabellini
2012-07-26 15:34   ` Stefano Stabellini
2012-07-26 15:34   ` Stefano Stabellini
2012-08-01 14:52   ` Konrad Rzeszutek Wilk
2012-08-01 14:52     ` Konrad Rzeszutek Wilk
2012-08-01 16:18     ` Stefano Stabellini
2012-08-01 16:18       ` Stefano Stabellini
2012-08-01 16:18       ` Stefano Stabellini
2012-08-01 18:19     ` Mukesh Rathor
2012-08-01 18:19       ` Mukesh Rathor
2012-08-01 18:19       ` Mukesh Rathor
2012-07-26 15:34 ` [PATCH 21/24] arm/v2m: initialize arch_timers even if v2m_timer is not present Stefano Stabellini
2012-07-26 15:34   ` Stefano Stabellini
2012-07-26 15:34   ` Stefano Stabellini
2012-08-01 14:52   ` Konrad Rzeszutek Wilk
2012-08-01 14:52     ` Konrad Rzeszutek Wilk
2012-08-01 14:52     ` Konrad Rzeszutek Wilk
2012-08-01 16:06     ` Stefano Stabellini
2012-08-01 16:06       ` Stefano Stabellini
2012-08-01 16:06       ` Stefano Stabellini
2012-07-26 15:34 ` [PATCH 22/24] ARM: enable earlyprintk=xen Stefano Stabellini
2012-07-26 15:34   ` Stefano Stabellini
2012-07-26 15:34   ` Stefano Stabellini
2012-07-26 15:34 ` [PATCH 23/24] hvc_xen: allow dom0_write_console for HVM guests Stefano Stabellini
2012-07-26 15:34   ` Stefano Stabellini
2012-07-26 15:34   ` Stefano Stabellini
2012-08-01 14:54   ` Konrad Rzeszutek Wilk
2012-08-01 14:54     ` Konrad Rzeszutek Wilk
2012-08-01 16:04     ` Stefano Stabellini
2012-08-01 16:04       ` Stefano Stabellini
2012-08-01 16:04       ` Stefano Stabellini
2012-07-26 15:34 ` Stefano Stabellini [this message]
2012-07-26 15:34   ` [PATCH 24/24] [HACK] xen/arm: implement xen_remap_domain_mfn_range Stefano Stabellini
2012-07-26 15:34   ` Stefano Stabellini
2012-08-01 14:56   ` Konrad Rzeszutek Wilk
2012-08-01 14:56     ` Konrad Rzeszutek Wilk
2012-08-01 14:56     ` Konrad Rzeszutek Wilk

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=1343316846-25860-24-git-send-email-stefano.stabellini@eu.citrix.com \
    --to=stefano.stabellini@eu.citrix.com \
    --cc=Ian.Campbell@citrix.com \
    --cc=arnd@arndb.de \
    --cc=catalin.marinas@arm.com \
    --cc=konrad.wilk@oracle.com \
    --cc=linaro-dev@lists.linaro.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=tim@xen.org \
    --cc=xen-devel@lists.xensource.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.