Re: [PATCH 1/3] x86/RAS: Simplify SMCA bank descriptor struct

2016-11-04 Thread Borislav Petkov
On Fri, Nov 04, 2016 at 10:44:47AM -0400, Yazen Ghannam wrote:
> Please add:
> Tested-by: Yazen Ghannam 
> 
> Ditto for the others.

Thanks, here's one more which I've been meaning to do:

---
From: Borislav Petkov 
Date: Thu, 3 Nov 2016 21:12:33 +0100
Subject: [PATCH] x86/RAS: Hide SMCA bank names

Add accessor functions and hide the smca_names array. Also, add a
sanity-check to bank HWID assignment in get_smca_bank_info().

Signed-off-by: Borislav Petkov 
---
 arch/x86/include/asm/mce.h   |  8 +---
 arch/x86/kernel/cpu/mcheck/mce_amd.c | 32 +---
 drivers/edac/mce_amd.c   |  2 +-
 3 files changed, 31 insertions(+), 11 deletions(-)

diff --git a/arch/x86/include/asm/mce.h b/arch/x86/include/asm/mce.h
index 8ffd21596dd7..748b8da8e627 100644
--- a/arch/x86/include/asm/mce.h
+++ b/arch/x86/include/asm/mce.h
@@ -356,13 +356,6 @@ enum smca_bank_types {
N_SMCA_BANK_TYPES
 };
 
