|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH for-4.9] x86/mm: Fix incorrect unmapping of 2MB and 1GB pages
>>> On 10.05.17 at 11:43, <igor.druzhinin@xxxxxxxxxx> wrote:
> --- a/xen/arch/x86/mm/p2m-ept.c
> +++ b/xen/arch/x86/mm/p2m-ept.c
> @@ -681,6 +681,7 @@ ept_set_entry(struct p2m_domain *p2m, unsigned long gfn,
> mfn_t mfn,
> ept_entry_t *table, *ept_entry = NULL;
> unsigned long gfn_remainder = gfn;
> unsigned int i, target = order / EPT_TABLE_ORDER;
> + unsigned long mfn_mask = mfn_valid(mfn) ? mfn_x(mfn) : 0;
Aiui MMIO pages will come here too, so an mfn_valid() check here
(and below) is too lax.
> --- a/xen/arch/x86/mm/p2m.c
> +++ b/xen/arch/x86/mm/p2m.c
> @@ -536,6 +536,7 @@ int p2m_set_entry(struct p2m_domain *p2m, unsigned long
> gfn, mfn_t mfn,
> struct domain *d = p2m->domain;
> unsigned long todo = 1ul << page_order;
> unsigned int order;
> + unsigned long mfn_mask;
Please move the declaration ...
> @@ -543,12 +544,15 @@ int p2m_set_entry(struct p2m_domain *p2m, unsigned long
> gfn, mfn_t mfn,
> while ( todo )
> {
> if ( hap_enabled(d) )
> - order = (!((gfn | mfn_x(mfn) | todo) &
> + {
> + mfn_mask = mfn_valid(mfn) ? mfn_x(mfn) : 0;
... here, perhaps at once making this the initializer. However, ...
> + order = (!((gfn | mfn_mask | todo) &
> ((1ul << PAGE_ORDER_1G) - 1)) &&
> hap_has_1gb) ? PAGE_ORDER_1G :
> - (!((gfn | mfn_x(mfn) | todo) &
> + (!((gfn | mfn_mask | todo) &
... seeing the recurring expression, it may be worth considering to
instead introduce a local variable holding "gfn | mfn_mask | todo".
Jan
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |