All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Tian, Kevin" <kevin.tian@intel.com>
To: "Chen, Tiejun" <tiejun.chen@intel.com>,
	"jbeulich@suse.com" <jbeulich@suse.com>,
	"tim@xen.org" <tim@xen.org>,
	"andrew.cooper3@citrix.com" <andrew.cooper3@citrix.com>,
	"Zhang, Yang Z" <yang.z.zhang@intel.com>,
	"wei.liu2@citrix.com" <wei.liu2@citrix.com>,
	"ian.campbell@citrix.com" <ian.campbell@citrix.com>,
	"Ian.Jackson@eu.citrix.com" <Ian.Jackson@eu.citrix.com>,
	"stefano.stabellini@citrix.com" <stefano.stabellini@citrix.com>
Cc: "xen-devel@lists.xen.org" <xen-devel@lists.xen.org>
Subject: Re: [v3][PATCH 01/16] xen: introduce XENMEM_reserved_device_memory_map
Date: Thu, 11 Jun 2015 08:56:51 +0000	[thread overview]
Message-ID: <AADFC41AFE54684AB9EE6CBC0274A5D126289EFE@SHSMSX101.ccr.corp.intel.com> (raw)
In-Reply-To: <1433985325-16676-2-git-send-email-tiejun.chen@intel.com>

> From: Chen, Tiejun
> Sent: Thursday, June 11, 2015 9:15 AM
> 
> From: Jan Beulich <jbeulich@suse.com>
> 
> This is a prerequisite for punching holes into HVM and PVH guests' P2M
> to allow passing through devices that are associated with (on VT-d)
> RMRRs.
> 
> Signed-off-by: Jan Beulich <jbeulich@suse.com>
> Signed-off-by: Tiejun Chen <tiejun.chen@intel.com>

Acked-by: Kevin Tian <kevin.tian@intel.com>

