diff mbox series

[v6,8/9] KVM: VMX: Open code VMX preemption timer rate mask in its accessor

Message ID 20240309012725.1409949-9-seanjc@google.com (mailing list archive)
State New, archived
Headers show
Series x86/cpu: KVM: Clean up PAT and VMX macros | expand

Commit Message

Sean Christopherson March 9, 2024, 1:27 a.m. UTC
From: Xin Li <xin3.li@intel.com>

Use vmx_misc_preemption_timer_rate() to get the rate in hardware_setup(),
and open code the rate's bitmask in vmx_misc_preemption_timer_rate() so
that the function looks like all the helpers that grab values from
VMX_BASIC and VMX_MISC MSR values.

No functional change intended.

Cc: Shan Kang <shan.kang@intel.com>
Cc: Kai Huang <kai.huang@intel.com>
Signed-off-by: Xin Li <xin3.li@intel.com>
[sean: split to separate patch, write changelog]
Signed-off-by: Sean Christopherson <seanjc@google.com>
---
 arch/x86/include/asm/vmx.h | 3 +--
 arch/x86/kvm/vmx/vmx.c     | 2 +-
 2 files changed, 2 insertions(+), 3 deletions(-)

Comments

Zhao Liu March 15, 2024, 3:46 p.m. UTC | #1
On Fri, Mar 08, 2024 at 05:27:24PM -0800, Sean Christopherson wrote:
> Date: Fri,  8 Mar 2024 17:27:24 -0800
> From: Sean Christopherson <seanjc@google.com>
> Subject: [PATCH v6 8/9] KVM: VMX: Open code VMX preemption timer rate mask
>  in its accessor
> X-Mailer: git-send-email 2.44.0.278.ge034bb2e1d-goog
> 
> From: Xin Li <xin3.li@intel.com>
> 
> Use vmx_misc_preemption_timer_rate() to get the rate in hardware_setup(),
> and open code the rate's bitmask in vmx_misc_preemption_timer_rate() so
> that the function looks like all the helpers that grab values from
> VMX_BASIC and VMX_MISC MSR values.
> 
> No functional change intended.
> 
> Cc: Shan Kang <shan.kang@intel.com>
> Cc: Kai Huang <kai.huang@intel.com>
> Signed-off-by: Xin Li <xin3.li@intel.com>
> [sean: split to separate patch, write changelog]
> Signed-off-by: Sean Christopherson <seanjc@google.com>
> ---
>  arch/x86/include/asm/vmx.h | 3 +--
>  arch/x86/kvm/vmx/vmx.c     | 2 +-
>  2 files changed, 2 insertions(+), 3 deletions(-)
> 
> diff --git a/arch/x86/include/asm/vmx.h b/arch/x86/include/asm/vmx.h
> index 6ff179b11235..90ed559076d7 100644
> --- a/arch/x86/include/asm/vmx.h
> +++ b/arch/x86/include/asm/vmx.h
> @@ -148,7 +148,6 @@ static inline u32 vmx_basic_vmcs_mem_type(u64 vmx_basic)
>  	return (vmx_basic & GENMASK_ULL(53, 50)) >> 50;
>  }
>  
> -#define VMX_MISC_PREEMPTION_TIMER_RATE_MASK	GENMASK_ULL(4, 0)
>  #define VMX_MISC_SAVE_EFER_LMA			BIT_ULL(5)
>  #define VMX_MISC_ACTIVITY_HLT			BIT_ULL(6)
>  #define VMX_MISC_ACTIVITY_SHUTDOWN		BIT_ULL(7)
> @@ -162,7 +161,7 @@ static inline u32 vmx_basic_vmcs_mem_type(u64 vmx_basic)
>  
>  static inline int vmx_misc_preemption_timer_rate(u64 vmx_misc)
>  {
> -	return vmx_misc & VMX_MISC_PREEMPTION_TIMER_RATE_MASK;
> +	return vmx_misc & GENMASK_ULL(4, 0);
>  }

I feel keeping VMX_MISC_PREEMPTION_TIMER_RATE_MASK is clearer than
GENMASK_ULL(4, 0), and the former improves code readability.

May not need to drop VMX_MISC_PREEMPTION_TIMER_RATE_MASK?

Thanks,
Zhao
Sean Christopherson March 15, 2024, 5:54 p.m. UTC | #2
On Fri, Mar 15, 2024, Zhao Liu wrote:
> On Fri, Mar 08, 2024 at 05:27:24PM -0800, Sean Christopherson wrote:
> > Use vmx_misc_preemption_timer_rate() to get the rate in hardware_setup(),
> > and open code the rate's bitmask in vmx_misc_preemption_timer_rate() so
> > that the function looks like all the helpers that grab values from
> > VMX_BASIC and VMX_MISC MSR values.

