All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v4 0/2] x86: Fix ARCH_REQ_XCOMP_PERM and update the test
@ 2022-01-29 17:36 Chang S. Bae
  2022-01-29 17:36 ` [PATCH v4 1/2] x86/arch_prctl: Fix the ARCH_REQ_XCOMP_PERM implementation Chang S. Bae
                   ` (2 more replies)
  0 siblings, 3 replies; 16+ messages in thread
From: Chang S. Bae @ 2022-01-29 17:36 UTC (permalink / raw)
  To: linux-kernel, x86, tglx, bp, dave.hansen, mingo
  Cc: yang.zhong, ravi.v.shankar, chang.seok.bae

Changes from V3:
* Rebased onto 5.17-rc1.

V3: https://lore.kernel.org/lkml/20211110003209.21666-1-chang.seok.bae@intel.com/

---

The recent x86 dynamic state support incorporates the arch_prctl option to
request permission before using a dynamic state.

It was designed to add the requested feature in the group leader's
permission bitmask so that every thread can reference this master bitmask.
The group leader is assumed to be unchanged here. The mainline is the case
as a group leader is identified at fork() or exec() time only.

This master bitmask should include non-dynamic features always, as they
are permitted by default. Users may check them via ARCH_GET_XCOMP_PERM.

But, in hindsight, the implementation does overwrite the bitmask with the
requested bit only, instead of adding the bit to the existing one. This
overwrite effectively revokes the permission that is granted already.

Fix the code and also update the selftest to disclose the issue if there
is.

Chang S. Bae (1):
  selftests/x86/amx: Update the ARCH_REQ_XCOMP_PERM test

Yang Zhong (1):
  x86/arch_prctl: Fix the ARCH_REQ_XCOMP_PERM implementation

 arch/x86/kernel/fpu/xstate.c      |  2 +-
 tools/testing/selftests/x86/amx.c | 16 ++++++++++++++--
 2 files changed, 15 insertions(+), 3 deletions(-)


base-commit: e783362eb54cd99b2cac8b3a9aeac942e6f6ac07
-- 
2.17.1


^ permalink raw reply	[flat|nested] 16+ messages in thread

* [PATCH v4 1/2] x86/arch_prctl: Fix the ARCH_REQ_XCOMP_PERM implementation
  2022-01-29 17:36 [PATCH v4 0/2] x86: Fix ARCH_REQ_XCOMP_PERM and update the test Chang S. Bae
@ 2022-01-29 17:36 ` Chang S. Bae
  2022-03-07 12:20   ` Hao Xiang
  2022-03-23 23:31   ` [tip: x86/urgent] x86/fpu/xstate: " tip-bot2 for Yang Zhong
  2022-01-29 17:36 ` [PATCH v4 2/2] selftests/x86/amx: Update the ARCH_REQ_XCOMP_PERM test Chang S. Bae
  2022-03-23 11:04 ` ping Re: [PATCH v4 0/2] x86: Fix ARCH_REQ_XCOMP_PERM and update the test Paolo Bonzini
  2 siblings, 2 replies; 16+ messages in thread
From: Chang S. Bae @ 2022-01-29 17:36 UTC (permalink / raw)
  To: linux-kernel, x86, tglx, bp, dave.hansen, mingo
  Cc: yang.zhong, ravi.v.shankar, chang.seok.bae

From: Yang Zhong <yang.zhong@intel.com>

ARCH_REQ_XCOMP_PERM is supposed to add the requested feature to the
permission bitmap of thread_group_leader()->fpu. But the code overwrites
the bitmap with the requested feature bit only rather than adding it.

Fix the code to add the request feature bit to the master bitmask.

Fixes: db8268df0983 ("x86/arch_prctl: Add controls for dynamic XSTATE components")
Signed-off-by: Yang Zhong <yang.zhong@intel.com>
Signed-off-by: Chang S. Bae <chang.seok.bae@intel.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: x86@kernel.org
Cc: linux-kernel@vger.kernel.org
---
Changes from v3:
* Adjust the change to the mainline (v5.17-rc).

Changes from v2:
 * Fix the authorship.

Changes from v1:
 * Change the mask value only and trim the changelog.
---
 arch/x86/kernel/fpu/xstate.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/arch/x86/kernel/fpu/xstate.c b/arch/x86/kernel/fpu/xstate.c
index 02b3ddaf4f75..2d4363e32517 100644
--- a/arch/x86/kernel/fpu/xstate.c
+++ b/arch/x86/kernel/fpu/xstate.c
@@ -1636,7 +1636,7 @@ static int __xstate_request_perm(u64 permitted, u64 requested, bool guest)
 
 	perm = guest ? &fpu->guest_perm : &fpu->perm;
 	/* Pairs with the READ_ONCE() in xstate_get_group_perm() */
-	WRITE_ONCE(perm->__state_perm, requested);
+	WRITE_ONCE(perm->__state_perm, mask);
 	/* Protected by sighand lock */
 	perm->__state_size = ksize;
 	perm->__user_state_size = usize;
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH v4 2/2] selftests/x86/amx: Update the ARCH_REQ_XCOMP_PERM test
  2022-01-29 17:36 [PATCH v4 0/2] x86: Fix ARCH_REQ_XCOMP_PERM and update the test Chang S. Bae
  2022-01-29 17:36 ` [PATCH v4 1/2] x86/arch_prctl: Fix the ARCH_REQ_XCOMP_PERM implementation Chang S. Bae
@ 2022-01-29 17:36 ` Chang S. Bae
  2022-03-23 16:44   ` Thomas Gleixner
  2022-03-23 23:31   ` [tip: x86/urgent] " tip-bot2 for Chang S. Bae
  2022-03-23 11:04 ` ping Re: [PATCH v4 0/2] x86: Fix ARCH_REQ_XCOMP_PERM and update the test Paolo Bonzini
  2 siblings, 2 replies; 16+ messages in thread
From: Chang S. Bae @ 2022-01-29 17:36 UTC (permalink / raw)
  To: linux-kernel, x86, tglx, bp, dave.hansen, mingo
  Cc: yang.zhong, ravi.v.shankar, chang.seok.bae, linux-kselftest

Update the arch_prctl test to check the permission bitmap whether the
requested feature is added as expected or not.

Every non-dynamic feature that is enabled is permitted already for use.
TILECFG is not dynamic feature. Ensure the bit is always on from
ARCH_GET_XCOMP_PERM.

Signed-off-by: Chang S. Bae <chang.seok.bae@intel.com>
Cc: Dave Hansen <dave.hansen@linux.intel.com>
Cc: linux-kselftest@vger.kernel.org
Cc: x86@kernel.org
Cc: linux-kernel@vger.kernel.org
---
 tools/testing/selftests/x86/amx.c | 16 ++++++++++++++--
 1 file changed, 14 insertions(+), 2 deletions(-)