> ---
>  xen/common/compat/memory.c           | 66
> ++++++++++++++++++++++++++++++++++++
>  xen/common/memory.c                  | 64
> ++++++++++++++++++++++++++++++++++
>  xen/drivers/passthrough/iommu.c      | 10 ++++++
>  xen/drivers/passthrough/vtd/dmar.c   | 32 +++++++++++++++++
>  xen/drivers/passthrough/vtd/extern.h |  1 +
>  xen/drivers/passthrough/vtd/iommu.c  |  1 +
>  xen/include/public/memory.h          | 32 ++++++++++++++++-
>  xen/include/xen/iommu.h              | 10 ++++++
>  xen/include/xen/pci.h                |  2 ++
>  xen/include/xlat.lst                 |  3 +-
>  10 files changed, 219 insertions(+), 2 deletions(-)
> 
> diff --git a/xen/common/compat/memory.c b/xen/common/compat/memory.c
> index b258138..b608496 100644
> --- a/xen/common/compat/memory.c
> +++ b/xen/common/compat/memory.c
> @@ -17,6 +17,45 @@ CHECK_TYPE(domid);
>  CHECK_mem_access_op;
>  CHECK_vmemrange;
> 
> +#ifdef HAS_PASSTHROUGH
> +struct get_reserved_device_memory {
> +    struct compat_reserved_device_memory_map map;
> +    unsigned int used_entries;
> +};
> +
> +static int get_reserved_device_memory(xen_pfn_t start, xen_ulong_t nr,
> +                                      u32 id, void *ctxt)
> +{
> +    struct get_reserved_device_memory *grdm = ctxt;
> +    u32 sbdf;
> +    struct compat_reserved_device_memory rdm = {
> +        .start_pfn = start, .nr_pages = nr
> +    };
> +
> +    sbdf = PCI_SBDF2(grdm->map.seg, grdm->map.bus, grdm->map.devfn);
> +    if ( (grdm->map.flag & PCI_DEV_RDM_ALL) || (sbdf == id) )
> +    {
> +        if ( grdm->used_entries < grdm->map.nr_entries )
> +        {
> +            if ( rdm.start_pfn != start || rdm.nr_pages != nr )
> +                return -ERANGE;
> +
> +            if ( __copy_to_compat_offset(grdm->map.buffer,
> +                                         grdm->used_entries,
> +                                         &rdm,
> +                                         1) )
> +            {
> +                return -EFAULT;
> +            }
> +        }
> +        ++grdm->used_entries;
> +        return 1;
> +    }
> +
> +    return 0;
> +}
> +#endif
> +
>  int compat_memory_op(unsigned int cmd, XEN_GUEST_HANDLE_PARAM(void) compat)
>  {
>      int split, op = cmd & MEMOP_CMD_MASK;
> @@ -303,6 +342,33 @@ int compat_memory_op(unsigned int cmd,
> XEN_GUEST_HANDLE_PARAM(void) compat)
>              break;
>          }
> 
> +#ifdef HAS_PASSTHROUGH
> +        case XENMEM_reserved_device_memory_map:
> +        {
> +            struct get_reserved_device_memory grdm;
> +
> +            if ( copy_from_guest(&grdm.map, compat, 1) ||
> +                 !compat_handle_okay(grdm.map.buffer, grdm.map.nr_entries) )
> +                return -EFAULT;
> +
> +            grdm.used_entries = 0;
> +            rc = iommu_get_reserved_device_memory(get_reserved_device_memory,
> +                                                  &grdm);
> +
> +            if ( !rc && grdm.map.nr_entries < grdm.used_entries )
> +                rc = -ENOBUFS;
> +
> +            grdm.map.nr_entries = grdm.used_entries;
> +            if ( grdm.map.nr_entries )
> +            {
> +                if ( __copy_to_guest(compat, &grdm.map, 1) )
> +                    rc = -EFAULT;
> +            }
> +
> +            return rc;
> +        }
> +#endif
> +
>          default:
>              return compat_arch_memory_op(cmd, compat);
>          }
> diff --git a/xen/common/memory.c b/xen/common/memory.c
> index 063a1c5..c789f72 100644
> --- a/xen/common/memory.c
> +++ b/xen/common/memory.c
> @@ -748,6 +748,43 @@ static int construct_memop_from_reservation(
>      return 0;
>  }
> 
> +#ifdef HAS_PASSTHROUGH
> +struct get_reserved_device_memory {
> +    struct xen_reserved_device_memory_map map;
> +    unsigned int used_entries;
> +};
> +
> +static int get_reserved_device_memory(xen_pfn_t start, xen_ulong_t nr,
> +                                      u32 id, void *ctxt)
> +{
> +    struct get_reserved_device_memory *grdm = ctxt;
> +    u32 sbdf;
> +
> +    sbdf = PCI_SBDF2(grdm->map.seg, grdm->map.bus, grdm->map.devfn);
> +    if ( (grdm->map.flag & PCI_DEV_RDM_ALL) || (sbdf == id) )
> +    {
> +        if ( grdm->used_entries < grdm->map.nr_entries )
> +        {
> +            struct xen_reserved_device_memory rdm = {
> +                .start_pfn = start, .nr_pages = nr
> +            };
> +
> +            if ( __copy_to_guest_offset(grdm->map.buffer,
> +                                        grdm->used_entries,
> +                                        &rdm,
> +                                        1) )
> +            {
> +                return -EFAULT;
> +            }
> +        }
> +        ++grdm->used_entries;
> +        return 1;
> +    }
> +
> +    return 0;
> +}
> +#endif
> +
>  long do_memory_op(unsigned long cmd, XEN_GUEST_HANDLE_PARAM(void) arg)
>  {
>      struct domain *d;
> @@ -1162,6 +1199,33 @@ long do_memory_op(unsigned long cmd,
> XEN_GUEST_HANDLE_PARAM(void) arg)
>          break;
>      }
> 
> +#ifdef HAS_PASSTHROUGH
> +    case XENMEM_reserved_device_memory_map:
> +    {
> +        struct get_reserved_device_memory grdm;
> +
> +        if ( copy_from_guest(&grdm.map, arg, 1) ||
> +             !guest_handle_okay(grdm.map.buffer, grdm.map.nr_entries) )
> +            return -EFAULT;
> +
> +        grdm.used_entries = 0;
> +        rc = iommu_get_reserved_device_memory(get_reserved_device_memory,
> +                                              &grdm);
> +
> +        if ( !rc && grdm.map.nr_entries < grdm.used_entries )
> +            rc = -ENOBUFS;
> +
> +        grdm.map.nr_entries = grdm.used_entries;
> +        if ( grdm.map.nr_entries )
> +        {
> +            if ( __copy_to_guest(arg, &grdm.map, 1) )
> +                rc = -EFAULT;
> +        }
> +
> +        break;
> +    }
> +#endif
> +
>      default:
>          rc = arch_memory_op(cmd, arg);
>          break;
> diff --git a/xen/drivers/passthrough/iommu.c b/xen/drivers/passthrough/iommu.c
> index 06cb38f..0b2ef52 100644
> --- a/xen/drivers/passthrough/iommu.c
> +++ b/xen/drivers/passthrough/iommu.c
> @@ -375,6 +375,16 @@ void iommu_crash_shutdown(void)
>      iommu_enabled = iommu_intremap = 0;
>  }
> 
> +int iommu_get_reserved_device_memory(iommu_grdm_t *func, void *ctxt)
> +{
> +    const struct iommu_ops *ops = iommu_get_ops();
> +
> +    if ( !iommu_enabled || !ops->get_reserved_device_memory )
> +        return 0;
> +
> +    return ops->get_reserved_device_memory(func, ctxt);
> +}
> +
>  bool_t iommu_has_feature(struct domain *d, enum iommu_feature feature)
>  {
>      const struct hvm_iommu *hd = domain_hvm_iommu(d);
> diff --git a/xen/drivers/passthrough/vtd/dmar.c b/xen/drivers/passthrough/vtd/dmar.c
> index 2b07be9..a730de5 100644
> --- a/xen/drivers/passthrough/vtd/dmar.c
> +++ b/xen/drivers/passthrough/vtd/dmar.c
> @@ -893,3 +893,35 @@ int platform_supports_x2apic(void)
>      unsigned int mask = ACPI_DMAR_INTR_REMAP | ACPI_DMAR_X2APIC_OPT_OUT;
>      return cpu_has_x2apic && ((dmar_flags & mask) == ACPI_DMAR_INTR_REMAP);
>  }
> +
> +int intel_iommu_get_reserved_device_memory(iommu_grdm_t *func, void *ctxt)
> +{
> +    struct acpi_rmrr_unit *rmrr, *rmrr_cur = NULL;
> +    int rc = 0;
> +    unsigned int i;
> +    u16 bdf;
> +
> +    for_each_rmrr_device ( rmrr, bdf, i )
> +    {
> +        if ( rmrr != rmrr_cur )
> +        {
> +            rc = func(PFN_DOWN(rmrr->base_address),
> +                      PFN_UP(rmrr->end_address) -
> +                        PFN_DOWN(rmrr->base_address),
> +                      PCI_SBDF(rmrr->segment, bdf),
> +                      ctxt);
> +
> +            if ( unlikely(rc < 0) )
> +                return rc;
> +
> +            if ( !rc )
> +                continue;
> +
> +            /* Just go next. */
> +            if ( rc == 1 )
> +                rmrr_cur = rmrr;
> +        }
> +    }
> +
> +    return 0;
> +}
> diff --git a/xen/drivers/passthrough/vtd/extern.h
> b/xen/drivers/passthrough/vtd/extern.h
> index 5524dba..f9ee9b0 100644
> --- a/xen/drivers/passthrough/vtd/extern.h
> +++ b/xen/drivers/passthrough/vtd/extern.h
> @@ -75,6 +75,7 @@ int domain_context_mapping_one(struct domain *domain, struct
> iommu *iommu,
>                                 u8 bus, u8 devfn, const struct pci_dev *);
>  int domain_context_unmap_one(struct domain *domain, struct iommu *iommu,
>                               u8 bus, u8 devfn);
> +int intel_iommu_get_reserved_device_memory(iommu_grdm_t *func, void *ctxt);
> 
>  unsigned int io_apic_read_remap_rte(unsigned int apic, unsigned int reg);
>  void io_apic_write_remap_rte(unsigned int apic,
> diff --git a/xen/drivers/passthrough/vtd/iommu.c
> b/xen/drivers/passthrough/vtd/iommu.c
> index 9053a1f..6a37624 100644
> --- a/xen/drivers/passthrough/vtd/iommu.c
> +++ b/xen/drivers/passthrough/vtd/iommu.c
> @@ -2491,6 +2491,7 @@ const struct iommu_ops intel_iommu_ops = {
>      .crash_shutdown = vtd_crash_shutdown,
>      .iotlb_flush = intel_iommu_iotlb_flush,
>      .iotlb_flush_all = intel_iommu_iotlb_flush_all,
> +    .get_reserved_device_memory = intel_iommu_get_reserved_device_memory,
>      .dump_p2m_table = vtd_dump_p2m_table,
>  };
> 
> diff --git a/xen/include/public/memory.h b/xen/include/public/memory.h
> index 832559a..7b25275 100644
> --- a/xen/include/public/memory.h
> +++ b/xen/include/public/memory.h
> @@ -573,7 +573,37 @@ struct xen_vnuma_topology_info {
>  typedef struct xen_vnuma_topology_info xen_vnuma_topology_info_t;
>  DEFINE_XEN_GUEST_HANDLE(xen_vnuma_topology_info_t);
> 
> -/* Next available subop number is 27 */
> +/*
> + * With some legacy devices, certain guest-physical addresses cannot safely
> + * be used for other purposes, e.g. to map guest RAM.  This hypercall
> + * enumerates those regions so the toolstack can avoid using them.
> + */
> +#define XENMEM_reserved_device_memory_map   27
> +struct xen_reserved_device_memory {
> +    xen_pfn_t start_pfn;
> +    xen_ulong_t nr_pages;
> +};
> +typedef struct xen_reserved_device_memory xen_reserved_device_memory_t;
> +DEFINE_XEN_GUEST_HANDLE(xen_reserved_device_memory_t);
> +
> +struct xen_reserved_device_memory_map {
> +    /* IN */
> +    /* Currently just one bit to indicate checkng all Reserved Device Memory. */
> +#define PCI_DEV_RDM_ALL   0x1
> +    uint32_t        flag;
> +    /* IN */
> +    uint16_t        seg;
> +    uint8_t         bus;
> +    uint8_t         devfn;
> +    /* IN/OUT */
> +    unsigned int    nr_entries;
> +    /* OUT */
> +    XEN_GUEST_HANDLE(xen_reserved_device_memory_t) buffer;
> +};
> +typedef struct xen_reserved_device_memory_map
> xen_reserved_device_memory_map_t;
> +DEFINE_XEN_GUEST_HANDLE(xen_reserved_device_memory_map_t);
> +
> +/* Next available subop number is 28 */
> 
>  #endif /* __XEN_PUBLIC_MEMORY_H__ */
> 
> diff --git a/xen/include/xen/iommu.h b/xen/include/xen/iommu.h
> index b30bf41..e2f584d 100644
> --- a/xen/include/xen/iommu.h
> +++ b/xen/include/xen/iommu.h
> @@ -126,6 +126,14 @@ int iommu_do_dt_domctl(struct xen_domctl *, struct domain *,
> 
>  struct page_info;
> 
> +/*
> + * Any non-zero value returned from callbacks of this type will cause the
> + * function the callback was handed to terminate its iteration. Assigning
> + * meaning of these non-zero values is left to the top level caller /
> + * callback pair.
> + */
> +typedef int iommu_grdm_t(xen_pfn_t start, xen_ulong_t nr, u32 id, void *ctxt);
> +
>  struct iommu_ops {
>      int (*init)(struct domain *d);
>      void (*hwdom_init)(struct domain *d);
> @@ -157,12 +165,14 @@ struct iommu_ops {
>      void (*crash_shutdown)(void);
>      void (*iotlb_flush)(struct domain *d, unsigned long gfn, unsigned int page_count);
>      void (*iotlb_flush_all)(struct domain *d);
> +    int (*get_reserved_device_memory)(iommu_grdm_t *, void *);
>      void (*dump_p2m_table)(struct domain *d);
>  };
> 
>  void iommu_suspend(void);
>  void iommu_resume(void);
>  void iommu_crash_shutdown(void);
> +int iommu_get_reserved_device_memory(iommu_grdm_t *, void *);
> 
>  void iommu_share_p2m_table(struct domain *d);
> 
> diff --git a/xen/include/xen/pci.h b/xen/include/xen/pci.h
> index 3908146..d176e8b 100644
> --- a/xen/include/xen/pci.h
> +++ b/xen/include/xen/pci.h
> @@ -33,6 +33,8 @@
>  #define PCI_DEVFN2(bdf) ((bdf) & 0xff)
>  #define PCI_BDF(b,d,f)  ((((b) & 0xff) << 8) | PCI_DEVFN(d,f))
>  #define PCI_BDF2(b,df)  ((((b) & 0xff) << 8) | ((df) & 0xff))
> +#define PCI_SBDF(s,bdf) (((s & 0xffff) << 16) | (bdf & 0xffff))
> +#define PCI_SBDF2(s,b,df) (((s & 0xffff) << 16) | PCI_BDF2(b,df))
> 
>  struct pci_dev_info {
>      bool_t is_extfn;
> diff --git a/xen/include/xlat.lst b/xen/include/xlat.lst
> index 9c9fd9a..dd23559 100644
> --- a/xen/include/xlat.lst
> +++ b/xen/include/xlat.lst
> @@ -61,9 +61,10 @@
>  !	memory_exchange			memory.h
>  !	memory_map			memory.h
>  !	memory_reservation		memory.h
> -?	mem_access_op		memory.h
> +?	mem_access_op			memory.h
>  !	pod_target			memory.h
>  !	remove_from_physmap		memory.h
> +!	reserved_device_memory_map	memory.h
>  ?	vmemrange			memory.h
>  !	vnuma_topology_info		memory.h
>  ?	physdev_eoi			physdev.h
> --
> 1.9.1

  reply	other threads:[~2015-06-11  8:56 UTC|newest]

Thread overview: 114+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-06-11  1:15 [v3][PATCH 00/16] Fix RMRR Tiejun Chen
2015-06-11  1:15 ` [v3][PATCH 01/16] xen: introduce XENMEM_reserved_device_memory_map Tiejun Chen
2015-06-11  8:56   ` Tian, Kevin [this message]
2015-06-11  1:15 ` [v3][PATCH 02/16] xen/x86/p2m: introduce set_identity_p2m_entry Tiejun Chen
2015-06-11  7:33   ` Jan Beulich
2015-06-11  8:23     ` Chen, Tiejun
2015-06-11  9:23       ` Jan Beulich
2015-06-11  9:25         ` Chen, Tiejun
2015-06-11  9:00   ` Tian, Kevin
2015-06-11  9:18     ` Chen, Tiejun
2015-06-11  1:15 ` [v3][PATCH 03/16] xen/vtd: create RMRR mapping Tiejun Chen
2015-06-11  9:14   ` Tian, Kevin
2015-06-11  9:31     ` Chen, Tiejun
2015-06-11 14:07       ` Tim Deegan
2015-06-12  2:43         ` Chen, Tiejun
2015-06-12  5:58           ` Chen, Tiejun
2015-06-12  5:59             ` Tian, Kevin
2015-06-12  6:13               ` Chen, Tiejun
2015-06-18 10:07                 ` Tim Deegan
2015-06-19  0:37                   ` Chen, Tiejun
2015-06-17 10:03   ` Jan Beulich
2015-06-18  6:23     ` Chen, Tiejun
2015-06-11  1:15 ` [v3][PATCH 04/16] xen/passthrough: extend hypercall to support rdm reservation policy Tiejun Chen
2015-06-11  9:28   ` Tian, Kevin
2015-06-12  6:31     ` Chen, Tiejun
2015-06-12  8:45       ` Jan Beulich
2015-06-12  9:20         ` Chen, Tiejun
2015-06-12  9:26           ` Jan Beulich
2015-06-15  7:39           ` Chen, Tiejun
2015-06-16  2:30       ` Tian, Kevin
2015-06-17 10:11   ` Jan Beulich
2015-06-18  7:14     ` Chen, Tiejun
2015-06-18  7:53       ` Jan Beulich
2015-06-18  8:48         ` Chen, Tiejun
2015-06-18  9:13           ` Jan Beulich
2015-06-18  9:31             ` Chen, Tiejun
2015-06-11  1:15 ` [v3][PATCH 05/16] xen: enable XENMEM_memory_map in hvm Tiejun Chen
2015-06-11  9:29   ` Tian, Kevin
2015-06-17 10:14   ` Jan Beulich
2015-06-18  8:53     ` Chen, Tiejun
2015-06-11  1:15 ` [v3][PATCH 06/16] hvmloader: get guest memory map into memory_map[] Tiejun Chen
2015-06-11  9:38   ` Tian, Kevin
2015-06-12  7:33     ` Chen, Tiejun
2015-06-17 10:22   ` Jan Beulich
2015-06-18  9:13     ` Chen, Tiejun
2015-06-11  1:15 ` [v3][PATCH 07/16] hvmloader/pci: skip reserved ranges Tiejun Chen
2015-06-11  9:51   ` Tian, Kevin
2015-06-12  7:53     ` Chen, Tiejun
2015-06-16  5:47       ` Tian, Kevin
2015-06-16  9:29         ` Chen, Tiejun
2015-06-16  9:40           ` Jan Beulich
2015-06-17  7:10             ` Chen, Tiejun
2015-06-17  7:19               ` Jan Beulich
2015-06-17  7:54                 ` Chen, Tiejun
2015-06-17  8:05                   ` Jan Beulich
2015-06-17  8:26                     ` Chen, Tiejun
2015-06-17  8:47                       ` Chen, Tiejun
2015-06-17  9:02                       ` Jan Beulich
2015-06-17  9:18                         ` Chen, Tiejun
2015-06-17  9:24                           ` Jan Beulich
2015-06-18  6:17                             ` Chen, Tiejun
2015-06-18  6:29                               ` Jan Beulich
2015-06-18  7:01                                 ` Chen, Tiejun
2015-06-18  8:05                                   ` Jan Beulich
2015-06-19  2:02                                     ` Chen, Tiejun
2015-06-23  9:46                                       ` Chen, Tiejun
2015-06-11  1:15 ` [v3][PATCH 08/16] hvmloader/e820: construct guest e820 table Tiejun Chen
2015-06-11  9:59   ` Tian, Kevin
2015-06-12  8:19     ` Chen, Tiejun
2015-06-16  5:54       ` Tian, Kevin
2015-06-11  1:15 ` [v3][PATCH 09/16] tools/libxc: Expose new hypercall xc_reserved_device_memory_map Tiejun Chen
2015-06-11 10:00   ` Tian, Kevin
2015-06-11  1:15 ` [v3][PATCH 10/16] tools: extend xc_assign_device() to support rdm reservation policy Tiejun Chen
2015-06-11 10:02   ` Tian, Kevin
2015-06-12  8:25     ` Chen, Tiejun
2015-06-16  2:28       ` Tian, Kevin
2015-06-12 15:43   ` Wei Liu
2015-06-15  1:12     ` Chen, Tiejun
2015-06-15 14:58       ` Wei Liu
2015-06-16  2:31         ` Chen, Tiejun
2015-06-11  1:15 ` [v3][PATCH 11/16] tools: introduce some new parameters to set rdm policy Tiejun Chen
2015-06-12 16:02   ` Wei Liu
2015-06-15  1:19     ` Chen, Tiejun
2015-06-11  1:15 ` [v3][PATCH 12/16] tools/libxl: passes rdm reservation policy Tiejun Chen
2015-06-12 16:17   ` Wei Liu
2015-06-15  1:26     ` Chen, Tiejun
2015-06-15 15:00       ` Wei Liu
2015-06-11  1:15 ` [v3][PATCH 13/16] tools/libxl: detect and avoid conflicts with RDM Tiejun Chen
2015-06-11 10:19   ` Tian, Kevin
2015-06-12  8:30     ` Chen, Tiejun
2015-06-12 16:39   ` Wei Liu
2015-06-15  1:50     ` Chen, Tiejun
2015-06-15 15:01       ` Wei Liu
2015-06-16  1:44         ` Chen, Tiejun
2015-06-11  1:15 ` [v3][PATCH 14/16] tools/libxl: extend XENMEM_set_memory_map Tiejun Chen
2015-06-12 16:43   ` Wei Liu
2015-06-15  2:15     ` Chen, Tiejun
2015-06-11  1:15 ` [v3][PATCH 15/16] xen/vtd: enable USB device assignment Tiejun Chen
2015-06-11 10:22   ` Tian, Kevin
2015-06-12  8:59     ` Chen, Tiejun
2015-06-16  5:58       ` Tian, Kevin
2015-06-16  6:09         ` Chen, Tiejun
2015-06-11  1:15 ` [v3][PATCH 16/16] xen/vtd: prevent from assign the device with shared rmrr Tiejun Chen
2015-06-11 10:25   ` Tian, Kevin
2015-06-12  8:44     ` Chen, Tiejun
2015-06-17 10:28   ` Jan Beulich
2015-06-18  9:23     ` Chen, Tiejun
2015-06-11  7:27 ` [v3][PATCH 00/16] Fix RMRR Jan Beulich
2015-06-11  8:42   ` Tian, Kevin
2015-06-11  9:06     ` Chen, Tiejun
2015-06-11 12:52 ` Tim Deegan
2015-06-12  2:10   ` Chen, Tiejun
2015-06-12  8:04     ` Jan Beulich
2015-06-12  8:20       ` Chen, Tiejun

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=AADFC41AFE54684AB9EE6CBC0274A5D126289EFE@SHSMSX101.ccr.corp.intel.com \
    --to=kevin.tian@intel.com \
    --cc=Ian.Jackson@eu.citrix.com \
    --cc=andrew.cooper3@citrix.com \
    --cc=ian.campbell@citrix.com \
    --cc=jbeulich@suse.com \
    --cc=stefano.stabellini@citrix.com \
    --cc=tiejun.chen@intel.com \
    --cc=tim@xen.org \
    --cc=wei.liu2@citrix.com \
    --cc=xen-devel@lists.xen.org \
    --cc=yang.z.zhang@intel.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.