Re: [PATCH 05/15] KVM: MTRR: clean up mtrr default type

2015-06-08 Thread David Matlack
On Sat, May 30, 2015 at 3:59 AM, Xiao Guangrong
guangrong.x...@linux.intel.com wrote:
 Use union definition to avoid the decode/code workload and drop all the
 hard code

Thank you for doing this cleanup. The new code is much clearer!


 Signed-off-by: Xiao Guangrong guangrong.x...@linux.intel.com
 ---
  arch/x86/include/asm/kvm_host.h | 12 ++--
  arch/x86/kvm/mtrr.c | 19 ---
  2 files changed, 18 insertions(+), 13 deletions(-)

 diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h
 index 2c3c52d..95ce2ff 100644
 --- a/arch/x86/include/asm/kvm_host.h
 +++ b/arch/x86/include/asm/kvm_host.h
 @@ -347,8 +347,16 @@ enum {
  struct kvm_mtrr {
 struct mtrr_var_range var_ranges[KVM_NR_VAR_MTRR];
 mtrr_type fixed_ranges[KVM_NR_FIXED_MTRR_REGION];
 -   unsigned char enabled;
 -   mtrr_type def_type;
 +
 +   union {
 +   u64 deftype;
 +   struct {
 +   unsigned def_type:8;
 +   unsigned reserved:2;
 +   unsigned fixed_mtrr_enabled:1;
 +   unsigned mtrr_enabled:1;
 +   };
 +   };
  };

  struct kvm_vcpu_arch {
 diff --git a/arch/x86/kvm/mtrr.c b/arch/x86/kvm/mtrr.c
 index 562341b..6de49dd 100644
 --- a/arch/x86/kvm/mtrr.c
 +++ b/arch/x86/kvm/mtrr.c
 @@ -105,7 +105,6 @@ EXPORT_SYMBOL_GPL(kvm_mtrr_valid);
  static void update_mtrr(struct kvm_vcpu *vcpu, u32 msr)
  {
 struct kvm_mtrr *mtrr_state = vcpu-arch.mtrr_state;
 -   unsigned char mtrr_enabled = mtrr_state-enabled;
 gfn_t start, end, mask;
 int index;
 bool is_fixed = true;
 @@ -114,7 +113,7 @@ static void update_mtrr(struct kvm_vcpu *vcpu, u32 msr)
   !kvm_arch_has_noncoherent_dma(vcpu-kvm))
 return;

 -   if (!(mtrr_enabled  0x2)  msr != MSR_MTRRdefType)
 +   if (!mtrr_state-mtrr_enabled  msr != MSR_MTRRdefType)
 return;

 switch (msr) {
 @@ -153,7 +152,7 @@ static void update_mtrr(struct kvm_vcpu *vcpu, u32 msr)
 end = ((start  mask) | ~mask) + 1;
 }

 -   if (is_fixed  !(mtrr_enabled  0x1))
 +   if (is_fixed  !mtrr_state-fixed_mtrr_enabled)
 return;

 kvm_zap_gfn_range(vcpu-kvm, gpa_to_gfn(start), gpa_to_gfn(end));
 @@ -166,10 +165,9 @@ int kvm_mtrr_set_msr(struct kvm_vcpu *vcpu, u32 msr, u64 
 data)
 if (!kvm_mtrr_valid(vcpu, msr, data))
 return 1;

 -   if (msr == MSR_MTRRdefType) {
 -   vcpu-arch.mtrr_state.def_type = data;
 -   vcpu-arch.mtrr_state.enabled = (data  0xc00)  10;
 -   } else if (msr == MSR_MTRRfix64K_0)
 +   if (msr == MSR_MTRRdefType)
 +   vcpu-arch.mtrr_state.deftype = data;
 +   else if (msr == MSR_MTRRfix64K_0)
 p[0] = data;
 else if (msr == MSR_MTRRfix16K_8 || msr == MSR_MTRRfix16K_A)
 p[1 + msr - MSR_MTRRfix16K_8] = data;
 @@ -216,8 +214,7 @@ int kvm_mtrr_get_msr(struct kvm_vcpu *vcpu, u32 msr, u64 
 *pdata)
 return 1;

 if (msr == MSR_MTRRdefType)
 -   *pdata = vcpu-arch.mtrr_state.def_type +
 -(vcpu-arch.mtrr_state.enabled  10);
 +   *pdata = vcpu-arch.mtrr_state.deftype;
 else if (msr == MSR_MTRRfix64K_0)
 *pdata = p[0];
 else if (msr == MSR_MTRRfix16K_8 || msr == MSR_MTRRfix16K_A)
 @@ -256,14 +253,14 @@ static int get_mtrr_type(struct kvm_mtrr *mtrr_state,
 int i, num_var_ranges = KVM_NR_VAR_MTRR;

 /* MTRR is completely disabled, use UC for all of physical memory. */
 -   if (!(mtrr_state-enabled  0x2))
 +   if (!mtrr_state-mtrr_enabled)
 return MTRR_TYPE_UNCACHABLE;

 /* Make end inclusive end, instead of exclusive */
 end--;

 /* Look in fixed ranges. Just return the type as per start */
 -   if ((mtrr_state-enabled  0x1)  (start  0x10)) {
 +   if (mtrr_state-fixed_mtrr_enabled  (start  0x10)) {
 int idx;

 if (start  0x8) {
 --
 2.1.0

 --
 To unsubscribe from this list: send the line unsubscribe kvm in
 the body of a message to majord...@vger.kernel.org
 More majordomo info at  http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line unsubscribe kvm in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 05/15] KVM: MTRR: clean up mtrr default type

2015-06-02 Thread Xiao Guangrong


Thanks for your review, Paolo!


On 06/01/2015 05:11 PM, Paolo Bonzini wrote:


  struct kvm_vcpu_arch {
diff --git a/arch/x86/kvm/mtrr.c b/arch/x86/kvm/mtrr.c
index 562341b..6de49dd 100644
--- a/arch/x86/kvm/mtrr.c
+++ b/arch/x86/kvm/mtrr.c
@@ -105,7 +105,6 @@ EXPORT_SYMBOL_GPL(kvm_mtrr_valid);
  static void update_mtrr(struct kvm_vcpu *vcpu, u32 msr)
  {
struct kvm_mtrr *mtrr_state = vcpu-arch.mtrr_state;
-   unsigned char mtrr_enabled = mtrr_state-enabled;
gfn_t start, end, mask;
int index;
bool is_fixed = true;
@@ -114,7 +113,7 @@ static void update_mtrr(struct kvm_vcpu *vcpu, u32 msr)
  !kvm_arch_has_noncoherent_dma(vcpu-kvm))
return;

-   if (!(mtrr_enabled  0x2)  msr != MSR_MTRRdefType)
+   if (!mtrr_state-mtrr_enabled  msr != MSR_MTRRdefType)


I know Linus doesn't like bitfields too much.  Can you change these to
inline functions, and only leave an u64 deftype in the struct?



Sure. I will introduce mtrr_is_enabled() and fixed_mtrr_is_enabled() instead
of these bitfields.

--
To unsubscribe from this list: send the line unsubscribe kvm in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 05/15] KVM: MTRR: clean up mtrr default type

2015-06-01 Thread Paolo Bonzini


On 30/05/2015 12:59, Xiao Guangrong wrote:
 Use union definition to avoid the decode/code workload and drop all the
 hard code
 
 Signed-off-by: Xiao Guangrong guangrong.x...@linux.intel.com
 ---
  arch/x86/include/asm/kvm_host.h | 12 ++--
  arch/x86/kvm/mtrr.c | 19 ---
  2 files changed, 18 insertions(+), 13 deletions(-)
 
 diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h
 index 2c3c52d..95ce2ff 100644
 --- a/arch/x86/include/asm/kvm_host.h
 +++ b/arch/x86/include/asm/kvm_host.h
 @@ -347,8 +347,16 @@ enum {
  struct kvm_mtrr {
   struct mtrr_var_range var_ranges[KVM_NR_VAR_MTRR];
   mtrr_type fixed_ranges[KVM_NR_FIXED_MTRR_REGION];
 - unsigned char enabled;
 - mtrr_type def_type;
 +
 + union {
 + u64 deftype;
 + struct {
 + unsigned def_type:8;
 + unsigned reserved:2;
 + unsigned fixed_mtrr_enabled:1;
 + unsigned mtrr_enabled:1;
 + };
 + };
  };
  
  struct kvm_vcpu_arch {
 diff --git a/arch/x86/kvm/mtrr.c b/arch/x86/kvm/mtrr.c
 index 562341b..6de49dd 100644
 --- a/arch/x86/kvm/mtrr.c
 +++ b/arch/x86/kvm/mtrr.c
 @@ -105,7 +105,6 @@ EXPORT_SYMBOL_GPL(kvm_mtrr_valid);
  static void update_mtrr(struct kvm_vcpu *vcpu, u32 msr)
  {
   struct kvm_mtrr *mtrr_state = vcpu-arch.mtrr_state;
 - unsigned char mtrr_enabled = mtrr_state-enabled;
   gfn_t start, end, mask;
   int index;
   bool is_fixed = true;
 @@ -114,7 +113,7 @@ static void update_mtrr(struct kvm_vcpu *vcpu, u32 msr)
 !kvm_arch_has_noncoherent_dma(vcpu-kvm))
   return;
  
 - if (!(mtrr_enabled  0x2)  msr != MSR_MTRRdefType)
 + if (!mtrr_state-mtrr_enabled  msr != MSR_MTRRdefType)

I know Linus doesn't like bitfields too much.  Can you change these to
inline functions, and only leave an u64 deftype in the struct?

Paolo

   return;
  
   switch (msr) {
 @@ -153,7 +152,7 @@ static void update_mtrr(struct kvm_vcpu *vcpu, u32 msr)
   end = ((start  mask) | ~mask) + 1;
   }
  
 - if (is_fixed  !(mtrr_enabled  0x1))
 + if (is_fixed  !mtrr_state-fixed_mtrr_enabled)
   return;
  
   kvm_zap_gfn_range(vcpu-kvm, gpa_to_gfn(start), gpa_to_gfn(end));
 @@ -166,10 +165,9 @@ int kvm_mtrr_set_msr(struct kvm_vcpu *vcpu, u32 msr, u64 
 data)
   if (!kvm_mtrr_valid(vcpu, msr, data))
   return 1;
  
 - if (msr == MSR_MTRRdefType) {
 - vcpu-arch.mtrr_state.def_type = data;
 - vcpu-arch.mtrr_state.enabled = (data  0xc00)  10;
 - } else if (msr == MSR_MTRRfix64K_0)
 + if (msr == MSR_MTRRdefType)
 + vcpu-arch.mtrr_state.deftype = data;
 + else if (msr == MSR_MTRRfix64K_0)
   p[0] = data;
   else if (msr == MSR_MTRRfix16K_8 || msr == MSR_MTRRfix16K_A)
   p[1 + msr - MSR_MTRRfix16K_8] = data;
 @@ -216,8 +214,7 @@ int kvm_mtrr_get_msr(struct kvm_vcpu *vcpu, u32 msr, u64 
 *pdata)
   return 1;
  
   if (msr == MSR_MTRRdefType)
 - *pdata = vcpu-arch.mtrr_state.def_type +
 -  (vcpu-arch.mtrr_state.enabled  10);
 + *pdata = vcpu-arch.mtrr_state.deftype;
   else if (msr == MSR_MTRRfix64K_0)
   *pdata = p[0];
   else if (msr == MSR_MTRRfix16K_8 || msr == MSR_MTRRfix16K_A)
 @@ -256,14 +253,14 @@ static int get_mtrr_type(struct kvm_mtrr *mtrr_state,
   int i, num_var_ranges = KVM_NR_VAR_MTRR;
  
   /* MTRR is completely disabled, use UC for all of physical memory. */
 - if (!(mtrr_state-enabled  0x2))
 + if (!mtrr_state-mtrr_enabled)
   return MTRR_TYPE_UNCACHABLE;
  
   /* Make end inclusive end, instead of exclusive */
   end--;
  
   /* Look in fixed ranges. Just return the type as per start */
 - if ((mtrr_state-enabled  0x1)  (start  0x10)) {
 + if (mtrr_state-fixed_mtrr_enabled  (start  0x10)) {
   int idx;
  
   if (start  0x8) {
 
--
To unsubscribe from this list: send the line unsubscribe kvm in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 05/15] KVM: MTRR: clean up mtrr default type

2015-05-30 Thread Xiao Guangrong
Use union definition to avoid the decode/code workload and drop all the
hard code

Signed-off-by: Xiao Guangrong guangrong.x...@linux.intel.com
---
 arch/x86/include/asm/kvm_host.h | 12 ++--
 arch/x86/kvm/mtrr.c | 19 ---
 2 files changed, 18 insertions(+), 13 deletions(-)

diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h
index 2c3c52d..95ce2ff 100644
--- a/arch/x86/include/asm/kvm_host.h
+++ b/arch/x86/include/asm/kvm_host.h
@@ -347,8 +347,16 @@ enum {
 struct kvm_mtrr {
struct mtrr_var_range var_ranges[KVM_NR_VAR_MTRR];
mtrr_type fixed_ranges[KVM_NR_FIXED_MTRR_REGION];
-   unsigned char enabled;
-   mtrr_type def_type;
+
+   union {
+   u64 deftype;
+   struct {
+   unsigned def_type:8;
+   unsigned reserved:2;
+   unsigned fixed_mtrr_enabled:1;
+   unsigned mtrr_enabled:1;
+   };
+   };
 };
 
 struct kvm_vcpu_arch {
diff --git a/arch/x86/kvm/mtrr.c b/arch/x86/kvm/mtrr.c
index 562341b..6de49dd 100644
--- a/arch/x86/kvm/mtrr.c
+++ b/arch/x86/kvm/mtrr.c
@@ -105,7 +105,6 @@ EXPORT_SYMBOL_GPL(kvm_mtrr_valid);
 static void update_mtrr(struct kvm_vcpu *vcpu, u32 msr)
 {
struct kvm_mtrr *mtrr_state = vcpu-arch.mtrr_state;
-   unsigned char mtrr_enabled = mtrr_state-enabled;
gfn_t start, end, mask;
int index;
bool is_fixed = true;
@@ -114,7 +113,7 @@ static void update_mtrr(struct kvm_vcpu *vcpu, u32 msr)
  !kvm_arch_has_noncoherent_dma(vcpu-kvm))
return;
 
-   if (!(mtrr_enabled  0x2)  msr != MSR_MTRRdefType)
+   if (!mtrr_state-mtrr_enabled  msr != MSR_MTRRdefType)
return;
 
switch (msr) {
@@ -153,7 +152,7 @@ static void update_mtrr(struct kvm_vcpu *vcpu, u32 msr)
end = ((start  mask) | ~mask) + 1;
}
 
-   if (is_fixed  !(mtrr_enabled  0x1))
+   if (is_fixed  !mtrr_state-fixed_mtrr_enabled)
return;
 
kvm_zap_gfn_range(vcpu-kvm, gpa_to_gfn(start), gpa_to_gfn(end));
@@ -166,10 +165,9 @@ int kvm_mtrr_set_msr(struct kvm_vcpu *vcpu, u32 msr, u64 
data)
if (!kvm_mtrr_valid(vcpu, msr, data))
return 1;
 
-   if (msr == MSR_MTRRdefType) {
-   vcpu-arch.mtrr_state.def_type = data;
-   vcpu-arch.mtrr_state.enabled = (data  0xc00)  10;
-   } else if (msr == MSR_MTRRfix64K_0)
+   if (msr == MSR_MTRRdefType)
+   vcpu-arch.mtrr_state.deftype = data;
+   else if (msr == MSR_MTRRfix64K_0)
p[0] = data;
else if (msr == MSR_MTRRfix16K_8 || msr == MSR_MTRRfix16K_A)
p[1 + msr - MSR_MTRRfix16K_8] = data;
@@ -216,8 +214,7 @@ int kvm_mtrr_get_msr(struct kvm_vcpu *vcpu, u32 msr, u64 
*pdata)
return 1;
 
if (msr == MSR_MTRRdefType)
-   *pdata = vcpu-arch.mtrr_state.def_type +
-(vcpu-arch.mtrr_state.enabled  10);
+   *pdata = vcpu-arch.mtrr_state.deftype;
else if (msr == MSR_MTRRfix64K_0)
*pdata = p[0];
else if (msr == MSR_MTRRfix16K_8 || msr == MSR_MTRRfix16K_A)
@@ -256,14 +253,14 @@ static int get_mtrr_type(struct kvm_mtrr *mtrr_state,
int i, num_var_ranges = KVM_NR_VAR_MTRR;
 
/* MTRR is completely disabled, use UC for all of physical memory. */
-   if (!(mtrr_state-enabled  0x2))
+   if (!mtrr_state-mtrr_enabled)
return MTRR_TYPE_UNCACHABLE;
 
/* Make end inclusive end, instead of exclusive */
end--;
 
/* Look in fixed ranges. Just return the type as per start */
-   if ((mtrr_state-enabled  0x1)  (start  0x10)) {
+   if (mtrr_state-fixed_mtrr_enabled  (start  0x10)) {
int idx;
 
if (start  0x8) {
-- 
2.1.0

--
To unsubscribe from this list: send the line unsubscribe kvm in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html