...

> > -#define VMX_MISC_PREEMPTION_TIMER_RATE_MASK	GENMASK_ULL(4, 0)
> >  #define VMX_MISC_SAVE_EFER_LMA			BIT_ULL(5)
> >  #define VMX_MISC_ACTIVITY_HLT			BIT_ULL(6)
> >  #define VMX_MISC_ACTIVITY_SHUTDOWN		BIT_ULL(7)
> > @@ -162,7 +161,7 @@ static inline u32 vmx_basic_vmcs_mem_type(u64 vmx_basic)
> >  
> >  static inline int vmx_misc_preemption_timer_rate(u64 vmx_misc)
> >  {
> > -	return vmx_misc & VMX_MISC_PREEMPTION_TIMER_RATE_MASK;
> > +	return vmx_misc & GENMASK_ULL(4, 0);
> >  }
> 
> I feel keeping VMX_MISC_PREEMPTION_TIMER_RATE_MASK is clearer than
> GENMASK_ULL(4, 0), and the former improves code readability.
> 
> May not need to drop VMX_MISC_PREEMPTION_TIMER_RATE_MASK?

I don't necessarily disagree, but in this case I value consistency over one
individual case.  As called out in the changelog, the motivation is to make
vmx_misc_preemption_timer_rate() look like all the surrounding helpers.

_If_ we want to preserve the mask, then we should add #defines for vmx_misc_cr3_count(),
vmx_misc_max_msr(), etc.

I don't have a super strong preference, though I think my vote would be to not
add the masks and go with this patch.  These helpers are intended to be the _only_
way to access the fields, i.e. they effectively _are_ the mask macros, just in
function form.
Huang, Kai March 27, 2024, 10:59 a.m. UTC | #3
On Fri, 2024-03-08 at 17:27 -0800, Sean Christopherson wrote:
> From: Xin Li <xin3.li@intel.com>
> 
> Use vmx_misc_preemption_timer_rate() to get the rate in hardware_setup(),
> and open code the rate's bitmask in vmx_misc_preemption_timer_rate() so
> that the function looks like all the helpers that grab values from

Is "all other helpers" better?

> VMX_BASIC and VMX_MISC MSR values.
> 
> No functional change intended.
> 
> Cc: Shan Kang <shan.kang@intel.com>
> Cc: Kai Huang <kai.huang@intel.com>
> Signed-off-by: Xin Li <xin3.li@intel.com>
> [sean: split to separate patch, write changelog]
> Signed-off-by: Sean Christopherson <seanjc@google.com>
> 

Reviewed-by: Kai Huang <kai.huang@intel.com>
Xiaoyao Li April 1, 2024, 7:07 a.m. UTC | #4
On 3/16/2024 1:54 AM, Sean Christopherson wrote:
> On Fri, Mar 15, 2024, Zhao Liu wrote:
>> On Fri, Mar 08, 2024 at 05:27:24PM -0800, Sean Christopherson wrote:
>>> Use vmx_misc_preemption_timer_rate() to get the rate in hardware_setup(),
>>> and open code the rate's bitmask in vmx_misc_preemption_timer_rate() so
>>> that the function looks like all the helpers that grab values from
>>> VMX_BASIC and VMX_MISC MSR values.
> 
> ...
> 
>>> -#define VMX_MISC_PREEMPTION_TIMER_RATE_MASK	GENMASK_ULL(4, 0)
>>>   #define VMX_MISC_SAVE_EFER_LMA			BIT_ULL(5)
>>>   #define VMX_MISC_ACTIVITY_HLT			BIT_ULL(6)
>>>   #define VMX_MISC_ACTIVITY_SHUTDOWN		BIT_ULL(7)
>>> @@ -162,7 +161,7 @@ static inline u32 vmx_basic_vmcs_mem_type(u64 vmx_basic)
>>>   
>>>   static inline int vmx_misc_preemption_timer_rate(u64 vmx_misc)
>>>   {
>>> -	return vmx_misc & VMX_MISC_PREEMPTION_TIMER_RATE_MASK;
>>> +	return vmx_misc & GENMASK_ULL(4, 0);
>>>   }
>>
>> I feel keeping VMX_MISC_PREEMPTION_TIMER_RATE_MASK is clearer than
>> GENMASK_ULL(4, 0), and the former improves code readability.
>>
>> May not need to drop VMX_MISC_PREEMPTION_TIMER_RATE_MASK?
> 
> I don't necessarily disagree, but in this case I value consistency over one
> individual case.  As called out in the changelog, the motivation is to make
> vmx_misc_preemption_timer_rate() look like all the surrounding helpers.
> 
> _If_ we want to preserve the mask, then we should add #defines for vmx_misc_cr3_count(),
> vmx_misc_max_msr(), etc.
> 
> I don't have a super strong preference, though I think my vote would be to not
> add the masks and go with this patch.  These helpers are intended to be the _only_
> way to access the fields, i.e. they effectively _are_ the mask macros, just in
> function form.
> 

+1.

However, it seems different for vmx_basic_vmcs_mem_type() in patch 5, 
that I just recommended to define the MASK.

Because we already have

	#define VMX_BASIC_MEM_TYPE_SHIFT	50

and it has been used in vmx/nested.c,

static inline u32 vmx_basic_vmcs_mem_type(u64 vmx_basic)
{
	return (vmx_basic & GENMASK_ULL(53, 50)) >>
		VMX_BASIC_MEM_TYPE_SHIFT;
}

looks not intuitive than original patch.
Sean Christopherson April 2, 2024, 10:06 p.m. UTC | #5
On Mon, Apr 01, 2024, Xiaoyao Li wrote:
> On 3/16/2024 1:54 AM, Sean Christopherson wrote:
> > On Fri, Mar 15, 2024, Zhao Liu wrote:
> > > On Fri, Mar 08, 2024 at 05:27:24PM -0800, Sean Christopherson wrote:
> > > > Use vmx_misc_preemption_timer_rate() to get the rate in hardware_setup(),
> > > > and open code the rate's bitmask in vmx_misc_preemption_timer_rate() so
> > > > that the function looks like all the helpers that grab values from
> > > > VMX_BASIC and VMX_MISC MSR values.
> > 
> > ...
> > 
> > > > -#define VMX_MISC_PREEMPTION_TIMER_RATE_MASK	GENMASK_ULL(4, 0)
> > > >   #define VMX_MISC_SAVE_EFER_LMA			BIT_ULL(5)
> > > >   #define VMX_MISC_ACTIVITY_HLT			BIT_ULL(6)
> > > >   #define VMX_MISC_ACTIVITY_SHUTDOWN		BIT_ULL(7)
> > > > @@ -162,7 +161,7 @@ static inline u32 vmx_basic_vmcs_mem_type(u64 vmx_basic)
> > > >   static inline int vmx_misc_preemption_timer_rate(u64 vmx_misc)
> > > >   {
> > > > -	return vmx_misc & VMX_MISC_PREEMPTION_TIMER_RATE_MASK;
> > > > +	return vmx_misc & GENMASK_ULL(4, 0);
> > > >   }
> > > 
> > > I feel keeping VMX_MISC_PREEMPTION_TIMER_RATE_MASK is clearer than
> > > GENMASK_ULL(4, 0), and the former improves code readability.
> > > 
> > > May not need to drop VMX_MISC_PREEMPTION_TIMER_RATE_MASK?
> > 
> > I don't necessarily disagree, but in this case I value consistency over one
> > individual case.  As called out in the changelog, the motivation is to make
> > vmx_misc_preemption_timer_rate() look like all the surrounding helpers.
> > 
> > _If_ we want to preserve the mask, then we should add #defines for vmx_misc_cr3_count(),
> > vmx_misc_max_msr(), etc.
> > 
> > I don't have a super strong preference, though I think my vote would be to not
> > add the masks and go with this patch.  These helpers are intended to be the _only_
> > way to access the fields, i.e. they effectively _are_ the mask macros, just in
> > function form.
> > 
> 
> +1.
> 
> However, it seems different for vmx_basic_vmcs_mem_type() in patch 5, that I
> just recommended to define the MASK.
> 
> Because we already have
> 
> 	#define VMX_BASIC_MEM_TYPE_SHIFT	50
> 
> and it has been used in vmx/nested.c,
> 
> static inline u32 vmx_basic_vmcs_mem_type(u64 vmx_basic)
> {
> 	return (vmx_basic & GENMASK_ULL(53, 50)) >>
> 		VMX_BASIC_MEM_TYPE_SHIFT;
> }
> 
> looks not intuitive than original patch.

Yeah, agreed, that's taking the worst of both worlds.  I'll update patch 5 to drop
VMX_BASIC_MEM_TYPE_SHIFT when effectively "moving" it into vmx_basic_vmcs_mem_type().

