diff mbox

x86/cpuid: expose AVX512_4VNNIW and AVX512_4FMAPS features to kvm guest

Message ID 1477645960-6898-1-git-send-email-he.chen@linux.intel.com (mailing list archive)
State New, archived
Headers show

Commit Message

He Chen Oct. 28, 2016, 9:12 a.m. UTC
The spec can be found in Intel Software Developer Manual or in
Instruction Set Extensions Programming Reference.

Signed-off-by: Luwei Kang <luwei.kang@intel.com>
Signed-off-by: He Chen <he.chen@linux.intel.com>
---
 arch/x86/kvm/cpuid.c | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

Comments

Paolo Bonzini Oct. 28, 2016, 9:31 a.m. UTC | #1
On 28/10/2016 11:12, He Chen wrote:
> The spec can be found in Intel Software Developer Manual or in
> Instruction Set Extensions Programming Reference.
> 
> Signed-off-by: Luwei Kang <luwei.kang@intel.com>
> Signed-off-by: He Chen <he.chen@linux.intel.com>
> ---
>  arch/x86/kvm/cpuid.c | 7 ++++++-
>  1 file changed, 6 insertions(+), 1 deletion(-)
> 
> diff --git a/arch/x86/kvm/cpuid.c b/arch/x86/kvm/cpuid.c
> index afa7bbb..328b169 100644
> --- a/arch/x86/kvm/cpuid.c
> +++ b/arch/x86/kvm/cpuid.c
> @@ -376,6 +376,10 @@ static inline int __do_cpuid_ent(struct kvm_cpuid_entry2 *entry, u32 function,
>  	/* cpuid 7.0.ecx*/
>  	const u32 kvm_cpuid_7_0_ecx_x86_features = F(PKU) | 0 /*OSPKE*/;
>  
> +	/* cpuid 7.0.edx*/
> +	const u32 kvm_cpuid_7_0_edx_x86_features =
> +        0x4 /* AVX512-4VNNIW */ | 0x8 /* AVX512-4FMAPS */;

Please define the new features in cpufeature.h first.

Thanks,

Paolo

>  	/* all calls to cpuid_count() should be made on the same cpu */
>  	get_cpu();
>  
> @@ -458,12 +462,13 @@ static inline int __do_cpuid_ent(struct kvm_cpuid_entry2 *entry, u32 function,
>  			/* PKU is not yet implemented for shadow paging. */
>  			if (!tdp_enabled)
>  				entry->ecx &= ~F(PKU);
> +            entry->edx &= kvm_cpuid_7_0_edx_x86_features;
>  		} else {
>  			entry->ebx = 0;
>  			entry->ecx = 0;
> +            entry->edx = 0;
>  		}
>  		entry->eax = 0;
> -		entry->edx = 0;
>  		break;
>  	}
>  	case 9:
> 
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
He Chen Oct. 28, 2016, 9:46 a.m. UTC | #2
On Fri, Oct 28, 2016 at 11:31:05AM +0200, Paolo Bonzini wrote:
> 
> 
> On 28/10/2016 11:12, He Chen wrote:
> > The spec can be found in Intel Software Developer Manual or in
> > Instruction Set Extensions Programming Reference.
> > 
> > Signed-off-by: Luwei Kang <luwei.kang@intel.com>
> > Signed-off-by: He Chen <he.chen@linux.intel.com>
> > ---
> >  arch/x86/kvm/cpuid.c | 7 ++++++-
> >  1 file changed, 6 insertions(+), 1 deletion(-)
> > 
> > diff --git a/arch/x86/kvm/cpuid.c b/arch/x86/kvm/cpuid.c
> > index afa7bbb..328b169 100644
> > --- a/arch/x86/kvm/cpuid.c
> > +++ b/arch/x86/kvm/cpuid.c
> > @@ -376,6 +376,10 @@ static inline int __do_cpuid_ent(struct kvm_cpuid_entry2 *entry, u32 function,
> >  	/* cpuid 7.0.ecx*/
> >  	const u32 kvm_cpuid_7_0_ecx_x86_features = F(PKU) | 0 /*OSPKE*/;
> >  
> > +	/* cpuid 7.0.edx*/
> > +	const u32 kvm_cpuid_7_0_edx_x86_features =
> > +        0x4 /* AVX512-4VNNIW */ | 0x8 /* AVX512-4FMAPS */;
> 
> Please define the new features in cpufeature.h first.
> 
These 2 new features defined as scattered features in kernel.
In cpufeature.h, there are:
#define X86_FEATURE_AVX512_4VNNIW (7*32+16)
#define X86_FEATURE_AVX512_4FMAPS (7*32+17)

Please see disscusion here:
https://www.mail-archive.com/linux-kernel@vger.kernel.org/msg1250183.html

Thanks,
-He
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Paolo Bonzini Oct. 28, 2016, 9:54 a.m. UTC | #3
On 28/10/2016 11:46, He Chen wrote:
> On Fri, Oct 28, 2016 at 11:31:05AM +0200, Paolo Bonzini wrote:
>>
>>
>> On 28/10/2016 11:12, He Chen wrote:
>>> The spec can be found in Intel Software Developer Manual or in
>>> Instruction Set Extensions Programming Reference.
>>>
>>> Signed-off-by: Luwei Kang <luwei.kang@intel.com>
>>> Signed-off-by: He Chen <he.chen@linux.intel.com>
>>> ---
>>>  arch/x86/kvm/cpuid.c | 7 ++++++-
>>>  1 file changed, 6 insertions(+), 1 deletion(-)
>>>
>>> diff --git a/arch/x86/kvm/cpuid.c b/arch/x86/kvm/cpuid.c
>>> index afa7bbb..328b169 100644
>>> --- a/arch/x86/kvm/cpuid.c
>>> +++ b/arch/x86/kvm/cpuid.c
>>> @@ -376,6 +376,10 @@ static inline int __do_cpuid_ent(struct kvm_cpuid_entry2 *entry, u32 function,
>>>  	/* cpuid 7.0.ecx*/
>>>  	const u32 kvm_cpuid_7_0_ecx_x86_features = F(PKU) | 0 /*OSPKE*/;
>>>  
>>> +	/* cpuid 7.0.edx*/
>>> +	const u32 kvm_cpuid_7_0_edx_x86_features =
>>> +        0x4 /* AVX512-4VNNIW */ | 0x8 /* AVX512-4FMAPS */;
>>
>> Please define the new features in cpufeature.h first.
>>
> These 2 new features defined as scattered features in kernel.
> In cpufeature.h, there are:
> #define X86_FEATURE_AVX512_4VNNIW (7*32+16)
> #define X86_FEATURE_AVX512_4FMAPS (7*32+17)
> 
> Please see disscusion here:
> https://www.mail-archive.com/linux-kernel@vger.kernel.org/msg1250183.html

Uff, that sucks. :(  I'd agree with hpa's position in that thread.

Please do something like

	/* These are scattered features in cpufeature.h.  */
	#define KVM_CPUID_BIT_AVX512_4VNNIW	2
	#define KVM_CPUID_BIT_AVX512_4FMAPS	3
	#define KF(x)	bit(KVM_CPUID_BIT_##x)

and then

	const u32 kvm_cpuid_7_0_edx_x86_features =
		KF(AVX512_4VNNIW) | KF(AVX512_4FMAPS)

I'll think of a trick to avoid using F for scattered features...

Thanks,

Paolo
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
He Chen Oct. 28, 2016, 9:55 a.m. UTC | #4
On Fri, Oct 28, 2016 at 11:54:13AM +0200, Paolo Bonzini wrote:
> 
> 
> On 28/10/2016 11:46, He Chen wrote:
> > On Fri, Oct 28, 2016 at 11:31:05AM +0200, Paolo Bonzini wrote:
> >>
> >>
> >> On 28/10/2016 11:12, He Chen wrote:
> >>> The spec can be found in Intel Software Developer Manual or in
> >>> Instruction Set Extensions Programming Reference.
> >>>
> >>> Signed-off-by: Luwei Kang <luwei.kang@intel.com>
> >>> Signed-off-by: He Chen <he.chen@linux.intel.com>
> >>> ---
> >>>  arch/x86/kvm/cpuid.c | 7 ++++++-
> >>>  1 file changed, 6 insertions(+), 1 deletion(-)
> >>>
> >>> diff --git a/arch/x86/kvm/cpuid.c b/arch/x86/kvm/cpuid.c
> >>> index afa7bbb..328b169 100644
> >>> --- a/arch/x86/kvm/cpuid.c
> >>> +++ b/arch/x86/kvm/cpuid.c
> >>> @@ -376,6 +376,10 @@ static inline int __do_cpuid_ent(struct kvm_cpuid_entry2 *entry, u32 function,
> >>>  	/* cpuid 7.0.ecx*/
> >>>  	const u32 kvm_cpuid_7_0_ecx_x86_features = F(PKU) | 0 /*OSPKE*/;
> >>>  
> >>> +	/* cpuid 7.0.edx*/
> >>> +	const u32 kvm_cpuid_7_0_edx_x86_features =
> >>> +        0x4 /* AVX512-4VNNIW */ | 0x8 /* AVX512-4FMAPS */;
> >>
> >> Please define the new features in cpufeature.h first.
> >>
> > These 2 new features defined as scattered features in kernel.
> > In cpufeature.h, there are:
> > #define X86_FEATURE_AVX512_4VNNIW (7*32+16)
> > #define X86_FEATURE_AVX512_4FMAPS (7*32+17)
> > 
> > Please see disscusion here:
> > https://www.mail-archive.com/linux-kernel@vger.kernel.org/msg1250183.html
> 
> Uff, that sucks. :(  I'd agree with hpa's position in that thread.
> 
> Please do something like
> 
> 	/* These are scattered features in cpufeature.h.  */
> 	#define KVM_CPUID_BIT_AVX512_4VNNIW	2
> 	#define KVM_CPUID_BIT_AVX512_4FMAPS	3
> 	#define KF(x)	bit(KVM_CPUID_BIT_##x)
> 
> and then
> 
> 	const u32 kvm_cpuid_7_0_edx_x86_features =
> 		KF(AVX512_4VNNIW) | KF(AVX512_4FMAPS)
> 
> I'll think of a trick to avoid using F for scattered features...
> 
Appreciate it :-)
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Piotr Luc Oct. 28, 2016, 10:13 a.m. UTC | #5
T24gRnJpLCAyMDE2LTEwLTI4IGF0IDE3OjEyICswODAwLCBIZSBDaGVuIHdyb3RlOg0KPiBUaGUg
c3BlYyBjYW4gYmUgZm91bmQgaW4gSW50ZWwgU29mdHdhcmUgRGV2ZWxvcGVyIE1hbnVhbCBvciBp
bg0KPiBJbnN0cnVjdGlvbiBTZXQgRXh0ZW5zaW9ucyBQcm9ncmFtbWluZyBSZWZlcmVuY2UuDQo+
IA0KPiBTaWduZWQtb2ZmLWJ5OiBMdXdlaSBLYW5nIDxsdXdlaS5rYW5nQGludGVsLmNvbT4NCj4g
U2lnbmVkLW9mZi1ieTogSGUgQ2hlbiA8aGUuY2hlbkBsaW51eC5pbnRlbC5jb20+DQo+IC0tLQ0K
PiDCoGFyY2gveDg2L2t2bS9jcHVpZC5jIHwgNyArKysrKystDQo+IMKgMSBmaWxlIGNoYW5nZWQs
IDYgaW5zZXJ0aW9ucygrKSwgMSBkZWxldGlvbigtKQ0KPiANCj4gZGlmZiAtLWdpdCBhL2FyY2gv
eDg2L2t2bS9jcHVpZC5jIGIvYXJjaC94ODYva3ZtL2NwdWlkLmMNCj4gaW5kZXggYWZhN2JiYi4u
MzI4YjE2OSAxMDA2NDQNCj4gLS0tIGEvYXJjaC94ODYva3ZtL2NwdWlkLmMNCj4gKysrIGIvYXJj
aC94ODYva3ZtL2NwdWlkLmMNCj4gQEAgLTM3Niw2ICszNzYsMTAgQEAgc3RhdGljIGlubGluZSBp
bnQgX19kb19jcHVpZF9lbnQoc3RydWN0DQo+IGt2bV9jcHVpZF9lbnRyeTIgKmVudHJ5LCB1MzIg
ZnVuY3Rpb24sDQo+IMKgCS8qIGNwdWlkIDcuMC5lY3gqLw0KPiDCoAljb25zdCB1MzIga3ZtX2Nw
dWlkXzdfMF9lY3hfeDg2X2ZlYXR1cmVzID0gRihQS1UpIHwgMA0KPiAvKk9TUEtFKi87DQo+IMKg
DQo+ICsJLyogY3B1aWQgNy4wLmVkeCovDQo+ICsJY29uc3QgdTMyIGt2bV9jcHVpZF83XzBfZWR4
X3g4Nl9mZWF0dXJlcyA9DQo+ICvCoMKgwqDCoMKgwqDCoMKgMHg0IC8qIEFWWDUxMi00Vk5OSVcg
Ki8gfCAweDggLyogQVZYNTEyLTRGTUFQUyAqLzsNCj4gKw0KPiDCoAkvKiBhbGwgY2FsbHMgdG8g
Y3B1aWRfY291bnQoKSBzaG91bGQgYmUgbWFkZSBvbiB0aGUgc2FtZSBjcHUNCj4gKi8NCj4gwqAJ
Z2V0X2NwdSgpOw0KPiDCoA0KPiBAQCAtNDU4LDEyICs0NjIsMTMgQEAgc3RhdGljIGlubGluZSBp
bnQgX19kb19jcHVpZF9lbnQoc3RydWN0DQo+IGt2bV9jcHVpZF9lbnRyeTIgKmVudHJ5LCB1MzIg
ZnVuY3Rpb24sDQo+IMKgCQkJLyogUEtVIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgZm9yIHNoYWRv
dw0KPiBwYWdpbmcuICovDQo+IMKgCQkJaWYgKCF0ZHBfZW5hYmxlZCkNCj4gwqAJCQkJZW50cnkt
PmVjeCAmPSB+RihQS1UpOw0KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZW50cnktPmVkeCAm
PSBrdm1fY3B1aWRfN18wX2VkeF94ODZfZmVhdHVyZXM7DQoNClRoZSBjcHVfbWFzaygpIGlzIG1p
c3NlZCBoZXJlLg0KSSB1bmRlcnN0YW5kIHRoYXQgaXQgZG9lc24ndCB3b3JrIGZvciB0aGlzIHNj
YXR0ZXJlZCBmZWF0dXJlcyBidXQgdGhlDQpiaXRzIGluIGVkeCBtdXN0IGJlIHplcm9lZCBpZiBj
b3JyZXNwb25kaW5nIGZsYWdzIHdlcmUgY2xlYXJlZCBpbg0KZnB1X194c3RhdGVfY2xlYXJfYWxs
X2NwdV9jYXBzLg0KU28gdGhpcyBpbXBsaWVzIG1vcmUgd29yayB1bmZvcnR1bmF0ZWx5Lg0KDQo+
IMKgCQl9IGVsc2Ugew0KPiDCoAkJCWVudHJ5LT5lYnggPSAwOw0KPiDCoAkJCWVudHJ5LT5lY3gg
PSAwOw0KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZW50cnktPmVkeCA9IDA7DQo+IMKgCQl9
DQo+IMKgCQllbnRyeS0+ZWF4ID0gMDsNCj4gLQkJZW50cnktPmVkeCA9IDA7DQo+IMKgCQlicmVh
azsNCj4gwqAJfQ0KPiDCoAljYXNlIDk6
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Paolo Bonzini Oct. 28, 2016, 10:17 a.m. UTC | #6
On 28/10/2016 12:13, Luc, Piotr wrote:
> On Fri, 2016-10-28 at 17:12 +0800, He Chen wrote:
>> The spec can be found in Intel Software Developer Manual or in
>> Instruction Set Extensions Programming Reference.
>>
>> Signed-off-by: Luwei Kang <luwei.kang@intel.com>
>> Signed-off-by: He Chen <he.chen@linux.intel.com>
>> ---
>>  arch/x86/kvm/cpuid.c | 7 ++++++-
>>  1 file changed, 6 insertions(+), 1 deletion(-)
>>
>> diff --git a/arch/x86/kvm/cpuid.c b/arch/x86/kvm/cpuid.c
>> index afa7bbb..328b169 100644
>> --- a/arch/x86/kvm/cpuid.c
>> +++ b/arch/x86/kvm/cpuid.c
>> @@ -376,6 +376,10 @@ static inline int __do_cpuid_ent(struct
>> kvm_cpuid_entry2 *entry, u32 function,
>>  	/* cpuid 7.0.ecx*/
>>  	const u32 kvm_cpuid_7_0_ecx_x86_features = F(PKU) | 0
>> /*OSPKE*/;
>>  
>> +	/* cpuid 7.0.edx*/
>> +	const u32 kvm_cpuid_7_0_edx_x86_features =
>> +        0x4 /* AVX512-4VNNIW */ | 0x8 /* AVX512-4FMAPS */;
>> +
>>  	/* all calls to cpuid_count() should be made on the same cpu
>> */
>>  	get_cpu();
>>  
>> @@ -458,12 +462,13 @@ static inline int __do_cpuid_ent(struct
>> kvm_cpuid_entry2 *entry, u32 function,
>>  			/* PKU is not yet implemented for shadow
>> paging. */
>>  			if (!tdp_enabled)
>>  				entry->ecx &= ~F(PKU);
>> +            entry->edx &= kvm_cpuid_7_0_edx_x86_features;
> 
> The cpu_mask() is missed here.
> I understand that it doesn't work for this scattered features but the
> bits in edx must be zeroed if corresponding flags were cleared in
> fpu__xstate_clear_all_cpu_caps.
> So this implies more work unfortunately.

So if the x86 folks would retract their objection and accept a new
cpufeature array element it would be nice, because KVM could just do

	cpuid_mask(&entry->edx, CPUID_7_0_EDX);

Otherwise, if you add a cpuid_count_edx function to processor.h then one
can do:

	entry_>edx &= cpuid_count_edx(7, 0);

which is decent too.

Thanks,

Paolo

>>  		} else {
>>  			entry->ebx = 0;
>>  			entry->ecx = 0;
>> +            entry->edx = 0;
>>  		}
>>  		entry->eax = 0;
>> -		entry->edx = 0;
>>  		break;
>>  	}
>>  	case 9:
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Borislav Petkov Oct. 28, 2016, 11:08 a.m. UTC | #7
On Fri, Oct 28, 2016 at 12:17:02PM +0200, Paolo Bonzini wrote:
> Otherwise, if you add a cpuid_count_edx function to processor.h then one
> can do:
> 
> 	entry_>edx &= cpuid_count_edx(7, 0);
> 
> which is decent too.

If you think of iterating over the cpuid_bits[] array and recreating the
CPUID leaf for KVM, sure, why not...
Paolo Bonzini Oct. 28, 2016, 12:07 p.m. UTC | #8
On 28/10/2016 13:08, Borislav Petkov wrote:
> On Fri, Oct 28, 2016 at 12:17:02PM +0200, Paolo Bonzini wrote:
>> Otherwise, if you add a cpuid_count_edx function to processor.h then one
>> can do:
>>
>> 	entry_>edx &= cpuid_count_edx(7, 0);
>>
>> which is decent too.
> 
> If you think of iterating over the cpuid_bits[] array and recreating the
> CPUID leaf for KVM, sure, why not...
> 

cpuid_count_edx would be just

static inline unsigned int cpuid_count_edx(unsigned op, unsigned count)
{
        unsigned int eax, ebx, ecx, edx;

        cpuid_count(op, count, &eax, &ebx, &ecx, &edx);

        return edx;
}

Paolo
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Borislav Petkov Oct. 28, 2016, 12:21 p.m. UTC | #9
On Fri, Oct 28, 2016 at 02:07:21PM +0200, Paolo Bonzini wrote:
> cpuid_count_edx would be just
> 
> static inline unsigned int cpuid_count_edx(unsigned op, unsigned count)
> {
>         unsigned int eax, ebx, ecx, edx;
> 
>         cpuid_count(op, count, &eax, &ebx, &ecx, &edx);
> 
>         return edx;
> }

Even better.

But shouldn't this be hiding unimplemented CPUID bits from the guest?
Paolo Bonzini Oct. 29, 2016, 12:21 p.m. UTC | #10
----- Original Message -----
> From: "Borislav Petkov" <bp@alien8.de>
> To: "Paolo Bonzini" <pbonzini@redhat.com>
> Cc: "Piotr Luc" <Piotr.Luc@intel.com>, kvm@vger.kernel.org, "he chen" <he.chen@linux.intel.com>,
> linux-kernel@vger.kernel.org, tglx@linutronix.de, x86@kernel.org, hpa@zytor.com, mingo@redhat.com, "Luwei Kang"
> <luwei.kang@intel.com>, rkrcmar@redhat.com
> Sent: Friday, October 28, 2016 2:21:23 PM
> Subject: Re: [PATCH] x86/cpuid: expose AVX512_4VNNIW and AVX512_4FMAPS features to kvm guest
> 
> On Fri, Oct 28, 2016 at 02:07:21PM +0200, Paolo Bonzini wrote:
> > cpuid_count_edx would be just
> > 
> > static inline unsigned int cpuid_count_edx(unsigned op, unsigned count)
> > {
> >         unsigned int eax, ebx, ecx, edx;
> > 
> >         cpuid_count(op, count, &eax, &ebx, &ecx, &edx);
> > 
> >         return edx;
> > }
> 
> Even better.
> 
> But shouldn't this be hiding unimplemented CPUID bits from the guest?

Currently none of the bits in CPUID[7,0].edx is ever masked by the host, so
this would be enough.  If we ever need to do some masking, I guess I'll
practice my puss-in-boots look and submit a patch to add CPUID[7,0] back
as a separate cpufeature entr.

Paolo
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Borislav Petkov Oct. 29, 2016, 12:25 p.m. UTC | #11
On Sat, Oct 29, 2016 at 08:21:17AM -0400, Paolo Bonzini wrote:
> Currently none of the bits in CPUID[7,0].edx is ever masked by the host, so
> this would be enough.  If we ever need to do some masking, I guess I'll
> practice my puss-in-boots look and submit a patch to add CPUID[7,0] back
> as a separate cpufeature entr.

I don't understand - why can't it be filtered here if needed? I.e.,

	return edx & KVM_CPUID_EDX_7_MASK;

or so?

Btw, we already have a cpuid_edx() helper in arch/x86/include/asm/processor.h
Paolo Bonzini Oct. 29, 2016, 12:36 p.m. UTC | #12
----- Original Message -----
> From: "Borislav Petkov" <bp@alien8.de>
> To: "Paolo Bonzini" <pbonzini@redhat.com>
> Cc: "Piotr Luc" <Piotr.Luc@intel.com>, kvm@vger.kernel.org, "he chen" <he.chen@linux.intel.com>,
> linux-kernel@vger.kernel.org, tglx@linutronix.de, x86@kernel.org, hpa@zytor.com, mingo@redhat.com, "Luwei Kang"
> <luwei.kang@intel.com>, rkrcmar@redhat.com
> Sent: Saturday, October 29, 2016 2:25:48 PM
> Subject: Re: [PATCH] x86/cpuid: expose AVX512_4VNNIW and AVX512_4FMAPS features to kvm guest
> 
> On Sat, Oct 29, 2016 at 08:21:17AM -0400, Paolo Bonzini wrote:
> > Currently none of the bits in CPUID[7,0].edx is ever masked by the host, so
> > this would be enough.  If we ever need to do some masking, I guess I'll
> > practice my puss-in-boots look and submit a patch to add CPUID[7,0] back
> > as a separate cpufeature entr.
> 
> I don't understand - why can't it be filtered here if needed? I.e.,
> 
> 	return edx & KVM_CPUID_EDX_7_MASK;
> 
> or so?

Because then it wouldn't be in processor.h.

> Btw, we already have a cpuid_edx() helper in arch/x86/include/asm/processor.h

Yes, but it doesn't take an ecx.

Anyhow this is not an issue for now.  It will depend on which other bits
are added to CPUID[7,0].edx, but in general it's relatively rare to blacklist
bits from cpufeature.

Paolo
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Borislav Petkov Oct. 29, 2016, 12:53 p.m. UTC | #13
On Sat, Oct 29, 2016 at 08:36:11AM -0400, Paolo Bonzini wrote:
> Because then it wouldn't be in processor.h.

Easy:

	return cpuid_edx(…) & KVM_CPUID_EDX_7_MASK;

at the call site.

> Yes, but it doesn't take an ecx.

Looks like we need another set of macros :-)

> Anyhow this is not an issue for now.  It will depend on which other bits
> are added to CPUID[7,0].edx, but in general it's relatively rare to blacklist
> bits from cpufeature.

Right.

Thanks.
Paolo Bonzini Oct. 29, 2016, 1:20 p.m. UTC | #14
----- Original Message -----
> From: "Borislav Petkov" <bp@alien8.de>
> To: "Paolo Bonzini" <pbonzini@redhat.com>
> Cc: "Piotr Luc" <Piotr.Luc@intel.com>, kvm@vger.kernel.org, "he chen" <he.chen@linux.intel.com>,
> linux-kernel@vger.kernel.org, tglx@linutronix.de, x86@kernel.org, hpa@zytor.com, mingo@redhat.com, "Luwei Kang"
> <luwei.kang@intel.com>, rkrcmar@redhat.com
> Sent: Saturday, October 29, 2016 2:53:10 PM
> Subject: Re: [PATCH] x86/cpuid: expose AVX512_4VNNIW and AVX512_4FMAPS features to kvm guest
> 
> On Sat, Oct 29, 2016 at 08:36:11AM -0400, Paolo Bonzini wrote:
> > Because then it wouldn't be in processor.h.
> 
> Easy:
> 
> 	return cpuid_edx(…) & KVM_CPUID_EDX_7_MASK;
> 
> at the call site.

Yup.  That's what I said before (entry->edx &= cpuid_count_edx(7, 0)).

Paolo
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Piotr Luc Oct. 31, 2016, 9:15 a.m. UTC | #15
T24gU2F0LCAyMDE2LTEwLTI5IGF0IDA4OjIxIC0wNDAwLCBQYW9sbyBCb256aW5pIHdyb3RlOg0K
PiANCj4gQ3VycmVudGx5IG5vbmUgb2YgdGhlIGJpdHMgaW4gQ1BVSURbNywwXS5lZHggaXMgZXZl
ciBtYXNrZWQgYnkgdGhlDQo+IGhvc3QsIHNvDQo+IHRoaXMgd291bGQgYmUgZW5vdWdoLsKgwqBJ
ZiB3ZSBldmVyIG5lZWQgdG8gZG8gc29tZSBtYXNraW5nLCBJIGd1ZXNzDQo+IEknbGwNCj4gcHJh
Y3RpY2UgbXkgcHVzcy1pbi1ib290cyBsb29rIGFuZCBzdWJtaXQgYSBwYXRjaCB0byBhZGQgQ1BV
SURbNywwXQ0KPiBiYWNrDQo+IGFzIGEgc2VwYXJhdGUgY3B1ZmVhdHVyZSBlbnRyLg0KDQpJIHRo
aW5rIHRoYXQgaW4gdjQuOS1yYzIgdGhlwqBDUFVJRFs3LDBdLmVkeCBiaXRzIGNhbiBiZSBtYXNr
ZWQgb3V0IGJ5DQphcHBseWluZyBub3hzYXZlIHRvIGNtZGxpbmUuIFVzaW5nIGRpcmVjdGx5IGNw
dV9jb3VudCB3aWxsIHJlc3VsdCBpbg0KcGFzc2luZyB0aGUgYml0cyBpbiBlZHggdG8gYSBndWVz
dCBkaXJlY3RseSB3aGlsZSB0aGUgeHNhdmVvcHQgYW5kIHJlc3QNCm9mIEFWWDUxMiBmZWF0dXJl
cyBiaXRzIHdpbGwgYmUgY2xlYXJlZC7CoA0KDQpUaHgNClBpb3Ry
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Borislav Petkov Oct. 31, 2016, 9:53 a.m. UTC | #16
On Mon, Oct 31, 2016 at 09:15:43AM +0000, Luc, Piotr wrote:
> I think that in v4.9-rc2 the CPUID[7,0].edx bits can be masked out by
> applying noxsave to cmdline. Using directly cpu_count will result in
> passing the bits in edx to a guest directly while the xsaveopt and rest
> of AVX512 features bits will be cleared. 

Errr, I can't parse that reading it backwards and forwards. Please
elaborate.
Piotr Luc Oct. 31, 2016, 10:18 a.m. UTC | #17
On Mon, 2016-10-31 at 10:53 +0100, Borislav Petkov wrote:
> > I think that in v4.9-rc2 the CPUID[7,0].edx bits can be masked out

> by

> > applying noxsave to cmdline. Using directly cpu_count will result

> in

> > passing the bits in edx to a guest directly while the xsaveopt and

> rest

> > of AVX512 features bits will be cleared. 

> 

> Errr, I can't parse that reading it backwards and forwards. Please

> elaborate.


The patch that introduces AVX512_4VNNIW and AVX512_4FMAPS features was
merged to kernel 4.9-rc2 so we have possibility to mask the feature
bits using 'noxsave' option in kernel cmdline. This option clears all
AVX512 feature bits in boot_cpu_data.x86_capability.
The cpuid_mask function, which usually used in kvm, read bit from this
x86_capabity and mask out. This prevents passing disabled features to
guest. If we use cpu_count instead, which reports bits directly from
CPU, then the bits of features that are disabled in host are passed to
guest as enabled. This seems be inconsistent.

Thanks,
Piotr
Borislav Petkov Oct. 31, 2016, 10:30 a.m. UTC | #18
On Mon, Oct 31, 2016 at 10:18:41AM +0000, Luc, Piotr wrote:
> The cpuid_mask function, which usually used in kvm, read bit from this
> x86_capabity and mask out. This prevents passing disabled features to
> guest. If we use cpu_count instead, which reports bits directly from

Ah, you mean cpuid_count().

> CPU, then the bits of features that are disabled in host are passed to
> guest as enabled. This seems be inconsistent.

Ok, I see what you mean.

So I guess we'll have to iterate over the cpuid_bits[] array and
recreate the CPUID leaf for KVM instead, as I suggested earlier.
Paolo Bonzini Oct. 31, 2016, 10:47 a.m. UTC | #19
On 31/10/2016 11:30, Borislav Petkov wrote:
> On Mon, Oct 31, 2016 at 10:18:41AM +0000, Luc, Piotr wrote:
>> The cpuid_mask function, which usually used in kvm, read bit from this
>> x86_capabity and mask out. This prevents passing disabled features to
>> guest. If we use cpu_count instead, which reports bits directly from
> 
> Ah, you mean cpuid_count().
> 
>> CPU, then the bits of features that are disabled in host are passed to
>> guest as enabled. This seems be inconsistent.
> 
> Ok, I see what you mean.
> 
> So I guess we'll have to iterate over the cpuid_bits[] array and
> recreate the CPUID leaf for KVM instead, as I suggested earlier.

Yes, indeed. :(

The information is all in arch/x86/kernel/cpu/scattered.c's cpuid_bits
array.  Borislav, would it be okay to export the cpuid_regs enum?

Paolo
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Borislav Petkov Oct. 31, 2016, 11:05 a.m. UTC | #20
On Mon, Oct 31, 2016 at 11:47:48AM +0100, Paolo Bonzini wrote:
> The information is all in arch/x86/kernel/cpu/scattered.c's cpuid_bits
> array.  Borislav, would it be okay to export the cpuid_regs enum?

Yeah, and kill the duplicated one in arch/x86/events/intel/pt.c too
please, while at it.

I'd still put it all in arch/x86/kernel/cpu/scattered.c so that it is
close-by and call it from outside.

Thanks.
Paolo Bonzini Oct. 31, 2016, 11:41 a.m. UTC | #21
On 31/10/2016 12:05, Borislav Petkov wrote:
> On Mon, Oct 31, 2016 at 11:47:48AM +0100, Paolo Bonzini wrote:
>> The information is all in arch/x86/kernel/cpu/scattered.c's cpuid_bits
>> array.  Borislav, would it be okay to export the cpuid_regs enum?
> 
> Yeah, and kill the duplicated one in arch/x86/events/intel/pt.c too
> please, while at it.
> 
> I'd still put it all in arch/x86/kernel/cpu/scattered.c so that it is
> close-by and call it from outside.

Good.  Chen, are you going to do this?

Paolo
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
He Chen Nov. 1, 2016, 7:48 a.m. UTC | #22
On Mon, Oct 31, 2016 at 12:41:32PM +0100, Paolo Bonzini wrote:
> 
> 
> On 31/10/2016 12:05, Borislav Petkov wrote:
> > On Mon, Oct 31, 2016 at 11:47:48AM +0100, Paolo Bonzini wrote:
> >> The information is all in arch/x86/kernel/cpu/scattered.c's cpuid_bits
> >> array.  Borislav, would it be okay to export the cpuid_regs enum?
> > 
> > Yeah, and kill the duplicated one in arch/x86/events/intel/pt.c too
> > please, while at it.
> > 
> > I'd still put it all in arch/x86/kernel/cpu/scattered.c so that it is
> > close-by and call it from outside.
> 
> Good.  Chen, are you going to do this?
> 

Sure.

Before sending a patch, let me check if my understanding is right...
I will add a helper in scattered.c like:

unsigned int get_scattered_cpuid_features(unsigned int level,
					unsigned int sub_leaf, enum cpuid_regs reg)
{
	u32 val = 0;
	const struct cpuid_bit *cb;

	for (cb = cpuid_bits; cb->feature; cb++) {

		if (reg == cb->reg &&
			level == cb->level &&
			sub_leaf == cb->sub_leaf &&
			boot_cpu_has(cb->feature))

			val |= cb->bit;
	}

	return val;
}

And, when KVM wants to mask out features, it can be called outside like:

entry->edx &= kvm_cpuid_7_0_edx_x86_features;
entry->edx &= get_scatterd_cpuid_features(7, 0, CR_EDX);

Thanks,
-He
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Borislav Petkov Nov. 1, 2016, 8:46 a.m. UTC | #23
On Tue, Nov 01, 2016 at 03:48:50PM +0800, He Chen wrote:
> Before sending a patch, let me check if my understanding is right...
> I will add a helper in scattered.c like:
> 
> unsigned int get_scattered_cpuid_features(unsigned int level,
> 					unsigned int sub_leaf, enum cpuid_regs reg)
> {
> 	u32 val = 0;
> 	const struct cpuid_bit *cb;
> 
> 	for (cb = cpuid_bits; cb->feature; cb++) {

Right, we can improve that by keeping cpuid_bit.level sorted so that you
can break out early if the level is exceeded. For that please sort it
and add a comment stating that the leaf should be kept sorted ontop of
it.

And then you do something like this:

u32 get_scattered_cpuid_leaf(unsigned int level, unsigned int sub_leaf,
			     enum cpuid_regs reg)
{
	u32 cpuid_val = 0;

	for (cb = cpuid_bits; cb->feature; cb++) {

		if (level < cb->level)
			continue;

		if (level > cb->level)
			break;

		if (cb->reg == reg && sub_leaf == cb->sub_leaf) {
			if (cpu_has(cb->feature))
				cpuid_val |= BIT(cb->bit);
		}
	}

	return cpuid_val;
}

Completely untested, of course.
diff mbox

Patch

diff --git a/arch/x86/kvm/cpuid.c b/arch/x86/kvm/cpuid.c
index afa7bbb..328b169 100644
--- a/arch/x86/kvm/cpuid.c
+++ b/arch/x86/kvm/cpuid.c
@@ -376,6 +376,10 @@  static inline int __do_cpuid_ent(struct kvm_cpuid_entry2 *entry, u32 function,
 	/* cpuid 7.0.ecx*/
 	const u32 kvm_cpuid_7_0_ecx_x86_features = F(PKU) | 0 /*OSPKE*/;
 
+	/* cpuid 7.0.edx*/
+	const u32 kvm_cpuid_7_0_edx_x86_features =
+        0x4 /* AVX512-4VNNIW */ | 0x8 /* AVX512-4FMAPS */;
+
 	/* all calls to cpuid_count() should be made on the same cpu */
 	get_cpu();
 
@@ -458,12 +462,13 @@  static inline int __do_cpuid_ent(struct kvm_cpuid_entry2 *entry, u32 function,
 			/* PKU is not yet implemented for shadow paging. */
 			if (!tdp_enabled)
 				entry->ecx &= ~F(PKU);
+            entry->edx &= kvm_cpuid_7_0_edx_x86_features;
 		} else {
 			entry->ebx = 0;
 			entry->ecx = 0;
+            entry->edx = 0;
 		}
 		entry->eax = 0;
-		entry->edx = 0;
 		break;
 	}
 	case 9: