Accepting request 69993 from Virtualization
- bnc#691256 - move modprobe of xen backend modules from xend to xencommons initscript tmp-initscript-modprobe.patch - bnc#691738 - Xen does not find device create with npiv block xen-qemu-iscsi-fix.patch - Upstream patches from Jan 22998-x86-get_page_from_l1e-retcode.patch 22999-x86-mod_l1_entry-retcode.patch 23000-x86-mod_l2_entry-retcode.patch 23096-x86-hpet-no-cpumask_lock.patch 23099-x86-rwlock-scalability.patch 23103-x86-pirq-guest-eoi-check.patch 23127-vtd-bios-settings.patch 23153-x86-amd-clear-DramModEn.patch 23154-x86-amd-iorr-no-rdwr.patch 23199-amd-iommu-unmapped-intr-fault.patch 23200-amd-iommu-intremap-sync.patch 23228-x86-conditional-write_tsc.patch - update xenalyze to revision 98 * Unify setting of vcpu data type * Unify record size checks * Fix cr3_switch not to access hvm struct before it's initialized - add xenalyze.gcc46.patch to fix unused-but-set-variable errors - bnc#688473 - VUL-0: potential buffer overflow in tools cve-2011-1583-4.0.patch OBS-URL: https://build.opensuse.org/request/show/69993 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/xen?expand=0&rev=133
This commit is contained in:
commit
670e49529b
236
22998-x86-get_page_from_l1e-retcode.patch
Normal file
236
22998-x86-get_page_from_l1e-retcode.patch
Normal file
@ -0,0 +1,236 @@
|
|||||||
|
References: bnc#675363
|
||||||
|
|
||||||
|
# HG changeset patch
|
||||||
|
# User Keir Fraser <keir@xen.org>
|
||||||
|
# Date 1299687371 0
|
||||||
|
# Node ID e9fab50d7b61d151d51a4b1088930c9e1ca2da47
|
||||||
|
# Parent 5f28dcea13555f7ab948c9cb95de3e79e0fbfc4b
|
||||||
|
x86: make get_page_from_l1e() return a proper error code
|
||||||
|
|
||||||
|
... so that the guest can actually know the reason for the (hypercall)
|
||||||
|
failure.
|
||||||
|
|
||||||
|
ptwr_do_page_fault() could propagate the error indicator received from
|
||||||
|
get_page_from_l1e() back to the guest in the high half of the error
|
||||||
|
code (entry_vector), provided we're sure all existing guests can deal
|
||||||
|
with that (or indicate so by means of a to-be-added guest feature
|
||||||
|
flag). Alternatively, a second virtual status register (like CR2)
|
||||||
|
could be introduced.
|
||||||
|
|
||||||
|
Signed-off-by: Jan Beulich <jbeulich@novell.com>
|
||||||
|
|
||||||
|
--- a/xen/arch/x86/mm/shadow/multi.c
|
||||||
|
+++ b/xen/arch/x86/mm/shadow/multi.c
|
||||||
|
@@ -872,7 +872,7 @@ shadow_get_page_from_l1e(shadow_l1e_t sl
|
||||||
|
// If a privileged domain is attempting to install a map of a page it does
|
||||||
|
// not own, we let it succeed anyway.
|
||||||
|
//
|
||||||
|
- if ( unlikely(!res) &&
|
||||||
|
+ if ( unlikely(res < 0) &&
|
||||||
|
!shadow_mode_translate(d) &&
|
||||||
|
mfn_valid(mfn = shadow_l1e_get_mfn(sl1e)) &&
|
||||||
|
(owner = page_get_owner(mfn_to_page(mfn))) &&
|
||||||
|
@@ -883,11 +883,11 @@ shadow_get_page_from_l1e(shadow_l1e_t sl
|
||||||
|
SHADOW_PRINTK("privileged domain %d installs map of mfn %05lx "
|
||||||
|
"which is owned by domain %d: %s\n",
|
||||||
|
d->domain_id, mfn_x(mfn), owner->domain_id,
|
||||||
|
- res ? "success" : "failed");
|
||||||
|
+ res >= 0 ? "success" : "failed");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Okay, it might still be a grant mapping PTE. Try it. */
|
||||||
|
- if ( unlikely(!res) &&
|
||||||
|
+ if ( unlikely(res < 0) &&
|
||||||
|
(type == p2m_grant_map_rw ||
|
||||||
|
(type == p2m_grant_map_ro &&
|
||||||
|
!(shadow_l1e_get_flags(sl1e) & _PAGE_RW))) )
|
||||||
|
@@ -900,7 +900,7 @@ shadow_get_page_from_l1e(shadow_l1e_t sl
|
||||||
|
res = get_page_from_l1e(sl1e, d, page_get_owner(mfn_to_page(mfn)));
|
||||||
|
}
|
||||||
|
|
||||||
|
- if ( unlikely(!res) )
|
||||||
|
+ if ( unlikely(res < 0) )
|
||||||
|
{
|
||||||
|
perfc_incr(shadow_get_page_fail);
|
||||||
|
SHADOW_PRINTK("failed: l1e=" SH_PRI_pte "\n");
|
||||||
|
@@ -1229,15 +1229,15 @@ static int shadow_set_l1e(struct vcpu *v
|
||||||
|
TRACE_SHADOW_PATH_FLAG(TRCE_SFLAG_SHADOW_L1_GET_REF);
|
||||||
|
switch ( shadow_get_page_from_l1e(new_sl1e, d, new_type) )
|
||||||
|
{
|
||||||
|
- case 0:
|
||||||
|
+ default:
|
||||||
|
/* Doesn't look like a pagetable. */
|
||||||
|
flags |= SHADOW_SET_ERROR;
|
||||||
|
new_sl1e = shadow_l1e_empty();
|
||||||
|
break;
|
||||||
|
- case -1:
|
||||||
|
+ case 1:
|
||||||
|
shadow_l1e_remove_flags(new_sl1e, _PAGE_RW);
|
||||||
|
/* fall through */
|
||||||
|
- default:
|
||||||
|
+ case 0:
|
||||||
|
shadow_vram_get_l1e(new_sl1e, sl1e, sl1mfn, d);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
--- a/xen/arch/x86/mm.c
|
||||||
|
+++ b/xen/arch/x86/mm.c
|
||||||
|
@@ -799,12 +799,12 @@ get_page_from_l1e(
|
||||||
|
bool_t write;
|
||||||
|
|
||||||
|
if ( !(l1f & _PAGE_PRESENT) )
|
||||||
|
- return 1;
|
||||||
|
+ return 0;
|
||||||
|
|
||||||
|
if ( unlikely(l1f & l1_disallow_mask(l1e_owner)) )
|
||||||
|
{
|
||||||
|
MEM_LOG("Bad L1 flags %x", l1f & l1_disallow_mask(l1e_owner));
|
||||||
|
- return 0;
|
||||||
|
+ return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( !mfn_valid(mfn) ||
|
||||||
|
@@ -821,18 +821,21 @@ get_page_from_l1e(
|
||||||
|
if ( !iomem_access_permitted(pg_owner, mfn, mfn) )
|
||||||
|
{
|
||||||
|
if ( mfn != (PADDR_MASK >> PAGE_SHIFT) ) /* INVALID_MFN? */
|
||||||
|
+ {
|
||||||
|
MEM_LOG("Non-privileged (%u) attempt to map I/O space %08lx",
|
||||||
|
pg_owner->domain_id, mfn);
|
||||||
|
- return 0;
|
||||||
|
+ return -EPERM;
|
||||||
|
+ }
|
||||||
|
+ return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( !(l1f & _PAGE_RW) || IS_PRIV(pg_owner) ||
|
||||||
|
!rangeset_contains_singleton(mmio_ro_ranges, mfn) )
|
||||||
|
- return 1;
|
||||||
|
+ return 0;
|
||||||
|
dprintk(XENLOG_G_WARNING,
|
||||||
|
"d%d: Forcing read-only access to MFN %lx\n",
|
||||||
|
l1e_owner->domain_id, mfn);
|
||||||
|
- return -1;
|
||||||
|
+ return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( unlikely(real_pg_owner != pg_owner) )
|
||||||
|
@@ -863,6 +866,7 @@ get_page_from_l1e(
|
||||||
|
{
|
||||||
|
unsigned long x, nx, y = page->count_info;
|
||||||
|
unsigned long cacheattr = pte_flags_to_cacheattr(l1f);
|
||||||
|
+ int err;
|
||||||
|
|
||||||
|
if ( is_xen_heap_page(page) )
|
||||||
|
{
|
||||||
|
@@ -870,7 +874,7 @@ get_page_from_l1e(
|
||||||
|
put_page_type(page);
|
||||||
|
put_page(page);
|
||||||
|
MEM_LOG("Attempt to change cache attributes of Xen heap page");
|
||||||
|
- return 0;
|
||||||
|
+ return -EACCES;
|
||||||
|
}
|
||||||
|
|
||||||
|
do {
|
||||||
|
@@ -878,7 +882,8 @@ get_page_from_l1e(
|
||||||
|
nx = (x & ~PGC_cacheattr_mask) | (cacheattr << PGC_cacheattr_base);
|
||||||
|
} while ( (y = cmpxchg(&page->count_info, x, nx)) != x );
|
||||||
|
|
||||||
|
- if ( unlikely(update_xen_mappings(mfn, cacheattr) != 0) )
|
||||||
|
+ err = update_xen_mappings(mfn, cacheattr);
|
||||||
|
+ if ( unlikely(err) )
|
||||||
|
{
|
||||||
|
cacheattr = y & PGC_cacheattr_mask;
|
||||||
|
do {
|
||||||
|
@@ -894,11 +899,11 @@ get_page_from_l1e(
|
||||||
|
" from L1 entry %" PRIpte ") for %d",
|
||||||
|
mfn, get_gpfn_from_mfn(mfn),
|
||||||
|
l1e_get_intpte(l1e), l1e_owner->domain_id);
|
||||||
|
- return 0;
|
||||||
|
+ return err;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- return 1;
|
||||||
|
+ return 0;
|
||||||
|
|
||||||
|
could_not_pin:
|
||||||
|
MEM_LOG("Error getting mfn %lx (pfn %lx) from L1 entry %" PRIpte
|
||||||
|
@@ -907,7 +912,7 @@ get_page_from_l1e(
|
||||||
|
l1e_get_intpte(l1e), l1e_owner->domain_id, pg_owner->domain_id);
|
||||||
|
if ( real_pg_owner != NULL )
|
||||||
|
put_page(page);
|
||||||
|
- return 0;
|
||||||
|
+ return -EBUSY;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@@ -1197,17 +1202,20 @@ static int alloc_l1_table(struct page_in
|
||||||
|
unsigned long pfn = page_to_mfn(page);
|
||||||
|
l1_pgentry_t *pl1e;
|
||||||
|
unsigned int i;
|
||||||
|
+ int ret = 0;
|
||||||
|
|
||||||
|
pl1e = map_domain_page(pfn);
|
||||||
|
|
||||||
|
for ( i = 0; i < L1_PAGETABLE_ENTRIES; i++ )
|
||||||
|
{
|
||||||
|
if ( is_guest_l1_slot(i) )
|
||||||
|
- switch ( get_page_from_l1e(pl1e[i], d, d) )
|
||||||
|
+ switch ( ret = get_page_from_l1e(pl1e[i], d, d) )
|
||||||
|
{
|
||||||
|
- case 0:
|
||||||
|
+ default:
|
||||||
|
goto fail;
|
||||||
|
- case -1:
|
||||||
|
+ case 0:
|
||||||
|
+ break;
|
||||||
|
+ case 1:
|
||||||
|
l1e_remove_flags(pl1e[i], _PAGE_RW);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
@@ -1225,7 +1233,7 @@ static int alloc_l1_table(struct page_in
|
||||||
|
put_page_from_l1e(pl1e[i], d);
|
||||||
|
|
||||||
|
unmap_domain_page(pl1e);
|
||||||
|
- return -EINVAL;
|
||||||
|
+ return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int create_pae_xen_mappings(struct domain *d, l3_pgentry_t *pl3e)
|
||||||
|
@@ -1794,11 +1802,13 @@ static int mod_l1_entry(l1_pgentry_t *pl
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
- switch ( get_page_from_l1e(nl1e, pt_dom, pg_dom) )
|
||||||
|
+ switch ( rc = get_page_from_l1e(nl1e, pt_dom, pg_dom) )
|
||||||
|
{
|
||||||
|
- case 0:
|
||||||
|
+ default:
|
||||||
|
return 0;
|
||||||
|
- case -1:
|
||||||
|
+ case 0:
|
||||||
|
+ break;
|
||||||
|
+ case 1:
|
||||||
|
l1e_remove_flags(nl1e, _PAGE_RW);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
@@ -4948,7 +4958,7 @@ static int ptwr_emulated_update(
|
||||||
|
nl1e = l1e_from_intpte(val);
|
||||||
|
switch ( get_page_from_l1e(nl1e, d, d) )
|
||||||
|
{
|
||||||
|
- case 0:
|
||||||
|
+ default:
|
||||||
|
if ( is_pv_32bit_domain(d) && (bytes == 4) && (unaligned_addr & 4) &&
|
||||||
|
!do_cmpxchg && (l1e_get_flags(nl1e) & _PAGE_PRESENT) )
|
||||||
|
{
|
||||||
|
@@ -4968,7 +4978,9 @@ static int ptwr_emulated_update(
|
||||||
|
return X86EMUL_UNHANDLEABLE;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
- case -1:
|
||||||
|
+ case 0:
|
||||||
|
+ break;
|
||||||
|
+ case 1:
|
||||||
|
l1e_remove_flags(nl1e, _PAGE_RW);
|
||||||
|
break;
|
||||||
|
}
|
114
22999-x86-mod_l1_entry-retcode.patch
Normal file
114
22999-x86-mod_l1_entry-retcode.patch
Normal file
@ -0,0 +1,114 @@
|
|||||||
|
References: bnc#675363
|
||||||
|
|
||||||
|
# HG changeset patch
|
||||||
|
# User Jan Beulich <jbeulich@novell.com>
|
||||||
|
# Date 1299687409 0
|
||||||
|
# Node ID 82b5f8d12903e140f957ae8d13d66e44be076b05
|
||||||
|
# Parent e9fab50d7b61d151d51a4b1088930c9e1ca2da47
|
||||||
|
x86: make mod_l1_entry() return a proper error code
|
||||||
|
|
||||||
|
... again is so that the guest can actually know the reason for the
|
||||||
|
(hypercall) failure.
|
||||||
|
|
||||||
|
Signed-off-by: Jan Beulich <jbeulich@novell.com>
|
||||||
|
|
||||||
|
--- a/xen/arch/x86/mm.c
|
||||||
|
+++ b/xen/arch/x86/mm.c
|
||||||
|
@@ -1765,15 +1765,16 @@ static int mod_l1_entry(l1_pgentry_t *pl
|
||||||
|
struct domain *pt_dom = pt_vcpu->domain;
|
||||||
|
unsigned long mfn;
|
||||||
|
p2m_type_t p2mt;
|
||||||
|
- int rc = 1;
|
||||||
|
+ int rc = 0;
|
||||||
|
|
||||||
|
if ( unlikely(__copy_from_user(&ol1e, pl1e, sizeof(ol1e)) != 0) )
|
||||||
|
- return 0;
|
||||||
|
+ return -EFAULT;
|
||||||
|
|
||||||
|
if ( unlikely(paging_mode_refcounts(pt_dom)) )
|
||||||
|
{
|
||||||
|
- rc = UPDATE_ENTRY(l1, pl1e, ol1e, nl1e, gl1mfn, pt_vcpu, preserve_ad);
|
||||||
|
- return rc;
|
||||||
|
+ if ( UPDATE_ENTRY(l1, pl1e, ol1e, nl1e, gl1mfn, pt_vcpu, preserve_ad) )
|
||||||
|
+ return 0;
|
||||||
|
+ return -EBUSY;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( l1e_get_flags(nl1e) & _PAGE_PRESENT )
|
||||||
|
@@ -1782,7 +1783,7 @@ static int mod_l1_entry(l1_pgentry_t *pl
|
||||||
|
mfn = mfn_x(gfn_to_mfn(p2m_get_hostp2m(pg_dom),
|
||||||
|
l1e_get_pfn(nl1e), &p2mt));
|
||||||
|
if ( !p2m_is_ram(p2mt) || unlikely(mfn == INVALID_MFN) )
|
||||||
|
- return 0;
|
||||||
|
+ return -EINVAL;
|
||||||
|
ASSERT((mfn & ~(PADDR_MASK >> PAGE_SHIFT)) == 0);
|
||||||
|
nl1e = l1e_from_pfn(mfn, l1e_get_flags(nl1e));
|
||||||
|
|
||||||
|
@@ -1790,22 +1791,23 @@ static int mod_l1_entry(l1_pgentry_t *pl
|
||||||
|
{
|
||||||
|
MEM_LOG("Bad L1 flags %x",
|
||||||
|
l1e_get_flags(nl1e) & l1_disallow_mask(pt_dom));
|
||||||
|
- return 0;
|
||||||
|
+ return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Fast path for identical mapping, r/w and presence. */
|
||||||
|
if ( !l1e_has_changed(ol1e, nl1e, _PAGE_RW | _PAGE_PRESENT) )
|
||||||
|
{
|
||||||
|
adjust_guest_l1e(nl1e, pt_dom);
|
||||||
|
- rc = UPDATE_ENTRY(l1, pl1e, ol1e, nl1e, gl1mfn, pt_vcpu,
|
||||||
|
- preserve_ad);
|
||||||
|
- return rc;
|
||||||
|
+ if ( UPDATE_ENTRY(l1, pl1e, ol1e, nl1e, gl1mfn, pt_vcpu,
|
||||||
|
+ preserve_ad) )
|
||||||
|
+ return 0;
|
||||||
|
+ return -EBUSY;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch ( rc = get_page_from_l1e(nl1e, pt_dom, pg_dom) )
|
||||||
|
{
|
||||||
|
default:
|
||||||
|
- return 0;
|
||||||
|
+ return rc;
|
||||||
|
case 0:
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
@@ -1818,13 +1820,13 @@ static int mod_l1_entry(l1_pgentry_t *pl
|
||||||
|
preserve_ad)) )
|
||||||
|
{
|
||||||
|
ol1e = nl1e;
|
||||||
|
- rc = 0;
|
||||||
|
+ rc = -EBUSY;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if ( unlikely(!UPDATE_ENTRY(l1, pl1e, ol1e, nl1e, gl1mfn, pt_vcpu,
|
||||||
|
preserve_ad)) )
|
||||||
|
{
|
||||||
|
- return 0;
|
||||||
|
+ return -EBUSY;
|
||||||
|
}
|
||||||
|
|
||||||
|
put_page_from_l1e(ol1e, pt_dom);
|
||||||
|
@@ -3516,9 +3518,10 @@ int do_mmu_update(
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
- okay = mod_l1_entry(va, l1e, mfn,
|
||||||
|
- cmd == MMU_PT_UPDATE_PRESERVE_AD, v,
|
||||||
|
- pg_owner);
|
||||||
|
+ rc = mod_l1_entry(va, l1e, mfn,
|
||||||
|
+ cmd == MMU_PT_UPDATE_PRESERVE_AD, v,
|
||||||
|
+ pg_owner);
|
||||||
|
+ okay = !rc;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case PGT_l2_page_table:
|
||||||
|
@@ -4300,7 +4303,7 @@ static int __do_update_va_mapping(
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
- rc = mod_l1_entry(pl1e, val, gl1mfn, 0, v, pg_owner) ? 0 : -EINVAL;
|
||||||
|
+ rc = mod_l1_entry(pl1e, val, gl1mfn, 0, v, pg_owner);
|
||||||
|
|
||||||
|
page_unlock(gl1pg);
|
||||||
|
put_page(gl1pg);
|
210
23000-x86-mod_l2_entry-retcode.patch
Normal file
210
23000-x86-mod_l2_entry-retcode.patch
Normal file
@ -0,0 +1,210 @@
|
|||||||
|
# HG changeset patch
|
||||||
|
# User Jan Beulich <jbeulich@novell.com>
|
||||||
|
# Date 1299687446 0
|
||||||
|
# Node ID d428fa67abaa0db20b915a697f1d5ba16e554185
|
||||||
|
# Parent 82b5f8d12903e140f957ae8d13d66e44be076b05
|
||||||
|
x86: make mod_l2_entry() return a proper error code
|
||||||
|
|
||||||
|
... so that finally all mod_lN_entry() functions behave identically,
|
||||||
|
allowing some cleanup in do_mmu_update() (which no longer needs to
|
||||||
|
track both an okay status and an error code).
|
||||||
|
|
||||||
|
Signed-off-by: Jan Beulich <jbeulich@novell.com>
|
||||||
|
|
||||||
|
--- a/xen/arch/x86/mm.c
|
||||||
|
+++ b/xen/arch/x86/mm.c
|
||||||
|
@@ -1845,16 +1845,16 @@ static int mod_l2_entry(l2_pgentry_t *pl
|
||||||
|
struct domain *d = vcpu->domain;
|
||||||
|
struct page_info *l2pg = mfn_to_page(pfn);
|
||||||
|
unsigned long type = l2pg->u.inuse.type_info;
|
||||||
|
- int rc = 1;
|
||||||
|
+ int rc = 0;
|
||||||
|
|
||||||
|
if ( unlikely(!is_guest_l2_slot(d, type, pgentry_ptr_to_slot(pl2e))) )
|
||||||
|
{
|
||||||
|
MEM_LOG("Illegal L2 update attempt in Xen-private area %p", pl2e);
|
||||||
|
- return 0;
|
||||||
|
+ return -EPERM;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( unlikely(__copy_from_user(&ol2e, pl2e, sizeof(ol2e)) != 0) )
|
||||||
|
- return 0;
|
||||||
|
+ return -EFAULT;
|
||||||
|
|
||||||
|
if ( l2e_get_flags(nl2e) & _PAGE_PRESENT )
|
||||||
|
{
|
||||||
|
@@ -1862,32 +1862,33 @@ static int mod_l2_entry(l2_pgentry_t *pl
|
||||||
|
{
|
||||||
|
MEM_LOG("Bad L2 flags %x",
|
||||||
|
l2e_get_flags(nl2e) & L2_DISALLOW_MASK);
|
||||||
|
- return 0;
|
||||||
|
+ return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Fast path for identical mapping and presence. */
|
||||||
|
if ( !l2e_has_changed(ol2e, nl2e, _PAGE_PRESENT) )
|
||||||
|
{
|
||||||
|
adjust_guest_l2e(nl2e, d);
|
||||||
|
- rc = UPDATE_ENTRY(l2, pl2e, ol2e, nl2e, pfn, vcpu, preserve_ad);
|
||||||
|
- return rc;
|
||||||
|
+ if ( UPDATE_ENTRY(l2, pl2e, ol2e, nl2e, pfn, vcpu, preserve_ad) )
|
||||||
|
+ return 0;
|
||||||
|
+ return -EBUSY;
|
||||||
|
}
|
||||||
|
|
||||||
|
- if ( unlikely(get_page_from_l2e(nl2e, pfn, d) < 0) )
|
||||||
|
- return 0;
|
||||||
|
+ if ( unlikely((rc = get_page_from_l2e(nl2e, pfn, d)) < 0) )
|
||||||
|
+ return rc;
|
||||||
|
|
||||||
|
adjust_guest_l2e(nl2e, d);
|
||||||
|
if ( unlikely(!UPDATE_ENTRY(l2, pl2e, ol2e, nl2e, pfn, vcpu,
|
||||||
|
preserve_ad)) )
|
||||||
|
{
|
||||||
|
ol2e = nl2e;
|
||||||
|
- rc = 0;
|
||||||
|
+ rc = -EBUSY;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if ( unlikely(!UPDATE_ENTRY(l2, pl2e, ol2e, nl2e, pfn, vcpu,
|
||||||
|
preserve_ad)) )
|
||||||
|
{
|
||||||
|
- return 0;
|
||||||
|
+ return -EBUSY;
|
||||||
|
}
|
||||||
|
|
||||||
|
put_page_from_l2e(ol2e, pfn);
|
||||||
|
@@ -3367,7 +3368,7 @@ int do_mmu_update(
|
||||||
|
void *va;
|
||||||
|
unsigned long gpfn, gmfn, mfn;
|
||||||
|
struct page_info *page;
|
||||||
|
- int rc = 0, okay = 1, i = 0;
|
||||||
|
+ int rc = 0, i = 0;
|
||||||
|
unsigned int cmd, done = 0, pt_dom;
|
||||||
|
struct vcpu *v = current;
|
||||||
|
struct domain *d = v->domain, *pt_owner = d, *pg_owner;
|
||||||
|
@@ -3434,7 +3435,6 @@ int do_mmu_update(
|
||||||
|
}
|
||||||
|
|
||||||
|
cmd = req.ptr & (sizeof(l1_pgentry_t)-1);
|
||||||
|
- okay = 0;
|
||||||
|
|
||||||
|
switch ( cmd )
|
||||||
|
{
|
||||||
|
@@ -3451,6 +3451,7 @@ int do_mmu_update(
|
||||||
|
rc = xsm_mmu_normal_update(d, pg_owner, req.val);
|
||||||
|
if ( rc )
|
||||||
|
break;
|
||||||
|
+ rc = -EINVAL;
|
||||||
|
|
||||||
|
req.ptr -= cmd;
|
||||||
|
gmfn = req.ptr >> PAGE_SHIFT;
|
||||||
|
@@ -3521,7 +3522,6 @@ int do_mmu_update(
|
||||||
|
rc = mod_l1_entry(va, l1e, mfn,
|
||||||
|
cmd == MMU_PT_UPDATE_PRESERVE_AD, v,
|
||||||
|
pg_owner);
|
||||||
|
- okay = !rc;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case PGT_l2_page_table:
|
||||||
|
@@ -3545,13 +3545,12 @@ int do_mmu_update(
|
||||||
|
else if ( p2m_ram_shared == l2e_p2mt )
|
||||||
|
{
|
||||||
|
MEM_LOG("Unexpected attempt to map shared page.\n");
|
||||||
|
- rc = -EINVAL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
- okay = mod_l2_entry(va, l2e, mfn,
|
||||||
|
- cmd == MMU_PT_UPDATE_PRESERVE_AD, v);
|
||||||
|
+ rc = mod_l2_entry(va, l2e, mfn,
|
||||||
|
+ cmd == MMU_PT_UPDATE_PRESERVE_AD, v);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case PGT_l3_page_table:
|
||||||
|
@@ -3575,13 +3574,11 @@ int do_mmu_update(
|
||||||
|
else if ( p2m_ram_shared == l3e_p2mt )
|
||||||
|
{
|
||||||
|
MEM_LOG("Unexpected attempt to map shared page.\n");
|
||||||
|
- rc = -EINVAL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
rc = mod_l3_entry(va, l3e, mfn,
|
||||||
|
cmd == MMU_PT_UPDATE_PRESERVE_AD, 1, v);
|
||||||
|
- okay = !rc;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
#if CONFIG_PAGING_LEVELS >= 4
|
||||||
|
@@ -3607,20 +3604,18 @@ int do_mmu_update(
|
||||||
|
else if ( p2m_ram_shared == l4e_p2mt )
|
||||||
|
{
|
||||||
|
MEM_LOG("Unexpected attempt to map shared page.\n");
|
||||||
|
- rc = -EINVAL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
rc = mod_l4_entry(va, l4e, mfn,
|
||||||
|
cmd == MMU_PT_UPDATE_PRESERVE_AD, 1, v);
|
||||||
|
- okay = !rc;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
case PGT_writable_page:
|
||||||
|
perfc_incr(writable_mmu_updates);
|
||||||
|
- okay = paging_write_guest_entry(
|
||||||
|
- v, va, req.val, _mfn(mfn));
|
||||||
|
+ if ( paging_write_guest_entry(v, va, req.val, _mfn(mfn)) )
|
||||||
|
+ rc = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
page_unlock(page);
|
||||||
|
@@ -3630,8 +3625,8 @@ int do_mmu_update(
|
||||||
|
else if ( get_page_type(page, PGT_writable_page) )
|
||||||
|
{
|
||||||
|
perfc_incr(writable_mmu_updates);
|
||||||
|
- okay = paging_write_guest_entry(
|
||||||
|
- v, va, req.val, _mfn(mfn));
|
||||||
|
+ if ( paging_write_guest_entry(v, va, req.val, _mfn(mfn)) )
|
||||||
|
+ rc = 0;
|
||||||
|
put_page_type(page);
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -3652,17 +3647,18 @@ int do_mmu_update(
|
||||||
|
if ( unlikely(!get_page_from_pagenr(mfn, pg_owner)) )
|
||||||
|
{
|
||||||
|
MEM_LOG("Could not get page for mach->phys update");
|
||||||
|
+ rc = -EINVAL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( unlikely(paging_mode_translate(pg_owner)) )
|
||||||
|
{
|
||||||
|
MEM_LOG("Mach-phys update on auto-translate guest");
|
||||||
|
+ rc = -EINVAL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
set_gpfn_from_mfn(mfn, gpfn);
|
||||||
|
- okay = 1;
|
||||||
|
|
||||||
|
paging_mark_dirty(pg_owner, mfn);
|
||||||
|
|
||||||
|
@@ -3672,15 +3668,11 @@ int do_mmu_update(
|
||||||
|
default:
|
||||||
|
MEM_LOG("Invalid page update command %x", cmd);
|
||||||
|
rc = -ENOSYS;
|
||||||
|
- okay = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
- if ( unlikely(!okay) )
|
||||||
|
- {
|
||||||
|
- rc = rc ? rc : -EINVAL;
|
||||||
|
+ if ( unlikely(rc) )
|
||||||
|
break;
|
||||||
|
- }
|
||||||
|
|
||||||
|
guest_handle_add_offset(ureqs, 1);
|
||||||
|
}
|
93
23096-x86-hpet-no-cpumask_lock.patch
Normal file
93
23096-x86-hpet-no-cpumask_lock.patch
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
# HG changeset patch
|
||||||
|
# User Jan Beulich <jbeulich@novell.com>
|
||||||
|
# Date 1301043797 0
|
||||||
|
# Node ID a65612bcbb921e98a8843157bf365e4ab16e8144
|
||||||
|
# Parent 941119d58655f2b2df86d9ecc4cb502bbc5e783c
|
||||||
|
x86/hpet: eliminate cpumask_lock
|
||||||
|
|
||||||
|
According to the (now getting removed) comment in struct
|
||||||
|
hpet_event_channel, this was to prevent accessing a CPU's
|
||||||
|
timer_deadline after it got cleared from cpumask. This can be done
|
||||||
|
without a lock altogether - hpet_broadcast_exit() can simply clear
|
||||||
|
the bit, and handle_hpet_broadcast() can read timer_deadline before
|
||||||
|
looking at the mask a second time (the cpumask bit was already
|
||||||
|
found set by the surrounding loop).
|
||||||
|
|
||||||
|
Signed-off-by: Jan Beulich <jbeulich@novell.com>
|
||||||
|
Acked-by: Gang Wei <gang.wei@intel.com>
|
||||||
|
|
||||||
|
--- a/xen/arch/x86/hpet.c
|
||||||
|
+++ b/xen/arch/x86/hpet.c
|
||||||
|
@@ -34,18 +34,6 @@ struct hpet_event_channel
|
||||||
|
int shift;
|
||||||
|
s_time_t next_event;
|
||||||
|
cpumask_t cpumask;
|
||||||
|
- /*
|
||||||
|
- * cpumask_lock is used to prevent hpet intr handler from accessing other
|
||||||
|
- * cpu's timer_deadline after the other cpu's mask was cleared --
|
||||||
|
- * mask cleared means cpu waken up, then accessing timer_deadline from
|
||||||
|
- * other cpu is not safe.
|
||||||
|
- * It is not used for protecting cpumask, so set ops needn't take it.
|
||||||
|
- * Multiple cpus clear cpumask simultaneously is ok due to the atomic
|
||||||
|
- * feature of cpu_clear, so hpet_broadcast_exit() can take read lock for
|
||||||
|
- * clearing cpumask, and handle_hpet_broadcast() have to take write lock
|
||||||
|
- * for read cpumask & access timer_deadline.
|
||||||
|
- */
|
||||||
|
- rwlock_t cpumask_lock;
|
||||||
|
spinlock_t lock;
|
||||||
|
void (*event_handler)(struct hpet_event_channel *);
|
||||||
|
|
||||||
|
@@ -208,17 +196,18 @@ again:
|
||||||
|
/* find all expired events */
|
||||||
|
for_each_cpu_mask(cpu, ch->cpumask)
|
||||||
|
{
|
||||||
|
- write_lock_irq(&ch->cpumask_lock);
|
||||||
|
+ s_time_t deadline;
|
||||||
|
|
||||||
|
- if ( cpu_isset(cpu, ch->cpumask) )
|
||||||
|
- {
|
||||||
|
- if ( per_cpu(timer_deadline, cpu) <= now )
|
||||||
|
- cpu_set(cpu, mask);
|
||||||
|
- else if ( per_cpu(timer_deadline, cpu) < next_event )
|
||||||
|
- next_event = per_cpu(timer_deadline, cpu);
|
||||||
|
- }
|
||||||
|
+ rmb();
|
||||||
|
+ deadline = per_cpu(timer_deadline, cpu);
|
||||||
|
+ rmb();
|
||||||
|
+ if ( !cpu_isset(cpu, ch->cpumask) )
|
||||||
|
+ continue;
|
||||||
|
|
||||||
|
- write_unlock_irq(&ch->cpumask_lock);
|
||||||
|
+ if ( deadline <= now )
|
||||||
|
+ cpu_set(cpu, mask);
|
||||||
|
+ else if ( deadline < next_event )
|
||||||
|
+ next_event = deadline;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* wakeup the cpus which have an expired event. */
|
||||||
|
@@ -598,7 +587,6 @@ void hpet_broadcast_init(void)
|
||||||
|
hpet_events[i].shift = 32;
|
||||||
|
hpet_events[i].next_event = STIME_MAX;
|
||||||
|
spin_lock_init(&hpet_events[i].lock);
|
||||||
|
- rwlock_init(&hpet_events[i].cpumask_lock);
|
||||||
|
wmb();
|
||||||
|
hpet_events[i].event_handler = handle_hpet_broadcast;
|
||||||
|
}
|
||||||
|
@@ -634,7 +622,6 @@ void hpet_broadcast_init(void)
|
||||||
|
legacy_hpet_event.idx = 0;
|
||||||
|
legacy_hpet_event.flags = 0;
|
||||||
|
spin_lock_init(&legacy_hpet_event.lock);
|
||||||
|
- rwlock_init(&legacy_hpet_event.cpumask_lock);
|
||||||
|
wmb();
|
||||||
|
legacy_hpet_event.event_handler = handle_hpet_broadcast;
|
||||||
|
|
||||||
|
@@ -713,9 +700,7 @@ void hpet_broadcast_exit(void)
|
||||||
|
if ( !reprogram_timer(this_cpu(timer_deadline)) )
|
||||||
|
raise_softirq(TIMER_SOFTIRQ);
|
||||||
|
|
||||||
|
- read_lock_irq(&ch->cpumask_lock);
|
||||||
|
cpu_clear(cpu, ch->cpumask);
|
||||||
|
- read_unlock_irq(&ch->cpumask_lock);
|
||||||
|
|
||||||
|
if ( ch != &legacy_hpet_event )
|
||||||
|
{
|
290
23099-x86-rwlock-scalability.patch
Normal file
290
23099-x86-rwlock-scalability.patch
Normal file
@ -0,0 +1,290 @@
|
|||||||
|
# HG changeset patch
|
||||||
|
# User Keir Fraser <keir@xen.org>
|
||||||
|
# Date 1301126601 0
|
||||||
|
# Node ID 612171ff82ea51aaf65d98fd1a551eb8d50fb481
|
||||||
|
# Parent c9f745c153ec8c3775e2ee03adc3cb30370b84f6
|
||||||
|
rwlock: Allow to scale to 2^31-1 readers on x86.
|
||||||
|
|
||||||
|
Also rework to match the 'trylock' style of raw function used for
|
||||||
|
spinlocks.
|
||||||
|
|
||||||
|
Inspired by Jan Beulich's patch to do similar improved scaling.
|
||||||
|
|
||||||
|
Signed-off-by: Keir Fraser <keir@xen.org>
|
||||||
|
|
||||||
|
# HG changeset patch
|
||||||
|
# User Keir Fraser <keir@xen.org>
|
||||||
|
# Date 1301214635 -3600
|
||||||
|
# Node ID 0bc1c4746c8939337f693a513fd837fc03477db1
|
||||||
|
# Parent 48dac730a93b27ff60a340564e9a7afd7f9385f4
|
||||||
|
x86_32: Fix _raw_read_trylock() build on some gcc versions.
|
||||||
|
|
||||||
|
Was broken by 23099:612171ff82ea.
|
||||||
|
|
||||||
|
A bool_t is a single byte, and needs a 'q' register constraint. Avoid
|
||||||
|
the whole issue by changing the variable to an int, and explicitly
|
||||||
|
specify the operand suffix as 'l' for good measure.
|
||||||
|
|
||||||
|
Signed-off-by: Keir Fraser <keir@xen.org>
|
||||||
|
|
||||||
|
--- a/xen/common/spinlock.c
|
||||||
|
+++ b/xen/common/spinlock.c
|
||||||
|
@@ -234,7 +234,11 @@ void _spin_unlock_recursive(spinlock_t *
|
||||||
|
void _read_lock(rwlock_t *lock)
|
||||||
|
{
|
||||||
|
check_lock(&lock->debug);
|
||||||
|
- _raw_read_lock(&lock->raw);
|
||||||
|
+ while ( unlikely(!_raw_read_trylock(&lock->raw)) )
|
||||||
|
+ {
|
||||||
|
+ while ( likely(_raw_rw_is_write_locked(&lock->raw)) )
|
||||||
|
+ cpu_relax();
|
||||||
|
+ }
|
||||||
|
preempt_disable();
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -243,7 +247,13 @@ void _read_lock_irq(rwlock_t *lock)
|
||||||
|
ASSERT(local_irq_is_enabled());
|
||||||
|
local_irq_disable();
|
||||||
|
check_lock(&lock->debug);
|
||||||
|
- _raw_read_lock(&lock->raw);
|
||||||
|
+ while ( unlikely(!_raw_read_trylock(&lock->raw)) )
|
||||||
|
+ {
|
||||||
|
+ local_irq_enable();
|
||||||
|
+ while ( likely(_raw_rw_is_write_locked(&lock->raw)) )
|
||||||
|
+ cpu_relax();
|
||||||
|
+ local_irq_disable();
|
||||||
|
+ }
|
||||||
|
preempt_disable();
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -252,11 +262,26 @@ unsigned long _read_lock_irqsave(rwlock_
|
||||||
|
unsigned long flags;
|
||||||
|
local_irq_save(flags);
|
||||||
|
check_lock(&lock->debug);
|
||||||
|
- _raw_read_lock(&lock->raw);
|
||||||
|
+ while ( unlikely(!_raw_read_trylock(&lock->raw)) )
|
||||||
|
+ {
|
||||||
|
+ local_irq_restore(flags);
|
||||||
|
+ while ( likely(_raw_rw_is_write_locked(&lock->raw)) )
|
||||||
|
+ cpu_relax();
|
||||||
|
+ local_irq_save(flags);
|
||||||
|
+ }
|
||||||
|
preempt_disable();
|
||||||
|
return flags;
|
||||||
|
}
|
||||||
|
|
||||||
|
+int _read_trylock(rwlock_t *lock)
|
||||||
|
+{
|
||||||
|
+ check_lock(&lock->debug);
|
||||||
|
+ if ( !_raw_read_trylock(&lock->raw) )
|
||||||
|
+ return 0;
|
||||||
|
+ preempt_disable();
|
||||||
|
+ return 1;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
void _read_unlock(rwlock_t *lock)
|
||||||
|
{
|
||||||
|
preempt_enable();
|
||||||
|
@@ -280,7 +305,11 @@ void _read_unlock_irqrestore(rwlock_t *l
|
||||||
|
void _write_lock(rwlock_t *lock)
|
||||||
|
{
|
||||||
|
check_lock(&lock->debug);
|
||||||
|
- _raw_write_lock(&lock->raw);
|
||||||
|
+ while ( unlikely(!_raw_write_trylock(&lock->raw)) )
|
||||||
|
+ {
|
||||||
|
+ while ( likely(_raw_rw_is_locked(&lock->raw)) )
|
||||||
|
+ cpu_relax();
|
||||||
|
+ }
|
||||||
|
preempt_disable();
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -289,7 +318,13 @@ void _write_lock_irq(rwlock_t *lock)
|
||||||
|
ASSERT(local_irq_is_enabled());
|
||||||
|
local_irq_disable();
|
||||||
|
check_lock(&lock->debug);
|
||||||
|
- _raw_write_lock(&lock->raw);
|
||||||
|
+ while ( unlikely(!_raw_write_trylock(&lock->raw)) )
|
||||||
|
+ {
|
||||||
|
+ local_irq_enable();
|
||||||
|
+ while ( likely(_raw_rw_is_locked(&lock->raw)) )
|
||||||
|
+ cpu_relax();
|
||||||
|
+ local_irq_disable();
|
||||||
|
+ }
|
||||||
|
preempt_disable();
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -298,7 +333,13 @@ unsigned long _write_lock_irqsave(rwlock
|
||||||
|
unsigned long flags;
|
||||||
|
local_irq_save(flags);
|
||||||
|
check_lock(&lock->debug);
|
||||||
|
- _raw_write_lock(&lock->raw);
|
||||||
|
+ while ( unlikely(!_raw_write_trylock(&lock->raw)) )
|
||||||
|
+ {
|
||||||
|
+ local_irq_restore(flags);
|
||||||
|
+ while ( likely(_raw_rw_is_locked(&lock->raw)) )
|
||||||
|
+ cpu_relax();
|
||||||
|
+ local_irq_save(flags);
|
||||||
|
+ }
|
||||||
|
preempt_disable();
|
||||||
|
return flags;
|
||||||
|
}
|
||||||
|
--- a/xen/include/asm-ia64/linux-xen/asm/spinlock.h
|
||||||
|
+++ b/xen/include/asm-ia64/linux-xen/asm/spinlock.h
|
||||||
|
@@ -35,17 +35,6 @@ typedef struct {
|
||||||
|
} raw_rwlock_t;
|
||||||
|
#define _RAW_RW_LOCK_UNLOCKED /*(raw_rwlock_t)*/ { 0, 0 }
|
||||||
|
|
||||||
|
-#define _raw_read_lock(rw) \
|
||||||
|
-do { \
|
||||||
|
- raw_rwlock_t *__read_lock_ptr = (rw); \
|
||||||
|
- \
|
||||||
|
- while (unlikely(ia64_fetchadd(1, (int *) __read_lock_ptr, acq) < 0)) { \
|
||||||
|
- ia64_fetchadd(-1, (int *) __read_lock_ptr, rel); \
|
||||||
|
- while (*(volatile int *)__read_lock_ptr < 0) \
|
||||||
|
- cpu_relax(); \
|
||||||
|
- } \
|
||||||
|
-} while (0)
|
||||||
|
-
|
||||||
|
#define _raw_read_unlock(rw) \
|
||||||
|
do { \
|
||||||
|
raw_rwlock_t *__read_lock_ptr = (rw); \
|
||||||
|
@@ -53,20 +42,6 @@ do { \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#ifdef ASM_SUPPORTED
|
||||||
|
-#define _raw_write_lock(rw) \
|
||||||
|
-do { \
|
||||||
|
- __asm__ __volatile__ ( \
|
||||||
|
- "mov ar.ccv = r0\n" \
|
||||||
|
- "dep r29 = -1, r0, 31, 1;;\n" \
|
||||||
|
- "1:\n" \
|
||||||
|
- "ld4 r2 = [%0];;\n" \
|
||||||
|
- "cmp4.eq p0,p7 = r0,r2\n" \
|
||||||
|
- "(p7) br.cond.spnt.few 1b \n" \
|
||||||
|
- "cmpxchg4.acq r2 = [%0], r29, ar.ccv;;\n" \
|
||||||
|
- "cmp4.eq p0,p7 = r0, r2\n" \
|
||||||
|
- "(p7) br.cond.spnt.few 1b;;\n" \
|
||||||
|
- :: "r"(rw) : "ar.ccv", "p7", "r2", "r29", "memory"); \
|
||||||
|
-} while(0)
|
||||||
|
|
||||||
|
#define _raw_write_trylock(rw) \
|
||||||
|
({ \
|
||||||
|
@@ -82,16 +57,6 @@ do { \
|
||||||
|
|
||||||
|
#else /* !ASM_SUPPORTED */
|
||||||
|
|
||||||
|
-#define _raw_write_lock(l) \
|
||||||
|
-({ \
|
||||||
|
- __u64 ia64_val, ia64_set_val = ia64_dep_mi(-1, 0, 31, 1); \
|
||||||
|
- __u32 *ia64_write_lock_ptr = (__u32 *) (l); \
|
||||||
|
- do { \
|
||||||
|
- while (*ia64_write_lock_ptr) \
|
||||||
|
- ia64_barrier(); \
|
||||||
|
- ia64_val = ia64_cmpxchg4_acq(ia64_write_lock_ptr, ia64_set_val, 0); \
|
||||||
|
- } while (ia64_val); \
|
||||||
|
-})
|
||||||
|
|
||||||
|
#define _raw_write_trylock(rw) \
|
||||||
|
({ \
|
||||||
|
--- a/xen/include/asm-x86/spinlock.h
|
||||||
|
+++ b/xen/include/asm-x86/spinlock.h
|
||||||
|
@@ -35,51 +35,29 @@ typedef struct {
|
||||||
|
volatile int lock;
|
||||||
|
} raw_rwlock_t;
|
||||||
|
|
||||||
|
-#define RW_LOCK_BIAS 0x01000000
|
||||||
|
-#define _RAW_RW_LOCK_UNLOCKED /*(raw_rwlock_t)*/ { RW_LOCK_BIAS }
|
||||||
|
+#define RW_WRITE_BIAS 0x7fffffff
|
||||||
|
+#define _RAW_RW_LOCK_UNLOCKED /*(raw_rwlock_t)*/ { 0 }
|
||||||
|
|
||||||
|
-static always_inline void _raw_read_lock(raw_rwlock_t *rw)
|
||||||
|
+static always_inline int _raw_read_trylock(raw_rwlock_t *rw)
|
||||||
|
{
|
||||||
|
- asm volatile (
|
||||||
|
- "1: lock; decl %0 \n"
|
||||||
|
- " jns 3f \n"
|
||||||
|
- " lock; incl %0 \n"
|
||||||
|
- "2: rep; nop \n"
|
||||||
|
- " cmpl $1,%0 \n"
|
||||||
|
- " js 2b \n"
|
||||||
|
- " jmp 1b \n"
|
||||||
|
- "3:"
|
||||||
|
- : "=m" (rw->lock) : : "memory" );
|
||||||
|
-}
|
||||||
|
+ int acquired;
|
||||||
|
|
||||||
|
-static always_inline void _raw_write_lock(raw_rwlock_t *rw)
|
||||||
|
-{
|
||||||
|
asm volatile (
|
||||||
|
- "1: lock; subl %1,%0 \n"
|
||||||
|
- " jz 3f \n"
|
||||||
|
- " lock; addl %1,%0 \n"
|
||||||
|
- "2: rep; nop \n"
|
||||||
|
- " cmpl %1,%0 \n"
|
||||||
|
- " jne 2b \n"
|
||||||
|
+ " lock; decl %0 \n"
|
||||||
|
+ " jns 2f \n"
|
||||||
|
+ "1: .subsection 1 \n"
|
||||||
|
+ "2: lock; incl %0 \n"
|
||||||
|
+ " decl %1 \n"
|
||||||
|
" jmp 1b \n"
|
||||||
|
- "3:"
|
||||||
|
- : "=m" (rw->lock) : "i" (RW_LOCK_BIAS) : "memory" );
|
||||||
|
+ " .subsection 0 \n"
|
||||||
|
+ : "=m" (rw->lock), "=r" (acquired) : "1" (1) : "memory" );
|
||||||
|
+
|
||||||
|
+ return acquired;
|
||||||
|
}
|
||||||
|
|
||||||
|
static always_inline int _raw_write_trylock(raw_rwlock_t *rw)
|
||||||
|
{
|
||||||
|
- int rc;
|
||||||
|
-
|
||||||
|
- asm volatile (
|
||||||
|
- " lock; subl %2,%0 \n"
|
||||||
|
- " jz 1f \n"
|
||||||
|
- " lock; addl %2,%0 \n"
|
||||||
|
- " dec %1 \n"
|
||||||
|
- "1:"
|
||||||
|
- : "=m" (rw->lock), "=r" (rc) : "i" (RW_LOCK_BIAS), "1" (1)
|
||||||
|
- : "memory" );
|
||||||
|
-
|
||||||
|
- return rc;
|
||||||
|
+ return (cmpxchg(&rw->lock, 0, RW_WRITE_BIAS) == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static always_inline void _raw_read_unlock(raw_rwlock_t *rw)
|
||||||
|
@@ -92,11 +70,11 @@ static always_inline void _raw_read_unlo
|
||||||
|
static always_inline void _raw_write_unlock(raw_rwlock_t *rw)
|
||||||
|
{
|
||||||
|
asm volatile (
|
||||||
|
- "lock ; addl %1,%0"
|
||||||
|
- : "=m" ((rw)->lock) : "i" (RW_LOCK_BIAS) : "memory" );
|
||||||
|
+ "lock ; subl %1,%0"
|
||||||
|
+ : "=m" ((rw)->lock) : "i" (RW_WRITE_BIAS) : "memory" );
|
||||||
|
}
|
||||||
|
|
||||||
|
-#define _raw_rw_is_locked(x) ((x)->lock < RW_LOCK_BIAS)
|
||||||
|
-#define _raw_rw_is_write_locked(x) ((x)->lock <= 0)
|
||||||
|
+#define _raw_rw_is_locked(x) ((x)->lock != 0)
|
||||||
|
+#define _raw_rw_is_write_locked(x) ((x)->lock > 0)
|
||||||
|
|
||||||
|
#endif /* __ASM_SPINLOCK_H */
|
||||||
|
--- a/xen/include/xen/spinlock.h
|
||||||
|
+++ b/xen/include/xen/spinlock.h
|
||||||
|
@@ -157,6 +157,7 @@ unsigned long _read_lock_irqsave(rwlock_
|
||||||
|
void _read_unlock(rwlock_t *lock);
|
||||||
|
void _read_unlock_irq(rwlock_t *lock);
|
||||||
|
void _read_unlock_irqrestore(rwlock_t *lock, unsigned long flags);
|
||||||
|
+int _read_trylock(rwlock_t *lock);
|
||||||
|
|
||||||
|
void _write_lock(rwlock_t *lock);
|
||||||
|
void _write_lock_irq(rwlock_t *lock);
|
||||||
|
@@ -210,6 +211,7 @@ int _rw_is_write_locked(rwlock_t *lock);
|
||||||
|
#define read_unlock(l) _read_unlock(l)
|
||||||
|
#define read_unlock_irq(l) _read_unlock_irq(l)
|
||||||
|
#define read_unlock_irqrestore(l, f) _read_unlock_irqrestore(l, f)
|
||||||
|
+#define read_trylock(l) _read_trylock(l)
|
||||||
|
|
||||||
|
#define write_lock(l) _write_lock(l)
|
||||||
|
#define write_lock_irq(l) _write_lock_irq(l)
|
25
23103-x86-pirq-guest-eoi-check.patch
Normal file
25
23103-x86-pirq-guest-eoi-check.patch
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
# HG changeset patch
|
||||||
|
# User Keir Fraser <keir@xen.org>
|
||||||
|
# Date 1301132521 0
|
||||||
|
# Node ID 48dac730a93b27ff60a340564e9a7afd7f9385f4
|
||||||
|
# Parent 8f001d864fefac689b7662bc9979eaddf4fd6e9c
|
||||||
|
x86: __pirq_guest_eoi() must check it is called for a fully
|
||||||
|
guest-bound irq before accessing desc->action.
|
||||||
|
|
||||||
|
Signed-off-by: Keir Fraser <keir@xen.org>
|
||||||
|
|
||||||
|
--- a/xen/arch/x86/irq.c
|
||||||
|
+++ b/xen/arch/x86/irq.c
|
||||||
|
@@ -1022,6 +1022,12 @@ static void __pirq_guest_eoi(struct doma
|
||||||
|
if ( desc == NULL )
|
||||||
|
return;
|
||||||
|
|
||||||
|
+ if ( !(desc->status & IRQ_GUEST) )
|
||||||
|
+ {
|
||||||
|
+ spin_unlock_irq(&desc->lock);
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
action = (irq_guest_action_t *)desc->action;
|
||||||
|
irq = desc - irq_desc;
|
||||||
|
|
194
23127-vtd-bios-settings.patch
Normal file
194
23127-vtd-bios-settings.patch
Normal file
@ -0,0 +1,194 @@
|
|||||||
|
# HG changeset patch
|
||||||
|
# User Allen Kay <allen.m.kay@intel.com>
|
||||||
|
# Date 1301755765 -3600
|
||||||
|
# Node ID 1046830079376a4b29fcad0cd037a834e808ed06
|
||||||
|
# Parent 89c23f58aa986092da0c9a7dfac1c41befbe1f3f
|
||||||
|
[VTD] check BIOS settings before enabling interrupt remapping or x2apic
|
||||||
|
|
||||||
|
Check flags field in ACPI DMAR structure before enabling interrupt
|
||||||
|
remapping or x2apic. This allows platform vendors to disable
|
||||||
|
interrupt remapping or x2apic features if on board BIOS does not
|
||||||
|
support them.
|
||||||
|
|
||||||
|
Signed-off-by: Allen Kay <allen.m.kay@intel.com>
|
||||||
|
|
||||||
|
# HG changeset patch
|
||||||
|
# User Allen Kay <allen.m.kay@intel.com>
|
||||||
|
# Date 1302077462 -3600
|
||||||
|
# Node ID c7916d6f4dfba9d6c7eeb0fc2796068d75e2fb4a
|
||||||
|
# Parent 42fa70e0761bbb0596618ca5323664f31a2faa76
|
||||||
|
[VTD] Fixes to ACPI DMAR flag checks.
|
||||||
|
|
||||||
|
* platform_supports_{intremap,x2apic} should not be marked __init as
|
||||||
|
they are used during S3 resume.
|
||||||
|
* DMAR flags should be taken from the table passed to
|
||||||
|
acpi_parse_dmar() -- this is the trusted copy of the DMAR, when
|
||||||
|
running in TXT mode.
|
||||||
|
|
||||||
|
Signed-off-by: Allen Kay <allen.m.kay@intel.com>
|
||||||
|
|
||||||
|
--- a/xen/arch/x86/apic.c
|
||||||
|
+++ b/xen/arch/x86/apic.c
|
||||||
|
@@ -531,7 +531,7 @@ static void resume_x2apic(void)
|
||||||
|
mask_8259A();
|
||||||
|
mask_IO_APIC_setup(ioapic_entries);
|
||||||
|
|
||||||
|
- iommu_enable_IR();
|
||||||
|
+ iommu_enable_x2apic_IR();
|
||||||
|
__enable_x2apic();
|
||||||
|
|
||||||
|
restore_IO_APIC_setup(ioapic_entries);
|
||||||
|
@@ -751,7 +751,7 @@ int lapic_suspend(void)
|
||||||
|
|
||||||
|
local_irq_save(flags);
|
||||||
|
disable_local_APIC();
|
||||||
|
- iommu_disable_IR();
|
||||||
|
+ iommu_disable_x2apic_IR();
|
||||||
|
local_irq_restore(flags);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
@@ -997,7 +997,7 @@ void __init x2apic_bsp_setup(void)
|
||||||
|
mask_8259A();
|
||||||
|
mask_IO_APIC_setup(ioapic_entries);
|
||||||
|
|
||||||
|
- if ( iommu_enable_IR() )
|
||||||
|
+ if ( iommu_enable_x2apic_IR() )
|
||||||
|
{
|
||||||
|
if ( x2apic_enabled )
|
||||||
|
panic("Interrupt remapping could not be enabled while "
|
||||||
|
--- a/xen/drivers/passthrough/vtd/dmar.c
|
||||||
|
+++ b/xen/drivers/passthrough/vtd/dmar.c
|
||||||
|
@@ -46,6 +46,7 @@ LIST_HEAD(acpi_rmrr_units);
|
||||||
|
LIST_HEAD(acpi_atsr_units);
|
||||||
|
LIST_HEAD(acpi_rhsa_units);
|
||||||
|
|
||||||
|
+static int __read_mostly dmar_flags;
|
||||||
|
static u64 igd_drhd_address;
|
||||||
|
u8 dmar_host_address_width;
|
||||||
|
|
||||||
|
@@ -682,6 +683,7 @@ static int __init acpi_parse_dmar(struct
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
dmar = (struct acpi_table_dmar *)table;
|
||||||
|
+ dmar_flags = dmar->flags;
|
||||||
|
|
||||||
|
if ( !iommu_enabled )
|
||||||
|
{
|
||||||
|
@@ -802,3 +804,22 @@ void acpi_dmar_zap(void)
|
||||||
|
dmar_table->signature[0] = 'X';
|
||||||
|
dmar_table->checksum -= 'X'-'D';
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+int platform_supports_intremap(void)
|
||||||
|
+{
|
||||||
|
+ unsigned int flags = 0;
|
||||||
|
+
|
||||||
|
+ flags = DMAR_INTR_REMAP;
|
||||||
|
+ return ((dmar_flags & flags) == DMAR_INTR_REMAP);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+int platform_supports_x2apic(void)
|
||||||
|
+{
|
||||||
|
+ unsigned int flags = 0;
|
||||||
|
+
|
||||||
|
+ if (!cpu_has_x2apic)
|
||||||
|
+ return 0;
|
||||||
|
+
|
||||||
|
+ flags = DMAR_INTR_REMAP | DMAR_X2APIC_OPT_OUT;
|
||||||
|
+ return ((dmar_flags & flags) == DMAR_INTR_REMAP);
|
||||||
|
+}
|
||||||
|
--- a/xen/drivers/passthrough/vtd/extern.h
|
||||||
|
+++ b/xen/drivers/passthrough/vtd/extern.h
|
||||||
|
@@ -87,5 +87,7 @@ void vtd_ops_preamble_quirk(struct iommu
|
||||||
|
void vtd_ops_postamble_quirk(struct iommu* iommu);
|
||||||
|
void me_wifi_quirk(struct domain *domain, u8 bus, u8 devfn, int map);
|
||||||
|
void pci_vtd_quirk(struct pci_dev *pdev);
|
||||||
|
+int platform_supports_intremap(void);
|
||||||
|
+int platform_supports_x2apic(void);
|
||||||
|
|
||||||
|
#endif // _VTD_EXTERN_H_
|
||||||
|
--- a/xen/drivers/passthrough/vtd/intremap.c
|
||||||
|
+++ b/xen/drivers/passthrough/vtd/intremap.c
|
||||||
|
@@ -735,6 +735,13 @@ int enable_intremap(struct iommu *iommu,
|
||||||
|
|
||||||
|
ASSERT(ecap_intr_remap(iommu->ecap) && iommu_intremap);
|
||||||
|
|
||||||
|
+ if ( !platform_supports_intremap() )
|
||||||
|
+ {
|
||||||
|
+ dprintk(XENLOG_ERR VTDPREFIX,
|
||||||
|
+ "Platform firmware does not support interrupt remapping\n");
|
||||||
|
+ return -EINVAL;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
ir_ctrl = iommu_ir_ctrl(iommu);
|
||||||
|
sts = dmar_readl(iommu->reg, DMAR_GSTS_REG);
|
||||||
|
|
||||||
|
@@ -821,10 +828,10 @@ out:
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
- * This function is used to enable Interrutp remapping when
|
||||||
|
+ * This function is used to enable Interrupt remapping when
|
||||||
|
* enable x2apic
|
||||||
|
*/
|
||||||
|
-int iommu_enable_IR(void)
|
||||||
|
+int iommu_enable_x2apic_IR(void)
|
||||||
|
{
|
||||||
|
struct acpi_drhd_unit *drhd;
|
||||||
|
struct iommu *iommu;
|
||||||
|
@@ -832,6 +839,9 @@ int iommu_enable_IR(void)
|
||||||
|
if ( !iommu_supports_eim() )
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
+ if ( !platform_supports_x2apic() )
|
||||||
|
+ return -1;
|
||||||
|
+
|
||||||
|
for_each_drhd_unit ( drhd )
|
||||||
|
{
|
||||||
|
struct qi_ctrl *qi_ctrl = NULL;
|
||||||
|
@@ -881,7 +891,7 @@ int iommu_enable_IR(void)
|
||||||
|
* This function is used to disable Interrutp remapping when
|
||||||
|
* suspend local apic
|
||||||
|
*/
|
||||||
|
-void iommu_disable_IR(void)
|
||||||
|
+void iommu_disable_x2apic_IR(void)
|
||||||
|
{
|
||||||
|
struct acpi_drhd_unit *drhd;
|
||||||
|
|
||||||
|
--- a/xen/drivers/passthrough/vtd/iommu.c
|
||||||
|
+++ b/xen/drivers/passthrough/vtd/iommu.c
|
||||||
|
@@ -2014,7 +2014,7 @@ static int init_vtd_hw(void)
|
||||||
|
if ( enable_intremap(iommu, 0) != 0 )
|
||||||
|
{
|
||||||
|
dprintk(XENLOG_WARNING VTDPREFIX,
|
||||||
|
- "Failed to enable Interrupt Remapping!\n");
|
||||||
|
+ "Interrupt Remapping not enabled\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
--- a/xen/drivers/passthrough/vtd/iommu.h
|
||||||
|
+++ b/xen/drivers/passthrough/vtd/iommu.h
|
||||||
|
@@ -22,6 +22,10 @@
|
||||||
|
|
||||||
|
#include <xen/types.h>
|
||||||
|
|
||||||
|
+/* DMAR Flags bits */
|
||||||
|
+#define DMAR_INTR_REMAP 0x1
|
||||||
|
+#define DMAR_X2APIC_OPT_OUT 0x2
|
||||||
|
+
|
||||||
|
/*
|
||||||
|
* Intel IOMMU register specification per version 1.0 public spec.
|
||||||
|
*/
|
||||||
|
--- a/xen/include/xen/iommu.h
|
||||||
|
+++ b/xen/include/xen/iommu.h
|
||||||
|
@@ -63,8 +63,8 @@ struct iommu {
|
||||||
|
|
||||||
|
int iommu_setup(void);
|
||||||
|
int iommu_supports_eim(void);
|
||||||
|
-int iommu_enable_IR(void);
|
||||||
|
-void iommu_disable_IR(void);
|
||||||
|
+int iommu_enable_x2apic_IR(void);
|
||||||
|
+void iommu_disable_x2apic_IR(void);
|
||||||
|
|
||||||
|
int iommu_add_device(struct pci_dev *pdev);
|
||||||
|
int iommu_remove_device(struct pci_dev *pdev);
|
57
23153-x86-amd-clear-DramModEn.patch
Normal file
57
23153-x86-amd-clear-DramModEn.patch
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
# HG changeset patch
|
||||||
|
# User Wei Huang <wei.huang2@amd.com>
|
||||||
|
# Date 1302076891 -3600
|
||||||
|
# Node ID 8fb61c9ebe499b576687907d164da07802414925
|
||||||
|
# Parent 97763efc41f9b664cf6f7db653c9c3f51e50b358
|
||||||
|
x86, amd, MTRR: correct DramModEn bit of SYS_CFG MSR
|
||||||
|
|
||||||
|
Some buggy BIOS might set SYS_CFG DramModEn bit to 1, which can cause
|
||||||
|
unexpected behavior on AMD platforms. This patch clears DramModEn bit
|
||||||
|
if it is 1.
|
||||||
|
|
||||||
|
Signed-off-by: Wei Huang <wei.huang2@amd.com>
|
||||||
|
|
||||||
|
--- a/xen/arch/x86/cpu/amd.c
|
||||||
|
+++ b/xen/arch/x86/cpu/amd.c
|
||||||
|
@@ -318,6 +318,32 @@ static void check_disable_c1e(unsigned i
|
||||||
|
on_each_cpu(disable_c1e, NULL, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
+/*
|
||||||
|
+ * BIOS is expected to clear MtrrFixDramModEn bit. According to AMD BKDG :
|
||||||
|
+ * "The MtrrFixDramModEn bit should be set to 1 during BIOS initalization of
|
||||||
|
+ * the fixed MTRRs, then cleared to 0 for operation."
|
||||||
|
+ */
|
||||||
|
+static void check_syscfg_dram_mod_en(void)
|
||||||
|
+{
|
||||||
|
+ uint64_t syscfg;
|
||||||
|
+ static bool_t printed = 0;
|
||||||
|
+
|
||||||
|
+ if (!((boot_cpu_data.x86_vendor == X86_VENDOR_AMD) &&
|
||||||
|
+ (boot_cpu_data.x86 >= 0x0f)))
|
||||||
|
+ return;
|
||||||
|
+
|
||||||
|
+ rdmsrl(MSR_K8_SYSCFG, syscfg);
|
||||||
|
+ if (!(syscfg & K8_MTRRFIXRANGE_DRAM_MODIFY))
|
||||||
|
+ return;
|
||||||
|
+
|
||||||
|
+ if (!test_and_set_bool(printed))
|
||||||
|
+ printk(KERN_ERR "MTRR: SYSCFG[MtrrFixDramModEn] not "
|
||||||
|
+ "cleared by BIOS, clearing this bit\n");
|
||||||
|
+
|
||||||
|
+ syscfg &= ~K8_MTRRFIXRANGE_DRAM_MODIFY;
|
||||||
|
+ wrmsrl(MSR_K8_SYSCFG, syscfg);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static void __devinit init_amd(struct cpuinfo_x86 *c)
|
||||||
|
{
|
||||||
|
u32 l, h;
|
||||||
|
@@ -587,6 +613,8 @@ static void __devinit init_amd(struct cp
|
||||||
|
disable_c1_ramping();
|
||||||
|
|
||||||
|
set_cpuidmask(c);
|
||||||
|
+
|
||||||
|
+ check_syscfg_dram_mod_en();
|
||||||
|
}
|
||||||
|
|
||||||
|
static unsigned int __cpuinit amd_size_cache(struct cpuinfo_x86 * c, unsigned int size)
|
51
23154-x86-amd-iorr-no-rdwr.patch
Normal file
51
23154-x86-amd-iorr-no-rdwr.patch
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
# HG changeset patch
|
||||||
|
# User Wei Huang <wei.huang2@amd.com>
|
||||||
|
# Date 1302076933 -3600
|
||||||
|
# Node ID 42fa70e0761bbb0596618ca5323664f31a2faa76
|
||||||
|
# Parent 8fb61c9ebe499b576687907d164da07802414925
|
||||||
|
x86, amd, MTRR: remove k8_enable_fixed_iorrs()
|
||||||
|
|
||||||
|
AMD64 defines two special bits (bit 3 and 4) RdMem and WrMem in fixed
|
||||||
|
MTRR type. Their values are supposed to be 0 after BIOS hands the
|
||||||
|
control to OS according to AMD BKDG. Unless OS specificially turn them
|
||||||
|
on, they are kept 0 all the time. As a result, k8_enable_fixed_iorrs()
|
||||||
|
is unnecessary and removed from upstream kernel (see
|
||||||
|
https://patchwork.kernel.org/patch/11425/). This patch does the same
|
||||||
|
thing.
|
||||||
|
|
||||||
|
Signed-off-by: Wei Huang <wei.huang2@amd.com>
|
||||||
|
|
||||||
|
--- a/xen/arch/x86/cpu/mtrr/generic.c
|
||||||
|
+++ b/xen/arch/x86/cpu/mtrr/generic.c
|
||||||
|
@@ -116,20 +116,6 @@ void mtrr_wrmsr(unsigned int msr, uint64
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
- * Enable and allow read/write of extended fixed-range MTRR bits on K8 CPUs
|
||||||
|
- * see AMD publication no. 24593, chapter 3.2.1 for more information
|
||||||
|
- */
|
||||||
|
-static inline void k8_enable_fixed_iorrs(void)
|
||||||
|
-{
|
||||||
|
- uint64_t msr_content;
|
||||||
|
-
|
||||||
|
- rdmsrl(MSR_K8_SYSCFG, msr_content);
|
||||||
|
- mtrr_wrmsr(MSR_K8_SYSCFG, msr_content
|
||||||
|
- | K8_MTRRFIXRANGE_DRAM_ENABLE
|
||||||
|
- | K8_MTRRFIXRANGE_DRAM_MODIFY);
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
-/**
|
||||||
|
* Checks and updates an fixed-range MTRR if it differs from the value it
|
||||||
|
* should have. If K8 extenstions are wanted, update the K8 SYSCFG MSR also.
|
||||||
|
* see AMD publication no. 24593, chapter 7.8.1, page 233 for more information
|
||||||
|
@@ -145,10 +131,6 @@ static void set_fixed_range(int msr, int
|
||||||
|
val = ((uint64_t)msrwords[1] << 32) | msrwords[0];
|
||||||
|
|
||||||
|
if (msr_content != val) {
|
||||||
|
- if (boot_cpu_data.x86_vendor == X86_VENDOR_AMD &&
|
||||||
|
- boot_cpu_data.x86 == 15 &&
|
||||||
|
- ((msrwords[0] | msrwords[1]) & K8_MTRR_RDMEM_WRMEM_MASK))
|
||||||
|
- k8_enable_fixed_iorrs();
|
||||||
|
mtrr_wrmsr(msr, val);
|
||||||
|
*changed = TRUE;
|
||||||
|
}
|
25
23199-amd-iommu-unmapped-intr-fault.patch
Normal file
25
23199-amd-iommu-unmapped-intr-fault.patch
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
# HG changeset patch
|
||||||
|
# User Wei Wang <wei.wang2@amd.com>
|
||||||
|
# Date 1302610857 -3600
|
||||||
|
# Node ID dbd98ab2f87facba8117bb881fa2ea5dfdb92960
|
||||||
|
# Parent 697ac895c11c6d5d82524de56796cee98fded2a5
|
||||||
|
amd iommu: Unmapped interrupt should generate IO page faults.
|
||||||
|
|
||||||
|
This helps us to debug interrupt issues.
|
||||||
|
|
||||||
|
Signed-off-by: Wei Wang <wei.wang2@amd.com>
|
||||||
|
|
||||||
|
--- a/xen/drivers/passthrough/amd/iommu_map.c
|
||||||
|
+++ b/xen/drivers/passthrough/amd/iommu_map.c
|
||||||
|
@@ -327,8 +327,9 @@ void amd_iommu_set_intremap_table(u32 *d
|
||||||
|
set_field_in_reg_u32(0xB, entry,
|
||||||
|
IOMMU_DEV_TABLE_INT_TABLE_LENGTH_MASK,
|
||||||
|
IOMMU_DEV_TABLE_INT_TABLE_LENGTH_SHIFT, &entry);
|
||||||
|
- /* ignore unmapped interrupts */
|
||||||
|
- set_field_in_reg_u32(IOMMU_CONTROL_ENABLED, entry,
|
||||||
|
+
|
||||||
|
+ /* unmapped interrupt results io page faults*/
|
||||||
|
+ set_field_in_reg_u32(IOMMU_CONTROL_DISABLED, entry,
|
||||||
|
IOMMU_DEV_TABLE_INT_TABLE_IGN_UNMAPPED_MASK,
|
||||||
|
IOMMU_DEV_TABLE_INT_TABLE_IGN_UNMAPPED_SHIFT, &entry);
|
||||||
|
set_field_in_reg_u32(int_valid ? IOMMU_CONTROL_ENABLED :
|
179
23200-amd-iommu-intremap-sync.patch
Normal file
179
23200-amd-iommu-intremap-sync.patch
Normal file
@ -0,0 +1,179 @@
|
|||||||
|
References: bnc#680824
|
||||||
|
|
||||||
|
# HG changeset patch
|
||||||
|
# User Wei Wang <wei.wang2@amd.com>
|
||||||
|
# Date 1302611179 -3600
|
||||||
|
# Node ID 995a0c01a076e9c4fb124c090bc146a10d76bc7b
|
||||||
|
# Parent dbd98ab2f87facba8117bb881fa2ea5dfdb92960
|
||||||
|
AMD IOMMU: Fix an interrupt remapping issue
|
||||||
|
|
||||||
|
Some device could generate bogus interrupts if an IO-APIC RTE and an
|
||||||
|
iommu interrupt remapping entry are not consistent during 2 adjacent
|
||||||
|
64bits IO-APIC RTE updates. For example, if the 2nd operation updates
|
||||||
|
destination bits in RTE for SATA device and unmask it, in some case,
|
||||||
|
SATA device will assert ioapic pin to generate interrupt immediately
|
||||||
|
using new destination but iommu could still translate it into the old
|
||||||
|
destination, then dom0 would be confused. To fix that, we sync up
|
||||||
|
interrupt remapping entry with IO-APIC IRE on every 32 bits operation
|
||||||
|
and forward IOAPIC RTE updates after interrupt.
|
||||||
|
|
||||||
|
Signed-off-by: Wei Wang <wei.wang2@amd.com>
|
||||||
|
Acked-by: Jan Beulich <jbeulich@novell.com>
|
||||||
|
|
||||||
|
--- a/xen/drivers/passthrough/amd/iommu_intr.c
|
||||||
|
+++ b/xen/drivers/passthrough/amd/iommu_intr.c
|
||||||
|
@@ -117,8 +117,7 @@ void invalidate_interrupt_table(struct a
|
||||||
|
static void update_intremap_entry_from_ioapic(
|
||||||
|
int bdf,
|
||||||
|
struct amd_iommu *iommu,
|
||||||
|
- struct IO_APIC_route_entry *ioapic_rte,
|
||||||
|
- unsigned int rte_upper, unsigned int value)
|
||||||
|
+ struct IO_APIC_route_entry *ioapic_rte)
|
||||||
|
{
|
||||||
|
unsigned long flags;
|
||||||
|
u32* entry;
|
||||||
|
@@ -130,28 +129,26 @@ static void update_intremap_entry_from_i
|
||||||
|
|
||||||
|
req_id = get_intremap_requestor_id(bdf);
|
||||||
|
lock = get_intremap_lock(req_id);
|
||||||
|
- /* only remap interrupt vector when lower 32 bits in ioapic ire changed */
|
||||||
|
- if ( likely(!rte_upper) )
|
||||||
|
- {
|
||||||
|
- delivery_mode = rte->delivery_mode;
|
||||||
|
- vector = rte->vector;
|
||||||
|
- dest_mode = rte->dest_mode;
|
||||||
|
- dest = rte->dest.logical.logical_dest;
|
||||||
|
|
||||||
|
- spin_lock_irqsave(lock, flags);
|
||||||
|
- offset = get_intremap_offset(vector, delivery_mode);
|
||||||
|
- entry = (u32*)get_intremap_entry(req_id, offset);
|
||||||
|
+ delivery_mode = rte->delivery_mode;
|
||||||
|
+ vector = rte->vector;
|
||||||
|
+ dest_mode = rte->dest_mode;
|
||||||
|
+ dest = rte->dest.logical.logical_dest;
|
||||||
|
|
||||||
|
- update_intremap_entry(entry, vector, delivery_mode, dest_mode, dest);
|
||||||
|
- spin_unlock_irqrestore(lock, flags);
|
||||||
|
+ spin_lock_irqsave(lock, flags);
|
||||||
|
|
||||||
|
- if ( iommu->enabled )
|
||||||
|
- {
|
||||||
|
- spin_lock_irqsave(&iommu->lock, flags);
|
||||||
|
- invalidate_interrupt_table(iommu, req_id);
|
||||||
|
- flush_command_buffer(iommu);
|
||||||
|
- spin_unlock_irqrestore(&iommu->lock, flags);
|
||||||
|
- }
|
||||||
|
+ offset = get_intremap_offset(vector, delivery_mode);
|
||||||
|
+ entry = (u32*)get_intremap_entry(req_id, offset);
|
||||||
|
+ update_intremap_entry(entry, vector, delivery_mode, dest_mode, dest);
|
||||||
|
+
|
||||||
|
+ spin_unlock_irqrestore(lock, flags);
|
||||||
|
+
|
||||||
|
+ if ( iommu->enabled )
|
||||||
|
+ {
|
||||||
|
+ spin_lock_irqsave(&iommu->lock, flags);
|
||||||
|
+ invalidate_interrupt_table(iommu, req_id);
|
||||||
|
+ flush_command_buffer(iommu);
|
||||||
|
+ spin_unlock_irqrestore(&iommu->lock, flags);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -199,7 +196,8 @@ int __init amd_iommu_setup_ioapic_remapp
|
||||||
|
spin_lock_irqsave(lock, flags);
|
||||||
|
offset = get_intremap_offset(vector, delivery_mode);
|
||||||
|
entry = (u32*)get_intremap_entry(req_id, offset);
|
||||||
|
- update_intremap_entry(entry, vector, delivery_mode, dest_mode, dest);
|
||||||
|
+ update_intremap_entry(entry, vector,
|
||||||
|
+ delivery_mode, dest_mode, dest);
|
||||||
|
spin_unlock_irqrestore(lock, flags);
|
||||||
|
|
||||||
|
if ( iommu->enabled )
|
||||||
|
@@ -217,16 +215,17 @@ int __init amd_iommu_setup_ioapic_remapp
|
||||||
|
void amd_iommu_ioapic_update_ire(
|
||||||
|
unsigned int apic, unsigned int reg, unsigned int value)
|
||||||
|
{
|
||||||
|
- struct IO_APIC_route_entry ioapic_rte = { 0 };
|
||||||
|
- unsigned int rte_upper = (reg & 1) ? 1 : 0;
|
||||||
|
+ struct IO_APIC_route_entry old_rte = { 0 };
|
||||||
|
+ struct IO_APIC_route_entry new_rte = { 0 };
|
||||||
|
+ unsigned int rte_lo = (reg & 1) ? reg - 1 : reg;
|
||||||
|
int saved_mask, bdf;
|
||||||
|
struct amd_iommu *iommu;
|
||||||
|
|
||||||
|
- *IO_APIC_BASE(apic) = reg;
|
||||||
|
- *(IO_APIC_BASE(apic)+4) = value;
|
||||||
|
-
|
||||||
|
if ( !iommu_intremap )
|
||||||
|
+ {
|
||||||
|
+ __io_apic_write(apic, reg, value);
|
||||||
|
return;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
/* get device id of ioapic devices */
|
||||||
|
bdf = ioapic_bdf[IO_APIC_ID(apic)];
|
||||||
|
@@ -235,30 +234,49 @@ void amd_iommu_ioapic_update_ire(
|
||||||
|
{
|
||||||
|
AMD_IOMMU_DEBUG("Fail to find iommu for ioapic device id = 0x%x\n",
|
||||||
|
bdf);
|
||||||
|
+ __io_apic_write(apic, reg, value);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
- if ( rte_upper )
|
||||||
|
- return;
|
||||||
|
|
||||||
|
- /* read both lower and upper 32-bits of rte entry */
|
||||||
|
- *IO_APIC_BASE(apic) = reg;
|
||||||
|
- *(((u32 *)&ioapic_rte) + 0) = *(IO_APIC_BASE(apic)+4);
|
||||||
|
- *IO_APIC_BASE(apic) = reg + 1;
|
||||||
|
- *(((u32 *)&ioapic_rte) + 1) = *(IO_APIC_BASE(apic)+4);
|
||||||
|
+ /* save io-apic rte lower 32 bits */
|
||||||
|
+ *((u32 *)&old_rte) = __io_apic_read(apic, rte_lo);
|
||||||
|
+ saved_mask = old_rte.mask;
|
||||||
|
+
|
||||||
|
+ if ( reg == rte_lo )
|
||||||
|
+ {
|
||||||
|
+ *((u32 *)&new_rte) = value;
|
||||||
|
+ /* read upper 32 bits from io-apic rte */
|
||||||
|
+ *(((u32 *)&new_rte) + 1) = __io_apic_read(apic, reg + 1);
|
||||||
|
+ }
|
||||||
|
+ else
|
||||||
|
+ {
|
||||||
|
+ *((u32 *)&new_rte) = *((u32 *)&old_rte);
|
||||||
|
+ *(((u32 *)&new_rte) + 1) = value;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
/* mask the interrupt while we change the intremap table */
|
||||||
|
- saved_mask = ioapic_rte.mask;
|
||||||
|
- ioapic_rte.mask = 1;
|
||||||
|
- *IO_APIC_BASE(apic) = reg;
|
||||||
|
- *(IO_APIC_BASE(apic)+4) = *(((int *)&ioapic_rte)+0);
|
||||||
|
- ioapic_rte.mask = saved_mask;
|
||||||
|
+ if ( !saved_mask )
|
||||||
|
+ {
|
||||||
|
+ old_rte.mask = 1;
|
||||||
|
+ __io_apic_write(apic, rte_lo, *((u32 *)&old_rte));
|
||||||
|
+ }
|
||||||
|
|
||||||
|
- update_intremap_entry_from_ioapic(
|
||||||
|
- bdf, iommu, &ioapic_rte, rte_upper, value);
|
||||||
|
+ /* Update interrupt remapping entry */
|
||||||
|
+ update_intremap_entry_from_ioapic(bdf, iommu, &new_rte);
|
||||||
|
+
|
||||||
|
+ /* Forward write access to IO-APIC RTE */
|
||||||
|
+ __io_apic_write(apic, reg, value);
|
||||||
|
+
|
||||||
|
+ /* For lower bits access, return directly to avoid double writes */
|
||||||
|
+ if ( reg == rte_lo )
|
||||||
|
+ return;
|
||||||
|
|
||||||
|
/* unmask the interrupt after we have updated the intremap table */
|
||||||
|
- *IO_APIC_BASE(apic) = reg;
|
||||||
|
- *(IO_APIC_BASE(apic)+4) = *(((u32 *)&ioapic_rte)+0);
|
||||||
|
+ if ( !saved_mask )
|
||||||
|
+ {
|
||||||
|
+ old_rte.mask = saved_mask;
|
||||||
|
+ __io_apic_write(apic, rte_lo, *((u32 *)&old_rte));
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
static void update_intremap_entry_from_msi_msg(
|
220
23228-x86-conditional-write_tsc.patch
Normal file
220
23228-x86-conditional-write_tsc.patch
Normal file
@ -0,0 +1,220 @@
|
|||||||
|
References: bnc#623680
|
||||||
|
|
||||||
|
# HG changeset patch
|
||||||
|
# User Keir Fraser <keir@xen.org>
|
||||||
|
# Date 1302853928 -3600
|
||||||
|
# Node ID 1329d99b4f161b7617a667f601077cc92559f248
|
||||||
|
# Parent b5165fb66b56d9438d77b475eaa9db67318d1ea1
|
||||||
|
x86: don't write_tsc() non-zero values on CPUs updating only the lower 32 bits
|
||||||
|
|
||||||
|
This means suppressing the uses in time_calibration_tsc_rendezvous(),
|
||||||
|
cstate_restore_tsc(), and synchronize_tsc_slave(), and fixes a boot
|
||||||
|
hang of Linux Dom0 when loading processor.ko on such systems that
|
||||||
|
have support for C states above C1.
|
||||||
|
|
||||||
|
Signed-off-by: Jan Beulich <jbeulich@novell.com>
|
||||||
|
Signed-off-by: Keir Fraser <keir@xen.org>
|
||||||
|
|
||||||
|
--- a/xen/arch/x86/acpi/cpu_idle.c
|
||||||
|
+++ b/xen/arch/x86/acpi/cpu_idle.c
|
||||||
|
@@ -1099,3 +1099,7 @@ void cpuidle_disable_deep_cstate(void)
|
||||||
|
hpet_disable_legacy_broadcast();
|
||||||
|
}
|
||||||
|
|
||||||
|
+bool_t cpuidle_using_deep_cstate(void)
|
||||||
|
+{
|
||||||
|
+ return xen_cpuidle && max_cstate > (local_apic_timer_c2_ok ? 2 : 1);
|
||||||
|
+}
|
||||||
|
--- a/xen/arch/x86/hpet.c
|
||||||
|
+++ b/xen/arch/x86/hpet.c
|
||||||
|
@@ -634,6 +634,9 @@ void hpet_disable_legacy_broadcast(void)
|
||||||
|
u32 cfg;
|
||||||
|
unsigned long flags;
|
||||||
|
|
||||||
|
+ if ( !legacy_hpet_event.shift )
|
||||||
|
+ return;
|
||||||
|
+
|
||||||
|
spin_lock_irqsave(&legacy_hpet_event.lock, flags);
|
||||||
|
|
||||||
|
legacy_hpet_event.flags |= HPET_EVT_DISABLE;
|
||||||
|
--- a/xen/arch/x86/smpboot.c
|
||||||
|
+++ b/xen/arch/x86/smpboot.c
|
||||||
|
@@ -41,6 +41,7 @@
|
||||||
|
#include <asm/flushtlb.h>
|
||||||
|
#include <asm/msr.h>
|
||||||
|
#include <asm/mtrr.h>
|
||||||
|
+#include <asm/time.h>
|
||||||
|
#include <mach_apic.h>
|
||||||
|
#include <mach_wakecpu.h>
|
||||||
|
#include <smpboot_hooks.h>
|
||||||
|
@@ -134,6 +135,12 @@ static void smp_store_cpu_info(int id)
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
|
+/*
|
||||||
|
+ * TSC's upper 32 bits can't be written in earlier CPUs (before
|
||||||
|
+ * Prescott), there is no way to resync one AP against BP.
|
||||||
|
+ */
|
||||||
|
+bool_t disable_tsc_sync;
|
||||||
|
+
|
||||||
|
static atomic_t tsc_count;
|
||||||
|
static uint64_t tsc_value;
|
||||||
|
static cpumask_t tsc_sync_cpu_mask;
|
||||||
|
@@ -142,6 +149,9 @@ static void synchronize_tsc_master(unsig
|
||||||
|
{
|
||||||
|
unsigned int i;
|
||||||
|
|
||||||
|
+ if ( disable_tsc_sync )
|
||||||
|
+ return;
|
||||||
|
+
|
||||||
|
if ( boot_cpu_has(X86_FEATURE_TSC_RELIABLE) &&
|
||||||
|
!cpu_isset(slave, tsc_sync_cpu_mask) )
|
||||||
|
return;
|
||||||
|
@@ -163,6 +173,9 @@ static void synchronize_tsc_slave(unsign
|
||||||
|
{
|
||||||
|
unsigned int i;
|
||||||
|
|
||||||
|
+ if ( disable_tsc_sync )
|
||||||
|
+ return;
|
||||||
|
+
|
||||||
|
if ( boot_cpu_has(X86_FEATURE_TSC_RELIABLE) &&
|
||||||
|
!cpu_isset(slave, tsc_sync_cpu_mask) )
|
||||||
|
return;
|
||||||
|
--- a/xen/arch/x86/time.c
|
||||||
|
+++ b/xen/arch/x86/time.c
|
||||||
|
@@ -21,6 +21,7 @@
|
||||||
|
#include <xen/smp.h>
|
||||||
|
#include <xen/irq.h>
|
||||||
|
#include <xen/softirq.h>
|
||||||
|
+#include <xen/cpuidle.h>
|
||||||
|
#include <xen/keyhandler.h>
|
||||||
|
#include <xen/guest_access.h>
|
||||||
|
#include <asm/io.h>
|
||||||
|
@@ -682,6 +683,8 @@ void cstate_restore_tsc(void)
|
||||||
|
if ( boot_cpu_has(X86_FEATURE_NONSTOP_TSC) )
|
||||||
|
return;
|
||||||
|
|
||||||
|
+ ASSERT(boot_cpu_has(X86_FEATURE_TSC_RELIABLE));
|
||||||
|
+
|
||||||
|
write_tsc(stime2tsc(read_platform_stime()));
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -1384,6 +1387,66 @@ void init_percpu_time(void)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+/*
|
||||||
|
+ * On certain older Intel CPUs writing the TSC MSR clears the upper 32 bits.
|
||||||
|
+ * Obviously we must not use write_tsc() on such CPUs.
|
||||||
|
+ *
|
||||||
|
+ * Additionally, AMD specifies that being able to write the TSC MSR is not an
|
||||||
|
+ * architectural feature (but, other than their manual says, also cannot be
|
||||||
|
+ * determined from CPUID bits).
|
||||||
|
+ */
|
||||||
|
+static void __init tsc_check_writability(void)
|
||||||
|
+{
|
||||||
|
+ const char *what = NULL;
|
||||||
|
+ uint64_t tsc;
|
||||||
|
+
|
||||||
|
+ /*
|
||||||
|
+ * If all CPUs are reported as synchronised and in sync, we never write
|
||||||
|
+ * the TSCs (except unavoidably, when a CPU is physically hot-plugged).
|
||||||
|
+ * Hence testing for writability is pointless and even harmful.
|
||||||
|
+ */
|
||||||
|
+ if ( boot_cpu_has(X86_FEATURE_TSC_RELIABLE) )
|
||||||
|
+ return;
|
||||||
|
+
|
||||||
|
+ rdtscll(tsc);
|
||||||
|
+ if ( wrmsr_safe(MSR_IA32_TSC, 0) == 0 )
|
||||||
|
+ {
|
||||||
|
+ uint64_t tmp, tmp2;
|
||||||
|
+ rdtscll(tmp2);
|
||||||
|
+ write_tsc(tsc | (1ULL << 32));
|
||||||
|
+ rdtscll(tmp);
|
||||||
|
+ if ( ABS((s64)tmp - (s64)tmp2) < (1LL << 31) )
|
||||||
|
+ what = "only partially";
|
||||||
|
+ }
|
||||||
|
+ else
|
||||||
|
+ {
|
||||||
|
+ what = "not";
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ /* Nothing to do if the TSC is fully writable. */
|
||||||
|
+ if ( !what )
|
||||||
|
+ {
|
||||||
|
+ /*
|
||||||
|
+ * Paranoia - write back original TSC value. However, APs get synced
|
||||||
|
+ * with BSP as they are brought up, so this doesn't much matter.
|
||||||
|
+ */
|
||||||
|
+ write_tsc(tsc);
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ printk(XENLOG_WARNING "TSC %s writable\n", what);
|
||||||
|
+
|
||||||
|
+ /* time_calibration_tsc_rendezvous() must not be used */
|
||||||
|
+ setup_clear_cpu_cap(X86_FEATURE_CONSTANT_TSC);
|
||||||
|
+
|
||||||
|
+ /* cstate_restore_tsc() must not be used (or do nothing) */
|
||||||
|
+ if ( !boot_cpu_has(X86_FEATURE_NONSTOP_TSC) )
|
||||||
|
+ cpuidle_disable_deep_cstate();
|
||||||
|
+
|
||||||
|
+ /* synchronize_tsc_slave() must do nothing */
|
||||||
|
+ disable_tsc_sync = 1;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
/* Late init function (after all CPUs are booted). */
|
||||||
|
int __init init_xen_time(void)
|
||||||
|
{
|
||||||
|
@@ -1400,6 +1463,8 @@ int __init init_xen_time(void)
|
||||||
|
setup_clear_cpu_cap(X86_FEATURE_TSC_RELIABLE);
|
||||||
|
}
|
||||||
|
|
||||||
|
+ tsc_check_writability();
|
||||||
|
+
|
||||||
|
/* If we have constant-rate TSCs then scale factor can be shared. */
|
||||||
|
if ( boot_cpu_has(X86_FEATURE_CONSTANT_TSC) )
|
||||||
|
{
|
||||||
|
@@ -1451,7 +1516,7 @@ static int disable_pit_irq(void)
|
||||||
|
* XXX dom0 may rely on RTC interrupt delivery, so only enable
|
||||||
|
* hpet_broadcast if FSB mode available or if force_hpet_broadcast.
|
||||||
|
*/
|
||||||
|
- if ( xen_cpuidle && !boot_cpu_has(X86_FEATURE_ARAT) )
|
||||||
|
+ if ( cpuidle_using_deep_cstate() && !boot_cpu_has(X86_FEATURE_ARAT) )
|
||||||
|
{
|
||||||
|
hpet_broadcast_init();
|
||||||
|
if ( !hpet_broadcast_is_available() )
|
||||||
|
--- a/xen/include/asm-x86/setup.h
|
||||||
|
+++ b/xen/include/asm-x86/setup.h
|
||||||
|
@@ -4,7 +4,6 @@
|
||||||
|
#include <xen/multiboot.h>
|
||||||
|
|
||||||
|
extern bool_t early_boot;
|
||||||
|
-extern s8 xen_cpuidle;
|
||||||
|
extern unsigned long xenheap_initial_phys_start;
|
||||||
|
|
||||||
|
void init_done(void);
|
||||||
|
--- a/xen/include/asm-x86/time.h
|
||||||
|
+++ b/xen/include/asm-x86/time.h
|
||||||
|
@@ -24,6 +24,8 @@
|
||||||
|
|
||||||
|
typedef u64 cycles_t;
|
||||||
|
|
||||||
|
+extern bool_t disable_tsc_sync;
|
||||||
|
+
|
||||||
|
static inline cycles_t get_cycles(void)
|
||||||
|
{
|
||||||
|
cycles_t c;
|
||||||
|
--- a/xen/include/xen/cpuidle.h
|
||||||
|
+++ b/xen/include/xen/cpuidle.h
|
||||||
|
@@ -85,7 +85,10 @@ struct cpuidle_governor
|
||||||
|
void (*reflect) (struct acpi_processor_power *dev);
|
||||||
|
};
|
||||||
|
|
||||||
|
+extern s8 xen_cpuidle;
|
||||||
|
extern struct cpuidle_governor *cpuidle_current_governor;
|
||||||
|
+
|
||||||
|
+bool_t cpuidle_using_deep_cstate(void);
|
||||||
|
void cpuidle_disable_deep_cstate(void);
|
||||||
|
|
||||||
|
extern void cpuidle_wakeup_mwait(cpumask_t *mask);
|
@ -2,7 +2,7 @@ Index: xen-4.1.0-testing/tools/python/xen/xend/XendDomainInfo.py
|
|||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.1.0-testing.orig/tools/python/xen/xend/XendDomainInfo.py
|
--- xen-4.1.0-testing.orig/tools/python/xen/xend/XendDomainInfo.py
|
||||||
+++ xen-4.1.0-testing/tools/python/xen/xend/XendDomainInfo.py
|
+++ xen-4.1.0-testing/tools/python/xen/xend/XendDomainInfo.py
|
||||||
@@ -2912,7 +2912,7 @@ class XendDomainInfo:
|
@@ -2913,7 +2913,7 @@ class XendDomainInfo:
|
||||||
|
|
||||||
self.guest_bitsize = self.image.getBitSize()
|
self.guest_bitsize = self.image.getBitSize()
|
||||||
# Make sure there's enough RAM available for the domain
|
# Make sure there's enough RAM available for the domain
|
||||||
|
@ -70,7 +70,7 @@ Index: xen-4.1.0-testing/tools/ioemu-qemu-xen/xenstore.c
|
|||||||
pstrcpy(bs->filename, sizeof(bs->filename), params);
|
pstrcpy(bs->filename, sizeof(bs->filename), params);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
@@ -710,7 +723,7 @@ void xenstore_parse_domain_config(int hv
|
@@ -716,7 +729,7 @@ void xenstore_parse_domain_config(int hv
|
||||||
|
|
||||||
fprintf(stderr, "Using file %s in read-%s mode\n", bs->filename, is_readonly ? "only" : "write");
|
fprintf(stderr, "Using file %s in read-%s mode\n", bs->filename, is_readonly ? "only" : "write");
|
||||||
|
|
||||||
|
217
cve-2011-1583-4.1.patch
Normal file
217
cve-2011-1583-4.1.patch
Normal file
@ -0,0 +1,217 @@
|
|||||||
|
diff -r dbf2ddf652dc tools/libxc/xc_dom_bzimageloader.c
|
||||||
|
--- a/tools/libxc/xc_dom_bzimageloader.c Thu Apr 07 15:26:58 2011 +0100
|
||||||
|
+++ b/tools/libxc/xc_dom_bzimageloader.c Thu Apr 21 12:05:57 2011 +0100
|
||||||
|
@@ -82,8 +82,29 @@ static int xc_try_bzip2_decode(
|
||||||
|
for ( ; ; )
|
||||||
|
{
|
||||||
|
ret = BZ2_bzDecompress(&stream);
|
||||||
|
- if ( (stream.avail_out == 0) || (ret != BZ_OK) )
|
||||||
|
+ if ( ret == BZ_STREAM_END )
|
||||||
|
{
|
||||||
|
+ DOMPRINTF("BZIP2: Saw data stream end");
|
||||||
|
+ retval = 0;
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+ if ( ret != BZ_OK )
|
||||||
|
+ {
|
||||||
|
+ DOMPRINTF("BZIP2: error %d", ret);
|
||||||
|
+ free(out_buf);
|
||||||
|
+ goto bzip2_cleanup;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if ( stream.avail_out == 0 )
|
||||||
|
+ {
|
||||||
|
+ /* Protect against output buffer overflow */
|
||||||
|
+ if ( outsize > INT_MAX / 2 )
|
||||||
|
+ {
|
||||||
|
+ DOMPRINTF("BZIP2: output buffer overflow");
|
||||||
|
+ free(out_buf);
|
||||||
|
+ goto bzip2_cleanup;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
tmp_buf = realloc(out_buf, outsize * 2);
|
||||||
|
if ( tmp_buf == NULL )
|
||||||
|
{
|
||||||
|
@@ -97,16 +118,18 @@ static int xc_try_bzip2_decode(
|
||||||
|
stream.avail_out = (outsize * 2) - outsize;
|
||||||
|
outsize *= 2;
|
||||||
|
}
|
||||||
|
-
|
||||||
|
- if ( ret != BZ_OK )
|
||||||
|
+ else if ( stream.avail_in == 0 )
|
||||||
|
{
|
||||||
|
- if ( ret == BZ_STREAM_END )
|
||||||
|
- {
|
||||||
|
- DOMPRINTF("BZIP2: Saw data stream end");
|
||||||
|
- retval = 0;
|
||||||
|
- break;
|
||||||
|
- }
|
||||||
|
- DOMPRINTF("BZIP2: error");
|
||||||
|
+ /*
|
||||||
|
+ * If there is output buffer available then this indicates
|
||||||
|
+ * that BZ2_bzDecompress would like more input data to be
|
||||||
|
+ * provided. However our complete input buffer is in
|
||||||
|
+ * memory and provided upfront so if avail_in is zero this
|
||||||
|
+ * actually indicates a truncated input.
|
||||||
|
+ */
|
||||||
|
+ DOMPRINTF("BZIP2: not enough input");
|
||||||
|
+ free(out_buf);
|
||||||
|
+ goto bzip2_cleanup;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -180,31 +203,14 @@ static int xc_try_lzma_decode(
|
||||||
|
for ( ; ; )
|
||||||
|
{
|
||||||
|
ret = lzma_code(&stream, action);
|
||||||
|
- if ( (stream.avail_out == 0) || (ret != LZMA_OK) )
|
||||||
|
+ if ( ret == LZMA_STREAM_END )
|
||||||
|
{
|
||||||
|
- tmp_buf = realloc(out_buf, outsize * 2);
|
||||||
|
- if ( tmp_buf == NULL )
|
||||||
|
- {
|
||||||
|
- DOMPRINTF("LZMA: Failed to realloc memory");
|
||||||
|
- free(out_buf);
|
||||||
|
- goto lzma_cleanup;
|
||||||
|
- }
|
||||||
|
- out_buf = tmp_buf;
|
||||||
|
-
|
||||||
|
- stream.next_out = out_buf + outsize;
|
||||||
|
- stream.avail_out = (outsize * 2) - outsize;
|
||||||
|
- outsize *= 2;
|
||||||
|
+ DOMPRINTF("LZMA: Saw data stream end");
|
||||||
|
+ retval = 0;
|
||||||
|
+ break;
|
||||||
|
}
|
||||||
|
-
|
||||||
|
if ( ret != LZMA_OK )
|
||||||
|
{
|
||||||
|
- if ( ret == LZMA_STREAM_END )
|
||||||
|
- {
|
||||||
|
- DOMPRINTF("LZMA: Saw data stream end");
|
||||||
|
- retval = 0;
|
||||||
|
- break;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
switch ( ret )
|
||||||
|
{
|
||||||
|
case LZMA_MEM_ERROR:
|
||||||
|
@@ -238,7 +244,32 @@ static int xc_try_lzma_decode(
|
||||||
|
}
|
||||||
|
DOMPRINTF("%s: LZMA decompression error %s",
|
||||||
|
__FUNCTION__, msg);
|
||||||
|
- break;
|
||||||
|
+ free(out_buf);
|
||||||
|
+ goto lzma_cleanup;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if ( stream.avail_out == 0 )
|
||||||
|
+ {
|
||||||
|
+ /* Protect against output buffer overflow */
|
||||||
|
+ if ( outsize > INT_MAX / 2 )
|
||||||
|
+ {
|
||||||
|
+ DOMPRINTF("LZMA: output buffer overflow");
|
||||||
|
+ free(out_buf);
|
||||||
|
+ goto lzma_cleanup;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ tmp_buf = realloc(out_buf, outsize * 2);
|
||||||
|
+ if ( tmp_buf == NULL )
|
||||||
|
+ {
|
||||||
|
+ DOMPRINTF("LZMA: Failed to realloc memory");
|
||||||
|
+ free(out_buf);
|
||||||
|
+ goto lzma_cleanup;
|
||||||
|
+ }
|
||||||
|
+ out_buf = tmp_buf;
|
||||||
|
+
|
||||||
|
+ stream.next_out = out_buf + outsize;
|
||||||
|
+ stream.avail_out = (outsize * 2) - outsize;
|
||||||
|
+ outsize *= 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -489,18 +520,18 @@ struct setup_header {
|
||||||
|
|
||||||
|
extern struct xc_dom_loader elf_loader;
|
||||||
|
|
||||||
|
-static unsigned int payload_offset(struct setup_header *hdr)
|
||||||
|
+static int check_magic(struct xc_dom_image *dom, const void *magic, size_t len)
|
||||||
|
{
|
||||||
|
- unsigned int off;
|
||||||
|
+ if (len > dom->kernel_size)
|
||||||
|
+ return 0;
|
||||||
|
|
||||||
|
- off = (hdr->setup_sects + 1) * 512;
|
||||||
|
- off += hdr->payload_offset;
|
||||||
|
- return off;
|
||||||
|
+ return (memcmp(dom->kernel_blob, magic, len) == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int xc_dom_probe_bzimage_kernel(struct xc_dom_image *dom)
|
||||||
|
{
|
||||||
|
struct setup_header *hdr;
|
||||||
|
+ uint64_t payload_offset, payload_length;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
if ( dom->kernel_blob == NULL )
|
||||||
|
@@ -533,10 +564,30 @@ static int xc_dom_probe_bzimage_kernel(s
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
- dom->kernel_blob = dom->kernel_blob + payload_offset(hdr);
|
||||||
|
- dom->kernel_size = hdr->payload_length;
|
||||||
|
|
||||||
|
- if ( memcmp(dom->kernel_blob, "\037\213", 2) == 0 )
|
||||||
|
+ /* upcast to 64 bits to avoid overflow */
|
||||||
|
+ /* setup_sects is u8 and so cannot overflow */
|
||||||
|
+ payload_offset = (hdr->setup_sects + 1) * 512;
|
||||||
|
+ payload_offset += hdr->payload_offset;
|
||||||
|
+ payload_length = hdr->payload_length;
|
||||||
|
+
|
||||||
|
+ if ( payload_offset >= dom->kernel_size )
|
||||||
|
+ {
|
||||||
|
+ xc_dom_panic(dom->xch, XC_INVALID_KERNEL, "%s: payload offset overflow",
|
||||||
|
+ __FUNCTION__);
|
||||||
|
+ return -EINVAL;
|
||||||
|
+ }
|
||||||
|
+ if ( (payload_offset + payload_length) > dom->kernel_size )
|
||||||
|
+ {
|
||||||
|
+ xc_dom_panic(dom->xch, XC_INVALID_KERNEL, "%s: payload length overflow",
|
||||||
|
+ __FUNCTION__);
|
||||||
|
+ return -EINVAL;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ dom->kernel_blob = dom->kernel_blob + payload_offset;
|
||||||
|
+ dom->kernel_size = payload_length;
|
||||||
|
+
|
||||||
|
+ if ( check_magic(dom, "\037\213", 2) )
|
||||||
|
{
|
||||||
|
ret = xc_dom_try_gunzip(dom, &dom->kernel_blob, &dom->kernel_size);
|
||||||
|
if ( ret == -1 )
|
||||||
|
@@ -546,7 +597,7 @@ static int xc_dom_probe_bzimage_kernel(s
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
- else if ( memcmp(dom->kernel_blob, "\102\132\150", 3) == 0 )
|
||||||
|
+ else if ( check_magic(dom, "\102\132\150", 3) )
|
||||||
|
{
|
||||||
|
ret = xc_try_bzip2_decode(dom, &dom->kernel_blob, &dom->kernel_size);
|
||||||
|
if ( ret < 0 )
|
||||||
|
@@ -557,7 +608,7 @@ static int xc_dom_probe_bzimage_kernel(s
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
- else if ( memcmp(dom->kernel_blob, "\135\000", 2) == 0 )
|
||||||
|
+ else if ( check_magic(dom, "\135\000", 2) )
|
||||||
|
{
|
||||||
|
ret = xc_try_lzma_decode(dom, &dom->kernel_blob, &dom->kernel_size);
|
||||||
|
if ( ret < 0 )
|
||||||
|
@@ -568,7 +619,7 @@ static int xc_dom_probe_bzimage_kernel(s
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
- else if ( memcmp(dom->kernel_blob, "\x89LZO", 5) == 0 )
|
||||||
|
+ else if ( check_magic(dom, "\x89LZO", 5) )
|
||||||
|
{
|
||||||
|
ret = xc_try_lzo1x_decode(dom, &dom->kernel_blob, &dom->kernel_size);
|
||||||
|
if ( ret < 0 )
|
34
hotplug.losetup.patch
Normal file
34
hotplug.losetup.patch
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
Improve busy loop device detection after changeset 22773:02c0af2bf280
|
||||||
|
|
||||||
|
The intention is not to find the file to be mounted in the losetup -a
|
||||||
|
output. What matters are existing mounted files with the same dev:inode
|
||||||
|
as the new file. So the fix is to apply variable expansion which
|
||||||
|
happens only without double quotes. Otherwise $dev will contain
|
||||||
|
newlines for hardlinked files, as mentioned in the commit message from
|
||||||
|
the changeset above.
|
||||||
|
|
||||||
|
losetup -a does also truncate long filenames to 62 chars due to ioctl
|
||||||
|
limitations. This part is fixed with 2.6.37 where the filename can be
|
||||||
|
obtained from sysfs. As a result very long filenames will be missed.
|
||||||
|
|
||||||
|
Signed-off-by: Olaf Hering <olaf@aepfle.de>
|
||||||
|
|
||||||
|
---
|
||||||
|
tools/hotplug/Linux/block | 4 ++--
|
||||||
|
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
Index: xen-4.1.0-testing/tools/hotplug/Linux/block
|
||||||
|
===================================================================
|
||||||
|
--- xen-4.1.0-testing.orig/tools/hotplug/Linux/block
|
||||||
|
+++ xen-4.1.0-testing/tools/hotplug/Linux/block
|
||||||
|
@@ -280,8 +280,8 @@ mount it read-write in a guest domain."
|
||||||
|
fi
|
||||||
|
|
||||||
|
shared_list=$(losetup -a |
|
||||||
|
- sed -n -e "s@^\([^:]\+\)\(:[[:blank:]]\[${dev}\]:${inode}[[:blank:]](${file})\)@\1@p" )
|
||||||
|
- for dev in "$shared_list"
|
||||||
|
+ sed -n -e "s@^\([^:]\+\)\(:[[:blank:]]\[${dev}\]:${inode}[[:blank:]](.*)\)@\1@p" )
|
||||||
|
+ for dev in $shared_list
|
||||||
|
do
|
||||||
|
if [ -n "$dev" ]
|
||||||
|
then
|
13
init.xend
13
init.xend
@ -81,19 +81,6 @@ case "$1" in
|
|||||||
else
|
else
|
||||||
cleanup
|
cleanup
|
||||||
fi
|
fi
|
||||||
# Load XEN backend modules
|
|
||||||
# Sidenote: They could be loaded later:
|
|
||||||
# - netbk and blkbk when the dom0 hotplug events occur
|
|
||||||
# (in xen-network-common.sh and block-common.sh)
|
|
||||||
# - xenblk when xend prepares for bootloader
|
|
||||||
# but for now it's safest to have them loaded when xend starts in dom0.
|
|
||||||
modprobe evtchn 2>/dev/null || true
|
|
||||||
modprobe blktap 2>/dev/null || true
|
|
||||||
modprobe blkbk 2>/dev/null || true
|
|
||||||
modprobe xenblk 2>/dev/null || true
|
|
||||||
modprobe netbk 2>/dev/null || true
|
|
||||||
modprobe gntdev 2>/dev/null || true
|
|
||||||
modprobe usbbk 2>/dev/null || true
|
|
||||||
xend start
|
xend start
|
||||||
await_daemons_up
|
await_daemons_up
|
||||||
;;
|
;;
|
||||||
|
@ -49,7 +49,7 @@ Index: xen-4.1.0-testing/tools/ioemu-qemu-xen/xenstore.c
|
|||||||
{
|
{
|
||||||
char **e_danger = NULL;
|
char **e_danger = NULL;
|
||||||
char *buf = NULL;
|
char *buf = NULL;
|
||||||
@@ -754,15 +754,19 @@ void xenstore_parse_domain_config(int hv
|
@@ -760,15 +760,19 @@ void xenstore_parse_domain_config(int hv
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@ Index: xen-4.1.0-testing/tools/ioemu-qemu-xen/xenstore.c
|
|||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.1.0-testing.orig/tools/ioemu-qemu-xen/xenstore.c
|
--- xen-4.1.0-testing.orig/tools/ioemu-qemu-xen/xenstore.c
|
||||||
+++ xen-4.1.0-testing/tools/ioemu-qemu-xen/xenstore.c
|
+++ xen-4.1.0-testing/tools/ioemu-qemu-xen/xenstore.c
|
||||||
@@ -972,6 +972,18 @@ static void xenstore_process_dm_command_
|
@@ -978,6 +978,18 @@ static void xenstore_process_dm_command_
|
||||||
}
|
}
|
||||||
|
|
||||||
snapshot_name = xs_read(xsh, XBT_NULL, path, &len);
|
snapshot_name = xs_read(xsh, XBT_NULL, path, &len);
|
||||||
|
@ -11,7 +11,7 @@ Index: xen-4.1.0-testing/tools/ioemu-qemu-xen/xenstore.c
|
|||||||
static int pasprintf(char **buf, const char *fmt, ...)
|
static int pasprintf(char **buf, const char *fmt, ...)
|
||||||
{
|
{
|
||||||
va_list ap;
|
va_list ap;
|
||||||
@@ -708,8 +710,33 @@ void xenstore_parse_domain_config(int hv
|
@@ -714,8 +716,33 @@ void xenstore_parse_domain_config(int hv
|
||||||
|
|
||||||
fprintf(stderr, "Using file %s in read-%s mode\n", bs->filename, is_readonly ? "only" : "write");
|
fprintf(stderr, "Using file %s in read-%s mode\n", bs->filename, is_readonly ? "only" : "write");
|
||||||
|
|
||||||
@ -46,7 +46,7 @@ Index: xen-4.1.0-testing/tools/ioemu-qemu-xen/xenstore.c
|
|||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -839,6 +866,23 @@ int xenstore_parse_disable_pf_config ()
|
@@ -845,6 +872,23 @@ int xenstore_parse_disable_pf_config ()
|
||||||
return disable_pf;
|
return disable_pf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -207,7 +207,7 @@ Index: xen-4.1.0-testing/tools/ioemu-qemu-xen/xenstore.c
|
|||||||
|
|
||||||
#include "console.h"
|
#include "console.h"
|
||||||
#include "hw.h"
|
#include "hw.h"
|
||||||
@@ -899,6 +900,7 @@ static void xenstore_process_dm_command_
|
@@ -905,6 +906,7 @@ static void xenstore_process_dm_command_
|
||||||
{
|
{
|
||||||
char *path = NULL, *command = NULL, *par = NULL;
|
char *path = NULL, *command = NULL, *par = NULL;
|
||||||
unsigned int len;
|
unsigned int len;
|
||||||
@ -215,7 +215,7 @@ Index: xen-4.1.0-testing/tools/ioemu-qemu-xen/xenstore.c
|
|||||||
|
|
||||||
if (pasprintf(&path,
|
if (pasprintf(&path,
|
||||||
"/local/domain/0/device-model/%u/command", domid) == -1) {
|
"/local/domain/0/device-model/%u/command", domid) == -1) {
|
||||||
@@ -914,7 +916,18 @@ static void xenstore_process_dm_command_
|
@@ -920,7 +922,18 @@ static void xenstore_process_dm_command_
|
||||||
|
|
||||||
if (!strncmp(command, "save", len)) {
|
if (!strncmp(command, "save", len)) {
|
||||||
fprintf(logfile, "dm-command: pause and save state\n");
|
fprintf(logfile, "dm-command: pause and save state\n");
|
||||||
@ -235,7 +235,7 @@ Index: xen-4.1.0-testing/tools/ioemu-qemu-xen/xenstore.c
|
|||||||
} else if (!strncmp(command, "continue", len)) {
|
} else if (!strncmp(command, "continue", len)) {
|
||||||
fprintf(logfile, "dm-command: continue after state save\n");
|
fprintf(logfile, "dm-command: continue after state save\n");
|
||||||
xen_pause_requested = 0;
|
xen_pause_requested = 0;
|
||||||
@@ -1077,6 +1090,13 @@ static void xenstore_process_vcpu_set_ev
|
@@ -1083,6 +1096,13 @@ static void xenstore_process_vcpu_set_ev
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
23
tmp-initscript-modprobe.patch
Normal file
23
tmp-initscript-modprobe.patch
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
Index: xen-4.1.0-testing/tools/hotplug/Linux/init.d/xencommons
|
||||||
|
===================================================================
|
||||||
|
--- xen-4.1.0-testing.orig/tools/hotplug/Linux/init.d/xencommons
|
||||||
|
+++ xen-4.1.0-testing/tools/hotplug/Linux/init.d/xencommons
|
||||||
|
@@ -45,6 +45,18 @@ do_start () {
|
||||||
|
local time=0
|
||||||
|
local timeout=30
|
||||||
|
|
||||||
|
+ # Load XEN backend modules
|
||||||
|
+ # NB: They could be loaded later, e.g. when dom0 hotplug events occur,
|
||||||
|
+ # but for now it's safest to have them loaded here.
|
||||||
|
+ modprobe evtchn 2>/dev/null || true
|
||||||
|
+ modprobe gntdev 2>/dev/null || true
|
||||||
|
+ modprobe blktap 2>/dev/null || true
|
||||||
|
+ modprobe blkbk 2>/dev/null || true
|
||||||
|
+ modprobe netbk 2>/dev/null || true
|
||||||
|
+ modprobe usbbk 2>/dev/null || true
|
||||||
|
+ # xenblk (frontend module) is needed in dom0, allowing it to use vbds
|
||||||
|
+ modprobe xenblk 2>/dev/null || true
|
||||||
|
+
|
||||||
|
if ! `xenstore-read -s / >/dev/null 2>&1`
|
||||||
|
then
|
||||||
|
test -z "$XENSTORED_ROOTDIR" || XENSTORED_ROOTDIR="/var/lib/xenstored"
|
@ -1,42 +1,9 @@
|
|||||||
Index: xen-4.1.0-testing/tools/hotplug/Linux/vif-route-ifup
|
---
|
||||||
===================================================================
|
tools/examples/xend-config.sxp | 20 ++++++++++++++++++++
|
||||||
--- /dev/null
|
tools/hotplug/Linux/Makefile | 2 +-
|
||||||
+++ xen-4.1.0-testing/tools/hotplug/Linux/vif-route-ifup
|
tools/hotplug/Linux/vif-route-ifup | 34 ++++++++++++++++++++++++++++++++++
|
||||||
@@ -0,0 +1,34 @@
|
3 files changed, 55 insertions(+), 1 deletion(-)
|
||||||
+#!/bin/bash
|
|
||||||
+#============================================================================
|
|
||||||
+# /etc/xen/vif-route-ifup
|
|
||||||
+#
|
|
||||||
+# Script for configuring a vif in routed mode.
|
|
||||||
+# The hotplugging system will call this script if it is specified either in
|
|
||||||
+# the device configuration given to Xend, or the default Xend configuration
|
|
||||||
+# in /etc/xen/xend-config.sxp. If the script is specified in neither of those
|
|
||||||
+# places, then vif-bridge is the default.
|
|
||||||
+#
|
|
||||||
+# Usage:
|
|
||||||
+# vif-route-ifup (add|remove|online|offline)
|
|
||||||
+#
|
|
||||||
+# Environment vars:
|
|
||||||
+# vif vif interface name (required).
|
|
||||||
+#============================================================================
|
|
||||||
+
|
|
||||||
+dir=$(dirname "$0")
|
|
||||||
+. "$dir/vif-common.sh"
|
|
||||||
+
|
|
||||||
+case "$command" in
|
|
||||||
+ online)
|
|
||||||
+ ifup ${vif}
|
|
||||||
+ ;;
|
|
||||||
+ offline)
|
|
||||||
+ do_without_error ifdown ${vif}
|
|
||||||
+ ;;
|
|
||||||
+esac
|
|
||||||
+
|
|
||||||
+log debug "Successful vif-route-ifup $command for $vif."
|
|
||||||
+if [ "$command" = "online" ]
|
|
||||||
+then
|
|
||||||
+ success
|
|
||||||
+fi
|
|
||||||
Index: xen-4.1.0-testing/tools/examples/xend-config.sxp
|
Index: xen-4.1.0-testing/tools/examples/xend-config.sxp
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-4.1.0-testing.orig/tools/examples/xend-config.sxp
|
--- xen-4.1.0-testing.orig/tools/examples/xend-config.sxp
|
||||||
@ -81,3 +48,42 @@ Index: xen-4.1.0-testing/tools/hotplug/Linux/Makefile
|
|||||||
XEN_SCRIPTS += network-nat vif-nat
|
XEN_SCRIPTS += network-nat vif-nat
|
||||||
XEN_SCRIPTS += vif2
|
XEN_SCRIPTS += vif2
|
||||||
XEN_SCRIPTS += vif-setup
|
XEN_SCRIPTS += vif-setup
|
||||||
|
Index: xen-4.1.0-testing/tools/hotplug/Linux/vif-route-ifup
|
||||||
|
===================================================================
|
||||||
|
--- /dev/null
|
||||||
|
+++ xen-4.1.0-testing/tools/hotplug/Linux/vif-route-ifup
|
||||||
|
@@ -0,0 +1,34 @@
|
||||||
|
+#!/bin/bash
|
||||||
|
+#============================================================================
|
||||||
|
+# /etc/xen/vif-route-ifup
|
||||||
|
+#
|
||||||
|
+# Script for configuring a vif in routed mode.
|
||||||
|
+# The hotplugging system will call this script if it is specified either in
|
||||||
|
+# the device configuration given to Xend, or the default Xend configuration
|
||||||
|
+# in /etc/xen/xend-config.sxp. If the script is specified in neither of those
|
||||||
|
+# places, then vif-bridge is the default.
|
||||||
|
+#
|
||||||
|
+# Usage:
|
||||||
|
+# vif-route-ifup (add|remove|online|offline)
|
||||||
|
+#
|
||||||
|
+# Environment vars:
|
||||||
|
+# dev vif interface name (required).
|
||||||
|
+#============================================================================
|
||||||
|
+
|
||||||
|
+dir=$(dirname "$0")
|
||||||
|
+. "$dir/vif-common.sh"
|
||||||
|
+
|
||||||
|
+case "$command" in
|
||||||
|
+ online)
|
||||||
|
+ ifup ${dev}
|
||||||
|
+ ;;
|
||||||
|
+ offline)
|
||||||
|
+ do_without_error ifdown ${dev}
|
||||||
|
+ ;;
|
||||||
|
+esac
|
||||||
|
+
|
||||||
|
+log debug "Successful vif-route-ifup $command for ${dev}."
|
||||||
|
+if [ "$command" = "online" ]
|
||||||
|
+then
|
||||||
|
+ success
|
||||||
|
+fi
|
||||||
|
@ -61,3 +61,16 @@ Index: xen-4.1.0-testing/tools/ioemu-qemu-xen/xenstore.c
|
|||||||
/* Obtain blktap sub-type prefix */
|
/* Obtain blktap sub-type prefix */
|
||||||
if ((!strcmp(drv, "tap") || !strcmp(drv, "qdisk")) && params[0]) {
|
if ((!strcmp(drv, "tap") || !strcmp(drv, "qdisk")) && params[0]) {
|
||||||
char *offset = strchr(params, ':');
|
char *offset = strchr(params, ':');
|
||||||
|
@@ -657,6 +681,12 @@ void xenstore_parse_domain_config(int hv
|
||||||
|
format = &bdrv_host_device;
|
||||||
|
else
|
||||||
|
format = &bdrv_raw;
|
||||||
|
+ } else if (!strcmp(drv,"iscsi")) {
|
||||||
|
+ format = &bdrv_raw;
|
||||||
|
+ } else if (!strcmp(drv,"npiv")) {
|
||||||
|
+ format = &bdrv_raw;
|
||||||
|
+ } else if (!strcmp(drv,"dmmd")) {
|
||||||
|
+ format = &bdrv_raw;
|
||||||
|
} else {
|
||||||
|
format = bdrv_find_format(drv);
|
||||||
|
if (!format) {
|
||||||
|
57
xen.changes
57
xen.changes
@ -1,3 +1,60 @@
|
|||||||
|
-------------------------------------------------------------------
|
||||||
|
Tue May 10 08:53:27 MDT 2011 - jfehlig@novell.com
|
||||||
|
|
||||||
|
- bnc#691256 - move modprobe of xen backend modules from xend to
|
||||||
|
xencommons initscript
|
||||||
|
tmp-initscript-modprobe.patch
|
||||||
|
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
Mon May 9 16:26:06 MDT 2011 - jfehlig@novell.com
|
||||||
|
|
||||||
|
- bnc#691738 - Xen does not find device create with npiv block
|
||||||
|
xen-qemu-iscsi-fix.patch
|
||||||
|
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
Tue May 3 11:11:05 MDT 2011 - carnold@novell.com
|
||||||
|
|
||||||
|
- Upstream patches from Jan
|
||||||
|
22998-x86-get_page_from_l1e-retcode.patch
|
||||||
|
22999-x86-mod_l1_entry-retcode.patch
|
||||||
|
23000-x86-mod_l2_entry-retcode.patch
|
||||||
|
23096-x86-hpet-no-cpumask_lock.patch
|
||||||
|
23099-x86-rwlock-scalability.patch
|
||||||
|
23103-x86-pirq-guest-eoi-check.patch
|
||||||
|
23127-vtd-bios-settings.patch
|
||||||
|
23153-x86-amd-clear-DramModEn.patch
|
||||||
|
23154-x86-amd-iorr-no-rdwr.patch
|
||||||
|
23199-amd-iommu-unmapped-intr-fault.patch
|
||||||
|
23200-amd-iommu-intremap-sync.patch
|
||||||
|
23228-x86-conditional-write_tsc.patch
|
||||||
|
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
Mon May 2 12:42:16 CEST 2011 - ohering@suse.de
|
||||||
|
|
||||||
|
- update xenalyze to revision 98
|
||||||
|
* Unify setting of vcpu data type
|
||||||
|
* Unify record size checks
|
||||||
|
* Fix cr3_switch not to access hvm struct before it's initialized
|
||||||
|
- add xenalyze.gcc46.patch to fix unused-but-set-variable errors
|
||||||
|
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
Thu Apr 28 14:12:13 MDT 2011 - jfehlig@novell.com
|
||||||
|
|
||||||
|
- bnc#688473 - VUL-0: potential buffer overflow in tools
|
||||||
|
cve-2011-1583-4.0.patch
|
||||||
|
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
Thu Apr 28 17:18:57 CEST 2011 - ohering@suse.de
|
||||||
|
|
||||||
|
- hotplug.losetup.patch
|
||||||
|
correct dev:inode detection and use variable expansion
|
||||||
|
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
Thu Apr 21 16:30:30 CEST 2011 - ohering@suse.de
|
||||||
|
|
||||||
|
- bnc#685189: update vif-route-ifup.patch to use correct variable
|
||||||
|
after upstream commit 22910:d4bc41a8cecb
|
||||||
|
|
||||||
-------------------------------------------------------------------
|
-------------------------------------------------------------------
|
||||||
Wed Apr 20 17:50:04 CEST 2011 - ohering@suse.de
|
Wed Apr 20 17:50:04 CEST 2011 - ohering@suse.de
|
||||||
|
|
||||||
|
150
xen.spec
150
xen.spec
@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# spec file for package xen
|
# spec file for package xen (Version 4.1.0_01)
|
||||||
#
|
#
|
||||||
# Copyright (c) 2011 SUSE LINUX Products GmbH, Nuernberg, Germany.
|
# Copyright (c) 2011 SUSE LINUX Products GmbH, Nuernberg, Germany.
|
||||||
#
|
#
|
||||||
@ -31,39 +31,39 @@ ExclusiveArch: %ix86 x86_64
|
|||||||
%else
|
%else
|
||||||
%define with_xend 1
|
%define with_xend 1
|
||||||
%endif
|
%endif
|
||||||
BuildRequires: LibVNCServer-devel
|
BuildRequires: LibVNCServer-devel
|
||||||
BuildRequires: SDL-devel
|
BuildRequires: SDL-devel
|
||||||
BuildRequires: automake
|
BuildRequires: automake
|
||||||
BuildRequires: bin86
|
BuildRequires: bin86
|
||||||
BuildRequires: curl-devel
|
BuildRequires: curl-devel
|
||||||
BuildRequires: dev86
|
BuildRequires: dev86
|
||||||
BuildRequires: graphviz
|
BuildRequires: graphviz
|
||||||
BuildRequires: latex2html
|
BuildRequires: latex2html
|
||||||
BuildRequires: libjpeg-devel
|
BuildRequires: libjpeg-devel
|
||||||
BuildRequires: libxml2-devel
|
BuildRequires: libxml2-devel
|
||||||
BuildRequires: ncurses-devel
|
BuildRequires: ncurses-devel
|
||||||
BuildRequires: openssl
|
BuildRequires: openssl
|
||||||
BuildRequires: openssl-devel
|
BuildRequires: openssl-devel
|
||||||
BuildRequires: pciutils-devel
|
BuildRequires: pciutils-devel
|
||||||
BuildRequires: python-devel
|
BuildRequires: python-devel
|
||||||
BuildRequires: texinfo
|
BuildRequires: texinfo
|
||||||
BuildRequires: transfig
|
BuildRequires: transfig
|
||||||
BuildRequires: libbz2-devel
|
BuildRequires: libbz2-devel
|
||||||
%if %suse_version >= 1120
|
%if %suse_version >= 1120
|
||||||
BuildRequires: xz-devel
|
BuildRequires: xz-devel
|
||||||
%endif
|
%endif
|
||||||
%if %suse_version <= 1110
|
%if %suse_version <= 1110
|
||||||
BuildRequires: pmtools
|
BuildRequires: pmtools
|
||||||
%else
|
%else
|
||||||
BuildRequires: acpica
|
BuildRequires: acpica
|
||||||
%endif
|
%endif
|
||||||
%if %suse_version >= 1030
|
%if %suse_version >= 1030
|
||||||
BuildRequires: texlive
|
BuildRequires: texlive
|
||||||
BuildRequires: texlive-latex
|
BuildRequires: texlive-latex
|
||||||
%else
|
%else
|
||||||
BuildRequires: te_ams
|
BuildRequires: te_ams
|
||||||
BuildRequires: te_latex
|
BuildRequires: te_latex
|
||||||
BuildRequires: tetex
|
BuildRequires: tetex
|
||||||
%endif
|
%endif
|
||||||
%ifarch x86_64
|
%ifarch x86_64
|
||||||
BuildRequires: glibc-32bit glibc-devel-32bit
|
BuildRequires: glibc-32bit glibc-devel-32bit
|
||||||
@ -80,7 +80,7 @@ BuildRequires: glibc-devel
|
|||||||
BuildRequires: kernel-source kernel-syms module-init-tools xorg-x11
|
BuildRequires: kernel-source kernel-syms module-init-tools xorg-x11
|
||||||
%endif
|
%endif
|
||||||
Version: 4.1.0_01
|
Version: 4.1.0_01
|
||||||
Release: 9
|
Release: 1
|
||||||
License: GPLv2+
|
License: GPLv2+
|
||||||
Group: System/Kernel
|
Group: System/Kernel
|
||||||
AutoReqProv: on
|
AutoReqProv: on
|
||||||
@ -117,9 +117,22 @@ Source24: xenapiusers
|
|||||||
# sysconfig hook script for Xen
|
# sysconfig hook script for Xen
|
||||||
Source25: xen-updown.sh
|
Source25: xen-updown.sh
|
||||||
Source99: baselibs.conf
|
Source99: baselibs.conf
|
||||||
# http://xenbits.xensource.com/ext/xenalyze.hg
|
# http://xenbits.xensource.com/ext/xenalyze
|
||||||
Source20000: xenalyze.hg.tar.bz2
|
Source20000: xenalyze.hg.tar.bz2
|
||||||
# Upstream patches
|
# Upstream patches
|
||||||
|
Patch0: cve-2011-1583-4.1.patch
|
||||||
|
Patch1: 22998-x86-get_page_from_l1e-retcode.patch
|
||||||
|
Patch2: 22999-x86-mod_l1_entry-retcode.patch
|
||||||
|
Patch3: 23000-x86-mod_l2_entry-retcode.patch
|
||||||
|
Patch4: 23096-x86-hpet-no-cpumask_lock.patch
|
||||||
|
Patch5: 23099-x86-rwlock-scalability.patch
|
||||||
|
Patch6: 23103-x86-pirq-guest-eoi-check.patch
|
||||||
|
Patch7: 23127-vtd-bios-settings.patch
|
||||||
|
Patch8: 23153-x86-amd-clear-DramModEn.patch
|
||||||
|
Patch9: 23154-x86-amd-iorr-no-rdwr.patch
|
||||||
|
Patch10: 23199-amd-iommu-unmapped-intr-fault.patch
|
||||||
|
Patch11: 23200-amd-iommu-intremap-sync.patch
|
||||||
|
Patch12: 23228-x86-conditional-write_tsc.patch
|
||||||
# Upstream qemu patches
|
# Upstream qemu patches
|
||||||
# Our patches
|
# Our patches
|
||||||
Patch300: xen-config.diff
|
Patch300: xen-config.diff
|
||||||
@ -172,7 +185,7 @@ Patch370: xend-sysconfig.patch
|
|||||||
Patch371: domu-usb-controller.patch
|
Patch371: domu-usb-controller.patch
|
||||||
Patch372: usb-list.patch
|
Patch372: usb-list.patch
|
||||||
Patch373: xend-devid-or-name.patch
|
Patch373: xend-devid-or-name.patch
|
||||||
Patch374: suspend_evtchn_lock.patch
|
Patch374: suspend_evtchn_lock.patch
|
||||||
# Patches for snapshot support
|
# Patches for snapshot support
|
||||||
Patch400: snapshot-ioemu-save.patch
|
Patch400: snapshot-ioemu-save.patch
|
||||||
Patch401: snapshot-ioemu-restore.patch
|
Patch401: snapshot-ioemu-restore.patch
|
||||||
@ -208,6 +221,7 @@ Patch440: bdrv_default_rwflag.patch
|
|||||||
Patch442: xen-minimum-restart-time.patch
|
Patch442: xen-minimum-restart-time.patch
|
||||||
Patch443: vif-bridge.mtu.patch
|
Patch443: vif-bridge.mtu.patch
|
||||||
Patch444: xentrace.dynamic_sized_tbuf.patch
|
Patch444: xentrace.dynamic_sized_tbuf.patch
|
||||||
|
Patch445: hotplug.losetup.patch
|
||||||
# Jim's domain lock patch
|
# Jim's domain lock patch
|
||||||
Patch450: xend-domain-lock.patch
|
Patch450: xend-domain-lock.patch
|
||||||
# Hypervisor and PV driver Patches
|
# Hypervisor and PV driver Patches
|
||||||
@ -228,35 +242,38 @@ Patch651: ioemu-disable-scsi.patch
|
|||||||
Patch652: ioemu-disable-emulated-ide-if-pv.patch
|
Patch652: ioemu-disable-emulated-ide-if-pv.patch
|
||||||
Patch700: hv_extid_compatibility.patch
|
Patch700: hv_extid_compatibility.patch
|
||||||
# FATE 310510
|
# FATE 310510
|
||||||
Patch10001: xenpaging.tools_xenpaging_cleanup.patch
|
Patch10001: xenpaging.tools_xenpaging_cleanup.patch
|
||||||
Patch10002: xenpaging.pageout_policy.patch
|
Patch10002: xenpaging.pageout_policy.patch
|
||||||
Patch10003: xenpaging.get_paged_frame.patch
|
Patch10003: xenpaging.get_paged_frame.patch
|
||||||
Patch10004: xenpaging.makefile.patch
|
Patch10004: xenpaging.makefile.patch
|
||||||
Patch10010: xenpaging.policy_linear.patch
|
Patch10010: xenpaging.policy_linear.patch
|
||||||
Patch10011: xenpaging.pagefile.patch
|
Patch10011: xenpaging.pagefile.patch
|
||||||
Patch10012: xenpaging.xenpaging_init.patch
|
Patch10012: xenpaging.xenpaging_init.patch
|
||||||
Patch10013: xenpaging.mem_paging_tool_qemu_flush_cache.patch
|
Patch10013: xenpaging.mem_paging_tool_qemu_flush_cache.patch
|
||||||
Patch10014: xenpaging.machine_to_phys_mapping.patch
|
Patch10014: xenpaging.machine_to_phys_mapping.patch
|
||||||
Patch10015: xenpaging.populate_only_if_paged.patch
|
Patch10015: xenpaging.populate_only_if_paged.patch
|
||||||
Patch10017: xenpaging.autostart.patch
|
Patch10017: xenpaging.autostart.patch
|
||||||
Patch10018: xenpaging.signal_handling.patch
|
Patch10018: xenpaging.signal_handling.patch
|
||||||
Patch10019: xenpaging.MRU_SIZE.patch
|
Patch10019: xenpaging.MRU_SIZE.patch
|
||||||
Patch10020: xenpaging.guest_remove_page.patch
|
Patch10020: xenpaging.guest_remove_page.patch
|
||||||
Patch10021: xenpaging.mem_event_check_ring-free_requests.patch
|
Patch10021: xenpaging.mem_event_check_ring-free_requests.patch
|
||||||
Patch10022: xenpaging.blacklist.patch
|
Patch10022: xenpaging.blacklist.patch
|
||||||
Patch10023: xenpaging.autostart_delay.patch
|
Patch10023: xenpaging.autostart_delay.patch
|
||||||
Patch10024: xenpaging.page_already_populated.patch
|
Patch10024: xenpaging.page_already_populated.patch
|
||||||
Patch10025: xenpaging.notify_policy_only_once.patch
|
Patch10025: xenpaging.notify_policy_only_once.patch
|
||||||
Patch10026: xenpaging.num_pages_equal_max_pages.patch
|
Patch10026: xenpaging.num_pages_equal_max_pages.patch
|
||||||
Patch10027: xenpaging.p2m_mem_paging_populate_if_p2m_ram_paged.patch
|
Patch10027: xenpaging.p2m_mem_paging_populate_if_p2m_ram_paged.patch
|
||||||
Patch10028: xenpaging.HVMCOPY_gfn_paged_out.patch
|
Patch10028: xenpaging.HVMCOPY_gfn_paged_out.patch
|
||||||
Patch10029: xenpaging.optimize_p2m_mem_paging_populate.patch
|
Patch10029: xenpaging.optimize_p2m_mem_paging_populate.patch
|
||||||
Patch10030: xenpaging.paging_prep_enomem.patch
|
Patch10030: xenpaging.paging_prep_enomem.patch
|
||||||
Patch10031: xenpaging.print-arguments.patch
|
Patch10031: xenpaging.print-arguments.patch
|
||||||
Patch10032: xenpaging.no_domain_id.patch
|
Patch10032: xenpaging.no_domain_id.patch
|
||||||
Patch10033: xenpaging.runtime_mru_size.patch
|
Patch10033: xenpaging.runtime_mru_size.patch
|
||||||
Patch10040: xenpaging.doc.patch
|
Patch10040: xenpaging.doc.patch
|
||||||
|
# xenalyze
|
||||||
|
Patch20000: xenalyze.gcc46.patch
|
||||||
# Build patch
|
# Build patch
|
||||||
|
Patch99998: tmp-initscript-modprobe.patch
|
||||||
Patch99999: tmp_build.patch
|
Patch99999: tmp_build.patch
|
||||||
Url: http://www.cl.cam.ac.uk/Research/SRG/netos/xen/
|
Url: http://www.cl.cam.ac.uk/Research/SRG/netos/xen/
|
||||||
BuildRoot: %{_tmppath}/%{name}-%{version}-build
|
BuildRoot: %{_tmppath}/%{name}-%{version}-build
|
||||||
@ -588,7 +605,21 @@ Authors:
|
|||||||
|
|
||||||
%prep
|
%prep
|
||||||
%setup -q -n %xen_build_dir -a 1 -a 20000
|
%setup -q -n %xen_build_dir -a 1 -a 20000
|
||||||
|
%patch20000 -p1
|
||||||
tar xfj %{SOURCE2} -C $RPM_BUILD_DIR/%{xen_build_dir}/tools
|
tar xfj %{SOURCE2} -C $RPM_BUILD_DIR/%{xen_build_dir}/tools
|
||||||
|
%patch0 -p1
|
||||||
|
%patch1 -p1
|
||||||
|
%patch2 -p1
|
||||||
|
%patch3 -p1
|
||||||
|
%patch4 -p1
|
||||||
|
%patch5 -p1
|
||||||
|
%patch6 -p1
|
||||||
|
%patch7 -p1
|
||||||
|
%patch8 -p1
|
||||||
|
%patch9 -p1
|
||||||
|
%patch10 -p1
|
||||||
|
%patch11 -p1
|
||||||
|
%patch12 -p1
|
||||||
%patch300 -p1
|
%patch300 -p1
|
||||||
%patch301 -p1
|
%patch301 -p1
|
||||||
%patch302 -p1
|
%patch302 -p1
|
||||||
@ -671,6 +702,7 @@ tar xfj %{SOURCE2} -C $RPM_BUILD_DIR/%{xen_build_dir}/tools
|
|||||||
%patch442 -p1
|
%patch442 -p1
|
||||||
%patch443 -p1
|
%patch443 -p1
|
||||||
%patch444 -p1
|
%patch444 -p1
|
||||||
|
%patch445 -p1
|
||||||
%patch450 -p1
|
%patch450 -p1
|
||||||
%patch500 -p1
|
%patch500 -p1
|
||||||
%patch501 -p1
|
%patch501 -p1
|
||||||
@ -716,8 +748,10 @@ tar xfj %{SOURCE2} -C $RPM_BUILD_DIR/%{xen_build_dir}/tools
|
|||||||
#%patch10032 -p1
|
#%patch10032 -p1
|
||||||
#%patch10033 -p1
|
#%patch10033 -p1
|
||||||
#%patch10040 -p1
|
#%patch10040 -p1
|
||||||
|
%patch99998 -p1
|
||||||
%patch99999 -p1
|
%patch99999 -p1
|
||||||
|
|
||||||
|
|
||||||
%build
|
%build
|
||||||
XEN_EXTRAVERSION=%version-%release
|
XEN_EXTRAVERSION=%version-%release
|
||||||
XEN_EXTRAVERSION=${XEN_EXTRAVERSION#%{xvers}}
|
XEN_EXTRAVERSION=${XEN_EXTRAVERSION#%{xvers}}
|
||||||
|
122
xenalyze.gcc46.patch
Normal file
122
xenalyze.gcc46.patch
Normal file
@ -0,0 +1,122 @@
|
|||||||
|
gcc -I../xen/include -fmessage-length=0 -O2 -Wall -D_FORTIFY_SOURCE=2 -funwind-tables -fasynchronous-unwind-tables -g -g -fno-strict-aliasing -std=gnu99 -Wall -Wstrict-prototypes -Wno-unused-value -Wdeclaration-after-statement -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -mno-tls-direct-seg-refs -Werror -o xenalyze xenalyze.c
|
||||||
|
xenalyze.c: In function 'weighted_percentile':
|
||||||
|
xenalyze.c:2017:9: error: variable 'progress' set but not used [-Werror=unused-but-set-variable]
|
||||||
|
xenalyze.c: In function 'self_weighted_percentile':
|
||||||
|
xenalyze.c:2105:9: error: variable 'progress' set but not used [-Werror=unused-but-set-variable]
|
||||||
|
xenalyze.c: In function 'interval_domain_short_summary_output':
|
||||||
|
xenalyze.c:2729:15: error: variable 'interval_cycles' set but not used [-Werror=unused-but-set-variable]
|
||||||
|
xenalyze.c: In function 'hvm_generic_dump':
|
||||||
|
xenalyze.c:4675:15: error: variable 'd' set but not used [-Werror=unused-but-set-variable]
|
||||||
|
xenalyze.c: In function 'sched_runstate_process':
|
||||||
|
xenalyze.c:6883:9: error: variable 'old_runstate' set but not used [-Werror=unused-but-set-variable]
|
||||||
|
xenalyze.c:6882:11: error: variable 'runstate_tsc' set but not used [-Werror=unused-but-set-variable]
|
||||||
|
xenalyze.c: In function 'cmd_parser':
|
||||||
|
xenalyze.c:9253:24: error: variable 'p' set but not used [-Werror=unused-but-set-variable]
|
||||||
|
cc1: all warnings being treated as errors
|
||||||
|
|
||||||
|
---
|
||||||
|
xenalyze.hg/xenalyze.c | 21 ---------------------
|
||||||
|
1 file changed, 21 deletions(-)
|
||||||
|
|
||||||
|
Index: xen-4.1.0-testing/xenalyze.hg/xenalyze.c
|
||||||
|
===================================================================
|
||||||
|
--- xen-4.1.0-testing.orig/xenalyze.hg/xenalyze.c
|
||||||
|
+++ xen-4.1.0-testing/xenalyze.hg/xenalyze.c
|
||||||
|
@@ -2016,8 +2016,6 @@ float weighted_percentile(float * A, /*
|
||||||
|
float X, t1;
|
||||||
|
unsigned long long t2;
|
||||||
|
|
||||||
|
- int progress;
|
||||||
|
-
|
||||||
|
/* Calculate total weight */
|
||||||
|
N_weight=0;
|
||||||
|
|
||||||
|
@@ -2078,15 +2076,11 @@ float weighted_percentile(float * A, /*
|
||||||
|
}
|
||||||
|
} while (I <= J); /* Keep going until our pointers meet or pass */
|
||||||
|
|
||||||
|
- progress = 0;
|
||||||
|
-
|
||||||
|
/* Re-adjust L and R, based on which element we're looking for */
|
||||||
|
if(J_weight<K_weight) {
|
||||||
|
- progress = 1;
|
||||||
|
L=I; L_weight = I_weight;
|
||||||
|
}
|
||||||
|
if(K_weight<I_weight) {
|
||||||
|
- progress = 1;
|
||||||
|
R=J; R_weight = J_weight;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -2104,8 +2098,6 @@ long long self_weighted_percentile(long
|
||||||
|
|
||||||
|
long long X, t1;
|
||||||
|
|
||||||
|
- int progress;
|
||||||
|
-
|
||||||
|
/* Calculate total weight */
|
||||||
|
N_weight=0;
|
||||||
|
|
||||||
|
@@ -2165,15 +2157,11 @@ long long self_weighted_percentile(long
|
||||||
|
}
|
||||||
|
} while (I <= J); /* Keep going until our pointers meet or pass */
|
||||||
|
|
||||||
|
- progress = 0;
|
||||||
|
-
|
||||||
|
/* Re-adjust L and R, based on which element we're looking for */
|
||||||
|
if(J_weight<K_weight) {
|
||||||
|
- progress = 1;
|
||||||
|
L=I; L_weight = I_weight;
|
||||||
|
}
|
||||||
|
if(K_weight<I_weight) {
|
||||||
|
- progress = 1;
|
||||||
|
R=J; R_weight = J_weight;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -2728,13 +2716,10 @@ void interval_domain_short_summary_outpu
|
||||||
|
|
||||||
|
if(P.interval.domain.d) {
|
||||||
|
struct domain_data *d;
|
||||||
|
- tsc_t interval_cycles;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
d=P.interval.domain.d;
|
||||||
|
|
||||||
|
- interval_cycles = d->total_time.interval.cycles;
|
||||||
|
-
|
||||||
|
interval_time_output();
|
||||||
|
|
||||||
|
interval_cycle_percent_output(&d->total_time.interval);
|
||||||
|
@@ -4663,7 +4648,6 @@ void hvm_generic_dump(struct record_info
|
||||||
|
} *cr = (typeof(cr))ri->d;
|
||||||
|
|
||||||
|
char *evt_string, evt_number[256];
|
||||||
|
- unsigned *d;
|
||||||
|
int i, evt, is_64 = 0;
|
||||||
|
|
||||||
|
evt = ri->event - TRC_HVM_HANDLER;
|
||||||
|
@@ -4683,7 +4667,6 @@ void hvm_generic_dump(struct record_info
|
||||||
|
evt_string = evt_number;
|
||||||
|
}
|
||||||
|
|
||||||
|
- d = ri->d;
|
||||||
|
printf("%s%s %s%s [",
|
||||||
|
prefix,
|
||||||
|
ri->dump_header,
|
||||||
|
@@ -6867,8 +6850,6 @@ void sched_runstate_process(struct pcpu_
|
||||||
|
} sevt;
|
||||||
|
int perfctrs;
|
||||||
|
struct last_oldstate_struct last_oldstate;
|
||||||
|
- tsc_t runstate_tsc;
|
||||||
|
- int old_runstate;
|
||||||
|
|
||||||
|
switch(_sevt.lo)
|
||||||
|
{
|
||||||
|
@@ -6938,8 +6919,6 @@ void sched_runstate_process(struct pcpu_
|
||||||
|
* be reset, it will be reset below. */
|
||||||
|
last_oldstate = v->runstate.last_oldstate;
|
||||||
|
v->runstate.last_oldstate.wrong = RUNSTATE_INIT;
|
||||||
|
- runstate_tsc = v->runstate.tsc;
|
||||||
|
- old_runstate = v->runstate.state;
|
||||||
|
|
||||||
|
/* Close vmexits when the putative reason for blocking / &c stops.
|
||||||
|
* This way, we don't account cpu contention to some other overhead. */
|
@ -1,3 +1,3 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:870743ab79d34e066a9b090e6555e9fe626165e9d7de28b6a6af136a2b8c4095
|
oid sha256:6f1d68fa351de9e0d67790b038f791fec6c159530e59f1d9d03ba47f94f1095e
|
||||||
size 118364
|
size 118689
|
||||||
|
Loading…
x
Reference in New Issue
Block a user