Thanks!
Sean Christopherson April 24, 2024, 8:06 p.m. UTC | #6
On Tue, Apr 02, 2024, Sean Christopherson wrote:
> On Mon, Apr 01, 2024, Xiaoyao Li wrote:
> > On 3/16/2024 1:54 AM, Sean Christopherson wrote:
> > > On Fri, Mar 15, 2024, Zhao Liu wrote:
> > > > On Fri, Mar 08, 2024 at 05:27:24PM -0800, Sean Christopherson wrote:
> > > > > Use vmx_misc_preemption_timer_rate() to get the rate in hardware_setup(),
> > > > > and open code the rate's bitmask in vmx_misc_preemption_timer_rate() so
> > > > > that the function looks like all the helpers that grab values from
> > > > > VMX_BASIC and VMX_MISC MSR values.
> > > 
> > > ...
> > > 
> > > > > -#define VMX_MISC_PREEMPTION_TIMER_RATE_MASK	GENMASK_ULL(4, 0)
> > > > >   #define VMX_MISC_SAVE_EFER_LMA			BIT_ULL(5)
> > > > >   #define VMX_MISC_ACTIVITY_HLT			BIT_ULL(6)
> > > > >   #define VMX_MISC_ACTIVITY_SHUTDOWN		BIT_ULL(7)
> > > > > @@ -162,7 +161,7 @@ static inline u32 vmx_basic_vmcs_mem_type(u64 vmx_basic)
> > > > >   static inline int vmx_misc_preemption_timer_rate(u64 vmx_misc)
> > > > >   {
> > > > > -	return vmx_misc & VMX_MISC_PREEMPTION_TIMER_RATE_MASK;
> > > > > +	return vmx_misc & GENMASK_ULL(4, 0);
> > > > >   }
> > > > 
> > > > I feel keeping VMX_MISC_PREEMPTION_TIMER_RATE_MASK is clearer than
> > > > GENMASK_ULL(4, 0), and the former improves code readability.
> > > > 
> > > > May not need to drop VMX_MISC_PREEMPTION_TIMER_RATE_MASK?
> > > 
> > > I don't necessarily disagree, but in this case I value consistency over one
> > > individual case.  As called out in the changelog, the motivation is to make
> > > vmx_misc_preemption_timer_rate() look like all the surrounding helpers.
> > > 
> > > _If_ we want to preserve the mask, then we should add #defines for vmx_misc_cr3_count(),
> > > vmx_misc_max_msr(), etc.
> > > 
> > > I don't have a super strong preference, though I think my vote would be to not
> > > add the masks and go with this patch.  These helpers are intended to be the _only_
> > > way to access the fields, i.e. they effectively _are_ the mask macros, just in
> > > function form.
> > > 
> > 
> > +1.
> > 
> > However, it seems different for vmx_basic_vmcs_mem_type() in patch 5, that I
> > just recommended to define the MASK.
> > 
> > Because we already have
> > 
> > 	#define VMX_BASIC_MEM_TYPE_SHIFT	50
> > 
> > and it has been used in vmx/nested.c,
> > 
> > static inline u32 vmx_basic_vmcs_mem_type(u64 vmx_basic)
> > {
> > 	return (vmx_basic & GENMASK_ULL(53, 50)) >>
> > 		VMX_BASIC_MEM_TYPE_SHIFT;
> > }
> > 
> > looks not intuitive than original patch.
> 
> Yeah, agreed, that's taking the worst of both worlds.  I'll update patch 5 to drop
> VMX_BASIC_MEM_TYPE_SHIFT when effectively "moving" it into vmx_basic_vmcs_mem_type().

Drat.  Finally getting back to this, dropping VMX_BASIC_MEM_TYPE_SHIFT doesn't
work because it's used by nested_vmx_setup_basic(), as is VMX_BASIC_VMCS_SIZE_SHIFT,
which is presumably why past me kept them around.

I'm leaning towards keeping things as proposed in this series.  I don't see us
gaining a third copy, or even a third user, i.e. I don't think we are creating a
future problem by open coding the shift in vmx_basic_vmcs_mem_type().  And IMO
code like this

	return (vmx_basic & VMX_BASIC_MEM_TYPE_MASK) >>
	       VMX_BASIC_MEM_TYPE_SHIFT;

is an unnecessary obfuscation when there is literally one user (the accessor).

Another idea would be to delete VMX_BASIC_MEM_TYPE_SHIFT and VMX_BASIC_VMCS_SIZE_SHIFT,
and either open code the values or use local const variables, but that also seems
like a net negative, e.g. splits the effective definitions over too many locations.
Huang, Kai April 25, 2024, 10:05 a.m. UTC | #7
On Wed, 2024-04-24 at 13:06 -0700, Sean Christopherson wrote:
> On Tue, Apr 02, 2024, Sean Christopherson wrote:
> > On Mon, Apr 01, 2024, Xiaoyao Li wrote:
> > > On 3/16/2024 1:54 AM, Sean Christopherson wrote:
> > > > On Fri, Mar 15, 2024, Zhao Liu wrote:
> > > > > On Fri, Mar 08, 2024 at 05:27:24PM -0800, Sean Christopherson wrote:
> > > > > > Use vmx_misc_preemption_timer_rate() to get the rate in hardware_setup(),
> > > > > > and open code the rate's bitmask in vmx_misc_preemption_timer_rate() so
> > > > > > that the function looks like all the helpers that grab values from
> > > > > > VMX_BASIC and VMX_MISC MSR values.
> > > > 
> > > > ...
> > > > 
> > > > > > -#define VMX_MISC_PREEMPTION_TIMER_RATE_MASK	GENMASK_ULL(4, 0)
> > > > > >   #define VMX_MISC_SAVE_EFER_LMA			BIT_ULL(5)
> > > > > >   #define VMX_MISC_ACTIVITY_HLT			BIT_ULL(6)
> > > > > >   #define VMX_MISC_ACTIVITY_SHUTDOWN		BIT_ULL(7)
> > > > > > @@ -162,7 +161,7 @@ static inline u32 vmx_basic_vmcs_mem_type(u64 vmx_basic)
> > > > > >   static inline int vmx_misc_preemption_timer_rate(u64 vmx_misc)
> > > > > >   {
> > > > > > -	return vmx_misc & VMX_MISC_PREEMPTION_TIMER_RATE_MASK;
> > > > > > +	return vmx_misc & GENMASK_ULL(4, 0);
> > > > > >   }
> > > > > 
> > > > > I feel keeping VMX_MISC_PREEMPTION_TIMER_RATE_MASK is clearer than
> > > > > GENMASK_ULL(4, 0), and the former improves code readability.
> > > > > 
> > > > > May not need to drop VMX_MISC_PREEMPTION_TIMER_RATE_MASK?
> > > > 
> > > > I don't necessarily disagree, but in this case I value consistency over one
> > > > individual case.  As called out in the changelog, the motivation is to make
> > > > vmx_misc_preemption_timer_rate() look like all the surrounding helpers.
> > > > 
> > > > _If_ we want to preserve the mask, then we should add #defines for vmx_misc_cr3_count(),
> > > > vmx_misc_max_msr(), etc.
> > > > 
> > > > I don't have a super strong preference, though I think my vote would be to not
> > > > add the masks and go with this patch.  These helpers are intended to be the _only_
> > > > way to access the fields, i.e. they effectively _are_ the mask macros, just in
> > > > function form.
> > > > 
> > > 
> > > +1.
> > > 
> > > However, it seems different for vmx_basic_vmcs_mem_type() in patch 5, that I
> > > just recommended to define the MASK.
> > > 
> > > Because we already have
> > > 
> > > 	#define VMX_BASIC_MEM_TYPE_SHIFT	50
> > > 
> > > and it has been used in vmx/nested.c,
> > > 
> > > static inline u32 vmx_basic_vmcs_mem_type(u64 vmx_basic)
> > > {
> > > 	return (vmx_basic & GENMASK_ULL(53, 50)) >>
> > > 		VMX_BASIC_MEM_TYPE_SHIFT;
> > > }
> > > 
> > > looks not intuitive than original patch.
> > 
> > Yeah, agreed, that's taking the worst of both worlds.  I'll update patch 5 to drop
> > VMX_BASIC_MEM_TYPE_SHIFT when effectively "moving" it into vmx_basic_vmcs_mem_type().
> 
> Drat.  Finally getting back to this, dropping VMX_BASIC_MEM_TYPE_SHIFT doesn't
> work because it's used by nested_vmx_setup_basic(), as is VMX_BASIC_VMCS_SIZE_SHIFT,
> which is presumably why past me kept them around.
> 
> I'm leaning towards keeping things as proposed in this series.  I don't see us
> gaining a third copy, or even a third user, i.e. I don't think we are creating a
> future problem by open coding the shift in vmx_basic_vmcs_mem_type().  And IMO
> code like this
> 
> 	return (vmx_basic & VMX_BASIC_MEM_TYPE_MASK) >>
> 	       VMX_BASIC_MEM_TYPE_SHIFT;
> 
> is an unnecessary obfuscation when there is literally one user (the accessor).
> 
> Another idea would be to delete VMX_BASIC_MEM_TYPE_SHIFT and VMX_BASIC_VMCS_SIZE_SHIFT,
> and either open code the values or use local const variables, but that also seems
> like a net negative, e.g. splits the effective definitions over too many locations.

Alternatively, we can add macros like below to <asm/vmx.h> close to
vmx_basic_vmcs_size() etc, so it's straightforward to see.

