|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v3 10/28] xen/x86: Generate deep dependencies of features
On Thu, Mar 17, 2016 at 08:14:52PM +0000, Andrew Cooper wrote:
> On 17/03/16 19:45, Konrad Rzeszutek Wilk wrote:
> > On Tue, Mar 15, 2016 at 03:35:06PM +0000, Andrew Cooper wrote:
> >> Some features depend on other features. Working out and maintaining the
> >> exact
> >> dependency tree is complicated, so it is expressed in the automatic
> >> generation
> >> script, and flattened for faster runtime use.
> >>
> >> Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
> >> ---
> >> CC: Jan Beulich <JBeulich@xxxxxxxx>
> >>
> >> v3:
> >> * Vastly more reserch and comments
> >> v2:
> >> * New
> >> ---
> >> xen/arch/x86/cpuid.c | 54 +++++++++++++++++
> >> xen/include/asm-x86/cpuid.h | 2 +
> >> xen/tools/gen-cpuid.py | 139
> >> +++++++++++++++++++++++++++++++++++++++++++-
> >> 3 files changed, 194 insertions(+), 1 deletion(-)
> >>
> >> diff --git a/xen/arch/x86/cpuid.c b/xen/arch/x86/cpuid.c
> >> index 174cfa0..17487f5 100644
> >> --- a/xen/arch/x86/cpuid.c
> >> +++ b/xen/arch/x86/cpuid.c
> >> @@ -11,6 +11,7 @@ const uint32_t special_features[] =
> >> INIT_SPECIAL_FEATURES;
> >> static const uint32_t __initconst pv_featuremask[] = INIT_PV_FEATURES;
> >> static const uint32_t __initconst hvm_shadow_featuremask[] =
> >> INIT_HVM_SHADOW_FEATURES;
> >> static const uint32_t __initconst hvm_hap_featuremask[] =
> >> INIT_HVM_HAP_FEATURES;
> >> +static const uint32_t __initconst deep_features[] = INIT_DEEP_FEATURES;
> >>
> >> uint32_t __read_mostly raw_featureset[FSCAPINTS];
> >> uint32_t __read_mostly pv_featureset[FSCAPINTS];
> >> @@ -18,12 +19,34 @@ uint32_t __read_mostly hvm_featureset[FSCAPINTS];
> >>
> >> static void __init sanitise_featureset(uint32_t *fs)
> >> {
> >> + uint32_t disabled_features[FSCAPINTS];
> >> unsigned int i;
> >>
> >> for ( i = 0; i < FSCAPINTS; ++i )
> >> {
> >> /* Clamp to known mask. */
> >> fs[i] &= known_features[i];
> >> +
> >> + /*
> >> + * Identify which features with deep dependencies have been
> >> + * disabled.
> >> + */
> >> + disabled_features[i] = ~fs[i] & deep_features[i];
> >> + }
> >> +
> >> + for_each_set_bit(i, (void *)disabled_features,
> >> + sizeof(disabled_features) * 8)
> >> + {
> >> + const uint32_t *dfs = lookup_deep_deps(i);
> >> + unsigned int j;
> >> +
> >> + ASSERT(dfs); /* deep_features[] should guarentee this. */
> >> +
> >> + for ( j = 0; j < FSCAPINTS; ++j )
> >> + {
> >> + fs[j] &= ~dfs[j];
> >> + disabled_features[j] &= ~dfs[j];
> > What if this clears the entries you have already skipped over?
>
> That is fine.
>
> >
> > Say you are at word 2 (i==2)and disabled_features[j] cleared word 1.
> > The loop (for_each_set_bit) won't notice this.
> >
> > And furthermore lets assume that the clearing of a bit in
> > word 1 should have done another dependency check which would clear
> > something at word 7. You would miss that?
>
> Each individual dfs[] is the complete set of all eventual features
> cleared because of i, which means there is no need to recurse along i's
> dependency chain.
In retrospective it is obvious - as the commit description says that.
What I was wondering if you could express what you said in the commit
description, like:
"We do take into account an feature which depends on a feature
which depends on a feature, and so. The individual dfs[] is the complete
set of _ALL_ eventual features cleared. "
>
> The entire point of the dependency flattening logic below is to make
> this logic here easier.
>
> >
> >> + # instructions. MMX is documented to alias the %MM registers
> >> over the
> >> + # x87 %ST registers in hardware.
> >> + FPU: [MMX],
> >> +
> >> + # The PSE36 feature indicates that reserved bits in a PSE
> >> superpage
> >> + # may be used as extra physical address bits.
> >> + PSE: [PSE36],
> >> +
> >> + # Entering Long Mode requires that %CR4.PAE is set. The NX
> >> pagetable
> >> + # bit is only representable in the 64bit PTE format offered by
> >> PAE.
> >> + PAE: [LM, NX],
> >> +
> >> + # APIC is special, but X2APIC does depend on APIC being available
> >> in
> >> + # the first place.
> >> + APIC: [X2APIC],
> >> +
> >> + # AMD built MMXExtentions and 3DNow as extentions to MMX.
> >> + MMX: [MMXEXT, _3DNOW]
> > EWhy the underscore?
>
> Because omitting it would be a syntax error. One slight hitch with
> mutating the global namespace is that is perfectly easy to put items in
> it which can be referred back to.
>
> ~Andrew
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@xxxxxxxxxxxxx
> http://lists.xen.org/xen-devel
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |