* [PATCH 0/4] XSA-169 follow-up
@ 2015-12-21 14:28 Jan Beulich
2015-12-21 14:33 ` [PATCH 1/4] arm: add missing newlines to printk()s Jan Beulich
` (3 more replies)
0 siblings, 4 replies; 10+ messages in thread
From: Jan Beulich @ 2015-12-21 14:28 UTC (permalink / raw)
To: xen-devel
While auditing code for further similar issues, a couple of oddities
were found:
1: arm: add missing newlines to printk()s
2: x86: misc printk() adjustments
3: VT-d: unhide messages needed for diagnosing firmware issues
4: IOMMU: unhide messages useful for diagnostics
Signed-off-by: Jan Beulich <jbeulich@suse.com>
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH 1/4] arm: add missing newlines to printk()s
2015-12-21 14:28 [PATCH 0/4] XSA-169 follow-up Jan Beulich
@ 2015-12-21 14:33 ` Jan Beulich
2015-12-21 15:16 ` Stefano Stabellini
2015-12-21 14:34 ` [PATCH 2/4] x86: misc printk() adjustments Jan Beulich
` (2 subsequent siblings)
3 siblings, 1 reply; 10+ messages in thread
From: Jan Beulich @ 2015-12-21 14:33 UTC (permalink / raw)
To: xen-devel; +Cc: Ian Campbell, Stefano Stabellini
[-- Attachment #1: Type: text/plain, Size: 778 bytes --]
Signed-off-by: Jan Beulich <jbeulich@suse.com>
--- a/xen/arch/arm/platforms/brcm.c
+++ b/xen/arch/arm/platforms/brcm.c
@@ -162,7 +162,7 @@ static int brcm_cpu_power_on(int cpu)
if ( timeout == 0 )
{
- dprintk(XENLOG_ERR, "CPU%d power enable failed", cpu);
+ dprintk(XENLOG_ERR, "CPU%d power enable failed\n", cpu);
return -ETIMEDOUT;
}
--- a/xen/arch/arm/platforms/exynos5.c
+++ b/xen/arch/arm/platforms/exynos5.c
@@ -183,7 +183,7 @@ static int exynos5_cpu_power_up(void __i
if ( timeout == 0 )
{
- dprintk(XENLOG_ERR, "CPU%d power enable failed", cpu);
+ dprintk(XENLOG_ERR, "CPU%d power enable failed\n", cpu);
return -ETIMEDOUT;
}
}
[-- Attachment #2: printk-misc-arm.patch --]
[-- Type: text/plain, Size: 814 bytes --]
arm: add missing newlines to printk()s
Signed-off-by: Jan Beulich <jbeulich@suse.com>
--- a/xen/arch/arm/platforms/brcm.c
+++ b/xen/arch/arm/platforms/brcm.c
@@ -162,7 +162,7 @@ static int brcm_cpu_power_on(int cpu)
if ( timeout == 0 )
{
- dprintk(XENLOG_ERR, "CPU%d power enable failed", cpu);
+ dprintk(XENLOG_ERR, "CPU%d power enable failed\n", cpu);
return -ETIMEDOUT;
}
--- a/xen/arch/arm/platforms/exynos5.c
+++ b/xen/arch/arm/platforms/exynos5.c
@@ -183,7 +183,7 @@ static int exynos5_cpu_power_up(void __i
if ( timeout == 0 )
{
- dprintk(XENLOG_ERR, "CPU%d power enable failed", cpu);
+ dprintk(XENLOG_ERR, "CPU%d power enable failed\n", cpu);
return -ETIMEDOUT;
}
}
[-- Attachment #3: Type: text/plain, Size: 126 bytes --]
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH 2/4] x86: misc printk() adjustments
2015-12-21 14:28 [PATCH 0/4] XSA-169 follow-up Jan Beulich
2015-12-21 14:33 ` [PATCH 1/4] arm: add missing newlines to printk()s Jan Beulich
@ 2015-12-21 14:34 ` Jan Beulich
2015-12-21 14:41 ` Andrew Cooper
2015-12-21 14:35 ` [PATCH 3/4] VT-d: unhide messages needed for diagnosing firmware issues Jan Beulich
2015-12-21 14:35 ` [PATCH 4/4] IOMMU: unhide messages useful for diagnostics Jan Beulich
3 siblings, 1 reply; 10+ messages in thread
From: Jan Beulich @ 2015-12-21 14:34 UTC (permalink / raw)
To: xen-devel; +Cc: Andrew Cooper, Keir Fraser
[-- Attachment #1: Type: text/plain, Size: 2667 bytes --]
- a missing newline
- missing log levels (in Dom0-only messages)
- one dprintk() -> printk() conversion
Signed-off-by: Jan Beulich <jbeulich@suse.com>
--- a/xen/arch/x86/acpi/power.c
+++ b/xen/arch/x86/acpi/power.c
@@ -268,7 +268,7 @@ int acpi_enter_sleep(struct xenpf_enter_
else if ( sleep->val_b &&
((sleep->val_a ^ sleep->val_b) & ACPI_BITMASK_SLEEP_ENABLE) )
{
- gdprintk(XENLOG_ERR, "Mismatched pm1a/pm1b setting.");
+ gdprintk(XENLOG_ERR, "Mismatched pm1a/pm1b setting\n");
return -EINVAL;
}
--- a/xen/arch/x86/io_apic.c
+++ b/xen/arch/x86/io_apic.c
@@ -2310,13 +2310,14 @@ int ioapic_guest_read(unsigned long phys
return 0;
}
-#define WARN_BOGUS_WRITE(f, a...) \
- dprintk(XENLOG_INFO, "\n%s: " \
- "apic=%d, pin=%d, irq=%d\n" \
- "%s: new_entry=%08x\n" \
- "%s: " f, __FUNCTION__, apic, pin, irq, \
- __FUNCTION__, *(u32 *)&rte, \
- __FUNCTION__ , ##a )
+#define WARN_BOGUS_WRITE(f, a...) \
+ dprintk(XENLOG_INFO, "\n" \
+ XENLOG_INFO "%s: apic=%d, pin=%d, irq=%d\n" \
+ XENLOG_INFO "%s: new_entry=%08x\n" \
+ XENLOG_INFO "%s: " f "\n", \
+ __func__, apic, pin, irq, \
+ __func__, *(u32 *)&rte, \
+ __func__, ##a )
int ioapic_guest_write(unsigned long physbase, unsigned int reg, u32 val)
{
@@ -2388,7 +2389,7 @@ int ioapic_guest_write(unsigned long phy
rte.vector = desc->arch.vector;
if ( *(u32*)&rte != ret )
WARN_BOGUS_WRITE("old_entry=%08x pirq=%d\n%s: "
- "Attempt to modify IO-APIC pin for in-use IRQ!\n",
+ "Attempt to modify IO-APIC pin for in-use IRQ!",
ret, pirq, __FUNCTION__);
return 0;
}
--- a/xen/arch/x86/x86_64/mm.c
+++ b/xen/arch/x86/x86_64/mm.c
@@ -1366,8 +1366,9 @@ int memory_add(unsigned long spfn, unsig
if ( !valid_numa_range(spfn << PAGE_SHIFT, epfn << PAGE_SHIFT, node) )
{
- dprintk(XENLOG_WARNING, "spfn %lx ~ epfn %lx pxm %x node %x"
- "is not numa valid", spfn, epfn, pxm, node);
+ printk(XENLOG_WARNING
+ "pfn range %lx..%lx PXM %x node %x is not NUMA-valid\n",
+ spfn, epfn, pxm, node);
return -EINVAL;
}
[-- Attachment #2: printk-misc-x86.patch --]
[-- Type: text/plain, Size: 2695 bytes --]
x86: misc printk() adjustments
- a missing newline
- missing log levels (in Dom0-only messages)
- one dprintk() -> printk() conversion
Signed-off-by: Jan Beulich <jbeulich@suse.com>
--- a/xen/arch/x86/acpi/power.c
+++ b/xen/arch/x86/acpi/power.c
@@ -268,7 +268,7 @@ int acpi_enter_sleep(struct xenpf_enter_
else if ( sleep->val_b &&
((sleep->val_a ^ sleep->val_b) & ACPI_BITMASK_SLEEP_ENABLE) )
{
- gdprintk(XENLOG_ERR, "Mismatched pm1a/pm1b setting.");
+ gdprintk(XENLOG_ERR, "Mismatched pm1a/pm1b setting\n");
return -EINVAL;
}
--- a/xen/arch/x86/io_apic.c
+++ b/xen/arch/x86/io_apic.c
@@ -2310,13 +2310,14 @@ int ioapic_guest_read(unsigned long phys
return 0;
}
-#define WARN_BOGUS_WRITE(f, a...) \
- dprintk(XENLOG_INFO, "\n%s: " \
- "apic=%d, pin=%d, irq=%d\n" \
- "%s: new_entry=%08x\n" \
- "%s: " f, __FUNCTION__, apic, pin, irq, \
- __FUNCTION__, *(u32 *)&rte, \
- __FUNCTION__ , ##a )
+#define WARN_BOGUS_WRITE(f, a...) \
+ dprintk(XENLOG_INFO, "\n" \
+ XENLOG_INFO "%s: apic=%d, pin=%d, irq=%d\n" \
+ XENLOG_INFO "%s: new_entry=%08x\n" \
+ XENLOG_INFO "%s: " f "\n", \
+ __func__, apic, pin, irq, \
+ __func__, *(u32 *)&rte, \
+ __func__, ##a )
int ioapic_guest_write(unsigned long physbase, unsigned int reg, u32 val)
{
@@ -2388,7 +2389,7 @@ int ioapic_guest_write(unsigned long phy
rte.vector = desc->arch.vector;
if ( *(u32*)&rte != ret )
WARN_BOGUS_WRITE("old_entry=%08x pirq=%d\n%s: "
- "Attempt to modify IO-APIC pin for in-use IRQ!\n",
+ "Attempt to modify IO-APIC pin for in-use IRQ!",
ret, pirq, __FUNCTION__);
return 0;
}
--- a/xen/arch/x86/x86_64/mm.c
+++ b/xen/arch/x86/x86_64/mm.c
@@ -1366,8 +1366,9 @@ int memory_add(unsigned long spfn, unsig
if ( !valid_numa_range(spfn << PAGE_SHIFT, epfn << PAGE_SHIFT, node) )
{
- dprintk(XENLOG_WARNING, "spfn %lx ~ epfn %lx pxm %x node %x"
- "is not numa valid", spfn, epfn, pxm, node);
+ printk(XENLOG_WARNING
+ "pfn range %lx..%lx PXM %x node %x is not NUMA-valid\n",
+ spfn, epfn, pxm, node);
return -EINVAL;
}
[-- Attachment #3: Type: text/plain, Size: 126 bytes --]
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH 3/4] VT-d: unhide messages needed for diagnosing firmware issues
2015-12-21 14:28 [PATCH 0/4] XSA-169 follow-up Jan Beulich
2015-12-21 14:33 ` [PATCH 1/4] arm: add missing newlines to printk()s Jan Beulich
2015-12-21 14:34 ` [PATCH 2/4] x86: misc printk() adjustments Jan Beulich
@ 2015-12-21 14:35 ` Jan Beulich
2015-12-22 1:33 ` Wu, Feng
2015-12-21 14:35 ` [PATCH 4/4] IOMMU: unhide messages useful for diagnostics Jan Beulich
3 siblings, 1 reply; 10+ messages in thread
From: Jan Beulich @ 2015-12-21 14:35 UTC (permalink / raw)
To: xen-devel; +Cc: Kevin Tian, Feng Wu
[-- Attachment #1: Type: text/plain, Size: 19829 bytes --]
Undue use of dprintk() lead to many messages useful in diagnosing
issues in the field now being hidden in non-debug (i.e. production)
builds. Re-surface them, namely when init-time only and/or already
guarded by iommu_{verbose,debug} conditionals. Switch from using
iommu_verbose to iommu_debug in a couple of runtime cases.
Signed-off-by: Jan Beulich <jbeulich@suse.com>
--- a/xen/drivers/passthrough/vtd/dmar.c
+++ b/xen/drivers/passthrough/vtd/dmar.c
@@ -298,7 +298,7 @@ static int __init scope_device_count(con
scope = start;
if ( scope->length < MIN_SCOPE_LEN )
{
- dprintk(XENLOG_WARNING VTDPREFIX, "Invalid device scope.\n");
+ printk(XENLOG_WARNING VTDPREFIX "Invalid device scope\n");
return -EINVAL;
}
@@ -360,18 +360,18 @@ static int __init acpi_parse_dev_scope(
sub_bus = pci_conf_read8(seg, bus, path->dev, path->fn,
PCI_SUBORDINATE_BUS);
if ( iommu_verbose )
- dprintk(VTDPREFIX,
- " bridge: %04x:%02x:%02x.%u start=%x sec=%x sub=%x\n",
- seg, bus, path->dev, path->fn,
- acpi_scope->bus, sec_bus, sub_bus);
+ printk(VTDPREFIX
+ " bridge: %04x:%02x:%02x.%u start=%x sec=%x sub=%x\n",
+ seg, bus, path->dev, path->fn,
+ acpi_scope->bus, sec_bus, sub_bus);
dmar_scope_add_buses(scope, sec_bus, sub_bus);
break;
case ACPI_DMAR_SCOPE_TYPE_HPET:
if ( iommu_verbose )
- dprintk(VTDPREFIX, " MSI HPET: %04x:%02x:%02x.%u\n",
- seg, bus, path->dev, path->fn);
+ printk(VTDPREFIX " MSI HPET: %04x:%02x:%02x.%u\n",
+ seg, bus, path->dev, path->fn);
if ( drhd )
{
@@ -392,8 +392,8 @@ static int __init acpi_parse_dev_scope(
case ACPI_DMAR_SCOPE_TYPE_ENDPOINT:
if ( iommu_verbose )
- dprintk(VTDPREFIX, " endpoint: %04x:%02x:%02x.%u\n",
- seg, bus, path->dev, path->fn);
+ printk(VTDPREFIX " endpoint: %04x:%02x:%02x.%u\n",
+ seg, bus, path->dev, path->fn);
if ( drhd )
{
@@ -406,8 +406,8 @@ static int __init acpi_parse_dev_scope(
case ACPI_DMAR_SCOPE_TYPE_IOAPIC:
if ( iommu_verbose )
- dprintk(VTDPREFIX, " IOAPIC: %04x:%02x:%02x.%u\n",
- seg, bus, path->dev, path->fn);
+ printk(VTDPREFIX " IOAPIC: %04x:%02x:%02x.%u\n",
+ seg, bus, path->dev, path->fn);
if ( drhd )
{
@@ -449,9 +449,8 @@ static int __init acpi_dmar_check_length
{
if ( h->length >= min_len )
return 0;
- dprintk(XENLOG_ERR VTDPREFIX,
- "Invalid ACPI DMAR entry length: %#x\n",
- h->length);
+ printk(XENLOG_ERR VTDPREFIX "Invalid ACPI DMAR entry length: %#x\n",
+ h->length);
return -EINVAL;
}
@@ -481,8 +480,7 @@ acpi_parse_one_drhd(struct acpi_dmar_hea
INIT_LIST_HEAD(&dmaru->ioapic_list);
INIT_LIST_HEAD(&dmaru->hpet_list);
if ( iommu_verbose )
- dprintk(VTDPREFIX, " dmaru->address = %"PRIx64"\n",
- dmaru->address);
+ printk(VTDPREFIX " dmaru->address = %"PRIx64"\n", dmaru->address);
ret = iommu_alloc(dmaru);
if ( ret )
@@ -496,12 +494,12 @@ acpi_parse_one_drhd(struct acpi_dmar_hea
if ( dmaru->include_all )
{
if ( iommu_verbose )
- dprintk(VTDPREFIX, " flags: INCLUDE_ALL\n");
+ printk(VTDPREFIX " flags: INCLUDE_ALL\n");
/* Only allow one INCLUDE_ALL */
if ( drhd->segment == 0 && include_all )
{
- dprintk(XENLOG_WARNING VTDPREFIX,
- "Only one INCLUDE_ALL device scope is allowed\n");
+ printk(XENLOG_WARNING VTDPREFIX
+ "Only one INCLUDE_ALL device scope is allowed\n");
ret = -EINVAL;
}
if ( drhd->segment == 0 )
@@ -538,9 +536,9 @@ acpi_parse_one_drhd(struct acpi_dmar_hea
if ( !pci_device_detect(drhd->segment, b, d, f) )
{
- dprintk(XENLOG_WARNING VTDPREFIX,
- " Non-existent device (%04x:%02x:%02x.%u) is reported"
- " in this DRHD's scope!\n", drhd->segment, b, d, f);
+ printk(XENLOG_WARNING VTDPREFIX
+ " Non-existent device (%04x:%02x:%02x.%u) in this DRHD's scope!\n",
+ drhd->segment, b, d, f);
invalid_cnt++;
}
}
@@ -550,9 +548,8 @@ acpi_parse_one_drhd(struct acpi_dmar_hea
if ( iommu_workaround_bios_bug &&
invalid_cnt == dmaru->scope.devices_cnt )
{
- dprintk(XENLOG_WARNING VTDPREFIX,
- " Workaround BIOS bug: ignore the DRHD due to all "
- "devices under its scope are not PCI discoverable!\n");
+ printk(XENLOG_WARNING VTDPREFIX
+ " Workaround BIOS bug: ignoring DRHD (no devices in its scope are PCI discoverable)\n");
scope_devices_free(&dmaru->scope);
iommu_free(dmaru);
@@ -560,11 +557,10 @@ acpi_parse_one_drhd(struct acpi_dmar_hea
}
else
{
- dprintk(XENLOG_WARNING VTDPREFIX,
- " The DRHD is invalid due to there are devices under "
- "its scope are not PCI discoverable! Pls try option "
- "iommu=force or iommu=workaround_bios_bug if you "
- "really want VT-d\n");
+ printk(XENLOG_WARNING VTDPREFIX
+ " DRHD is invalid (some devices in its scope are not PCI discoverable)\n");
+ printk(XENLOG_WARNING VTDPREFIX
+ " Try \"iommu=force\" or \"iommu=workaround_bios_bug\" if you really want VT-d\n");
ret = -EINVAL;
}
}
@@ -613,10 +609,9 @@ acpi_parse_one_rmrr(struct acpi_dmar_hea
if ( (!page_is_ram_type(paddr_to_pfn(base_addr), RAM_TYPE_RESERVED)) ||
(!page_is_ram_type(paddr_to_pfn(end_addr), RAM_TYPE_RESERVED)) )
{
- dprintk(XENLOG_WARNING VTDPREFIX,
- " RMRR address range not in reserved memory "
- "base = %"PRIx64" end = %"PRIx64"; "
- "iommu_inclusive_mapping=1 parameter may be needed.\n",
+ printk(XENLOG_WARNING VTDPREFIX
+ " RMRR address range %"PRIx64"..%"PRIx64" not in reserved memory;"
+ " need \"iommu_inclusive_mapping=1\"?\n",
base_addr, end_addr);
}
@@ -653,11 +648,10 @@ acpi_parse_one_rmrr(struct acpi_dmar_hea
if ( !pci_device_detect(rmrr->segment, b, d, f) )
{
- dprintk(XENLOG_WARNING VTDPREFIX,
- " Non-existent device (%04x:%02x:%02x.%u) is reported"
- " in RMRR (%"PRIx64", %"PRIx64")'s scope!\n",
- rmrr->segment, b, d, f,
- rmrru->base_address, rmrru->end_address);
+ printk(XENLOG_WARNING VTDPREFIX
+ " Non-existent device (%04x:%02x:%02x.%u) reported in RMRR (%"PRIx64", %"PRIx64")'s scope!\n",
+ rmrr->segment, b, d, f,
+ rmrru->base_address, rmrru->end_address);
ignore = 1;
}
else
@@ -669,18 +663,17 @@ acpi_parse_one_rmrr(struct acpi_dmar_hea
if ( ignore )
{
- dprintk(XENLOG_WARNING VTDPREFIX,
- " Ignore the RMRR (%"PRIx64", %"PRIx64") due to "
- "devices under its scope are not PCI discoverable!\n",
- rmrru->base_address, rmrru->end_address);
+ printk(XENLOG_WARNING VTDPREFIX
+ " Ignore RMRR (%"PRIx64", %"PRIx64") (some devices in its scope are not PCI discoverable)\n",
+ rmrru->base_address, rmrru->end_address);
scope_devices_free(&rmrru->scope);
xfree(rmrru);
}
else if ( base_addr > end_addr )
{
- dprintk(XENLOG_WARNING VTDPREFIX,
- " The RMRR (%"PRIx64", %"PRIx64") is incorrect!\n",
- rmrru->base_address, rmrru->end_address);
+ printk(XENLOG_WARNING VTDPREFIX
+ " RMRR (%"PRIx64", %"PRIx64") is incorrect\n",
+ rmrru->base_address, rmrru->end_address);
scope_devices_free(&rmrru->scope);
xfree(rmrru);
ret = -EFAULT;
@@ -688,10 +681,9 @@ acpi_parse_one_rmrr(struct acpi_dmar_hea
else
{
if ( iommu_verbose )
- dprintk(VTDPREFIX,
- " RMRR region: base_addr %"PRIx64
- " end_address %"PRIx64"\n",
- rmrru->base_address, rmrru->end_address);
+ printk(VTDPREFIX
+ " RMRR region: base_addr %"PRIx64" end_address %"PRIx64"\n",
+ rmrru->base_address, rmrru->end_address);
acpi_register_rmrr_unit(rmrru);
}
}
@@ -719,8 +711,7 @@ acpi_parse_one_atsr(struct acpi_dmar_hea
atsru->segment = atsr->segment;
atsru->all_ports = atsr->flags & ACPI_DMAR_ALL_PORTS;
if ( iommu_verbose )
- dprintk(VTDPREFIX,
- " atsru->all_ports: %x\n", atsru->all_ports);
+ printk(VTDPREFIX " atsru->all_ports: %x\n", atsru->all_ports);
if ( !atsru->all_ports )
{
dev_scope_start = (void *)(atsr + 1);
@@ -731,12 +722,12 @@ acpi_parse_one_atsr(struct acpi_dmar_hea
else
{
if ( iommu_verbose )
- dprintk(VTDPREFIX, " flags: ALL_PORTS\n");
+ printk(VTDPREFIX " flags: ALL_PORTS\n");
/* Only allow one ALL_PORTS */
if ( atsr->segment == 0 && all_ports )
{
- dprintk(XENLOG_WARNING VTDPREFIX,
- "Only one ALL_PORTS device scope is allowed\n");
+ printk(XENLOG_WARNING VTDPREFIX
+ "Only one ALL_PORTS device scope is allowed\n");
ret = -EINVAL;
}
if ( atsr->segment == 0 )
@@ -772,10 +763,9 @@ acpi_parse_one_rhsa(struct acpi_dmar_hea
rhsau->proximity_domain = rhsa->proximity_domain;
list_add_tail(&rhsau->list, &acpi_rhsa_units);
if ( iommu_verbose )
- dprintk(VTDPREFIX,
- " rhsau->address: %"PRIx64
- " rhsau->proximity_domain: %"PRIx32"\n",
- rhsau->address, rhsau->proximity_domain);
+ printk(VTDPREFIX
+ " rhsau->address: %"PRIx64" rhsau->proximity_domain: %"PRIx32"\n",
+ rhsau->address, rhsau->proximity_domain);
return ret;
}
@@ -798,15 +788,14 @@ static int __init acpi_parse_dmar(struct
if ( !dmar->width )
{
- dprintk(XENLOG_WARNING VTDPREFIX, "Zero: Invalid DMAR width\n");
+ printk(XENLOG_WARNING VTDPREFIX "Zero: Invalid DMAR width\n");
ret = -EINVAL;
goto out;
}
dmar_host_address_width = dmar->width + 1;
if ( iommu_verbose )
- dprintk(VTDPREFIX, "Host address width %d\n",
- dmar_host_address_width);
+ printk(VTDPREFIX "Host address width %d\n", dmar_host_address_width);
entry_header = (void *)(dmar + 1);
while ( ((unsigned long)entry_header) <
@@ -820,22 +809,22 @@ static int __init acpi_parse_dmar(struct
{
case ACPI_DMAR_TYPE_HARDWARE_UNIT:
if ( iommu_verbose )
- dprintk(VTDPREFIX, "found ACPI_DMAR_DRHD:\n");
+ printk(VTDPREFIX "found ACPI_DMAR_DRHD:\n");
ret = acpi_parse_one_drhd(entry_header);
break;
case ACPI_DMAR_TYPE_RESERVED_MEMORY:
if ( iommu_verbose )
- dprintk(VTDPREFIX, "found ACPI_DMAR_RMRR:\n");
+ printk(VTDPREFIX "found ACPI_DMAR_RMRR:\n");
ret = acpi_parse_one_rmrr(entry_header);
break;
case ACPI_DMAR_TYPE_ATSR:
if ( iommu_verbose )
- dprintk(VTDPREFIX, "found ACPI_DMAR_ATSR:\n");
+ printk(VTDPREFIX "found ACPI_DMAR_ATSR:\n");
ret = acpi_parse_one_atsr(entry_header);
break;
case ACPI_DMAR_HARDWARE_AFFINITY:
if ( iommu_verbose )
- dprintk(VTDPREFIX, "found ACPI_DMAR_RHSA:\n");
+ printk(VTDPREFIX "found ACPI_DMAR_RHSA:\n");
ret = acpi_parse_one_rhsa(entry_header);
break;
default:
--- a/xen/drivers/passthrough/vtd/iommu.c
+++ b/xen/drivers/passthrough/vtd/iommu.c
@@ -713,20 +713,18 @@ static void iommu_enable_translation(str
{
if ( force_iommu )
panic("BIOS did not enable IGD for VT properly, crash Xen for security purpose");
- else
- {
- dprintk(XENLOG_WARNING VTDPREFIX,
- "BIOS did not enable IGD for VT properly. Disabling IGD VT-d engine.\n");
- return;
- }
+
+ printk(XENLOG_WARNING VTDPREFIX
+ "BIOS did not enable IGD for VT properly. Disabling IGD VT-d engine.\n");
+ return;
}
/* apply platform specific errata workarounds */
vtd_ops_preamble_quirk(iommu);
if ( iommu_verbose )
- dprintk(VTDPREFIX,
- "iommu_enable_translation: iommu->reg = %p\n", iommu->reg);
+ printk(VTDPREFIX "iommu_enable_translation: iommu->reg = %p\n",
+ iommu->reg);
spin_lock_irqsave(&iommu->register_lock, flags);
sts = dmar_readl(iommu->reg, DMAR_GSTS_REG);
dmar_writel(iommu->reg, DMAR_GCMD_REG, sts | DMA_GCMD_TE);
@@ -1150,11 +1148,10 @@ int __init iommu_alloc(struct acpi_drhd_
if ( iommu_verbose )
{
- dprintk(VTDPREFIX,
- "drhd->address = %"PRIx64" iommu->reg = %p\n",
- drhd->address, iommu->reg);
- dprintk(VTDPREFIX,
- "cap = %"PRIx64" ecap = %"PRIx64"\n", iommu->cap, iommu->ecap);
+ printk(VTDPREFIX "drhd->address = %"PRIx64" iommu->reg = %p\n",
+ drhd->address, iommu->reg);
+ printk(VTDPREFIX "cap = %"PRIx64" ecap = %"PRIx64"\n",
+ iommu->cap, iommu->ecap);
}
if ( !(iommu->cap + 1) || !(iommu->ecap + 1) )
return -ENODEV;
@@ -1163,7 +1160,7 @@ int __init iommu_alloc(struct acpi_drhd_
cap_num_fault_regs(iommu->cap) * PRIMARY_FAULT_REG_LEN >= PAGE_SIZE ||
ecap_iotlb_offset(iommu->ecap) >= PAGE_SIZE )
{
- dprintk(XENLOG_ERR VTDPREFIX, "IOMMU: unsupported\n");
+ printk(XENLOG_ERR VTDPREFIX "IOMMU: unsupported\n");
print_iommu_regs(drhd);
return -ENODEV;
}
@@ -1175,8 +1172,7 @@ int __init iommu_alloc(struct acpi_drhd_
break;
if ( agaw < 0 )
{
- dprintk(XENLOG_ERR VTDPREFIX,
- "IOMMU: unsupported sagaw %lx\n", sagaw);
+ printk(XENLOG_ERR VTDPREFIX "IOMMU: unsupported sagaw %lx\n", sagaw);
print_iommu_regs(drhd);
return -ENODEV;
}
@@ -1433,10 +1429,10 @@ static int domain_context_mapping(
switch ( pdev->type )
{
case DEV_TYPE_PCI_HOST_BRIDGE:
- if ( iommu_verbose )
- dprintk(VTDPREFIX, "d%d:Hostbridge: skip %04x:%02x:%02x.%u map\n",
- domain->domain_id, seg, bus,
- PCI_SLOT(devfn), PCI_FUNC(devfn));
+ if ( iommu_debug )
+ printk(VTDPREFIX "d%d:Hostbridge: skip %04x:%02x:%02x.%u map\n",
+ domain->domain_id, seg, bus,
+ PCI_SLOT(devfn), PCI_FUNC(devfn));
if ( !is_hardware_domain(domain) )
return -EPERM;
break;
@@ -1447,10 +1443,10 @@ static int domain_context_mapping(
break;
case DEV_TYPE_PCIe_ENDPOINT:
- if ( iommu_verbose )
- dprintk(VTDPREFIX, "d%d:PCIe: map %04x:%02x:%02x.%u\n",
- domain->domain_id, seg, bus,
- PCI_SLOT(devfn), PCI_FUNC(devfn));
+ if ( iommu_debug )
+ printk(VTDPREFIX "d%d:PCIe: map %04x:%02x:%02x.%u\n",
+ domain->domain_id, seg, bus,
+ PCI_SLOT(devfn), PCI_FUNC(devfn));
ret = domain_context_mapping_one(domain, drhd->iommu, bus, devfn,
pdev);
if ( !ret && devfn == pdev->devfn && ats_device(pdev, drhd) > 0 )
@@ -1459,10 +1455,10 @@ static int domain_context_mapping(
break;
case DEV_TYPE_PCI:
- if ( iommu_verbose )
- dprintk(VTDPREFIX, "d%d:PCI: map %04x:%02x:%02x.%u\n",
- domain->domain_id, seg, bus,
- PCI_SLOT(devfn), PCI_FUNC(devfn));
+ if ( iommu_debug )
+ printk(VTDPREFIX "d%d:PCI: map %04x:%02x:%02x.%u\n",
+ domain->domain_id, seg, bus,
+ PCI_SLOT(devfn), PCI_FUNC(devfn));
ret = domain_context_mapping_one(domain, drhd->iommu, bus, devfn,
pdev);
@@ -1572,10 +1568,10 @@ static int domain_context_unmap(
switch ( pdev->type )
{
case DEV_TYPE_PCI_HOST_BRIDGE:
- if ( iommu_verbose )
- dprintk(VTDPREFIX, "d%d:Hostbridge: skip %04x:%02x:%02x.%u unmap\n",
- domain->domain_id, seg, bus,
- PCI_SLOT(devfn), PCI_FUNC(devfn));
+ if ( iommu_debug )
+ printk(VTDPREFIX "d%d:Hostbridge: skip %04x:%02x:%02x.%u unmap\n",
+ domain->domain_id, seg, bus,
+ PCI_SLOT(devfn), PCI_FUNC(devfn));
if ( !is_hardware_domain(domain) )
return -EPERM;
goto out;
@@ -1586,10 +1582,10 @@ static int domain_context_unmap(
goto out;
case DEV_TYPE_PCIe_ENDPOINT:
- if ( iommu_verbose )
- dprintk(VTDPREFIX, "d%d:PCIe: unmap %04x:%02x:%02x.%u\n",
- domain->domain_id, seg, bus,
- PCI_SLOT(devfn), PCI_FUNC(devfn));
+ if ( iommu_debug )
+ printk(VTDPREFIX "d%d:PCIe: unmap %04x:%02x:%02x.%u\n",
+ domain->domain_id, seg, bus,
+ PCI_SLOT(devfn), PCI_FUNC(devfn));
ret = domain_context_unmap_one(domain, iommu, bus, devfn);
if ( !ret && devfn == pdev->devfn && ats_device(pdev, drhd) > 0 )
disable_ats_device(seg, bus, devfn);
@@ -1597,9 +1593,9 @@ static int domain_context_unmap(
break;
case DEV_TYPE_PCI:
- if ( iommu_verbose )
- dprintk(VTDPREFIX, "d%d:PCI: unmap %04x:%02x:%02x.%u\n",
- domain->domain_id, seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn));
+ if ( iommu_debug )
+ printk(VTDPREFIX "d%d:PCI: unmap %04x:%02x:%02x.%u\n",
+ domain->domain_id, seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn));
ret = domain_context_unmap_one(domain, iommu, bus, devfn);
if ( ret )
break;
[-- Attachment #2: VT-d-logging.patch --]
[-- Type: text/plain, Size: 19888 bytes --]
VT-d: unhide messages needed for diagnosing firmware issues
Undue use of dprintk() lead to many messages useful in diagnosing
issues in the field now being hidden in non-debug (i.e. production)
builds. Re-surface them, namely when init-time only and/or already
guarded by iommu_{verbose,debug} conditionals. Switch from using
iommu_verbose to iommu_debug in a couple of runtime cases.
Signed-off-by: Jan Beulich <jbeulich@suse.com>
--- a/xen/drivers/passthrough/vtd/dmar.c
+++ b/xen/drivers/passthrough/vtd/dmar.c
@@ -298,7 +298,7 @@ static int __init scope_device_count(con
scope = start;
if ( scope->length < MIN_SCOPE_LEN )
{
- dprintk(XENLOG_WARNING VTDPREFIX, "Invalid device scope.\n");
+ printk(XENLOG_WARNING VTDPREFIX "Invalid device scope\n");
return -EINVAL;
}
@@ -360,18 +360,18 @@ static int __init acpi_parse_dev_scope(
sub_bus = pci_conf_read8(seg, bus, path->dev, path->fn,
PCI_SUBORDINATE_BUS);
if ( iommu_verbose )
- dprintk(VTDPREFIX,
- " bridge: %04x:%02x:%02x.%u start=%x sec=%x sub=%x\n",
- seg, bus, path->dev, path->fn,
- acpi_scope->bus, sec_bus, sub_bus);
+ printk(VTDPREFIX
+ " bridge: %04x:%02x:%02x.%u start=%x sec=%x sub=%x\n",
+ seg, bus, path->dev, path->fn,
+ acpi_scope->bus, sec_bus, sub_bus);
dmar_scope_add_buses(scope, sec_bus, sub_bus);
break;
case ACPI_DMAR_SCOPE_TYPE_HPET:
if ( iommu_verbose )
- dprintk(VTDPREFIX, " MSI HPET: %04x:%02x:%02x.%u\n",
- seg, bus, path->dev, path->fn);
+ printk(VTDPREFIX " MSI HPET: %04x:%02x:%02x.%u\n",
+ seg, bus, path->dev, path->fn);
if ( drhd )
{
@@ -392,8 +392,8 @@ static int __init acpi_parse_dev_scope(
case ACPI_DMAR_SCOPE_TYPE_ENDPOINT:
if ( iommu_verbose )
- dprintk(VTDPREFIX, " endpoint: %04x:%02x:%02x.%u\n",
- seg, bus, path->dev, path->fn);
+ printk(VTDPREFIX " endpoint: %04x:%02x:%02x.%u\n",
+ seg, bus, path->dev, path->fn);
if ( drhd )
{
@@ -406,8 +406,8 @@ static int __init acpi_parse_dev_scope(
case ACPI_DMAR_SCOPE_TYPE_IOAPIC:
if ( iommu_verbose )
- dprintk(VTDPREFIX, " IOAPIC: %04x:%02x:%02x.%u\n",
- seg, bus, path->dev, path->fn);
+ printk(VTDPREFIX " IOAPIC: %04x:%02x:%02x.%u\n",
+ seg, bus, path->dev, path->fn);
if ( drhd )
{
@@ -449,9 +449,8 @@ static int __init acpi_dmar_check_length
{
if ( h->length >= min_len )
return 0;
- dprintk(XENLOG_ERR VTDPREFIX,
- "Invalid ACPI DMAR entry length: %#x\n",
- h->length);
+ printk(XENLOG_ERR VTDPREFIX "Invalid ACPI DMAR entry length: %#x\n",
+ h->length);
return -EINVAL;
}
@@ -481,8 +480,7 @@ acpi_parse_one_drhd(struct acpi_dmar_hea
INIT_LIST_HEAD(&dmaru->ioapic_list);
INIT_LIST_HEAD(&dmaru->hpet_list);
if ( iommu_verbose )
- dprintk(VTDPREFIX, " dmaru->address = %"PRIx64"\n",
- dmaru->address);
+ printk(VTDPREFIX " dmaru->address = %"PRIx64"\n", dmaru->address);
ret = iommu_alloc(dmaru);
if ( ret )
@@ -496,12 +494,12 @@ acpi_parse_one_drhd(struct acpi_dmar_hea
if ( dmaru->include_all )
{
if ( iommu_verbose )
- dprintk(VTDPREFIX, " flags: INCLUDE_ALL\n");
+ printk(VTDPREFIX " flags: INCLUDE_ALL\n");
/* Only allow one INCLUDE_ALL */
if ( drhd->segment == 0 && include_all )
{
- dprintk(XENLOG_WARNING VTDPREFIX,
- "Only one INCLUDE_ALL device scope is allowed\n");
+ printk(XENLOG_WARNING VTDPREFIX
+ "Only one INCLUDE_ALL device scope is allowed\n");
ret = -EINVAL;
}
if ( drhd->segment == 0 )
@@ -538,9 +536,9 @@ acpi_parse_one_drhd(struct acpi_dmar_hea
if ( !pci_device_detect(drhd->segment, b, d, f) )
{
- dprintk(XENLOG_WARNING VTDPREFIX,
- " Non-existent device (%04x:%02x:%02x.%u) is reported"
- " in this DRHD's scope!\n", drhd->segment, b, d, f);
+ printk(XENLOG_WARNING VTDPREFIX
+ " Non-existent device (%04x:%02x:%02x.%u) in this DRHD's scope!\n",
+ drhd->segment, b, d, f);
invalid_cnt++;
}
}
@@ -550,9 +548,8 @@ acpi_parse_one_drhd(struct acpi_dmar_hea
if ( iommu_workaround_bios_bug &&
invalid_cnt == dmaru->scope.devices_cnt )
{
- dprintk(XENLOG_WARNING VTDPREFIX,
- " Workaround BIOS bug: ignore the DRHD due to all "
- "devices under its scope are not PCI discoverable!\n");
+ printk(XENLOG_WARNING VTDPREFIX
+ " Workaround BIOS bug: ignoring DRHD (no devices in its scope are PCI discoverable)\n");
scope_devices_free(&dmaru->scope);
iommu_free(dmaru);
@@ -560,11 +557,10 @@ acpi_parse_one_drhd(struct acpi_dmar_hea
}
else
{
- dprintk(XENLOG_WARNING VTDPREFIX,
- " The DRHD is invalid due to there are devices under "
- "its scope are not PCI discoverable! Pls try option "
- "iommu=force or iommu=workaround_bios_bug if you "
- "really want VT-d\n");
+ printk(XENLOG_WARNING VTDPREFIX
+ " DRHD is invalid (some devices in its scope are not PCI discoverable)\n");
+ printk(XENLOG_WARNING VTDPREFIX
+ " Try \"iommu=force\" or \"iommu=workaround_bios_bug\" if you really want VT-d\n");
ret = -EINVAL;
}
}
@@ -613,10 +609,9 @@ acpi_parse_one_rmrr(struct acpi_dmar_hea
if ( (!page_is_ram_type(paddr_to_pfn(base_addr), RAM_TYPE_RESERVED)) ||
(!page_is_ram_type(paddr_to_pfn(end_addr), RAM_TYPE_RESERVED)) )
{
- dprintk(XENLOG_WARNING VTDPREFIX,
- " RMRR address range not in reserved memory "
- "base = %"PRIx64" end = %"PRIx64"; "
- "iommu_inclusive_mapping=1 parameter may be needed.\n",
+ printk(XENLOG_WARNING VTDPREFIX
+ " RMRR address range %"PRIx64"..%"PRIx64" not in reserved memory;"
+ " need \"iommu_inclusive_mapping=1\"?\n",
base_addr, end_addr);
}
@@ -653,11 +648,10 @@ acpi_parse_one_rmrr(struct acpi_dmar_hea
if ( !pci_device_detect(rmrr->segment, b, d, f) )
{
- dprintk(XENLOG_WARNING VTDPREFIX,
- " Non-existent device (%04x:%02x:%02x.%u) is reported"
- " in RMRR (%"PRIx64", %"PRIx64")'s scope!\n",
- rmrr->segment, b, d, f,
- rmrru->base_address, rmrru->end_address);
+ printk(XENLOG_WARNING VTDPREFIX
+ " Non-existent device (%04x:%02x:%02x.%u) reported in RMRR (%"PRIx64", %"PRIx64")'s scope!\n",
+ rmrr->segment, b, d, f,
+ rmrru->base_address, rmrru->end_address);
ignore = 1;
}
else
@@ -669,18 +663,17 @@ acpi_parse_one_rmrr(struct acpi_dmar_hea
if ( ignore )
{
- dprintk(XENLOG_WARNING VTDPREFIX,
- " Ignore the RMRR (%"PRIx64", %"PRIx64") due to "
- "devices under its scope are not PCI discoverable!\n",
- rmrru->base_address, rmrru->end_address);
+ printk(XENLOG_WARNING VTDPREFIX
+ " Ignore RMRR (%"PRIx64", %"PRIx64") (some devices in its scope are not PCI discoverable)\n",
+ rmrru->base_address, rmrru->end_address);
scope_devices_free(&rmrru->scope);
xfree(rmrru);
}
else if ( base_addr > end_addr )
{
- dprintk(XENLOG_WARNING VTDPREFIX,
- " The RMRR (%"PRIx64", %"PRIx64") is incorrect!\n",
- rmrru->base_address, rmrru->end_address);
+ printk(XENLOG_WARNING VTDPREFIX
+ " RMRR (%"PRIx64", %"PRIx64") is incorrect\n",
+ rmrru->base_address, rmrru->end_address);
scope_devices_free(&rmrru->scope);
xfree(rmrru);
ret = -EFAULT;
@@ -688,10 +681,9 @@ acpi_parse_one_rmrr(struct acpi_dmar_hea
else
{
if ( iommu_verbose )
- dprintk(VTDPREFIX,
- " RMRR region: base_addr %"PRIx64
- " end_address %"PRIx64"\n",
- rmrru->base_address, rmrru->end_address);
+ printk(VTDPREFIX
+ " RMRR region: base_addr %"PRIx64" end_address %"PRIx64"\n",
+ rmrru->base_address, rmrru->end_address);
acpi_register_rmrr_unit(rmrru);
}
}
@@ -719,8 +711,7 @@ acpi_parse_one_atsr(struct acpi_dmar_hea
atsru->segment = atsr->segment;
atsru->all_ports = atsr->flags & ACPI_DMAR_ALL_PORTS;
if ( iommu_verbose )
- dprintk(VTDPREFIX,
- " atsru->all_ports: %x\n", atsru->all_ports);
+ printk(VTDPREFIX " atsru->all_ports: %x\n", atsru->all_ports);
if ( !atsru->all_ports )
{
dev_scope_start = (void *)(atsr + 1);
@@ -731,12 +722,12 @@ acpi_parse_one_atsr(struct acpi_dmar_hea
else
{
if ( iommu_verbose )
- dprintk(VTDPREFIX, " flags: ALL_PORTS\n");
+ printk(VTDPREFIX " flags: ALL_PORTS\n");
/* Only allow one ALL_PORTS */
if ( atsr->segment == 0 && all_ports )
{
- dprintk(XENLOG_WARNING VTDPREFIX,
- "Only one ALL_PORTS device scope is allowed\n");
+ printk(XENLOG_WARNING VTDPREFIX
+ "Only one ALL_PORTS device scope is allowed\n");
ret = -EINVAL;
}
if ( atsr->segment == 0 )
@@ -772,10 +763,9 @@ acpi_parse_one_rhsa(struct acpi_dmar_hea
rhsau->proximity_domain = rhsa->proximity_domain;
list_add_tail(&rhsau->list, &acpi_rhsa_units);
if ( iommu_verbose )
- dprintk(VTDPREFIX,
- " rhsau->address: %"PRIx64
- " rhsau->proximity_domain: %"PRIx32"\n",
- rhsau->address, rhsau->proximity_domain);
+ printk(VTDPREFIX
+ " rhsau->address: %"PRIx64" rhsau->proximity_domain: %"PRIx32"\n",
+ rhsau->address, rhsau->proximity_domain);
return ret;
}
@@ -798,15 +788,14 @@ static int __init acpi_parse_dmar(struct
if ( !dmar->width )
{
- dprintk(XENLOG_WARNING VTDPREFIX, "Zero: Invalid DMAR width\n");
+ printk(XENLOG_WARNING VTDPREFIX "Zero: Invalid DMAR width\n");
ret = -EINVAL;
goto out;
}
dmar_host_address_width = dmar->width + 1;
if ( iommu_verbose )
- dprintk(VTDPREFIX, "Host address width %d\n",
- dmar_host_address_width);
+ printk(VTDPREFIX "Host address width %d\n", dmar_host_address_width);
entry_header = (void *)(dmar + 1);
while ( ((unsigned long)entry_header) <
@@ -820,22 +809,22 @@ static int __init acpi_parse_dmar(struct
{
case ACPI_DMAR_TYPE_HARDWARE_UNIT:
if ( iommu_verbose )
- dprintk(VTDPREFIX, "found ACPI_DMAR_DRHD:\n");
+ printk(VTDPREFIX "found ACPI_DMAR_DRHD:\n");
ret = acpi_parse_one_drhd(entry_header);
break;
case ACPI_DMAR_TYPE_RESERVED_MEMORY:
if ( iommu_verbose )
- dprintk(VTDPREFIX, "found ACPI_DMAR_RMRR:\n");
+ printk(VTDPREFIX "found ACPI_DMAR_RMRR:\n");
ret = acpi_parse_one_rmrr(entry_header);
break;
case ACPI_DMAR_TYPE_ATSR:
if ( iommu_verbose )
- dprintk(VTDPREFIX, "found ACPI_DMAR_ATSR:\n");
+ printk(VTDPREFIX "found ACPI_DMAR_ATSR:\n");
ret = acpi_parse_one_atsr(entry_header);
break;
case ACPI_DMAR_HARDWARE_AFFINITY:
if ( iommu_verbose )
- dprintk(VTDPREFIX, "found ACPI_DMAR_RHSA:\n");
+ printk(VTDPREFIX "found ACPI_DMAR_RHSA:\n");
ret = acpi_parse_one_rhsa(entry_header);
break;
default:
--- a/xen/drivers/passthrough/vtd/iommu.c
+++ b/xen/drivers/passthrough/vtd/iommu.c
@@ -713,20 +713,18 @@ static void iommu_enable_translation(str
{
if ( force_iommu )
panic("BIOS did not enable IGD for VT properly, crash Xen for security purpose");
- else
- {
- dprintk(XENLOG_WARNING VTDPREFIX,
- "BIOS did not enable IGD for VT properly. Disabling IGD VT-d engine.\n");
- return;
- }
+
+ printk(XENLOG_WARNING VTDPREFIX
+ "BIOS did not enable IGD for VT properly. Disabling IGD VT-d engine.\n");
+ return;
}
/* apply platform specific errata workarounds */
vtd_ops_preamble_quirk(iommu);
if ( iommu_verbose )
- dprintk(VTDPREFIX,
- "iommu_enable_translation: iommu->reg = %p\n", iommu->reg);
+ printk(VTDPREFIX "iommu_enable_translation: iommu->reg = %p\n",
+ iommu->reg);
spin_lock_irqsave(&iommu->register_lock, flags);
sts = dmar_readl(iommu->reg, DMAR_GSTS_REG);
dmar_writel(iommu->reg, DMAR_GCMD_REG, sts | DMA_GCMD_TE);
@@ -1150,11 +1148,10 @@ int __init iommu_alloc(struct acpi_drhd_
if ( iommu_verbose )
{
- dprintk(VTDPREFIX,
- "drhd->address = %"PRIx64" iommu->reg = %p\n",
- drhd->address, iommu->reg);
- dprintk(VTDPREFIX,
- "cap = %"PRIx64" ecap = %"PRIx64"\n", iommu->cap, iommu->ecap);
+ printk(VTDPREFIX "drhd->address = %"PRIx64" iommu->reg = %p\n",
+ drhd->address, iommu->reg);
+ printk(VTDPREFIX "cap = %"PRIx64" ecap = %"PRIx64"\n",
+ iommu->cap, iommu->ecap);
}
if ( !(iommu->cap + 1) || !(iommu->ecap + 1) )
return -ENODEV;
@@ -1163,7 +1160,7 @@ int __init iommu_alloc(struct acpi_drhd_
cap_num_fault_regs(iommu->cap) * PRIMARY_FAULT_REG_LEN >= PAGE_SIZE ||
ecap_iotlb_offset(iommu->ecap) >= PAGE_SIZE )
{
- dprintk(XENLOG_ERR VTDPREFIX, "IOMMU: unsupported\n");
+ printk(XENLOG_ERR VTDPREFIX "IOMMU: unsupported\n");
print_iommu_regs(drhd);
return -ENODEV;
}
@@ -1175,8 +1172,7 @@ int __init iommu_alloc(struct acpi_drhd_
break;
if ( agaw < 0 )
{
- dprintk(XENLOG_ERR VTDPREFIX,
- "IOMMU: unsupported sagaw %lx\n", sagaw);
+ printk(XENLOG_ERR VTDPREFIX "IOMMU: unsupported sagaw %lx\n", sagaw);
print_iommu_regs(drhd);
return -ENODEV;
}
@@ -1433,10 +1429,10 @@ static int domain_context_mapping(
switch ( pdev->type )
{
case DEV_TYPE_PCI_HOST_BRIDGE:
- if ( iommu_verbose )
- dprintk(VTDPREFIX, "d%d:Hostbridge: skip %04x:%02x:%02x.%u map\n",
- domain->domain_id, seg, bus,
- PCI_SLOT(devfn), PCI_FUNC(devfn));
+ if ( iommu_debug )
+ printk(VTDPREFIX "d%d:Hostbridge: skip %04x:%02x:%02x.%u map\n",
+ domain->domain_id, seg, bus,
+ PCI_SLOT(devfn), PCI_FUNC(devfn));
if ( !is_hardware_domain(domain) )
return -EPERM;
break;
@@ -1447,10 +1443,10 @@ static int domain_context_mapping(
break;
case DEV_TYPE_PCIe_ENDPOINT:
- if ( iommu_verbose )
- dprintk(VTDPREFIX, "d%d:PCIe: map %04x:%02x:%02x.%u\n",
- domain->domain_id, seg, bus,
- PCI_SLOT(devfn), PCI_FUNC(devfn));
+ if ( iommu_debug )
+ printk(VTDPREFIX "d%d:PCIe: map %04x:%02x:%02x.%u\n",
+ domain->domain_id, seg, bus,
+ PCI_SLOT(devfn), PCI_FUNC(devfn));
ret = domain_context_mapping_one(domain, drhd->iommu, bus, devfn,
pdev);
if ( !ret && devfn == pdev->devfn && ats_device(pdev, drhd) > 0 )
@@ -1459,10 +1455,10 @@ static int domain_context_mapping(
break;
case DEV_TYPE_PCI:
- if ( iommu_verbose )
- dprintk(VTDPREFIX, "d%d:PCI: map %04x:%02x:%02x.%u\n",
- domain->domain_id, seg, bus,
- PCI_SLOT(devfn), PCI_FUNC(devfn));
+ if ( iommu_debug )
+ printk(VTDPREFIX "d%d:PCI: map %04x:%02x:%02x.%u\n",
+ domain->domain_id, seg, bus,
+ PCI_SLOT(devfn), PCI_FUNC(devfn));
ret = domain_context_mapping_one(domain, drhd->iommu, bus, devfn,
pdev);
@@ -1572,10 +1568,10 @@ static int domain_context_unmap(
switch ( pdev->type )
{
case DEV_TYPE_PCI_HOST_BRIDGE:
- if ( iommu_verbose )
- dprintk(VTDPREFIX, "d%d:Hostbridge: skip %04x:%02x:%02x.%u unmap\n",
- domain->domain_id, seg, bus,
- PCI_SLOT(devfn), PCI_FUNC(devfn));
+ if ( iommu_debug )
+ printk(VTDPREFIX "d%d:Hostbridge: skip %04x:%02x:%02x.%u unmap\n",
+ domain->domain_id, seg, bus,
+ PCI_SLOT(devfn), PCI_FUNC(devfn));
if ( !is_hardware_domain(domain) )
return -EPERM;
goto out;
@@ -1586,10 +1582,10 @@ static int domain_context_unmap(
goto out;
case DEV_TYPE_PCIe_ENDPOINT:
- if ( iommu_verbose )
- dprintk(VTDPREFIX, "d%d:PCIe: unmap %04x:%02x:%02x.%u\n",
- domain->domain_id, seg, bus,
- PCI_SLOT(devfn), PCI_FUNC(devfn));
+ if ( iommu_debug )
+ printk(VTDPREFIX "d%d:PCIe: unmap %04x:%02x:%02x.%u\n",
+ domain->domain_id, seg, bus,
+ PCI_SLOT(devfn), PCI_FUNC(devfn));
ret = domain_context_unmap_one(domain, iommu, bus, devfn);
if ( !ret && devfn == pdev->devfn && ats_device(pdev, drhd) > 0 )
disable_ats_device(seg, bus, devfn);
@@ -1597,9 +1593,9 @@ static int domain_context_unmap(
break;
case DEV_TYPE_PCI:
- if ( iommu_verbose )
- dprintk(VTDPREFIX, "d%d:PCI: unmap %04x:%02x:%02x.%u\n",
- domain->domain_id, seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn));
+ if ( iommu_debug )
+ printk(VTDPREFIX "d%d:PCI: unmap %04x:%02x:%02x.%u\n",
+ domain->domain_id, seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn));
ret = domain_context_unmap_one(domain, iommu, bus, devfn);
if ( ret )
break;
[-- Attachment #3: Type: text/plain, Size: 126 bytes --]
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH 4/4] IOMMU: unhide messages useful for diagnostics
2015-12-21 14:28 [PATCH 0/4] XSA-169 follow-up Jan Beulich
` (2 preceding siblings ...)
2015-12-21 14:35 ` [PATCH 3/4] VT-d: unhide messages needed for diagnosing firmware issues Jan Beulich
@ 2015-12-21 14:35 ` Jan Beulich
3 siblings, 0 replies; 10+ messages in thread
From: Jan Beulich @ 2015-12-21 14:35 UTC (permalink / raw)
To: xen-devel
[-- Attachment #1: Type: text/plain, Size: 2423 bytes --]
Undue use of dprintk() lead to many messages useful in diagnosing
issues in the field now being hidden in non-debug (i.e. production)
builds. Re-surface them.
Signed-off-by: Jan Beulich <jbeulich@suse.com>
--- a/xen/drivers/passthrough/io.c
+++ b/xen/drivers/passthrough/io.c
@@ -543,10 +543,10 @@ int pt_irq_create_bind(
spin_unlock(&d->event_lock);
if ( iommu_verbose )
- dprintk(XENLOG_G_INFO,
- "d%d: bind: m_gsi=%u g_gsi=%u dev=%02x.%02x.%u intx=%u\n",
- d->domain_id, pirq, guest_gsi, bus,
- PCI_SLOT(device), PCI_FUNC(device), intx);
+ printk(XENLOG_G_INFO
+ "d%d: bind: m_gsi=%u g_gsi=%u dev=%02x.%02x.%u intx=%u\n",
+ d->domain_id, pirq, guest_gsi, bus,
+ PCI_SLOT(device), PCI_FUNC(device), intx);
break;
}
@@ -576,11 +576,11 @@ int pt_irq_destroy_bind(
unsigned int device = pt_irq_bind->u.pci.device;
unsigned int intx = pt_irq_bind->u.pci.intx;
- dprintk(XENLOG_G_INFO,
- "d%d: unbind: m_gsi=%u g_gsi=%u dev=%02x:%02x.%u intx=%u\n",
- d->domain_id, machine_gsi, hvm_pci_intx_gsi(device, intx),
- pt_irq_bind->u.pci.bus,
- PCI_SLOT(device), PCI_FUNC(device), intx);
+ printk(XENLOG_G_INFO
+ "d%d: unbind: m_gsi=%u g_gsi=%u dev=%02x:%02x.%u intx=%u\n",
+ d->domain_id, machine_gsi, hvm_pci_intx_gsi(device, intx),
+ pt_irq_bind->u.pci.bus,
+ PCI_SLOT(device), PCI_FUNC(device), intx);
}
break;
case PT_IRQ_TYPE_MSI:
@@ -676,10 +676,10 @@ int pt_irq_destroy_bind(
{
unsigned int device = pt_irq_bind->u.pci.device;
- dprintk(XENLOG_G_INFO,
- "d%d %s unmap: m_irq=%u dev=%02x:%02x.%u intx=%u\n",
- d->domain_id, what, machine_gsi, pt_irq_bind->u.pci.bus,
- PCI_SLOT(device), PCI_FUNC(device), pt_irq_bind->u.pci.intx);
+ printk(XENLOG_G_INFO
+ "d%d %s unmap: m_irq=%u dev=%02x:%02x.%u intx=%u\n",
+ d->domain_id, what, machine_gsi, pt_irq_bind->u.pci.bus,
+ PCI_SLOT(device), PCI_FUNC(device), pt_irq_bind->u.pci.intx);
}
return 0;
[-- Attachment #2: IOMMU-logging.patch --]
[-- Type: text/plain, Size: 2466 bytes --]
IOMMU: unhide messages useful for diagnostics
Undue use of dprintk() lead to many messages useful in diagnosing
issues in the field now being hidden in non-debug (i.e. production)
builds. Re-surface them.
Signed-off-by: Jan Beulich <jbeulich@suse.com>
--- a/xen/drivers/passthrough/io.c
+++ b/xen/drivers/passthrough/io.c
@@ -543,10 +543,10 @@ int pt_irq_create_bind(
spin_unlock(&d->event_lock);
if ( iommu_verbose )
- dprintk(XENLOG_G_INFO,
- "d%d: bind: m_gsi=%u g_gsi=%u dev=%02x.%02x.%u intx=%u\n",
- d->domain_id, pirq, guest_gsi, bus,
- PCI_SLOT(device), PCI_FUNC(device), intx);
+ printk(XENLOG_G_INFO
+ "d%d: bind: m_gsi=%u g_gsi=%u dev=%02x.%02x.%u intx=%u\n",
+ d->domain_id, pirq, guest_gsi, bus,
+ PCI_SLOT(device), PCI_FUNC(device), intx);
break;
}
@@ -576,11 +576,11 @@ int pt_irq_destroy_bind(
unsigned int device = pt_irq_bind->u.pci.device;
unsigned int intx = pt_irq_bind->u.pci.intx;
- dprintk(XENLOG_G_INFO,
- "d%d: unbind: m_gsi=%u g_gsi=%u dev=%02x:%02x.%u intx=%u\n",
- d->domain_id, machine_gsi, hvm_pci_intx_gsi(device, intx),
- pt_irq_bind->u.pci.bus,
- PCI_SLOT(device), PCI_FUNC(device), intx);
+ printk(XENLOG_G_INFO
+ "d%d: unbind: m_gsi=%u g_gsi=%u dev=%02x:%02x.%u intx=%u\n",
+ d->domain_id, machine_gsi, hvm_pci_intx_gsi(device, intx),
+ pt_irq_bind->u.pci.bus,
+ PCI_SLOT(device), PCI_FUNC(device), intx);
}
break;
case PT_IRQ_TYPE_MSI:
@@ -676,10 +676,10 @@ int pt_irq_destroy_bind(
{
unsigned int device = pt_irq_bind->u.pci.device;
- dprintk(XENLOG_G_INFO,
- "d%d %s unmap: m_irq=%u dev=%02x:%02x.%u intx=%u\n",
- d->domain_id, what, machine_gsi, pt_irq_bind->u.pci.bus,
- PCI_SLOT(device), PCI_FUNC(device), pt_irq_bind->u.pci.intx);
+ printk(XENLOG_G_INFO
+ "d%d %s unmap: m_irq=%u dev=%02x:%02x.%u intx=%u\n",
+ d->domain_id, what, machine_gsi, pt_irq_bind->u.pci.bus,
+ PCI_SLOT(device), PCI_FUNC(device), pt_irq_bind->u.pci.intx);
}
return 0;
[-- Attachment #3: Type: text/plain, Size: 126 bytes --]
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 2/4] x86: misc printk() adjustments
2015-12-21 14:34 ` [PATCH 2/4] x86: misc printk() adjustments Jan Beulich
@ 2015-12-21 14:41 ` Andrew Cooper
2015-12-21 14:48 ` Jan Beulich
0 siblings, 1 reply; 10+ messages in thread
From: Andrew Cooper @ 2015-12-21 14:41 UTC (permalink / raw)
To: Jan Beulich, xen-devel; +Cc: Keir Fraser
On 21/12/15 14:34, Jan Beulich wrote:
> --- a/xen/arch/x86/io_apic.c
> +++ b/xen/arch/x86/io_apic.c
> @@ -2310,13 +2310,14 @@ int ioapic_guest_read(unsigned long phys
> return 0;
> }
>
> -#define WARN_BOGUS_WRITE(f, a...) \
> - dprintk(XENLOG_INFO, "\n%s: " \
> - "apic=%d, pin=%d, irq=%d\n" \
> - "%s: new_entry=%08x\n" \
> - "%s: " f, __FUNCTION__, apic, pin, irq, \
> - __FUNCTION__, *(u32 *)&rte, \
> - __FUNCTION__ , ##a )
> +#define WARN_BOGUS_WRITE(f, a...) \
> + dprintk(XENLOG_INFO, "\n" \
> + XENLOG_INFO "%s: apic=%d, pin=%d, irq=%d\n" \
> + XENLOG_INFO "%s: new_entry=%08x\n" \
> + XENLOG_INFO "%s: " f "\n", \
> + __func__, apic, pin, irq, \
> + __func__, *(u32 *)&rte, \
> + __func__, ##a )
>
> int ioapic_guest_write(unsigned long physbase, unsigned int reg, u32 val)
> {
> @@ -2388,7 +2389,7 @@ int ioapic_guest_write(unsigned long phy
> rte.vector = desc->arch.vector;
> if ( *(u32*)&rte != ret )
> WARN_BOGUS_WRITE("old_entry=%08x pirq=%d\n%s: "
> - "Attempt to modify IO-APIC pin for in-use IRQ!\n",
> + "Attempt to modify IO-APIC pin for in-use IRQ!",
> ret, pirq, __FUNCTION__);
Given that this is the sole user of WARN_BOGUS_WRITE(), I would
recommend folding it all together in a simple dprintk(), and remove some
of the redundant information, and fixing the resulting message to take
up fewer lines.
~Andrew
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 2/4] x86: misc printk() adjustments
2015-12-21 14:41 ` Andrew Cooper
@ 2015-12-21 14:48 ` Jan Beulich
2015-12-22 11:48 ` Andrew Cooper
0 siblings, 1 reply; 10+ messages in thread
From: Jan Beulich @ 2015-12-21 14:48 UTC (permalink / raw)
To: Andrew Cooper; +Cc: xen-devel, Keir Fraser
>>> On 21.12.15 at 15:41, <andrew.cooper3@citrix.com> wrote:
> On 21/12/15 14:34, Jan Beulich wrote:
>> --- a/xen/arch/x86/io_apic.c
>> +++ b/xen/arch/x86/io_apic.c
>> @@ -2310,13 +2310,14 @@ int ioapic_guest_read(unsigned long phys
>> return 0;
>> }
>>
>> -#define WARN_BOGUS_WRITE(f, a...) \
>> - dprintk(XENLOG_INFO, "\n%s: " \
>> - "apic=%d, pin=%d, irq=%d\n" \
>> - "%s: new_entry=%08x\n" \
>> - "%s: " f, __FUNCTION__, apic, pin, irq, \
>> - __FUNCTION__, *(u32 *)&rte, \
>> - __FUNCTION__ , ##a )
>> +#define WARN_BOGUS_WRITE(f, a...) \
>> + dprintk(XENLOG_INFO, "\n" \
>> + XENLOG_INFO "%s: apic=%d, pin=%d, irq=%d\n" \
>> + XENLOG_INFO "%s: new_entry=%08x\n" \
>> + XENLOG_INFO "%s: " f "\n", \
>> + __func__, apic, pin, irq, \
>> + __func__, *(u32 *)&rte, \
>> + __func__, ##a )
>>
>> int ioapic_guest_write(unsigned long physbase, unsigned int reg, u32 val)
>> {
>> @@ -2388,7 +2389,7 @@ int ioapic_guest_write(unsigned long phy
>> rte.vector = desc->arch.vector;
>> if ( *(u32*)&rte != ret )
>> WARN_BOGUS_WRITE("old_entry=%08x pirq=%d\n%s: "
>> - "Attempt to modify IO-APIC pin for in-use IRQ!\n",
>> + "Attempt to modify IO-APIC pin for in-use IRQ!",
>> ret, pirq, __FUNCTION__);
>
> Given that this is the sole user of WARN_BOGUS_WRITE(), I would
> recommend folding it all together in a simple dprintk(), and remove some
> of the redundant information, and fixing the resulting message to take
> up fewer lines.
If you feel strongly about this I could certainly do so, but I did
consider that option and decided against it to retain the option
of using the macro (again?) in a second place.
Jan
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 1/4] arm: add missing newlines to printk()s
2015-12-21 14:33 ` [PATCH 1/4] arm: add missing newlines to printk()s Jan Beulich
@ 2015-12-21 15:16 ` Stefano Stabellini
0 siblings, 0 replies; 10+ messages in thread
From: Stefano Stabellini @ 2015-12-21 15:16 UTC (permalink / raw)
To: Jan Beulich; +Cc: Ian Campbell, xen-devel, Stefano Stabellini
On Mon, 21 Dec 2015, Jan Beulich wrote:
> Signed-off-by: Jan Beulich <jbeulich@suse.com>
Acked-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
> --- a/xen/arch/arm/platforms/brcm.c
> +++ b/xen/arch/arm/platforms/brcm.c
> @@ -162,7 +162,7 @@ static int brcm_cpu_power_on(int cpu)
>
> if ( timeout == 0 )
> {
> - dprintk(XENLOG_ERR, "CPU%d power enable failed", cpu);
> + dprintk(XENLOG_ERR, "CPU%d power enable failed\n", cpu);
> return -ETIMEDOUT;
> }
>
> --- a/xen/arch/arm/platforms/exynos5.c
> +++ b/xen/arch/arm/platforms/exynos5.c
> @@ -183,7 +183,7 @@ static int exynos5_cpu_power_up(void __i
>
> if ( timeout == 0 )
> {
> - dprintk(XENLOG_ERR, "CPU%d power enable failed", cpu);
> + dprintk(XENLOG_ERR, "CPU%d power enable failed\n", cpu);
> return -ETIMEDOUT;
> }
> }
>
>
>
>
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 3/4] VT-d: unhide messages needed for diagnosing firmware issues
2015-12-21 14:35 ` [PATCH 3/4] VT-d: unhide messages needed for diagnosing firmware issues Jan Beulich
@ 2015-12-22 1:33 ` Wu, Feng
0 siblings, 0 replies; 10+ messages in thread
From: Wu, Feng @ 2015-12-22 1:33 UTC (permalink / raw)
To: Jan Beulich, xen-devel; +Cc: Tian, Kevin, Wu, Feng
> -----Original Message-----
> From: Jan Beulich [mailto:JBeulich@suse.com]
> Sent: Monday, December 21, 2015 10:35 PM
> To: xen-devel <xen-devel@lists.xenproject.org>
> Cc: Wu, Feng <feng.wu@intel.com>; Tian, Kevin <kevin.tian@intel.com>
> Subject: [PATCH 3/4] VT-d: unhide messages needed for diagnosing firmware
> issues
>
> Undue use of dprintk() lead to many messages useful in diagnosing
> issues in the field now being hidden in non-debug (i.e. production)
> builds. Re-surface them, namely when init-time only and/or already
> guarded by iommu_{verbose,debug} conditionals. Switch from using
> iommu_verbose to iommu_debug in a couple of runtime cases.
>
> Signed-off-by: Jan Beulich <jbeulich@suse.com>
Acked-by: Feng Wu <feng.wu@intel.com>
Thanks,
Feng
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 2/4] x86: misc printk() adjustments
2015-12-21 14:48 ` Jan Beulich
@ 2015-12-22 11:48 ` Andrew Cooper
0 siblings, 0 replies; 10+ messages in thread
From: Andrew Cooper @ 2015-12-22 11:48 UTC (permalink / raw)
To: Jan Beulich; +Cc: xen-devel, Keir Fraser
On 21/12/15 14:48, Jan Beulich wrote:
>>>> On 21.12.15 at 15:41, <andrew.cooper3@citrix.com> wrote:
>> On 21/12/15 14:34, Jan Beulich wrote:
>>> --- a/xen/arch/x86/io_apic.c
>>> +++ b/xen/arch/x86/io_apic.c
>>> @@ -2310,13 +2310,14 @@ int ioapic_guest_read(unsigned long phys
>>> return 0;
>>> }
>>>
>>> -#define WARN_BOGUS_WRITE(f, a...) \
>>> - dprintk(XENLOG_INFO, "\n%s: " \
>>> - "apic=%d, pin=%d, irq=%d\n" \
>>> - "%s: new_entry=%08x\n" \
>>> - "%s: " f, __FUNCTION__, apic, pin, irq, \
>>> - __FUNCTION__, *(u32 *)&rte, \
>>> - __FUNCTION__ , ##a )
>>> +#define WARN_BOGUS_WRITE(f, a...) \
>>> + dprintk(XENLOG_INFO, "\n" \
>>> + XENLOG_INFO "%s: apic=%d, pin=%d, irq=%d\n" \
>>> + XENLOG_INFO "%s: new_entry=%08x\n" \
>>> + XENLOG_INFO "%s: " f "\n", \
>>> + __func__, apic, pin, irq, \
>>> + __func__, *(u32 *)&rte, \
>>> + __func__, ##a )
>>>
>>> int ioapic_guest_write(unsigned long physbase, unsigned int reg, u32 val)
>>> {
>>> @@ -2388,7 +2389,7 @@ int ioapic_guest_write(unsigned long phy
>>> rte.vector = desc->arch.vector;
>>> if ( *(u32*)&rte != ret )
>>> WARN_BOGUS_WRITE("old_entry=%08x pirq=%d\n%s: "
>>> - "Attempt to modify IO-APIC pin for in-use IRQ!\n",
>>> + "Attempt to modify IO-APIC pin for in-use IRQ!",
>>> ret, pirq, __FUNCTION__);
>> Given that this is the sole user of WARN_BOGUS_WRITE(), I would
>> recommend folding it all together in a simple dprintk(), and remove some
>> of the redundant information, and fixing the resulting message to take
>> up fewer lines.
> If you feel strongly about this I could certainly do so, but I did
> consider that option and decided against it to retain the option
> of using the macro (again?) in a second place.
I don't forsee it being useful to use again.
Either way, Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>
~Andrew
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2015-12-22 11:48 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-12-21 14:28 [PATCH 0/4] XSA-169 follow-up Jan Beulich
2015-12-21 14:33 ` [PATCH 1/4] arm: add missing newlines to printk()s Jan Beulich
2015-12-21 15:16 ` Stefano Stabellini
2015-12-21 14:34 ` [PATCH 2/4] x86: misc printk() adjustments Jan Beulich
2015-12-21 14:41 ` Andrew Cooper
2015-12-21 14:48 ` Jan Beulich
2015-12-22 11:48 ` Andrew Cooper
2015-12-21 14:35 ` [PATCH 3/4] VT-d: unhide messages needed for diagnosing firmware issues Jan Beulich
2015-12-22 1:33 ` Wu, Feng
2015-12-21 14:35 ` [PATCH 4/4] IOMMU: unhide messages useful for diagnostics Jan Beulich
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.