+#define VMX_BSAIC_VMCS12_SIZE	((u64)VMCS12_SIZE << 32)
+#define VMX_BASIC_MEM_TYPE_WB	(MEM_TYPE_WB << 50)
Xiaoyao Li April 25, 2024, 2:18 p.m. UTC | #8
On 4/25/2024 4:06 AM, Sean Christopherson wrote:
> On Tue, Apr 02, 2024, Sean Christopherson wrote:
>> On Mon, Apr 01, 2024, Xiaoyao Li wrote:
>>> On 3/16/2024 1:54 AM, Sean Christopherson wrote:
>>>> On Fri, Mar 15, 2024, Zhao Liu wrote:
>>>>> On Fri, Mar 08, 2024 at 05:27:24PM -0800, Sean Christopherson wrote:
>>>>>> Use vmx_misc_preemption_timer_rate() to get the rate in hardware_setup(),
>>>>>> and open code the rate's bitmask in vmx_misc_preemption_timer_rate() so
>>>>>> that the function looks like all the helpers that grab values from
>>>>>> VMX_BASIC and VMX_MISC MSR values.
>>>>
>>>> ...
>>>>
>>>>>> -#define VMX_MISC_PREEMPTION_TIMER_RATE_MASK	GENMASK_ULL(4, 0)
>>>>>>    #define VMX_MISC_SAVE_EFER_LMA			BIT_ULL(5)
>>>>>>    #define VMX_MISC_ACTIVITY_HLT			BIT_ULL(6)
>>>>>>    #define VMX_MISC_ACTIVITY_SHUTDOWN		BIT_ULL(7)
>>>>>> @@ -162,7 +161,7 @@ static inline u32 vmx_basic_vmcs_mem_type(u64 vmx_basic)
>>>>>>    static inline int vmx_misc_preemption_timer_rate(u64 vmx_misc)
>>>>>>    {
>>>>>> -	return vmx_misc & VMX_MISC_PREEMPTION_TIMER_RATE_MASK;
>>>>>> +	return vmx_misc & GENMASK_ULL(4, 0);
>>>>>>    }
>>>>>
>>>>> I feel keeping VMX_MISC_PREEMPTION_TIMER_RATE_MASK is clearer than
>>>>> GENMASK_ULL(4, 0), and the former improves code readability.
>>>>>
>>>>> May not need to drop VMX_MISC_PREEMPTION_TIMER_RATE_MASK?
>>>>
>>>> I don't necessarily disagree, but in this case I value consistency over one
>>>> individual case.  As called out in the changelog, the motivation is to make
>>>> vmx_misc_preemption_timer_rate() look like all the surrounding helpers.
>>>>
>>>> _If_ we want to preserve the mask, then we should add #defines for vmx_misc_cr3_count(),
>>>> vmx_misc_max_msr(), etc.
>>>>
>>>> I don't have a super strong preference, though I think my vote would be to not
>>>> add the masks and go with this patch.  These helpers are intended to be the _only_
>>>> way to access the fields, i.e. they effectively _are_ the mask macros, just in
>>>> function form.
>>>>
>>>
>>> +1.
>>>
>>> However, it seems different for vmx_basic_vmcs_mem_type() in patch 5, that I
>>> just recommended to define the MASK.
>>>
>>> Because we already have
>>>
>>> 	#define VMX_BASIC_MEM_TYPE_SHIFT	50
>>>
>>> and it has been used in vmx/nested.c,
>>>
>>> static inline u32 vmx_basic_vmcs_mem_type(u64 vmx_basic)
>>> {
>>> 	return (vmx_basic & GENMASK_ULL(53, 50)) >>
>>> 		VMX_BASIC_MEM_TYPE_SHIFT;
>>> }
>>>
>>> looks not intuitive than original patch.
>>
>> Yeah, agreed, that's taking the worst of both worlds.  I'll update patch 5 to drop
>> VMX_BASIC_MEM_TYPE_SHIFT when effectively "moving" it into vmx_basic_vmcs_mem_type().
> 
> Drat.  Finally getting back to this, dropping VMX_BASIC_MEM_TYPE_SHIFT doesn't
> work because it's used by nested_vmx_setup_basic(), as is VMX_BASIC_VMCS_SIZE_SHIFT,
> which is presumably why past me kept them around.
> 
> I'm leaning towards keeping things as proposed in this series.  

If it goes this way, I beg for a comment above the code to explain. 
Otherwise, people might send patch to use defined MARCO in the future.

