* [PCI passthrough NIC problem]
@ 2011-01-12 7:17 박은병
2011-01-12 8:07 ` 박은병
0 siblings, 1 reply; 3+ messages in thread
From: 박은병 @ 2011-01-12 7:17 UTC (permalink / raw)
To: xen-devel
[-- Attachment #1.1: Type: text/plain, Size: 1085 bytes --]
I have some problem about setting the PCI passthrough NIC with Broadcom
NetXtreme II BCM5716 Ethernet controller
I strictly followed xen wiki
http://wiki.xensource.com/xenwiki/XenPCIpassthrough
My configuration is pvops 2.6.32.26 dom0, pvops 2.6.32.27 domU kernel, xen
4.0.1 official release, Intel core i7, 64bit
no hvm, no IOMMU/VT-d, just pv guest.
I could success PCI passthrough by using domU with 2GB~3GB memory.
(Strangely, I could not see the assignable pci lists when *xm
pci-list-assignable-devices command*,
But it seems to work well even when the passthroughed domU is used as IDD)
However, When I allocated to above 4GB memory to domU,
domU device driver complain with below messages, and it does not work well
=======
Broadcom NetXtreme II Gigabit Ethernet Driver bnx2 v2.0.2 (Aug 21, 2009)
bnx2 0000:00:00.1: device not available because of BAR 0
[0xdc000000-0xddffffff] collisions
bnx2 0000:00:00.1: Cannot enable PCI device, aborting.
bnx2: probe of 0000:00:00.1 failed with error -22
=======
Is there anyone who suffer from this??
Thanks.
--
Eunbyung Park
[-- Attachment #1.2: Type: text/html, Size: 2103 bytes --]
[-- Attachment #2: Type: text/plain, Size: 138 bytes --]
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PCI passthrough NIC problem]
2011-01-12 7:17 [PCI passthrough NIC problem] 박은병
@ 2011-01-12 8:07 ` 박은병
2011-01-12 14:38 ` Konrad Rzeszutek Wilk
0 siblings, 1 reply; 3+ messages in thread
From: 박은병 @ 2011-01-12 8:07 UTC (permalink / raw)
To: xen-devel; +Cc: konrad.wilk
[-- Attachment #1.1: Type: text/plain, Size: 1508 bytes --]
This is a soliloquy..:)
I found 3GB memory restriction for pv domU with PCI threads.
and some bug reports
http://www.gossamer-threads.com/lists/xen/devel/187533
I'm sorry for asking withoug pre-survey.
this problem was already resolved ?? :)
2011/1/12 박은병 <peb1611@gmail.com>
> I have some problem about setting the PCI passthrough NIC with Broadcom
> NetXtreme II BCM5716 Ethernet controller
>
> I strictly followed xen wiki
> http://wiki.xensource.com/xenwiki/XenPCIpassthrough
>
> My configuration is pvops 2.6.32.26 dom0, pvops 2.6.32.27 domU kernel, xen
> 4.0.1 official release, Intel core i7, 64bit
>
> no hvm, no IOMMU/VT-d, just pv guest.
>
> I could success PCI passthrough by using domU with 2GB~3GB memory.
> (Strangely, I could not see the assignable pci lists when *xm
> pci-list-assignable-devices command*,
> But it seems to work well even when the passthroughed domU is used as IDD)
>
> However, When I allocated to above 4GB memory to domU,
>
> domU device driver complain with below messages, and it does not work well
>
> =======
> Broadcom NetXtreme II Gigabit Ethernet Driver bnx2 v2.0.2 (Aug 21, 2009)
> bnx2 0000:00:00.1: device not available because of BAR 0
> [0xdc000000-0xddffffff] collisions
> bnx2 0000:00:00.1: Cannot enable PCI device, aborting.
> bnx2: probe of 0000:00:00.1 failed with error -22
> =======
>
> Is there anyone who suffer from this??
>
> Thanks.
> --
> Eunbyung Park
>
--
Eunbyung Park
[-- Attachment #1.2: Type: text/html, Size: 4024 bytes --]
[-- Attachment #2: Type: text/plain, Size: 138 bytes --]
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PCI passthrough NIC problem]
2011-01-12 8:07 ` 박은병
@ 2011-01-12 14:38 ` Konrad Rzeszutek Wilk
0 siblings, 0 replies; 3+ messages in thread
From: Konrad Rzeszutek Wilk @ 2011-01-12 14:38 UTC (permalink / raw)
To: 박은병; +Cc: xen-devel
[-- Attachment #1: Type: text/plain, Size: 808 bytes --]
On Wed, Jan 12, 2011 at 05:07:41PM +0900, 박은병 wrote:
> This is a soliloquy..:)
>
> I found 3GB memory restriction for pv domU with PCI threads.
> and some bug reports
>
> http://www.gossamer-threads.com/lists/xen/devel/187533
>
>
> I'm sorry for asking withoug pre-survey.
>
> this problem was already resolved ?? :)
There is a patch for the 2.6.37 tree (and for the xl and xm tools)
that can fix this, but I am in process of reworking it.
If you really want it, get the patches from
git://git.kernel.org/pub/scm/linux/kernel/git/konrad/xen.git devel/e820-hole
for the 2.6.37 Linux kernel.
And for the tool stack - see attached patch.
You need to define in your .xm file this attribute:
pci_hole=0xc0000
(or 1 to automatically try to guess - which might fail).
[-- Attachment #2: e820-xl-xm-9-draft3.patch --]
[-- Type: text/x-diff, Size: 20906 bytes --]
diff -r 388c44a63613 tools/libxc/xc_dom.h
--- a/tools/libxc/xc_dom.h Wed Nov 10 14:56:06 2010 +0000
+++ b/tools/libxc/xc_dom.h Tue Nov 16 14:48:46 2010 -0500
@@ -91,6 +91,8 @@
/* physical memory */
xen_pfn_t total_pages;
+ /* start of the pci_hole. goes up to 4gb */
+ xen_pfn_t pci_hole;
struct xc_dom_phys *phys_pages;
int realmodearea_log;
diff -r 388c44a63613 tools/libxc/xc_dom_core.c
--- a/tools/libxc/xc_dom_core.c Wed Nov 10 14:56:06 2010 +0000
+++ b/tools/libxc/xc_dom_core.c Tue Nov 16 14:48:46 2010 -0500
@@ -714,18 +714,22 @@
{
uint32_t *p2m_32;
uint64_t *p2m_64;
- xen_pfn_t i;
+ xen_pfn_t i, tot_pages;
if ( !dom->p2m_guest )
return 0;
+ tot_pages = dom->total_pages;
+ if (dom->pci_hole)
+ tot_pages += (0x100000 - dom->pci_hole);
+
switch ( dom->arch_hooks->sizeof_pfn )
{
case 4:
DOMPRINTF("%s: dst 32bit, pages 0x%" PRIpfn "",
- __FUNCTION__, dom->total_pages);
+ __FUNCTION__, tot_pages);
p2m_32 = dom->p2m_guest;
- for ( i = 0; i < dom->total_pages; i++ )
+ for ( i = 0; i < tot_pages; i++ )
if ( dom->p2m_host[i] != INVALID_P2M_ENTRY )
p2m_32[i] = dom->p2m_host[i];
else
@@ -733,9 +737,9 @@
break;
case 8:
DOMPRINTF("%s: dst 64bit, pages 0x%" PRIpfn "",
- __FUNCTION__, dom->total_pages);
+ __FUNCTION__, tot_pages);
p2m_64 = dom->p2m_guest;
- for ( i = 0; i < dom->total_pages; i++ )
+ for ( i = 0; i < tot_pages; i++ )
if ( dom->p2m_host[i] != INVALID_P2M_ENTRY )
p2m_64[i] = dom->p2m_host[i];
else
diff -r 388c44a63613 tools/libxc/xc_dom_x86.c
--- a/tools/libxc/xc_dom_x86.c Wed Nov 10 14:56:06 2010 +0000
+++ b/tools/libxc/xc_dom_x86.c Tue Nov 16 14:48:46 2010 -0500
@@ -406,6 +406,8 @@
{
size_t p2m_size = dom->total_pages * dom->arch_hooks->sizeof_pfn;
+ if (dom->pci_hole && (dom->total_pages > dom->pci_hole))
+ p2m_size += (0x100000 - dom->pci_hole) * dom->arch_hooks->sizeof_pfn;
/* allocate phys2mach table */
if ( xc_dom_alloc_segment(dom, &dom->p2m_seg, "phys2mach", 0, p2m_size) )
return -1;
@@ -712,6 +714,7 @@
{
int rc;
xen_pfn_t pfn, allocsz, i, j, mfn;
+ size_t p2m_size;
rc = x86_compat(dom->xch, dom->guest_domid, dom->guest_type);
if ( rc )
@@ -723,8 +726,13 @@
if ( rc )
return rc;
}
+ p2m_size = dom->total_pages;
- dom->p2m_host = xc_dom_malloc(dom, sizeof(xen_pfn_t) * dom->total_pages);
+ if (dom->pci_hole && (dom->total_pages > dom->pci_hole))
+ p2m_size += (0x100000 - dom->pci_hole);
+
+ DOMPRINTF("Allocating 0x%" PRIpfn " bytes for P2M.", (xen_pfn_t)(p2m_size * sizeof(xen_pfn_t)));
+ dom->p2m_host = xc_dom_malloc(dom, sizeof(xen_pfn_t) * p2m_size);
if ( dom->superpages )
{
int count = dom->total_pages >> SUPERPAGE_PFN_SHIFT;
@@ -750,21 +758,66 @@
}
else
{
- /* setup initial p2m */
- for ( pfn = 0; pfn < dom->total_pages; pfn++ )
- dom->p2m_host[pfn] = pfn;
-
- /* allocate guest memory */
- for ( i = rc = allocsz = 0;
- (i < dom->total_pages) && !rc;
- i += allocsz )
+ /* for PCI mapping, stick INVALID_MFN in the PCI_HOLE */
+ if ( dom->pci_hole && (dom->total_pages > dom->pci_hole) )
{
- allocsz = dom->total_pages - i;
- if ( allocsz > 1024*1024 )
- allocsz = 1024*1024;
- rc = xc_domain_populate_physmap_exact(
- dom->xch, dom->guest_domid, allocsz,
- 0, 0, &dom->p2m_host[i]);
+ /* setup initial p2m in three passes. */
+ for (pfn = 0; pfn < dom->pci_hole; pfn++)
+ dom->p2m_host[pfn] = pfn;
+
+ xc_dom_printf (dom->xch, "%s: 0x0->0x%" PRIpfn " has PFNs.", __FUNCTION__, pfn);
+ xc_dom_printf (dom->xch, "%s: 0x%" PRIpfn " -> 0x10000 has INVALID_MFN",
+ __FUNCTION__, pfn);
+ for (; pfn < 0x100000; pfn++)
+ dom->p2m_host[pfn] = INVALID_MFN;
+
+ for (; pfn < 0x100000 + dom->total_pages - dom->pci_hole; pfn++)
+ dom->p2m_host[pfn] = pfn;
+ xc_dom_printf (dom->xch, "%s: 0x100000 -> 0x%" PRIpfn " has PFNs.", __FUNCTION__,
+ pfn);
+
+ /* allocate guest memory in two passes. */
+ for (i = rc = allocsz = 0; (i < dom->pci_hole) && !rc; i += allocsz)
+ {
+ allocsz = dom->pci_hole - i;
+ xc_dom_printf (dom->xch, "%s: Populating M2P 0x%" PRIpfn "->0x%" PRIpfn,
+ __FUNCTION__, i, i + allocsz);
+ rc = xc_domain_populate_physmap_exact (dom->xch, dom->guest_domid,
+ allocsz, 0, 0,
+ &dom->p2m_host[i]);
+ }
+ for (i = 0x100000, allocsz = rc = 0;
+ (i < (0x100000 + dom->total_pages - dom->pci_hole))
+ && !rc; i += allocsz)
+ {
+ allocsz = (dom->total_pages - dom->pci_hole) - (i - 0x100000);
+ if (allocsz > 1024 * 1024)
+ allocsz = 1024 * 1024;
+ xc_dom_printf (dom->xch, "%s: Populating M2P 0x%" PRIpfn "->0x%" PRIpfn,
+ __FUNCTION__, i, i + allocsz);
+ rc = xc_domain_populate_physmap_exact (dom->xch, dom->guest_domid,
+ allocsz, 0, 0,
+ &dom->p2m_host[i]);
+ }
+ xc_dom_printf (dom->xch, "%s: Done with PCI populate physmap",
+ __FUNCTION__);
+ } else {
+ /* setup initial p2m */
+ for ( pfn = 0; pfn < dom->total_pages; pfn++ )
+ dom->p2m_host[pfn] = pfn;
+
+ /* allocate guest memory */
+ for ( i = rc = allocsz = 0;
+ (i < dom->total_pages) && !rc;
+ i += allocsz )
+ {
+ allocsz = dom->total_pages - i;
+ if ( allocsz > 1024*1024 )
+ allocsz = 1024*1024;
+ rc = xc_domain_populate_physmap_exact(
+ dom->xch, dom->guest_domid, allocsz,
+ 0, 0, &dom->p2m_host[i]);
+ }
}
}
diff -r 388c44a63613 tools/libxc/xc_domain.c
--- a/tools/libxc/xc_domain.c Wed Nov 10 14:56:06 2010 +0000
+++ b/tools/libxc/xc_domain.c Tue Nov 16 14:48:46 2010 -0500
@@ -481,16 +481,25 @@
#include "xc_e820.h"
int xc_domain_set_memmap_limit(xc_interface *xch,
uint32_t domid,
- unsigned long map_limitkb)
+ unsigned long map_limitkb,
+ xen_pfn_t pci_hole_start)
{
int rc;
+ uint64_t delta_kb;
+ size_t e820_sz;
struct xen_foreign_memory_map fmap = {
.domid = domid,
.map = { .nr_entries = 1 }
};
DECLARE_HYPERCALL_BUFFER(struct e820entry, e820);
- e820 = xc_hypercall_buffer_alloc(xch, e820, sizeof(*e820));
+ delta_kb = map_limitkb - (uint64_t)(pci_hole_start << 2);
+ if (pci_hole_start && (delta_kb > 0))
+ e820_sz = sizeof(*e820);
+ else
+ e820_sz = sizeof(*e820)*2;
+
+ e820 = xc_hypercall_buffer_alloc(xch, e820, e820_sz);
if ( e820 == NULL )
{
@@ -502,6 +511,16 @@
e820->size = (uint64_t)map_limitkb << 10;
e820->type = E820_RAM;
+ if (pci_hole_start && (delta_kb > 0))
+ {
+ fmap.map.nr_entries ++;
+ e820[0].size = (uint64_t)pci_hole_start << 12;
+
+ e820[1].type = E820_RAM;
+ e820[1].addr = (uint64_t)0x100000 << 12; /* val in pfn... */
+ e820[1].size = (uint64_t)delta_kb << 10; /* .. while here in in kB. */
+ }
+
set_xen_guest_handle(fmap.map.buffer, e820);
rc = do_memory_op(xch, XENMEM_set_memory_map, &fmap, sizeof(fmap));
@@ -513,7 +532,8 @@
#else
int xc_domain_set_memmap_limit(xc_interface *xch,
uint32_t domid,
- unsigned long map_limitkb)
+ unsigned long map_limitkb,
+ xen_pfn_t pci_hole_start)
{
PERROR("Function not implemented");
errno = ENOSYS;
diff -r 388c44a63613 tools/libxc/xenctrl.h
--- a/tools/libxc/xenctrl.h Wed Nov 10 14:56:06 2010 +0000
+++ b/tools/libxc/xenctrl.h Tue Nov 16 14:48:46 2010 -0500
@@ -913,7 +913,8 @@
int xc_domain_set_memmap_limit(xc_interface *xch,
uint32_t domid,
- unsigned long map_limitkb);
+ unsigned long map_limitkb,
+ xen_pfn_t pci_hole_start);
int xc_domain_set_time_offset(xc_interface *xch,
uint32_t domid,
diff -r 388c44a63613 tools/libxl/libxl.h
--- a/tools/libxl/libxl.h Wed Nov 10 14:56:06 2010 +0000
+++ b/tools/libxl/libxl.h Tue Nov 16 14:48:46 2010 -0500
@@ -392,6 +392,7 @@
libxl_device_disk *disk, libxl_diskinfo *diskinfo);
int libxl_cdrom_insert(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *disk);
+int libxl_find_pci_hole(uint32_t *start_pfn);
/*
* Make a disk available in this domain. Returns path to a device.
*/
diff -r 388c44a63613 tools/libxl/libxl.idl
--- a/tools/libxl/libxl.idl Wed Nov 10 14:56:06 2010 +0000
+++ b/tools/libxl/libxl.idl Tue Nov 16 14:48:46 2010 -0500
@@ -110,6 +110,7 @@
])),
("pv", "!%s", Struct(None,
[("slack_memkb", uint32),
+ ("pci_hole_start", uint32),
("bootloader", string),
("bootloader_args", string),
("cmdline", string),
diff -r 388c44a63613 tools/libxl/libxl_dom.c
--- a/tools/libxl/libxl_dom.c Wed Nov 10 14:56:06 2010 +0000
+++ b/tools/libxl/libxl_dom.c Tue Nov 16 14:48:46 2010 -0500
@@ -71,7 +71,8 @@
xc_domain_setmaxmem(ctx->xch, domid, info->target_memkb + LIBXL_MAXMEM_CONSTANT);
xc_domain_set_memmap_limit(ctx->xch, domid,
(info->hvm) ? info->max_memkb :
- (info->max_memkb + info->u.pv.slack_memkb));
+ (info->max_memkb + info->u.pv.slack_memkb),
+ (info->hvm) ? 0 : info->u.pv.pci_hole_start);
xc_domain_set_tsc_info(ctx->xch, domid, info->tsc_mode, 0, 0, 0);
if ( info->disable_migrate )
xc_domain_disable_migrate(ctx->xch, domid);
@@ -181,6 +182,8 @@
}
}
}
+ if ( info->u.pv.pci_hole_start)
+ dom->pci_hole = info->u.pv.pci_hole_start;
dom->flags = flags;
dom->console_evtchn = state->console_port;
diff -r 388c44a63613 tools/libxl/libxl_pci.c
--- a/tools/libxl/libxl_pci.c Wed Nov 10 14:56:06 2010 +0000
+++ b/tools/libxl/libxl_pci.c Tue Nov 16 14:48:46 2010 -0500
@@ -1066,3 +1066,51 @@
free(pcidevs);
return 0;
}
+
+#define MAX_LINE 300
+int libxl_find_pci_hole(uint32_t *start_pfn)
+{
+ FILE *fp;
+ char *s;
+ char buf[MAX_LINE];
+ int ret = -ENODEV;
+ long int pci_hole_phys;
+
+ *start_pfn = 0;
+ fp = fopen("/proc/iomem", "r");
+ if (!fp)
+ return ret;
+
+ while (1) {
+ s = fgets(buf, MAX_LINE, fp);
+ if (!s)
+ break;
+ if (strlen(buf) < 1)
+ continue;
+ if (buf[strlen(buf)-1] == '\n')
+ buf[strlen(buf)-1] = '\0';
+ s = strchr(buf,'P');
+ if (!s)
+ continue;
+ if (strncmp(s, "PCI", 3) == 0) {
+ if (buf[0] == ' ')
+ continue;
+ s = strchr(buf,'-');
+ if (!s)
+ break;
+ s[0]='\0';
+ pci_hole_phys = strtol(buf, NULL, 16);
+ if (!pci_hole_phys)
+ break;
+ /* We don't want to the holes below 16MB. */
+ if (pci_hole_phys <= 0x1000)
+ continue;
+ *start_pfn = pci_hole_phys >> 12;
+ fprintf(stderr,"The value is 0x%d\n", *start_pfn);
+ ret = 0;
+ break;
+ }
+ }
+ fclose(fp);
+ return ret;
+}
diff -r 388c44a63613 tools/libxl/xl_cmdimpl.c
--- a/tools/libxl/xl_cmdimpl.c Wed Nov 10 14:56:06 2010 +0000
+++ b/tools/libxl/xl_cmdimpl.c Tue Nov 16 14:48:46 2010 -0500
@@ -1078,6 +1078,14 @@
if (!xlu_cfg_get_long (config, "pci_power_mgmt", &l))
pci_power_mgmt = l;
+ if (!xlu_cfg_get_long (config, "pci_hole", &l)) {
+ if (l == 1) {
+ uint32_t pfn_start = 0;
+ if (!libxl_find_pci_hole(&pfn_start))
+ b_info->u.pv.pci_hole_start = pfn_start;
+ } else
+ b_info->u.pv.pci_hole_start = l;
+ }
if (!xlu_cfg_get_list (config, "pci", &pcis, 0, 0)) {
int i;
d_config->num_pcidevs = 0;
diff -r 388c44a63613 tools/python/xen/lowlevel/xc/xc.c
--- a/tools/python/xen/lowlevel/xc/xc.c Wed Nov 10 14:56:06 2010 +0000
+++ b/tools/python/xen/lowlevel/xc/xc.c Tue Nov 16 14:48:46 2010 -0500
@@ -458,6 +458,7 @@
unsigned int mem_mb;
unsigned long store_mfn = 0;
unsigned long console_mfn = 0;
+ unsigned long pci_hole_start = 0;
PyObject* elfnote_dict;
PyObject* elfnote = NULL;
PyObject* ret;
@@ -467,14 +468,16 @@
"console_evtchn", "image",
/* optional */
"ramdisk", "cmdline", "flags",
- "features", "vhpt", "superpages", NULL };
-
- if ( !PyArg_ParseTupleAndKeywords(args, kwds, "iiiis|ssisii", kwd_list,
+ "features", "vhpt", "superpages",
+ "pci_hole", NULL };
+
+ if ( !PyArg_ParseTupleAndKeywords(args, kwds, "iiiis|ssisiii", kwd_list,
&domid, &store_evtchn, &mem_mb,
&console_evtchn, &image,
/* optional */
&ramdisk, &cmdline, &flags,
- &features, &vhpt, &superpages) )
+ &features, &vhpt, &superpages,
+ &pci_hole_start) )
return NULL;
xc_dom_loginit(self->xc_handle);
@@ -486,6 +489,8 @@
dom->superpages = superpages;
+ dom->pci_hole = pci_hole_start;
+
if ( xc_dom_linux_build(self->xc_handle, dom, domid, mem_mb, image,
ramdisk, flags, store_evtchn, &store_mfn,
console_evtchn, &console_mfn) != 0 ) {
@@ -1659,11 +1664,13 @@
{
uint32_t dom;
unsigned int maplimit_kb;
-
- if ( !PyArg_ParseTuple(args, "ii", &dom, &maplimit_kb) )
+ unsigned long pci_hole_start = 0;
+
+ if ( !PyArg_ParseTuple(args, "ii|i", &dom, &maplimit_kb, &pci_hole_start) )
return NULL;
- if ( xc_domain_set_memmap_limit(self->xc_handle, dom, maplimit_kb) != 0 )
+ if ( xc_domain_set_memmap_limit(self->xc_handle, dom, maplimit_kb,
+ pci_hole_start) != 0 )
return pyxc_error_to_exception(self->xc_handle);
Py_INCREF(zero);
@@ -2661,6 +2668,7 @@
"Set a domain's physical memory mappping limit\n"
" dom [int]: Identifier of domain.\n"
" map_limitkb [int]: .\n"
+ " pci_hole_start [int]: PFN for start of PCI hole (optional).\n"
"Returns: [int] 0 on success; -1 on error.\n" },
#ifdef __ia64__
diff -r 388c44a63613 tools/python/xen/xend/XendConfig.py
--- a/tools/python/xen/xend/XendConfig.py Wed Nov 10 14:56:06 2010 +0000
+++ b/tools/python/xen/xend/XendConfig.py Tue Nov 16 14:48:46 2010 -0500
@@ -241,6 +241,7 @@
'suppress_spurious_page_faults': bool0,
's3_integrity' : int,
'superpages' : int,
+ 'pci_hole' : int,
'memory_sharing': int,
'pool_name' : str,
'Description': str,
@@ -422,6 +423,7 @@
'target': 0,
'pool_name' : 'Pool-0',
'superpages': 0,
+ 'pci_hole': 0,
'description': '',
}
@@ -2135,6 +2137,9 @@
image.append(['args', self['PV_args']])
if self.has_key('superpages'):
image.append(['superpages', self['superpages']])
+ if self.has_key('pci_hole'):
+ image.append(['pci_hole', self['pci_hole']])
+
for key in XENAPI_PLATFORM_CFG_TYPES.keys():
if key in self['platform']:
@@ -2179,6 +2184,10 @@
val = sxp.child_value(image_sxp, 'superpages')
if val is not None:
self['superpages'] = val
+
+ val = sxp.child_value(image_sxp, 'pci_hole')
+ if val is not None:
+ self['pci_hole'] = val
val = sxp.child_value(image_sxp, 'memory_sharing')
if val is not None:
diff -r 388c44a63613 tools/python/xen/xend/image.py
--- a/tools/python/xen/xend/image.py Wed Nov 10 14:56:06 2010 +0000
+++ b/tools/python/xen/xend/image.py Tue Nov 16 14:48:46 2010 -0500
@@ -84,6 +84,7 @@
ostype = None
superpages = 0
+ pci_hole = 0
memory_sharing = 0
def __init__(self, vm, vmConfig):
@@ -711,6 +712,7 @@
self.vramsize = int(vmConfig['platform'].get('videoram',4)) * 1024
self.is_stubdom = (self.kernel.find('stubdom') >= 0)
self.superpages = int(vmConfig['superpages'])
+ self.pci_hole = int(vmConfig['pci_hole'])
def buildDomain(self):
store_evtchn = self.vm.getStorePort()
@@ -729,6 +731,7 @@
log.debug("features = %s", self.vm.getFeatures())
log.debug("flags = %d", self.flags)
log.debug("superpages = %d", self.superpages)
+ log.debug("pci_hole = %d", self.pci_hole)
if arch.type == "ia64":
log.debug("vhpt = %d", self.vhpt)
@@ -742,7 +745,8 @@
features = self.vm.getFeatures(),
flags = self.flags,
vhpt = self.vhpt,
- superpages = self.superpages)
+ superpages = self.superpages,
+ pci_hole = self.pci_hole)
def getBitSize(self):
return xc.getBitSize(image = self.kernel,
@@ -774,7 +778,6 @@
args = args + ([ "-M", "xenpv"])
return args
-
class HVMImageHandler(ImageHandler):
ostype = "hvm"
@@ -1065,7 +1068,7 @@
# set physical mapping limit
# add an 8MB slack to balance backend allocations.
mem_kb = self.getRequiredMaximumReservation() + (8 * 1024)
- xc.domain_set_memmap_limit(self.vm.getDomid(), mem_kb)
+ xc.domain_set_memmap_limit(self.vm.getDomid(), mem_kb, self.pci_hole)
rc = LinuxImageHandler.buildDomain(self)
self.setCpuid()
return rc
diff -r 388c44a63613 tools/python/xen/xm/create.py
--- a/tools/python/xen/xm/create.py Wed Nov 10 14:56:06 2010 +0000
+++ b/tools/python/xen/xm/create.py Tue Nov 16 14:48:46 2010 -0500
@@ -680,6 +680,11 @@
fn=set_int, default=0,
use="Create domain with superpages")
+gopts.var('pci_hole', val='0x<XXX>|0',
+ fn=set_int, default=0,
+ use="""Create domain with a PCI hole. The value is the PFN of the
+ start of PCI hole. Usually that is 0xc0000.""")
+
def err(msg):
"""Print an error to stderr and exit.
"""
@@ -770,6 +775,9 @@
config_image.append(['args', vals.extra])
if vals.superpages:
config_image.append(['superpages', vals.superpages])
+ if vals.pci_hole:
+ config_image.append(['pci_hole', vals.pci_hole])
+
if vals.builder == 'hvm':
configure_hvm(config_image, vals)
diff -r 388c44a63613 tools/python/xen/xm/xenapi_create.py
--- a/tools/python/xen/xm/xenapi_create.py Wed Nov 10 14:56:06 2010 +0000
+++ b/tools/python/xen/xm/xenapi_create.py Tue Nov 16 14:48:46 2010 -0500
@@ -285,6 +285,8 @@
vm.attributes["s3_integrity"].value,
"superpages":
vm.attributes["superpages"].value,
+ "pci_hole":
+ vm.attributes["pci_hole"].value,
"memory_static_max":
get_child_node_attribute(vm, "memory", "static_max"),
"memory_static_min":
@@ -697,6 +699,8 @@
= str(get_child_by_name(config, "s3_integrity", 0))
vm.attributes["superpages"] \
= str(get_child_by_name(config, "superpages", 0))
+ vm.attributes["pci_hole"] \
+ = str(get_child_by_name(config, "pci_hole", 0))
vm.attributes["pool_name"] \
= str(get_child_by_name(config, "pool_name", "Pool-0"))
[-- Attachment #3: Type: text/plain, Size: 138 bytes --]
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2011-01-12 14:38 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-01-12 7:17 [PCI passthrough NIC problem] 박은병
2011-01-12 8:07 ` 박은병
2011-01-12 14:38 ` Konrad Rzeszutek Wilk
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.