diff --git a/tools/testing/selftests/x86/amx.c b/tools/testing/selftests/x86/amx.c
index 3615ef4a48bb..e1e2c8f3356f 100644
--- a/tools/testing/selftests/x86/amx.c
+++ b/tools/testing/selftests/x86/amx.c
@@ -368,9 +368,16 @@ static void req_xtiledata_perm(void)
 
 static void validate_req_xcomp_perm(enum expected_result exp)
 {
-	unsigned long bitmask;
+	unsigned long bitmask, expected_bitmask;
 	long rc;
 
+	rc = syscall(SYS_arch_prctl, ARCH_GET_XCOMP_PERM, &bitmask);
+	if (rc) {
+		fatal_error("prctl(ARCH_GET_XCOMP_PERM) error: %ld", rc);
+	} else if (!(bitmask & XFEATURE_MASK_XTILECFG)) {
+		fatal_error("ARCH_GET_XCOMP_PERM returns XFEATURE_XTILECFG off.");
+	}
+
 	rc = syscall(SYS_arch_prctl, ARCH_REQ_XCOMP_PERM, XFEATURE_XTILEDATA);
 	if (exp == FAIL_EXPECTED) {
 		if (rc) {
@@ -383,10 +390,15 @@ static void validate_req_xcomp_perm(enum expected_result exp)
 		fatal_error("ARCH_REQ_XCOMP_PERM saw unexpected failure.\n");
 	}
 
+	expected_bitmask = bitmask | XFEATURE_MASK_XTILEDATA;
+
 	rc = syscall(SYS_arch_prctl, ARCH_GET_XCOMP_PERM, &bitmask);
 	if (rc) {
 		fatal_error("prctl(ARCH_GET_XCOMP_PERM) error: %ld", rc);
-	} else if (bitmask & XFEATURE_MASK_XTILE) {
+	} else if (bitmask != expected_bitmask) {
+		fatal_error("ARCH_REQ_XCOMP_PERM saw a wrong bitmask: %lx, expected: %lx.\n",
+			    bitmask, expected_bitmask);
+	} else {
 		printf("\tARCH_REQ_XCOMP_PERM is successful.\n");
 	}
 }
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 16+ messages in thread

* Re: [PATCH v4 1/2] x86/arch_prctl: Fix the ARCH_REQ_XCOMP_PERM implementation
  2022-01-29 17:36 ` [PATCH v4 1/2] x86/arch_prctl: Fix the ARCH_REQ_XCOMP_PERM implementation Chang S. Bae
@ 2022-03-07 12:20   ` Hao Xiang
  2022-03-07 18:53     ` Chang S. Bae
  2022-03-23 23:31   ` [tip: x86/urgent] x86/fpu/xstate: " tip-bot2 for Yang Zhong
  1 sibling, 1 reply; 16+ messages in thread
From: Hao Xiang @ 2022-03-07 12:20 UTC (permalink / raw)
  To: chang.seok.bae
  Cc: bp, dave.hansen, linux-kernel, mingo, ravi.v.shankar, tglx, x86,
	yang.zhong

x86/arch_prctl: Fix the ARCH_REQ_XCOMP_PERM implementation

If WRITE_ONCE(perm->__state_perm, requested) is modified to
WRITE_ONCE(perm->__state_perm, mask), When the qemu process does not 
request the XFEATURE_MASK_XTILE_DATA xsave state permission, there may 
be a gp error (kvm: kvm_set_xcr line 1091 inject gp fault with cpl 0) 
because __kvm_set_xcr return 1.

static int __kvm_set_xcr(struct kvm_vcpu *vcpu, u32 index, u64 xcr){
     ...
     // xcr0 includes XFEATURE_MASK_XTILE_CFG by default.
     if ((xcr0 & XFEATURE_MASK_XTILE) &&
         ((xcr0 & XFEATURE_MASK_XTILE) != XFEATURE_MASK_XTILE))
         return 1;
     ...
}

diff --git a/arch/x86/kernel/fpu/xstate.c b/arch/x86/kernel/fpu/xstate.c
index 02b3dda..2d4363e 100644
--- a/arch/x86/kernel/fpu/xstate.c
+++ b/arch/x86/kernel/fpu/xstate.c
@@ -1636,7 +1636,7 @@ static int __xstate_request_perm(u64 permitted, 
u64 requested, bool guest)

         perm = guest ? &fpu->guest_perm : &fpu->perm;
         /* Pairs with the READ_ONCE() in xstate_get_group_perm() */
-       WRITE_ONCE(perm->__state_perm, requested);
+       WRITE_ONCE(perm->__state_perm, mask);
         /* Protected by sighand lock */
         perm->__state_size = ksize;
         perm->__user_state_size = usize;
diff --git a/arch/x86/kvm/cpuid.c b/arch/x86/kvm/cpuid.c
index 494d4d3..e8704568 100644
--- a/arch/x86/kvm/cpuid.c
+++ b/arch/x86/kvm/cpuid.c
@@ -908,6 +908,9 @@ static inline int __do_cpuid_func(struct 
kvm_cpuid_array *array, u32 function)
                 break;
         case 0xd: {
                 u64 permitted_xcr0 = supported_xcr0 & 
xstate_get_guest_group_perm();
+               permitted_xcr0 = ((permitted_xcr0 & 
XFEATURES_MASK_XTILE) != XFEATURES_MASK_XTILE)
+                               ? permitted_xcr0
+                               : permitted_xcr0 & ~XFEATURES_MASK_XTILE;
                 u64 permitted_xss = supported_xss;

                 entry->eax &= permitted_xcr0;


^ permalink raw reply related	[flat|nested] 16+ messages in thread

* Re: [PATCH v4 1/2] x86/arch_prctl: Fix the ARCH_REQ_XCOMP_PERM implementation
  2022-03-07 12:20   ` Hao Xiang
@ 2022-03-07 18:53     ` Chang S. Bae
  2022-03-08  8:36       ` Hao Xiang
  0 siblings, 1 reply; 16+ messages in thread
From: Chang S. Bae @ 2022-03-07 18:53 UTC (permalink / raw)
  To: Hao Xiang, yang.zhong
  Cc: bp, dave.hansen, linux-kernel, mingo, ravi.v.shankar, tglx, x86

On 3/7/2022 4:20 AM, Hao Xiang wrote:
> x86/arch_prctl: Fix the ARCH_REQ_XCOMP_PERM implementation
> 
> If WRITE_ONCE(perm->__state_perm, requested) is modified to
> WRITE_ONCE(perm->__state_perm, mask), When the qemu process does not 
> request the XFEATURE_MASK_XTILE_DATA xsave state permission, there may 
> be a gp error (kvm: kvm_set_xcr line 1091 inject gp fault with cpl 0) 
> because __kvm_set_xcr return 1.

What you said here does not make sense to me. When the Qemu process does 
not request XTILEDATA, then the __xstate_request_perm() function is 
never called in this, no?

> 
> static int __kvm_set_xcr(struct kvm_vcpu *vcpu, u32 index, u64 xcr){
>      ...
>      // xcr0 includes XFEATURE_MASK_XTILE_CFG by default.
>      if ((xcr0 & XFEATURE_MASK_XTILE) &&
>          ((xcr0 & XFEATURE_MASK_XTILE) != XFEATURE_MASK_XTILE))
>          return 1;
>      ...
> }
> 
> diff --git a/arch/x86/kernel/fpu/xstate.c b/arch/x86/kernel/fpu/xstate.c
> index 02b3dda..2d4363e 100644
> --- a/arch/x86/kernel/fpu/xstate.c
> +++ b/arch/x86/kernel/fpu/xstate.c
> @@ -1636,7 +1636,7 @@ static int __xstate_request_perm(u64 permitted, 
> u64 requested, bool guest)
> 
>          perm = guest ? &fpu->guest_perm : &fpu->perm;
>          /* Pairs with the READ_ONCE() in xstate_get_group_perm() */
> -       WRITE_ONCE(perm->__state_perm, requested);
> +       WRITE_ONCE(perm->__state_perm, mask);
>          /* Protected by sighand lock */
>          perm->__state_size = ksize;
>          perm->__user_state_size = usize;
> diff --git a/arch/x86/kvm/cpuid.c b/arch/x86/kvm/cpuid.c
> index 494d4d3..e8704568 100644
> --- a/arch/x86/kvm/cpuid.c
> +++ b/arch/x86/kvm/cpuid.c
> @@ -908,6 +908,9 @@ static inline int __do_cpuid_func(struct 
> kvm_cpuid_array *array, u32 function)
>                  break;
>          case 0xd: {
>                  u64 permitted_xcr0 = supported_xcr0 & 
> xstate_get_guest_group_perm();

Yang, I think you should have included your fix [1] in your series [2] 
in the first place, before using it widely like [3].

> +               permitted_xcr0 = ((permitted_xcr0 & 
> XFEATURES_MASK_XTILE) != XFEATURES_MASK_XTILE)
> +                               ? permitted_xcr0
> +                               : permitted_xcr0 & ~XFEATURES_MASK_XTILE;
>                  u64 permitted_xss = supported_xss;
> 
>                  entry->eax &= permitted_xcr0;
> 

Well, first of all, one patch should fix one issue, not two or more, no?

But this hunk looks duplicate with this [4].

Thanks,
Chang


[1] https://lore.kernel.org/lkml/20211108222815.4078-1-yang.zhong@intel.com/
[2] 
https://lore.kernel.org/lkml/20220105123532.12586-1-yang.zhong@intel.com/
[3] 
https://lore.kernel.org/lkml/20220105123532.12586-2-yang.zhong@intel.com/
[4] 
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/arch/x86/kvm/x86.c#n1033

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH v4 1/2] x86/arch_prctl: Fix the ARCH_REQ_XCOMP_PERM implementation
  2022-03-07 18:53     ` Chang S. Bae
@ 2022-03-08  8:36       ` Hao Xiang
  0 siblings, 0 replies; 16+ messages in thread
From: Hao Xiang @ 2022-03-08  8:36 UTC (permalink / raw)
  To: Chang S. Bae, yang.zhong
  Cc: bp, dave.hansen, linux-kernel, mingo, ravi.v.shankar, tglx, x86

Using the linux upsteam code with your patches,the problem is not 
reproduced. Maybe my patches are incomplete.

Thanks,
Hao

On 2022/3/8 2:53, Chang S. Bae wrote:
> On 3/7/2022 4:20 AM, Hao Xiang wrote:
>> x86/arch_prctl: Fix the ARCH_REQ_XCOMP_PERM implementation
>>
>> If WRITE_ONCE(perm->__state_perm, requested) is modified to
>> WRITE_ONCE(perm->__state_perm, mask), When the qemu process does not 
>> request the XFEATURE_MASK_XTILE_DATA xsave state permission, there may 
>> be a gp error (kvm: kvm_set_xcr line 1091 inject gp fault with cpl 0) 
>> because __kvm_set_xcr return 1.
> 
> What you said here does not make sense to me. When the Qemu process does 
> not request XTILEDATA, then the __xstate_request_perm() function is 
> never called in this, no?
> 
>>
>> static int __kvm_set_xcr(struct kvm_vcpu *vcpu, u32 index, u64 xcr){
>>      ...
>>      // xcr0 includes XFEATURE_MASK_XTILE_CFG by default.
>>      if ((xcr0 & XFEATURE_MASK_XTILE) &&
>>          ((xcr0 & XFEATURE_MASK_XTILE) != XFEATURE_MASK_XTILE))
>>          return 1;
>>      ...
>> }
>>
>> diff --git a/arch/x86/kernel/fpu/xstate.c b/arch/x86/kernel/fpu/xstate.c
>> index 02b3dda..2d4363e 100644
>> --- a/arch/x86/kernel/fpu/xstate.c
>> +++ b/arch/x86/kernel/fpu/xstate.c
>> @@ -1636,7 +1636,7 @@ static int __xstate_request_perm(u64 permitted, 
>> u64 requested, bool guest)
>>
>>          perm = guest ? &fpu->guest_perm : &fpu->perm;
>>          /* Pairs with the READ_ONCE() in xstate_get_group_perm() */
>> -       WRITE_ONCE(perm->__state_perm, requested);
>> +       WRITE_ONCE(perm->__state_perm, mask);
>>          /* Protected by sighand lock */
>>          perm->__state_size = ksize;
>>          perm->__user_state_size = usize;
>> diff --git a/arch/x86/kvm/cpuid.c b/arch/x86/kvm/cpuid.c
>> index 494d4d3..e8704568 100644
>> --- a/arch/x86/kvm/cpuid.c
>> +++ b/arch/x86/kvm/cpuid.c
>> @@ -908,6 +908,9 @@ static inline int __do_cpuid_func(struct 
>> kvm_cpuid_array *array, u32 function)
>>                  break;
>>          case 0xd: {
>>                  u64 permitted_xcr0 = supported_xcr0 & 
>> xstate_get_guest_group_perm();
> 
> Yang, I think you should have included your fix [1] in your series [2] 
> in the first place, before using it widely like [3].
> 
>> +               permitted_xcr0 = ((permitted_xcr0 & 
>> XFEATURES_MASK_XTILE) != XFEATURES_MASK_XTILE)
>> +                               ? permitted_xcr0
>> +                               : permitted_xcr0 & ~XFEATURES_MASK_XTILE;
>>                  u64 permitted_xss = supported_xss;
>>
>>                  entry->eax &= permitted_xcr0;
>>
> 
> Well, first of all, one patch should fix one issue, not two or more, no?
> 
> But this hunk looks duplicate with this [4].
> 
> Thanks,
> Chang
> 
> 
> [1] 
> https://lore.kernel.org/lkml/20211108222815.4078-1-yang.zhong@intel.com/
> [2] 
> https://lore.kernel.org/lkml/20220105123532.12586-1-yang.zhong@intel.com/
> [3] 
> https://lore.kernel.org/lkml/20220105123532.12586-2-yang.zhong@intel.com/
> [4] 
> https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/arch/x86/kvm/x86.c#n1033 
> 

^ permalink raw reply	[flat|nested] 16+ messages in thread

* ping Re: [PATCH v4 0/2] x86: Fix ARCH_REQ_XCOMP_PERM and update the test
  2022-01-29 17:36 [PATCH v4 0/2] x86: Fix ARCH_REQ_XCOMP_PERM and update the test Chang S. Bae
  2022-01-29 17:36 ` [PATCH v4 1/2] x86/arch_prctl: Fix the ARCH_REQ_XCOMP_PERM implementation Chang S. Bae
  2022-01-29 17:36 ` [PATCH v4 2/2] selftests/x86/amx: Update the ARCH_REQ_XCOMP_PERM test Chang S. Bae
@ 2022-03-23 11:04 ` Paolo Bonzini
  2022-03-23 12:27   ` Thomas Gleixner
  2 siblings, 1 reply; 16+ messages in thread
From: Paolo Bonzini @ 2022-03-23 11:04 UTC (permalink / raw)
  To: tglx, dave.hansen
  Cc: yang.zhong, ravi.v.shankar, mingo, Chang S. Bae, bp, x86,
	linux-kernel, KVM list

Thomas, Dave,

can this series be included in 5.18 and CCed to stable?

The bug makes the __state_perm field completely wrong.  As a result, 
arch_prctl(ARCH_GET_XCOMP_PERM) only returns the features that were 
requested last, forgetting what was already in __state_perm (the 
"permitted" argument to __xstate_request_perm).

In KVM, it is a bit worse.  It affects 
arch_prctl(ARCH_GET_XCOMP_GUEST_PERM) in the same way and also 
ioctl(KVM_GET_SUPPORTED_CPUID), but the bug can also make KVM return the 
wrong xsave state size to userspace.  It's likely to go unnoticed by 
userspace until Intel adds non-dynamic states above a dynamic one, but 
potentially userspace could allocate a buffer that is too small.

Paolo

On 1/29/22 18:36, Chang S. Bae wrote:
> Changes from V3:
> * Rebased onto 5.17-rc1.
> 
> V3: https://lore.kernel.org/lkml/20211110003209.21666-1-chang.seok.bae@intel.com/
> 
> ---
> 
> The recent x86 dynamic state support incorporates the arch_prctl option to
> request permission before using a dynamic state.
> 
> It was designed to add the requested feature in the group leader's
> permission bitmask so that every thread can reference this master bitmask.
> The group leader is assumed to be unchanged here. The mainline is the case
> as a group leader is identified at fork() or exec() time only.
> 
> This master bitmask should include non-dynamic features always, as they
> are permitted by default. Users may check them via ARCH_GET_XCOMP_PERM.
> 
> But, in hindsight, the implementation does overwrite the bitmask with the
> requested bit only, instead of adding the bit to the existing one. This
> overwrite effectively revokes the permission that is granted already.
> 
> Fix the code and also update the selftest to disclose the issue if there
> is.
> 
> Chang S. Bae (1):
>    selftests/x86/amx: Update the ARCH_REQ_XCOMP_PERM test
> 
> Yang Zhong (1):
>    x86/arch_prctl: Fix the ARCH_REQ_XCOMP_PERM implementation
> 
>   arch/x86/kernel/fpu/xstate.c      |  2 +-
>   tools/testing/selftests/x86/amx.c | 16 ++++++++++++++--
>   2 files changed, 15 insertions(+), 3 deletions(-)
> 
> 
> base-commit: e783362eb54cd99b2cac8b3a9aeac942e6f6ac07


^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: ping Re: [PATCH v4 0/2] x86: Fix ARCH_REQ_XCOMP_PERM and update the test
  2022-03-23 11:04 ` ping Re: [PATCH v4 0/2] x86: Fix ARCH_REQ_XCOMP_PERM and update the test Paolo Bonzini
@ 2022-03-23 12:27   ` Thomas Gleixner
  2022-03-23 12:55     ` Thomas Gleixner
  0 siblings, 1 reply; 16+ messages in thread
From: Thomas Gleixner @ 2022-03-23 12:27 UTC (permalink / raw)
  To: Paolo Bonzini, dave.hansen
  Cc: yang.zhong, ravi.v.shankar, mingo, Chang S. Bae, bp, x86,
	linux-kernel, KVM list

Paolo,

On Wed, Mar 23 2022 at 12:04, Paolo Bonzini wrote:
> can this series be included in 5.18 and CCed to stable?

working on it. There is another issue with that which I'm currently
looking into.

Thanks,

        tglx

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: ping Re: [PATCH v4 0/2] x86: Fix ARCH_REQ_XCOMP_PERM and update the test
  2022-03-23 12:27   ` Thomas Gleixner
@ 2022-03-23 12:55     ` Thomas Gleixner
  2022-03-23 14:24       ` Paolo Bonzini
  0 siblings, 1 reply; 16+ messages in thread
From: Thomas Gleixner @ 2022-03-23 12:55 UTC (permalink / raw)
  To: Paolo Bonzini, dave.hansen
  Cc: yang.zhong, ravi.v.shankar, mingo, Chang S. Bae, bp, x86,
	linux-kernel, KVM list

On Wed, Mar 23 2022 at 13:27, Thomas Gleixner wrote:
> On Wed, Mar 23 2022 at 12:04, Paolo Bonzini wrote:
>> can this series be included in 5.18 and CCed to stable?
>
> working on it. There is another issue with that which I'm currently
> looking into.

The size calculation for the kernel state fails to take supervisor
states into account. Up to 5.18 that did not matter because ENQCMD/PASID
was disabled. But now it matters...

Thanks,

        tglx
---

--- a/arch/x86/kernel/fpu/xstate.c
+++ b/arch/x86/kernel/fpu/xstate.c
@@ -1625,6 +1625,8 @@ static int __xstate_request_perm(u64 per
 
 	/* Calculate the resulting kernel state size */
 	mask = permitted | requested;
+	/* Take supervisor states into account */
+	mask |= xfeatures_mask_supervisor();
 	ksize = xstate_calculate_size(mask, compacted);
 
 	/* Calculate the resulting user state size */

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: ping Re: [PATCH v4 0/2] x86: Fix ARCH_REQ_XCOMP_PERM and update the test
  2022-03-23 12:55     ` Thomas Gleixner
@ 2022-03-23 14:24       ` Paolo Bonzini
  2022-03-23 17:07         ` Thomas Gleixner
  0 siblings, 1 reply; 16+ messages in thread
From: Paolo Bonzini @ 2022-03-23 14:24 UTC (permalink / raw)
  To: Thomas Gleixner, dave.hansen
  Cc: yang.zhong, ravi.v.shankar, mingo, Chang S. Bae, bp, x86,
	linux-kernel, KVM list

On 3/23/22 13:55, Thomas Gleixner wrote:
> --- a/arch/x86/kernel/fpu/xstate.c
> +++ b/arch/x86/kernel/fpu/xstate.c
> @@ -1625,6 +1625,8 @@ static int __xstate_request_perm(u64 per
>   
>   	/* Calculate the resulting kernel state size */
>   	mask = permitted | requested;
> +	/* Take supervisor states into account */
> +	mask |= xfeatures_mask_supervisor();
>   	ksize = xstate_calculate_size(mask, compacted);
>   

This should be only added in for the !guest case.

Paolo

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH v4 2/2] selftests/x86/amx: Update the ARCH_REQ_XCOMP_PERM test
  2022-01-29 17:36 ` [PATCH v4 2/2] selftests/x86/amx: Update the ARCH_REQ_XCOMP_PERM test Chang S. Bae
@ 2022-03-23 16:44   ` Thomas Gleixner
  2022-03-23 21:27     ` Chang S. Bae
  2022-03-23 23:31   ` [tip: x86/urgent] " tip-bot2 for Chang S. Bae
  1 sibling, 1 reply; 16+ messages in thread
From: Thomas Gleixner @ 2022-03-23 16:44 UTC (permalink / raw)
  To: Chang S. Bae, linux-kernel, x86, bp, dave.hansen, mingo
  Cc: yang.zhong, ravi.v.shankar, chang.seok.bae, linux-kselftest

On Sat, Jan 29 2022 at 09:36, Chang S. Bae wrote:
> Update the arch_prctl test to check the permission bitmap whether the
> requested feature is added as expected or not.
>
> Every non-dynamic feature that is enabled is permitted already for use.
> TILECFG is not dynamic feature. Ensure the bit is always on from
> ARCH_GET_XCOMP_PERM.

Running it on a machine which does not have AMX results in:

 amx_64: [FAIL]	xstate cpuid: invalid tile data size/offset: 0/0: Success

It's not a failure, really. Selftests are supposed to run on all
machines and the proper thing to do if a hardware feature is not
available is to SKIP the test and return 0.

Thanks,

        tglx

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: ping Re: [PATCH v4 0/2] x86: Fix ARCH_REQ_XCOMP_PERM and update the test
  2022-03-23 14:24       ` Paolo Bonzini
@ 2022-03-23 17:07         ` Thomas Gleixner
  2022-03-23 17:20           ` Thomas Gleixner
  0 siblings, 1 reply; 16+ messages in thread
From: Thomas Gleixner @ 2022-03-23 17:07 UTC (permalink / raw)
  To: Paolo Bonzini, dave.hansen
  Cc: yang.zhong, ravi.v.shankar, mingo, Chang S. Bae, bp, x86,
	linux-kernel, KVM list

On Wed, Mar 23 2022 at 15:24, Paolo Bonzini wrote:
> On 3/23/22 13:55, Thomas Gleixner wrote:
>> --- a/arch/x86/kernel/fpu/xstate.c
>> +++ b/arch/x86/kernel/fpu/xstate.c
>> @@ -1625,6 +1625,8 @@ static int __xstate_request_perm(u64 per
>>   
>>   	/* Calculate the resulting kernel state size */
>>   	mask = permitted | requested;
>> +	/* Take supervisor states into account */
>> +	mask |= xfeatures_mask_supervisor();
>>   	ksize = xstate_calculate_size(mask, compacted);
>>   
>
> This should be only added in for the !guest case.

Yes, I figured that out already :)

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: ping Re: [PATCH v4 0/2] x86: Fix ARCH_REQ_XCOMP_PERM and update the test
  2022-03-23 17:07         ` Thomas Gleixner
@ 2022-03-23 17:20           ` Thomas Gleixner
  0 siblings, 0 replies; 16+ messages in thread
From: Thomas Gleixner @ 2022-03-23 17:20 UTC (permalink / raw)
  To: Paolo Bonzini, dave.hansen
  Cc: yang.zhong, ravi.v.shankar, mingo, Chang S. Bae, bp, x86,
	linux-kernel, KVM list

On Wed, Mar 23 2022 at 18:07, Thomas Gleixner wrote:
> On Wed, Mar 23 2022 at 15:24, Paolo Bonzini wrote:
>> On 3/23/22 13:55, Thomas Gleixner wrote:
>>> --- a/arch/x86/kernel/fpu/xstate.c
>>> +++ b/arch/x86/kernel/fpu/xstate.c
>>> @@ -1625,6 +1625,8 @@ static int __xstate_request_perm(u64 per
>>>   
>>>   	/* Calculate the resulting kernel state size */
>>>   	mask = permitted | requested;
>>> +	/* Take supervisor states into account */
>>> +	mask |= xfeatures_mask_supervisor();
>>>   	ksize = xstate_calculate_size(mask, compacted);
>>>   
>>
>> This should be only added in for the !guest case.
>
> Yes, I figured that out already :)

Hrm, that has more consequences vs. the buffer conversion functions. Let
me stare some more.

Thanks,

        tglx

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH v4 2/2] selftests/x86/amx: Update the ARCH_REQ_XCOMP_PERM test
  2022-03-23 16:44   ` Thomas Gleixner
@ 2022-03-23 21:27     ` Chang S. Bae
  0 siblings, 0 replies; 16+ messages in thread
From: Chang S. Bae @ 2022-03-23 21:27 UTC (permalink / raw)
  To: Thomas Gleixner, linux-kernel, x86, bp, dave.hansen, mingo
  Cc: yang.zhong, ravi.v.shankar, linux-kselftest

On 3/23/2022 9:44 AM, Thomas Gleixner wrote:
> 
> Running it on a machine which does not have AMX results in:
> 
>   amx_64: [FAIL]	xstate cpuid: invalid tile data size/offset: 0/0: Success
> 
> It's not a failure, really. Selftests are supposed to run on all
> machines and the proper thing to do if a hardware feature is not
> available is to SKIP the test and return 0.

Ah, right. The test should be just *skipped* on non-AMX or even 
non-XSAVE systems.

Will follow up with a separate patch.

Thanks,
Chang

^ permalink raw reply	[flat|nested] 16+ messages in thread

* [tip: x86/urgent] selftests/x86/amx: Update the ARCH_REQ_XCOMP_PERM test
  2022-01-29 17:36 ` [PATCH v4 2/2] selftests/x86/amx: Update the ARCH_REQ_XCOMP_PERM test Chang S. Bae
  2022-03-23 16:44   ` Thomas Gleixner
@ 2022-03-23 23:31   ` tip-bot2 for Chang S. Bae
  1 sibling, 0 replies; 16+ messages in thread
From: tip-bot2 for Chang S. Bae @ 2022-03-23 23:31 UTC (permalink / raw)
  To: linux-tip-commits; +Cc: Chang S. Bae, Thomas Gleixner, x86, linux-kernel

The following commit has been merged into the x86/urgent branch of tip:

Commit-ID:     20df737561484cb2d42e537663c03a7311d2b3c1
Gitweb:        https://git.kernel.org/tip/20df737561484cb2d42e537663c03a7311d2b3c1
Author:        Chang S. Bae <chang.seok.bae@intel.com>
AuthorDate:    Sat, 29 Jan 2022 09:36:47 -08:00
Committer:     Thomas Gleixner <tglx@linutronix.de>
CommitterDate: Wed, 23 Mar 2022 21:28:34 +01:00

selftests/x86/amx: Update the ARCH_REQ_XCOMP_PERM test

Update the arch_prctl test to check the permission bitmap whether the
requested feature is added as expected or not.

Every non-dynamic feature that is enabled is permitted already for use.
TILECFG is not dynamic feature. Ensure the bit is always on from
ARCH_GET_XCOMP_PERM.

Signed-off-by: Chang S. Bae <chang.seok.bae@intel.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Link: https://lore.kernel.org/r/20220129173647.27981-3-chang.seok.bae@intel.com

---
 tools/testing/selftests/x86/amx.c | 16 ++++++++++++++--
 1 file changed, 14 insertions(+), 2 deletions(-)

diff --git a/tools/testing/selftests/x86/amx.c b/tools/testing/selftests/x86/amx.c
index 3615ef4..2189f03 100644
--- a/tools/testing/selftests/x86/amx.c
+++ b/tools/testing/selftests/x86/amx.c
@@ -368,9 +368,16 @@ static void req_xtiledata_perm(void)
 
 static void validate_req_xcomp_perm(enum expected_result exp)
 {
-	unsigned long bitmask;
+	unsigned long bitmask, expected_bitmask;
 	long rc;
 
+	rc = syscall(SYS_arch_prctl, ARCH_GET_XCOMP_PERM, &bitmask);
+	if (rc) {
+		fatal_error("prctl(ARCH_GET_XCOMP_PERM) error: %ld", rc);
+	} else if (!(bitmask & XFEATURE_MASK_XTILECFG)) {
+		fatal_error("ARCH_GET_XCOMP_PERM returns XFEATURE_XTILECFG off.");
+	}
+
 	rc = syscall(SYS_arch_prctl, ARCH_REQ_XCOMP_PERM, XFEATURE_XTILEDATA);
 	if (exp == FAIL_EXPECTED) {
 		if (rc) {
@@ -383,10 +390,15 @@ static void validate_req_xcomp_perm(enum expected_result exp)
 		fatal_error("ARCH_REQ_XCOMP_PERM saw unexpected failure.\n");
 	}
 
+	expected_bitmask = bitmask | XFEATURE_MASK_XTILEDATA;
+
 	rc = syscall(SYS_arch_prctl, ARCH_GET_XCOMP_PERM, &bitmask);
 	if (rc) {
 		fatal_error("prctl(ARCH_GET_XCOMP_PERM) error: %ld", rc);
-	} else if (bitmask & XFEATURE_MASK_XTILE) {
+	} else if (bitmask != expected_bitmask) {
+		fatal_error("ARCH_REQ_XCOMP_PERM set a wrong bitmask: %lx, expected: %lx.\n",
+			    bitmask, expected_bitmask);
+	} else {
 		printf("\tARCH_REQ_XCOMP_PERM is successful.\n");
 	}
 }

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [tip: x86/urgent] x86/fpu/xstate: Fix the ARCH_REQ_XCOMP_PERM implementation
  2022-01-29 17:36 ` [PATCH v4 1/2] x86/arch_prctl: Fix the ARCH_REQ_XCOMP_PERM implementation Chang S. Bae
  2022-03-07 12:20   ` Hao Xiang
@ 2022-03-23 23:31   ` tip-bot2 for Yang Zhong
  1 sibling, 0 replies; 16+ messages in thread
From: tip-bot2 for Yang Zhong @ 2022-03-23 23:31 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: Yang Zhong, Chang S. Bae, Thomas Gleixner, Paolo Bonzini, stable,
	x86, linux-kernel

The following commit has been merged into the x86/urgent branch of tip:

Commit-ID:     063452fd94d153d4eb38ad58f210f3d37a09cca4
Gitweb:        https://git.kernel.org/tip/063452fd94d153d4eb38ad58f210f3d37a09cca4
Author:        Yang Zhong <yang.zhong@intel.com>
AuthorDate:    Sat, 29 Jan 2022 09:36:46 -08:00
Committer:     Thomas Gleixner <tglx@linutronix.de>
CommitterDate: Wed, 23 Mar 2022 21:28:34 +01:00

x86/fpu/xstate: Fix the ARCH_REQ_XCOMP_PERM implementation

ARCH_REQ_XCOMP_PERM is supposed to add the requested feature to the
permission bitmap of thread_group_leader()->fpu. But the code overwrites
the bitmap with the requested feature bit only rather than adding it.

Fix the code to add the requested feature bit to the master bitmask.

Fixes: db8268df0983 ("x86/arch_prctl: Add controls for dynamic XSTATE components")
Signed-off-by: Yang Zhong <yang.zhong@intel.com>
Signed-off-by: Chang S. Bae <chang.seok.bae@intel.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Cc: Paolo Bonzini <bonzini@gnu.org>
Cc: stable@vger.kernel.org
Link: https://lore.kernel.org/r/20220129173647.27981-2-chang.seok.bae@intel.com

---
 arch/x86/kernel/fpu/xstate.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/arch/x86/kernel/fpu/xstate.c b/arch/x86/kernel/fpu/xstate.c
index 7c7824a..dc6d5e9 100644
--- a/arch/x86/kernel/fpu/xstate.c
+++ b/arch/x86/kernel/fpu/xstate.c
@@ -1639,7 +1639,7 @@ static int __xstate_request_perm(u64 permitted, u64 requested, bool guest)
 
 	perm = guest ? &fpu->guest_perm : &fpu->perm;
 	/* Pairs with the READ_ONCE() in xstate_get_group_perm() */
-	WRITE_ONCE(perm->__state_perm, requested);
+	WRITE_ONCE(perm->__state_perm, mask);
 	/* Protected by sighand lock */
 	perm->__state_size = ksize;
 	perm->__user_state_size = usize;

^ permalink raw reply related	[flat|nested] 16+ messages in thread

end of thread, other threads:[~2022-03-23 23:31 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-01-29 17:36 [PATCH v4 0/2] x86: Fix ARCH_REQ_XCOMP_PERM and update the test Chang S. Bae
2022-01-29 17:36 ` [PATCH v4 1/2] x86/arch_prctl: Fix the ARCH_REQ_XCOMP_PERM implementation Chang S. Bae
2022-03-07 12:20   ` Hao Xiang
2022-03-07 18:53     ` Chang S. Bae
2022-03-08  8:36       ` Hao Xiang
2022-03-23 23:31   ` [tip: x86/urgent] x86/fpu/xstate: " tip-bot2 for Yang Zhong
2022-01-29 17:36 ` [PATCH v4 2/2] selftests/x86/amx: Update the ARCH_REQ_XCOMP_PERM test Chang S. Bae
2022-03-23 16:44   ` Thomas Gleixner
2022-03-23 21:27     ` Chang S. Bae
2022-03-23 23:31   ` [tip: x86/urgent] " tip-bot2 for Chang S. Bae
2022-03-23 11:04 ` ping Re: [PATCH v4 0/2] x86: Fix ARCH_REQ_XCOMP_PERM and update the test Paolo Bonzini
2022-03-23 12:27   ` Thomas Gleixner
2022-03-23 12:55     ` Thomas Gleixner
2022-03-23 14:24       ` Paolo Bonzini
2022-03-23 17:07         ` Thomas Gleixner
2022-03-23 17:20           ` Thomas Gleixner

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.