> I don't see us
> gaining a third copy, or even a third user, i.e. I don't think we are creating a
> future problem by open coding the shift in vmx_basic_vmcs_mem_type().  And IMO
> code like this
> 
> 	return (vmx_basic & VMX_BASIC_MEM_TYPE_MASK) >>
> 	       VMX_BASIC_MEM_TYPE_SHIFT;
> 
> is an unnecessary obfuscation when there is literally one user (the accessor).
> 
> Another idea would be to delete VMX_BASIC_MEM_TYPE_SHIFT and VMX_BASIC_VMCS_SIZE_SHIFT,
> and either open code the values or use local const variables, but that also seems
> like a net negative, e.g. splits the effective definitions over too many locations.
Sean Christopherson April 25, 2024, 2:42 p.m. UTC | #9
On Thu, Apr 25, 2024, Kai Huang wrote:
> On Wed, 2024-04-24 at 13:06 -0700, Sean Christopherson wrote:
> > > > static inline u32 vmx_basic_vmcs_mem_type(u64 vmx_basic)
> > > > {
> > > > 	return (vmx_basic & GENMASK_ULL(53, 50)) >>
> > > > 		VMX_BASIC_MEM_TYPE_SHIFT;
> > > > }
> > > > 
> > > > looks not intuitive than original patch.
> > > 
> > > Yeah, agreed, that's taking the worst of both worlds.  I'll update patch 5 to drop
> > > VMX_BASIC_MEM_TYPE_SHIFT when effectively "moving" it into vmx_basic_vmcs_mem_type().
> > 
> > Drat.  Finally getting back to this, dropping VMX_BASIC_MEM_TYPE_SHIFT doesn't
> > work because it's used by nested_vmx_setup_basic(), as is VMX_BASIC_VMCS_SIZE_SHIFT,
> > which is presumably why past me kept them around.
> > 
> > I'm leaning towards keeping things as proposed in this series.  I don't see us
> > gaining a third copy, or even a third user, i.e. I don't think we are creating a
> > future problem by open coding the shift in vmx_basic_vmcs_mem_type().  And IMO
> > code like this
> > 
> > 	return (vmx_basic & VMX_BASIC_MEM_TYPE_MASK) >>
> > 	       VMX_BASIC_MEM_TYPE_SHIFT;
> > 
> > is an unnecessary obfuscation when there is literally one user (the accessor).
> > 
> > Another idea would be to delete VMX_BASIC_MEM_TYPE_SHIFT and VMX_BASIC_VMCS_SIZE_SHIFT,
> > and either open code the values or use local const variables, but that also seems
> > like a net negative, e.g. splits the effective definitions over too many locations.
> 
> Alternatively, we can add macros like below to <asm/vmx.h> close to
> vmx_basic_vmcs_size() etc, so it's straightforward to see.
> 
> +#define VMX_BSAIC_VMCS12_SIZE	((u64)VMCS12_SIZE << 32)
> +#define VMX_BASIC_MEM_TYPE_WB	(MEM_TYPE_WB << 50)

Hmm, it's a bit hard to see it's specifically VMCS12 size, and given that prior
to this series, VMX_BASIC_MEM_TYPE_WB = 6, I'm hesitant to re-introduce/redefine
that macro with a different value.

What if we add a helper in vmx.h to encode the VMCS info?  Then the #defines for
the shifts can go away because the open coded shifts are colocated and more
obviously related.  E.g.

  static inline u64 vmx_basic_encode_vmcs_info(u32 revision, u16 size, u8 memtype)
  {
	return revision | ((u64)size << 32) | ((u64)memtype << 50);
  }


and

  static void nested_vmx_setup_basic(struct nested_vmx_msrs *msrs)
  {
	/*
	 * This MSR reports some information about VMX support. We
	 * should return information about the VMX we emulate for the
	 * guest, and the VMCS structure we give it - not about the
	 * VMX support of the underlying hardware.
	 */
	msrs->basic = vmx_basic_encode_vmcs_info(VMCS12_REVISION, VMCS12_SIZE,
						 X86_MEMTYPE_WB);

	msrs->basic |= VMX_BASIC_TRUE_CTLS
	if (cpu_has_vmx_basic_inout())
		msrs->basic |= VMX_BASIC_INOUT;
  }