-struct smca_bank_name {
-   const char *name;   /* Short name for sysfs */
-   const char *long_name;  /* Long name for pretty-printing */
-};
-
-extern struct smca_bank_name smca_names[N_SMCA_BANK_TYPES];
-
 #define HWID_MCATYPE(hwid, mcatype) ((hwid << 16) | mcatype)
 
 struct smca_hwid {
@@ -379,6 +372,7 @@ struct smca_bank {
 
 extern struct smca_bank smca_banks[MAX_NR_BANKS];
 
+extern const char *smca_get_long_name(enum smca_bank_types t);
 #endif
 
 #endif /* _ASM_X86_MCE_H */
diff --git a/arch/x86/kernel/cpu/mcheck/mce_amd.c 
b/arch/x86/kernel/cpu/mcheck/mce_amd.c
index afeb02b87127..e68a305ff666 100644
--- a/arch/x86/kernel/cpu/mcheck/mce_amd.c
+++ b/arch/x86/kernel/cpu/mcheck/mce_amd.c
@@ -69,7 +69,12 @@ static const char * const smca_umc_block_names[] = {
"misc_umc"
 };
 
-struct smca_bank_name smca_names[] = {
+struct smca_bank_name {
+   const char *name;   /* Short name for sysfs */
+   const char *long_name;  /* Long name for pretty-printing */
+};
+
+static struct smca_bank_name smca_names[] = {
[SMCA_LS]   = { "load_store",   "Load Store Unit" },
[SMCA_IF]   = { "insn_fetch",   "Instruction Fetch Unit" },
[SMCA_L2_CACHE] = { "l2_cache", "L2 Cache" },
@@ -84,7 +89,23 @@ struct smca_bank_name smca_names[] = {
[SMCA_PSP]  = { "psp",  "Platform Security Processor" },
[SMCA_SMU]  = { "smu",  "System Management Unit" },
 };
-EXPORT_SYMBOL_GPL(smca_names);
+
+const char *smca_get_name(enum smca_bank_types t)
+{
+   if (t >= N_SMCA_BANK_TYPES)
+   return NULL;
+
+   return smca_names[t].name;
+}
+
+const char *smca_get_long_name(enum smca_bank_types t)
+{
+   if (t >= N_SMCA_BANK_TYPES)
+   return NULL;
+
+   return smca_names[t].long_name;
+}
+EXPORT_SYMBOL_GPL(smca_get_long_name);
 
 static struct smca_hwid smca_hwid_mcatypes[] = {
/* { bank_type, hwid_mcatype, xec_bitmap } */
@@ -163,6 +184,11 @@ static void get_smca_bank_info(unsigned int bank)
for (i = 0; i < ARRAY_SIZE(smca_hwid_mcatypes); i++) {
s_hwid = _hwid_mcatypes[i];
if (hwid_mcatype == s_hwid->hwid_mcatype) {
+
+   WARN(smca_banks[bank].hwid,
+"Bank %s already initialized!\n",
+smca_get_name(s_hwid->bank_type));
+
smca_banks[bank].hwid = s_hwid;
smca_banks[bank].id = instance_id;
break;
@@ -832,7 +858,7 @@ static const char *get_name(unsigned int bank, struct 
threshold_block *b)
}
 
snprintf(buf_mcatype, MAX_MCATYPE_NAME_LEN,
-"%s_%x", smca_names[bank_type].name,
+"%s_%x", smca_get_name(bank_type),
  smca_banks[bank].id);
return buf_mcatype;
 }
diff --git a/drivers/edac/mce_amd.c b/drivers/edac/mce_amd.c
index 3dee58583d25..80762acd8cc8 100644
--- a/drivers/edac/mce_amd.c
+++ b/drivers/edac/mce_amd.c
@@ -867,7 +867,7 @@ static void decode_smca_errors(struct mce *m)
return;
 
bank_type = hwid->bank_type;
-   ip_name = smca_names[bank_type].long_name;
+   ip_name = smca_get_long_name(bank_type);
 
pr_emerg(HW_ERR "%s Extended Error Code: %d\n", ip_name, xec);
 
-- 
2.10.0

-- 
Regards/Gruss,
Boris.

Good mailing practices for 400: avoid top-posting and trim the reply.


Re: [PATCH 1/3] x86/RAS: Simplify SMCA bank descriptor struct

2016-11-04 Thread Borislav Petkov
On Fri, Nov 04, 2016 at 10:44:47AM -0400, Yazen Ghannam wrote:
> Please add:
> Tested-by: Yazen Ghannam 
> 
> Ditto for the others.

Thanks, here's one more which I've been meaning to do:

---
From: Borislav Petkov 
Date: Thu, 3 Nov 2016 21:12:33 +0100
Subject: [PATCH] x86/RAS: Hide SMCA bank names

Add accessor functions and hide the smca_names array. Also, add a
sanity-check to bank HWID assignment in get_smca_bank_info().

Signed-off-by: Borislav Petkov 
---
 arch/x86/include/asm/mce.h   |  8 +---
 arch/x86/kernel/cpu/mcheck/mce_amd.c | 32 +---
 drivers/edac/mce_amd.c   |  2 +-
 3 files changed, 31 insertions(+), 11 deletions(-)

diff --git a/arch/x86/include/asm/mce.h b/arch/x86/include/asm/mce.h
index 8ffd21596dd7..748b8da8e627 100644
--- a/arch/x86/include/asm/mce.h
+++ b/arch/x86/include/asm/mce.h
@@ -356,13 +356,6 @@ enum smca_bank_types {
N_SMCA_BANK_TYPES
 };
 
-struct smca_bank_name {
-   const char *name;   /* Short name for sysfs */
-   const char *long_name;  /* Long name for pretty-printing */
-};
-
-extern struct smca_bank_name smca_names[N_SMCA_BANK_TYPES];
-
 #define HWID_MCATYPE(hwid, mcatype) ((hwid << 16) | mcatype)
 
 struct smca_hwid {
@@ -379,6 +372,7 @@ struct smca_bank {
 
 extern struct smca_bank smca_banks[MAX_NR_BANKS];
 
+extern const char *smca_get_long_name(enum smca_bank_types t);
 #endif
 
 #endif /* _ASM_X86_MCE_H */
diff --git a/arch/x86/kernel/cpu/mcheck/mce_amd.c 
b/arch/x86/kernel/cpu/mcheck/mce_amd.c
index afeb02b87127..e68a305ff666 100644
--- a/arch/x86/kernel/cpu/mcheck/mce_amd.c
+++ b/arch/x86/kernel/cpu/mcheck/mce_amd.c
@@ -69,7 +69,12 @@ static const char * const smca_umc_block_names[] = {
"misc_umc"
 };
 
-struct smca_bank_name smca_names[] = {
+struct smca_bank_name {
+   const char *name;   /* Short name for sysfs */
+   const char *long_name;  /* Long name for pretty-printing */
+};
+
+static struct smca_bank_name smca_names[] = {
[SMCA_LS]   = { "load_store",   "Load Store Unit" },
[SMCA_IF]   = { "insn_fetch",   "Instruction Fetch Unit" },
[SMCA_L2_CACHE] = { "l2_cache", "L2 Cache" },
@@ -84,7 +89,23 @@ struct smca_bank_name smca_names[] = {
[SMCA_PSP]  = { "psp",  "Platform Security Processor" },
[SMCA_SMU]  = { "smu",  "System Management Unit" },
 };
-EXPORT_SYMBOL_GPL(smca_names);
+
+const char *smca_get_name(enum smca_bank_types t)
+{
+   if (t >= N_SMCA_BANK_TYPES)
+   return NULL;
+
+   return smca_names[t].name;
+}
+
+const char *smca_get_long_name(enum smca_bank_types t)
+{
+   if (t >= N_SMCA_BANK_TYPES)
+   return NULL;
+
+   return smca_names[t].long_name;
+}
+EXPORT_SYMBOL_GPL(smca_get_long_name);
 
 static struct smca_hwid smca_hwid_mcatypes[] = {
/* { bank_type, hwid_mcatype, xec_bitmap } */
@@ -163,6 +184,11 @@ static void get_smca_bank_info(unsigned int bank)
for (i = 0; i < ARRAY_SIZE(smca_hwid_mcatypes); i++) {
s_hwid = _hwid_mcatypes[i];
if (hwid_mcatype == s_hwid->hwid_mcatype) {
+
+   WARN(smca_banks[bank].hwid,
+"Bank %s already initialized!\n",
+smca_get_name(s_hwid->bank_type));
+
smca_banks[bank].hwid = s_hwid;
smca_banks[bank].id = instance_id;
break;
@@ -832,7 +858,7 @@ static const char *get_name(unsigned int bank, struct 
threshold_block *b)
}
 
snprintf(buf_mcatype, MAX_MCATYPE_NAME_LEN,
-"%s_%x", smca_names[bank_type].name,
+"%s_%x", smca_get_name(bank_type),
  smca_banks[bank].id);
return buf_mcatype;
 }
diff --git a/drivers/edac/mce_amd.c b/drivers/edac/mce_amd.c
index 3dee58583d25..80762acd8cc8 100644
--- a/drivers/edac/mce_amd.c
+++ b/drivers/edac/mce_amd.c
@@ -867,7 +867,7 @@ static void decode_smca_errors(struct mce *m)
return;
 
bank_type = hwid->bank_type;
-   ip_name = smca_names[bank_type].long_name;
+   ip_name = smca_get_long_name(bank_type);
 
pr_emerg(HW_ERR "%s Extended Error Code: %d\n", ip_name, xec);
 
-- 
2.10.0

-- 
Regards/Gruss,
Boris.

Good mailing practices for 400: avoid top-posting and trim the reply.


Re: [PATCH 1/3] x86/RAS: Simplify SMCA bank descriptor struct

2016-11-04 Thread Yazen Ghannam
> 
> Call the struct simply smca_bank, it's instance ID can be simply ->id.
> Makes the code much more readable.
> 
> Signed-off-by: Borislav Petkov 

Looks good to me.

Please add:
Tested-by: Yazen Ghannam 

Ditto for the others.

Thanks,
Yazen


Re: [PATCH 1/3] x86/RAS: Simplify SMCA bank descriptor struct

2016-11-04 Thread Yazen Ghannam
> 
> Call the struct simply smca_bank, it's instance ID can be simply ->id.
> Makes the code much more readable.
> 
> Signed-off-by: Borislav Petkov 

Looks good to me.

Please add:
Tested-by: Yazen Ghannam 

Ditto for the others.

Thanks,
Yazen


[PATCH 1/3] x86/RAS: Simplify SMCA bank descriptor struct

2016-11-03 Thread Borislav Petkov
From: Borislav Petkov 

Call the struct simply smca_bank, it's instance ID can be simply ->id.
Makes the code much more readable.

Signed-off-by: Borislav Petkov 
---
 arch/x86/include/asm/mce.h   |  7 ---
 arch/x86/kernel/cpu/mcheck/mce_amd.c | 10 +-
 2 files changed, 9 insertions(+), 8 deletions(-)

diff --git a/arch/x86/include/asm/mce.h b/arch/x86/include/asm/mce.h
index 9bd7ff5ffbcc..4d97875d9543 100644
--- a/arch/x86/include/asm/mce.h
+++ b/arch/x86/include/asm/mce.h
@@ -371,12 +371,13 @@ struct smca_hwid_mcatype {
u32 xec_bitmap; /* Bitmap of valid ExtErrorCodes; current max 
is 21. */
 };
 
-struct smca_bank_info {
+struct smca_bank {
struct smca_hwid_mcatype *type;
-   u32 type_instance;
+   /* Instance ID */
+   u32 id;
 };
 
-extern struct smca_bank_info smca_banks[MAX_NR_BANKS];
+extern struct smca_bank smca_banks[MAX_NR_BANKS];
 
 #endif
 
diff --git a/arch/x86/kernel/cpu/mcheck/mce_amd.c 
b/arch/x86/kernel/cpu/mcheck/mce_amd.c
index 9b5403462936..ac2f4f2cad18 100644
--- a/arch/x86/kernel/cpu/mcheck/mce_amd.c
+++ b/arch/x86/kernel/cpu/mcheck/mce_amd.c
@@ -116,7 +116,7 @@ static struct smca_hwid_mcatype smca_hwid_mcatypes[] = {
{ SMCA_SMU,  HWID_MCATYPE(0x01, 0x0), 0x1 },
 };
 
-struct smca_bank_info smca_banks[MAX_NR_BANKS];
+struct smca_bank smca_banks[MAX_NR_BANKS];
 EXPORT_SYMBOL_GPL(smca_banks);
 
 /*
@@ -150,14 +150,14 @@ static void get_smca_bank_info(unsigned int bank)
 {
unsigned int i, hwid_mcatype, cpu = smp_processor_id();
struct smca_hwid_mcatype *type;
-   u32 high, instanceId;
+   u32 high, instance_id;
u16 hwid, mcatype;
 
/* Collect bank_info using CPU 0 for now. */
if (cpu)
return;
 
-   if (rdmsr_safe_on_cpu(cpu, MSR_AMD64_SMCA_MCx_IPID(bank), , 
)) {
+   if (rdmsr_safe_on_cpu(cpu, MSR_AMD64_SMCA_MCx_IPID(bank), _id, 
)) {
pr_warn("Failed to read MCA_IPID for bank %d\n", bank);
return;
}
@@ -170,7 +170,7 @@ static void get_smca_bank_info(unsigned int bank)
type = _hwid_mcatypes[i];
if (hwid_mcatype == type->hwid_mcatype) {
smca_banks[bank].type = type;
-   smca_banks[bank].type_instance = instanceId;
+   smca_banks[bank].id = instance_id;
break;
}
}
@@ -839,7 +839,7 @@ static const char *get_name(unsigned int bank, struct 
threshold_block *b)
 
snprintf(buf_mcatype, MAX_MCATYPE_NAME_LEN,
 "%s_%x", smca_bank_names[bank_type].name,
- smca_banks[bank].type_instance);
+ smca_banks[bank].id);
return buf_mcatype;
 }
 
-- 
2.10.0



[PATCH 1/3] x86/RAS: Simplify SMCA bank descriptor struct

2016-11-03 Thread Borislav Petkov
From: Borislav Petkov 

Call the struct simply smca_bank, it's instance ID can be simply ->id.
Makes the code much more readable.

Signed-off-by: Borislav Petkov 
---
 arch/x86/include/asm/mce.h   |  7 ---
 arch/x86/kernel/cpu/mcheck/mce_amd.c | 10 +-
 2 files changed, 9 insertions(+), 8 deletions(-)

diff --git a/arch/x86/include/asm/mce.h b/arch/x86/include/asm/mce.h
index 9bd7ff5ffbcc..4d97875d9543 100644
--- a/arch/x86/include/asm/mce.h
+++ b/arch/x86/include/asm/mce.h
@@ -371,12 +371,13 @@ struct smca_hwid_mcatype {
u32 xec_bitmap; /* Bitmap of valid ExtErrorCodes; current max 
is 21. */
 };
 
-struct smca_bank_info {
+struct smca_bank {
struct smca_hwid_mcatype *type;
-   u32 type_instance;
+   /* Instance ID */
+   u32 id;
 };
 
-extern struct smca_bank_info smca_banks[MAX_NR_BANKS];
+extern struct smca_bank smca_banks[MAX_NR_BANKS];
 
 #endif
 
diff --git a/arch/x86/kernel/cpu/mcheck/mce_amd.c 
b/arch/x86/kernel/cpu/mcheck/mce_amd.c
index 9b5403462936..ac2f4f2cad18 100644
--- a/arch/x86/kernel/cpu/mcheck/mce_amd.c
+++ b/arch/x86/kernel/cpu/mcheck/mce_amd.c
@@ -116,7 +116,7 @@ static struct smca_hwid_mcatype smca_hwid_mcatypes[] = {
{ SMCA_SMU,  HWID_MCATYPE(0x01, 0x0), 0x1 },
 };
 
-struct smca_bank_info smca_banks[MAX_NR_BANKS];
+struct smca_bank smca_banks[MAX_NR_BANKS];
 EXPORT_SYMBOL_GPL(smca_banks);
 
 /*
@@ -150,14 +150,14 @@ static void get_smca_bank_info(unsigned int bank)
 {
unsigned int i, hwid_mcatype, cpu = smp_processor_id();
struct smca_hwid_mcatype *type;
-   u32 high, instanceId;
+   u32 high, instance_id;
u16 hwid, mcatype;
 
/* Collect bank_info using CPU 0 for now. */
if (cpu)
return;
 
-   if (rdmsr_safe_on_cpu(cpu, MSR_AMD64_SMCA_MCx_IPID(bank), , 
)) {
+   if (rdmsr_safe_on_cpu(cpu, MSR_AMD64_SMCA_MCx_IPID(bank), _id, 
)) {
pr_warn("Failed to read MCA_IPID for bank %d\n", bank);
return;
}
@@ -170,7 +170,7 @@ static void get_smca_bank_info(unsigned int bank)
type = _hwid_mcatypes[i];
if (hwid_mcatype == type->hwid_mcatype) {
smca_banks[bank].type = type;
-   smca_banks[bank].type_instance = instanceId;
+   smca_banks[bank].id = instance_id;
break;
}
}
@@ -839,7 +839,7 @@ static const char *get_name(unsigned int bank, struct 
threshold_block *b)
 
snprintf(buf_mcatype, MAX_MCATYPE_NAME_LEN,
 "%s_%x", smca_bank_names[bank_type].name,
- smca_banks[bank].type_instance);
+ smca_banks[bank].id);
return buf_mcatype;
 }
 
-- 
2.10.0