Huang, Kai April 25, 2024, 9:44 p.m. UTC | #10
On Thu, 2024-04-25 at 07:42 -0700, Sean Christopherson wrote:
> On Thu, Apr 25, 2024, Kai Huang wrote:
> > On Wed, 2024-04-24 at 13:06 -0700, Sean Christopherson wrote:
> > > > > static inline u32 vmx_basic_vmcs_mem_type(u64 vmx_basic)
> > > > > {
> > > > > 	return (vmx_basic & GENMASK_ULL(53, 50)) >>
> > > > > 		VMX_BASIC_MEM_TYPE_SHIFT;
> > > > > }
> > > > > 
> > > > > looks not intuitive than original patch.
> > > > 
> > > > Yeah, agreed, that's taking the worst of both worlds.  I'll update patch 5 to drop
> > > > VMX_BASIC_MEM_TYPE_SHIFT when effectively "moving" it into vmx_basic_vmcs_mem_type().
> > > 
> > > Drat.  Finally getting back to this, dropping VMX_BASIC_MEM_TYPE_SHIFT doesn't
> > > work because it's used by nested_vmx_setup_basic(), as is VMX_BASIC_VMCS_SIZE_SHIFT,
> > > which is presumably why past me kept them around.
> > > 
> > > I'm leaning towards keeping things as proposed in this series.  I don't see us
> > > gaining a third copy, or even a third user, i.e. I don't think we are creating a
> > > future problem by open coding the shift in vmx_basic_vmcs_mem_type().  And IMO
> > > code like this
> > > 
> > > 	return (vmx_basic & VMX_BASIC_MEM_TYPE_MASK) >>
> > > 	       VMX_BASIC_MEM_TYPE_SHIFT;
> > > 
> > > is an unnecessary obfuscation when there is literally one user (the accessor).
> > > 
> > > Another idea would be to delete VMX_BASIC_MEM_TYPE_SHIFT and VMX_BASIC_VMCS_SIZE_SHIFT,
> > > and either open code the values or use local const variables, but that also seems
> > > like a net negative, e.g. splits the effective definitions over too many locations.
> > 
> > Alternatively, we can add macros like below to <asm/vmx.h> close to
> > vmx_basic_vmcs_size() etc, so it's straightforward to see.
> > 
> > +#define VMX_BSAIC_VMCS12_SIZE	((u64)VMCS12_SIZE << 32)
> > +#define VMX_BASIC_MEM_TYPE_WB	(MEM_TYPE_WB << 50)
> 
> Hmm, it's a bit hard to see it's specifically VMCS12 size, and given that prior
> to this series, VMX_BASIC_MEM_TYPE_WB = 6, I'm hesitant to re-introduce/redefine
> that macro with a different value.
> 
> What if we add a helper in vmx.h to encode the VMCS info?  Then the #defines for
> the shifts can go away because the open coded shifts are colocated and more
> obviously related.  E.g.
> 
>   static inline u64 vmx_basic_encode_vmcs_info(u32 revision, u16 size, u8 memtype)
>   {
> 	return revision | ((u64)size << 32) | ((u64)memtype << 50);
>   }
> 
> 
> and
> 
>   static void nested_vmx_setup_basic(struct nested_vmx_msrs *msrs)
>   {
> 	/*
> 	 * This MSR reports some information about VMX support. We
> 	 * should return information about the VMX we emulate for the
> 	 * guest, and the VMCS structure we give it - not about the
> 	 * VMX support of the underlying hardware.
> 	 */
> 	msrs->basic = vmx_basic_encode_vmcs_info(VMCS12_REVISION, VMCS12_SIZE,
> 						 X86_MEMTYPE_WB);
> 
> 	msrs->basic |= VMX_BASIC_TRUE_CTLS
> 	if (cpu_has_vmx_basic_inout())
> 		msrs->basic |= VMX_BASIC_INOUT;
>   }

Yeah this is better.  Thanks.
diff mbox series

Patch

diff --git a/arch/x86/include/asm/vmx.h b/arch/x86/include/asm/vmx.h
index 6ff179b11235..90ed559076d7 100644
--- a/arch/x86/include/asm/vmx.h
+++ b/arch/x86/include/asm/vmx.h
@@ -148,7 +148,6 @@  static inline u32 vmx_basic_vmcs_mem_type(u64 vmx_basic)
 	return (vmx_basic & GENMASK_ULL(53, 50)) >> 50;
 }
 
-#define VMX_MISC_PREEMPTION_TIMER_RATE_MASK	GENMASK_ULL(4, 0)
 #define VMX_MISC_SAVE_EFER_LMA			BIT_ULL(5)
 #define VMX_MISC_ACTIVITY_HLT			BIT_ULL(6)
 #define VMX_MISC_ACTIVITY_SHUTDOWN		BIT_ULL(7)
@@ -162,7 +161,7 @@  static inline u32 vmx_basic_vmcs_mem_type(u64 vmx_basic)
 
 static inline int vmx_misc_preemption_timer_rate(u64 vmx_misc)
 {
-	return vmx_misc & VMX_MISC_PREEMPTION_TIMER_RATE_MASK;
+	return vmx_misc & GENMASK_ULL(4, 0);
 }
 
 static inline int vmx_misc_cr3_count(u64 vmx_misc)
diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c
index e312c48f542f..4fcfa1a213fa 100644
--- a/arch/x86/kvm/vmx/vmx.c
+++ b/arch/x86/kvm/vmx/vmx.c
@@ -8613,7 +8613,7 @@  static __init int hardware_setup(void)
 		u64 use_timer_freq = 5000ULL * 1000 * 1000;
 
 		cpu_preemption_timer_multi =
-			vmcs_config.misc & VMX_MISC_PREEMPTION_TIMER_RATE_MASK;
+			vmx_misc_preemption_timer_rate(vmcs_config.misc);
 
 		if (tsc_khz)
 			use_timer_freq = (u64)tsc_khz * 1000;