When a vSMP Foundation box is detected, the function apic_cluster_num() counts
the number of APIC clusters found. If more than one found, a multi board
configuration is assumed, and TSC marked as unstable. This behavior is
incorrect as vSMP Foundation may use processors from single node only, attached
to memory of other nodes - and such node may have more than one APIC cluster
(typically any recent intel box has more than single APIC_CLUSTERID(x)).
To fix this, we simply remove the code which detects a vSMP Foundation box and
affects apic_is_clusted_box() return value. This can be done because later the
kernel checks by itself if the TSC is stable using the
check_tsc_sync_[source|target]() functions and marks TSC as unstable if needed.
Acked-by: Shai Fultheim <[email protected]>
Signed-off-by: Oren Twaig <[email protected]>
---
diff --git a/arch/x86/include/asm/apic.h b/arch/x86/include/asm/apic.h
index 19b0eba..c100694 100644
--- a/arch/x86/include/asm/apic.h
+++ b/arch/x86/include/asm/apic.h
@@ -85,14 +85,6 @@ static inline bool apic_from_smp_config(void)
#include <asm/paravirt.h>
#endif
-#ifdef CONFIG_X86_64
-extern int is_vsmp_box(void);
-#else
-static inline int is_vsmp_box(void)
-{
- return 0;
-}
-#endif
extern int setup_profiling_timer(unsigned int);
static inline void native_apic_mem_write(u32 reg, u32 v)
diff --git a/arch/x86/kernel/apic/apic.c b/arch/x86/kernel/apic/apic.c
index ad28db7..2b85bb9 100644
--- a/arch/x86/kernel/apic/apic.c
+++ b/arch/x86/kernel/apic/apic.c
@@ -2451,51 +2451,6 @@ static void apic_pm_activate(void) { }
#ifdef CONFIG_X86_64
-static int apic_cluster_num(void)
-{
- int i, clusters, zeros;
- unsigned id;
- u16 *bios_cpu_apicid;
- DECLARE_BITMAP(clustermap, NUM_APIC_CLUSTERS);
-
- bios_cpu_apicid = early_per_cpu_ptr(x86_bios_cpu_apicid);
- bitmap_zero(clustermap, NUM_APIC_CLUSTERS);
-
- for (i = 0; i < nr_cpu_ids; i++) {
- /* are we being called early in kernel startup? */
- if (bios_cpu_apicid) {
- id = bios_cpu_apicid[i];
- } else if (i < nr_cpu_ids) {
- if (cpu_present(i))
- id = per_cpu(x86_bios_cpu_apicid, i);
- else
- continue;
- } else
- break;
-
- if (id != BAD_APICID)
- __set_bit(APIC_CLUSTERID(id), clustermap);
- }
-
- /* Problem: Partially populated chassis may not have CPUs in some of
- * the APIC clusters they have been allocated. Only present CPUs have
- * x86_bios_cpu_apicid entries, thus causing zeroes in the bitmap.
- * Since clusters are allocated sequentially, count zeros only if
- * they are bounded by ones.
- */
- clusters = 0;
- zeros = 0;
- for (i = 0; i < NUM_APIC_CLUSTERS; i++) {
- if (test_bit(i, clustermap)) {
- clusters += 1 + zeros;
- zeros = 0;
- } else
- ++zeros;
- }
-
- return clusters;
-}
-
static int multi_checked;
static int multi;
@@ -2540,20 +2495,7 @@ static void dmi_check_multi(void)
int apic_is_clustered_box(void)
{
dmi_check_multi();
- if (multi)
- return 1;
-
- if (!is_vsmp_box())
- return 0;
-
- /*
- * ScaleMP vSMPowered boxes have one cluster per board and TSCs are
- * not guaranteed to be synced between boards
- */
- if (apic_cluster_num() > 1)
- return 1;
-
- return 0;
+ return multi;
}
#endif
Hi,
Quick question: As I'm new at this (submitting patches), what is a reasonable time to wait before ping-ing a patch ?
Oren.
On 06/29/2014 01:01 PM, Oren Twaig wrote:
> When a vSMP Foundation box is detected, the function apic_cluster_num() counts
> the number of APIC clusters found. If more than one found, a multi board
> configuration is assumed, and TSC marked as unstable. This behavior is
> incorrect as vSMP Foundation may use processors from single node only, attached
> to memory of other nodes - and such node may have more than one APIC cluster
> (typically any recent intel box has more than single APIC_CLUSTERID(x)).
>
> To fix this, we simply remove the code which detects a vSMP Foundation box and
> affects apic_is_clusted_box() return value. This can be done because later the
> kernel checks by itself if the TSC is stable using the
> check_tsc_sync_[source|target]() functions and marks TSC as unstable if needed.
>
> Acked-by: Shai Fultheim <[email protected]>
> Signed-off-by: Oren Twaig <[email protected]>
> ---
> diff --git a/arch/x86/include/asm/apic.h b/arch/x86/include/asm/apic.h
> index 19b0eba..c100694 100644
> --- a/arch/x86/include/asm/apic.h
> +++ b/arch/x86/include/asm/apic.h
> @@ -85,14 +85,6 @@ static inline bool apic_from_smp_config(void)
> #include <asm/paravirt.h>
> #endif
>
> -#ifdef CONFIG_X86_64
> -extern int is_vsmp_box(void);
> -#else
> -static inline int is_vsmp_box(void)
> -{
> - return 0;
> -}
> -#endif
> extern int setup_profiling_timer(unsigned int);
>
> static inline void native_apic_mem_write(u32 reg, u32 v)
> diff --git a/arch/x86/kernel/apic/apic.c b/arch/x86/kernel/apic/apic.c
> index ad28db7..2b85bb9 100644
> --- a/arch/x86/kernel/apic/apic.c
> +++ b/arch/x86/kernel/apic/apic.c
> @@ -2451,51 +2451,6 @@ static void apic_pm_activate(void) { }
>
> #ifdef CONFIG_X86_64
>
> -static int apic_cluster_num(void)
> -{
> - int i, clusters, zeros;
> - unsigned id;
> - u16 *bios_cpu_apicid;
> - DECLARE_BITMAP(clustermap, NUM_APIC_CLUSTERS);
> -
> - bios_cpu_apicid = early_per_cpu_ptr(x86_bios_cpu_apicid);
> - bitmap_zero(clustermap, NUM_APIC_CLUSTERS);
> -
> - for (i = 0; i < nr_cpu_ids; i++) {
> - /* are we being called early in kernel startup? */
> - if (bios_cpu_apicid) {
> - id = bios_cpu_apicid[i];
> - } else if (i < nr_cpu_ids) {
> - if (cpu_present(i))
> - id = per_cpu(x86_bios_cpu_apicid, i);
> - else
> - continue;
> - } else
> - break;
> -
> - if (id != BAD_APICID)
> - __set_bit(APIC_CLUSTERID(id), clustermap);
> - }
> -
> - /* Problem: Partially populated chassis may not have CPUs in some of
> - * the APIC clusters they have been allocated. Only present CPUs have
> - * x86_bios_cpu_apicid entries, thus causing zeroes in the bitmap.
> - * Since clusters are allocated sequentially, count zeros only if
> - * they are bounded by ones.
> - */
> - clusters = 0;
> - zeros = 0;
> - for (i = 0; i < NUM_APIC_CLUSTERS; i++) {
> - if (test_bit(i, clustermap)) {
> - clusters += 1 + zeros;
> - zeros = 0;
> - } else
> - ++zeros;
> - }
> -
> - return clusters;
> -}
> -
> static int multi_checked;
> static int multi;
>
> @@ -2540,20 +2495,7 @@ static void dmi_check_multi(void)
> int apic_is_clustered_box(void)
> {
> dmi_check_multi();
> - if (multi)
> - return 1;
> -
> - if (!is_vsmp_box())
> - return 0;
> -
> - /*
> - * ScaleMP vSMPowered boxes have one cluster per board and TSCs are
> - * not guaranteed to be synced between boards
> - */
> - if (apic_cluster_num() > 1)
> - return 1;
> -
> - return 0;
> + return multi;
> }
> #endif
>
>
Hi,
Quick question: As I'm new at this (submitting patches), what is a reasonable
time to wait before ping-ing a patch ?
Oren.
On 06/29/2014 01:01 PM, Oren Twaig wrote:
> When a vSMP Foundation box is detected, the function apic_cluster_num() counts
> the number of APIC clusters found. If more than one found, a multi board
> configuration is assumed, and TSC marked as unstable. This behavior is
> incorrect as vSMP Foundation may use processors from single node only, attached
> to memory of other nodes - and such node may have more than one APIC cluster
> (typically any recent intel box has more than single APIC_CLUSTERID(x)).
>
> To fix this, we simply remove the code which detects a vSMP Foundation box and
> affects apic_is_clusted_box() return value. This can be done because later the
> kernel checks by itself if the TSC is stable using the
> check_tsc_sync_[source|target]() functions and marks TSC as unstable if needed.
>
> Acked-by: Shai Fultheim <[email protected]>
> Signed-off-by: Oren Twaig <[email protected]>
> ---
> diff --git a/arch/x86/include/asm/apic.h b/arch/x86/include/asm/apic.h
> index 19b0eba..c100694 100644
> --- a/arch/x86/include/asm/apic.h
> +++ b/arch/x86/include/asm/apic.h
> @@ -85,14 +85,6 @@ static inline bool apic_from_smp_config(void)
> #include <asm/paravirt.h>
> #endif
>
> -#ifdef CONFIG_X86_64
> -extern int is_vsmp_box(void);
> -#else
> -static inline int is_vsmp_box(void)
> -{
> - return 0;
> -}
> -#endif
> extern int setup_profiling_timer(unsigned int);
>
> static inline void native_apic_mem_write(u32 reg, u32 v)
> diff --git a/arch/x86/kernel/apic/apic.c b/arch/x86/kernel/apic/apic.c
> index ad28db7..2b85bb9 100644
> --- a/arch/x86/kernel/apic/apic.c
> +++ b/arch/x86/kernel/apic/apic.c
> @@ -2451,51 +2451,6 @@ static void apic_pm_activate(void) { }
>
> #ifdef CONFIG_X86_64
>
> -static int apic_cluster_num(void)
> -{
> - int i, clusters, zeros;
> - unsigned id;
> - u16 *bios_cpu_apicid;
> - DECLARE_BITMAP(clustermap, NUM_APIC_CLUSTERS);
> -
> - bios_cpu_apicid = early_per_cpu_ptr(x86_bios_cpu_apicid);
> - bitmap_zero(clustermap, NUM_APIC_CLUSTERS);
> -
> - for (i = 0; i < nr_cpu_ids; i++) {
> - /* are we being called early in kernel startup? */
> - if (bios_cpu_apicid) {
> - id = bios_cpu_apicid[i];
> - } else if (i < nr_cpu_ids) {
> - if (cpu_present(i))
> - id = per_cpu(x86_bios_cpu_apicid, i);
> - else
> - continue;
> - } else
> - break;
> -
> - if (id != BAD_APICID)
> - __set_bit(APIC_CLUSTERID(id), clustermap);
> - }
> -
> - /* Problem: Partially populated chassis may not have CPUs in some of
> - * the APIC clusters they have been allocated. Only present CPUs have
> - * x86_bios_cpu_apicid entries, thus causing zeroes in the bitmap.
> - * Since clusters are allocated sequentially, count zeros only if
> - * they are bounded by ones.
> - */
> - clusters = 0;
> - zeros = 0;
> - for (i = 0; i < NUM_APIC_CLUSTERS; i++) {
> - if (test_bit(i, clustermap)) {
> - clusters += 1 + zeros;
> - zeros = 0;
> - } else
> - ++zeros;
> - }
> -
> - return clusters;
> -}
> -
> static int multi_checked;
> static int multi;
>
> @@ -2540,20 +2495,7 @@ static void dmi_check_multi(void)
> int apic_is_clustered_box(void)
> {
> dmi_check_multi();
> - if (multi)
> - return 1;
> -
> - if (!is_vsmp_box())
> - return 0;
> -
> - /*
> - * ScaleMP vSMPowered boxes have one cluster per board and TSCs are
> - * not guaranteed to be synced between boards
> - */
> - if (apic_cluster_num() > 1)
> - return 1;
> -
> - return 0;
> + return multi;
> }
> #endif
>
>
ping
On 07/06/2014 09:33 AM, Oren Twaig wrote:
> Hi,
>
> Quick question: As I'm new at this (submitting patches), what is a reasonable
> time to wait before ping-ing a patch ?
>
> Oren.
>
> On 06/29/2014 01:01 PM, Oren Twaig wrote:
>> When a vSMP Foundation box is detected, the function apic_cluster_num() counts
>> the number of APIC clusters found. If more than one found, a multi board
>> configuration is assumed, and TSC marked as unstable. This behavior is
>> incorrect as vSMP Foundation may use processors from single node only, attached
>> to memory of other nodes - and such node may have more than one APIC cluster
>> (typically any recent intel box has more than single APIC_CLUSTERID(x)).
>>
>> To fix this, we simply remove the code which detects a vSMP Foundation box and
>> affects apic_is_clusted_box() return value. This can be done because later the
>> kernel checks by itself if the TSC is stable using the
>> check_tsc_sync_[source|target]() functions and marks TSC as unstable if needed.
>>
>> Acked-by: Shai Fultheim <[email protected]>
>> Signed-off-by: Oren Twaig <[email protected]>
>> ---
>> diff --git a/arch/x86/include/asm/apic.h b/arch/x86/include/asm/apic.h
>> index 19b0eba..c100694 100644
>> --- a/arch/x86/include/asm/apic.h
>> +++ b/arch/x86/include/asm/apic.h
>> @@ -85,14 +85,6 @@ static inline bool apic_from_smp_config(void)
>> #include <asm/paravirt.h>
>> #endif
>>
>> -#ifdef CONFIG_X86_64
>> -extern int is_vsmp_box(void);
>> -#else
>> -static inline int is_vsmp_box(void)
>> -{
>> - return 0;
>> -}
>> -#endif
>> extern int setup_profiling_timer(unsigned int);
>>
>> static inline void native_apic_mem_write(u32 reg, u32 v)
>> diff --git a/arch/x86/kernel/apic/apic.c b/arch/x86/kernel/apic/apic.c
>> index ad28db7..2b85bb9 100644
>> --- a/arch/x86/kernel/apic/apic.c
>> +++ b/arch/x86/kernel/apic/apic.c
>> @@ -2451,51 +2451,6 @@ static void apic_pm_activate(void) { }
>>
>> #ifdef CONFIG_X86_64
>>
>> -static int apic_cluster_num(void)
>> -{
>> - int i, clusters, zeros;
>> - unsigned id;
>> - u16 *bios_cpu_apicid;
>> - DECLARE_BITMAP(clustermap, NUM_APIC_CLUSTERS);
>> -
>> - bios_cpu_apicid = early_per_cpu_ptr(x86_bios_cpu_apicid);
>> - bitmap_zero(clustermap, NUM_APIC_CLUSTERS);
>> -
>> - for (i = 0; i < nr_cpu_ids; i++) {
>> - /* are we being called early in kernel startup? */
>> - if (bios_cpu_apicid) {
>> - id = bios_cpu_apicid[i];
>> - } else if (i < nr_cpu_ids) {
>> - if (cpu_present(i))
>> - id = per_cpu(x86_bios_cpu_apicid, i);
>> - else
>> - continue;
>> - } else
>> - break;
>> -
>> - if (id != BAD_APICID)
>> - __set_bit(APIC_CLUSTERID(id), clustermap);
>> - }
>> -
>> - /* Problem: Partially populated chassis may not have CPUs in some of
>> - * the APIC clusters they have been allocated. Only present CPUs have
>> - * x86_bios_cpu_apicid entries, thus causing zeroes in the bitmap.
>> - * Since clusters are allocated sequentially, count zeros only if
>> - * they are bounded by ones.
>> - */
>> - clusters = 0;
>> - zeros = 0;
>> - for (i = 0; i < NUM_APIC_CLUSTERS; i++) {
>> - if (test_bit(i, clustermap)) {
>> - clusters += 1 + zeros;
>> - zeros = 0;
>> - } else
>> - ++zeros;
>> - }
>> -
>> - return clusters;
>> -}
>> -
>> static int multi_checked;
>> static int multi;
>>
>> @@ -2540,20 +2495,7 @@ static void dmi_check_multi(void)
>> int apic_is_clustered_box(void)
>> {
>> dmi_check_multi();
>> - if (multi)
>> - return 1;
>> -
>> - if (!is_vsmp_box())
>> - return 0;
>> -
>> - /*
>> - * ScaleMP vSMPowered boxes have one cluster per board and TSCs are
>> - * not guaranteed to be synced between boards
>> - */
>> - if (apic_cluster_num() > 1)
>> - return 1;
>> -
>> - return 0;
>> + return multi;
>> }
>> #endif
>>
>>
>
>
Am 13.07.2014 08:51, schrieb Oren Twaig:
> ping
> On 07/06/2014 09:33 AM, Oren Twaig wrote:
>> Hi,
>>
>> Quick question: As I'm new at this (submitting patches), what is a reasonable
>> time to wait before ping-ing a patch ?
>>
>> Oren.
AFACT Peter is still crawling through his mail backlog to catch up.
Thanks,
//richard
I see - Thanks for the quick respond.
Oren.
On 07/13/2014 12:10 PM, Richard Weinberger wrote:
> Am 13.07.2014 08:51, schrieb Oren Twaig:
>> ping
>> On 07/06/2014 09:33 AM, Oren Twaig wrote:
>>> Hi,
>>>
>>> Quick question: As I'm new at this (submitting patches), what is a reasonable
>>> time to wait before ping-ing a patch ?
>>>
>>> Oren.
> AFACT Peter is still crawling through his mail backlog to catch up.
>
> Thanks,
> //richard
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to [email protected]
> More majordomo info at http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at http://www.tux.org/lkml/
>
Yes, although sometimes pings we useful to keep things from getting lost. Typically 1-2 weeks without response is a good reason to ping. *Don't repost*, just put a ping as a reply to the original 0/ patch, which in most threaded mail readers brings the thread back to the front.
Sent from my tablet, pardon any formatting problems.
> On Jul 13, 2014, at 2:10, Richard Weinberger <[email protected]> wrote:
>
> Am 13.07.2014 08:51, schrieb Oren Twaig:
>> ping
>> On 07/06/2014 09:33 AM, Oren Twaig wrote:
>>> Hi,
>>>
>>> Quick question: As I'm new at this (submitting patches), what is a reasonable
>>> time to wait before ping-ing a patch ?
>>>
>>> Oren.
>
> AFACT Peter is still crawling through his mail backlog to catch up.
>
> Thanks,
> //richard
I see - thanks.
BTW, the v2 was sent because I had a mailer send-as-text issues which caused
the patch not to be sent properly and you had some conflicts with it when
merging.
All should be good now with the v2.
Thanks,
Oren.
On 7/13/2014 7:40 PM, H. Peter Anvin wrote:
> Yes, although sometimes pings we useful to keep things from getting lost. Typically 1-2 weeks without response is a good reason to ping. *Don't repost*, just put a ping as a reply to the original 0/ patch, which in most threaded mail readers brings the thread back to the front.
>
> Sent from my tablet, pardon any formatting problems.
>
>> On Jul 13, 2014, at 2:10, Richard Weinberger <[email protected]> wrote:
>>
>> Am 13.07.2014 08:51, schrieb Oren Twaig:
>>> ping
>>> On 07/06/2014 09:33 AM, Oren Twaig wrote:
>>>> Hi,
>>>>
>>>> Quick question: As I'm new at this (submitting patches), what is a reasonable
>>>> time to wait before ping-ing a patch ?
>>>>
>>>> Oren.
>> AFACT Peter is still crawling through his mail backlog to catch up.
>>
>> Thanks,
>> //richard
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to [email protected]
> More majordomo info at http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at http://www.tux.org/lkml/
>
---
This email is free from viruses and malware because avast! Antivirus protection is active.
http://www.avast.com
Commit-ID: 411cf9ee2946492c0ac7eca48422fcf94a723ce5
Gitweb: http://git.kernel.org/tip/411cf9ee2946492c0ac7eca48422fcf94a723ce5
Author: Oren Twaig <[email protected]>
AuthorDate: Sun, 29 Jun 2014 13:01:08 +0300
Committer: H. Peter Anvin <[email protected]>
CommitDate: Sun, 13 Jul 2014 17:48:03 -0700
x86, vsmp: Remove is_vsmp_box() from apic_is_clustered_box()
When a vSMP Foundation box is detected, the function apic_cluster_num() counts
the number of APIC clusters found. If more than one found, a multi board
configuration is assumed, and TSC marked as unstable. This behavior is
incorrect as vSMP Foundation may use processors from single node only, attached
to memory of other nodes - and such node may have more than one APIC cluster
(typically any recent intel box has more than single APIC_CLUSTERID(x)).
To fix this, we simply remove the code which detects a vSMP Foundation box and
affects apic_is_clusted_box() return value. This can be done because later the
kernel checks by itself if the TSC is stable using the
check_tsc_sync_[source|target]() functions and marks TSC as unstable if needed.
Acked-by: Shai Fultheim <[email protected]>
Signed-off-by: Oren Twaig <[email protected]>
Link: http://lkml.kernel.org/r/[email protected]
Signed-off-by: H. Peter Anvin <[email protected]>
---
arch/x86/include/asm/apic.h | 8 ------
arch/x86/kernel/apic/apic.c | 60 +--------------------------------------------
2 files changed, 1 insertion(+), 67 deletions(-)
diff --git a/arch/x86/include/asm/apic.h b/arch/x86/include/asm/apic.h
index 69ed79a..b40ea7e 100644
--- a/arch/x86/include/asm/apic.h
+++ b/arch/x86/include/asm/apic.h
@@ -85,14 +85,6 @@ static inline bool apic_from_smp_config(void)
#include <asm/paravirt.h>
#endif
-#ifdef CONFIG_X86_64
-extern int is_vsmp_box(void);
-#else
-static inline int is_vsmp_box(void)
-{
- return 0;
-}
-#endif
extern int setup_profiling_timer(unsigned int);
static inline void native_apic_mem_write(u32 reg, u32 v)
diff --git a/arch/x86/kernel/apic/apic.c b/arch/x86/kernel/apic/apic.c
index ca1bd75..6b35d30 100644
--- a/arch/x86/kernel/apic/apic.c
+++ b/arch/x86/kernel/apic/apic.c
@@ -2451,51 +2451,6 @@ static void apic_pm_activate(void) { }
#ifdef CONFIG_X86_64
-static int apic_cluster_num(void)
-{
- int i, clusters, zeros;
- unsigned id;
- u16 *bios_cpu_apicid;
- DECLARE_BITMAP(clustermap, NUM_APIC_CLUSTERS);
-
- bios_cpu_apicid = early_per_cpu_ptr(x86_bios_cpu_apicid);
- bitmap_zero(clustermap, NUM_APIC_CLUSTERS);
-
- for (i = 0; i < nr_cpu_ids; i++) {
- /* are we being called early in kernel startup? */
- if (bios_cpu_apicid) {
- id = bios_cpu_apicid[i];
- } else if (i < nr_cpu_ids) {
- if (cpu_present(i))
- id = per_cpu(x86_bios_cpu_apicid, i);
- else
- continue;
- } else
- break;
-
- if (id != BAD_APICID)
- __set_bit(APIC_CLUSTERID(id), clustermap);
- }
-
- /* Problem: Partially populated chassis may not have CPUs in some of
- * the APIC clusters they have been allocated. Only present CPUs have
- * x86_bios_cpu_apicid entries, thus causing zeroes in the bitmap.
- * Since clusters are allocated sequentially, count zeros only if
- * they are bounded by ones.
- */
- clusters = 0;
- zeros = 0;
- for (i = 0; i < NUM_APIC_CLUSTERS; i++) {
- if (test_bit(i, clustermap)) {
- clusters += 1 + zeros;
- zeros = 0;
- } else
- ++zeros;
- }
-
- return clusters;
-}
-
static int multi_checked;
static int multi;
@@ -2540,20 +2495,7 @@ static void dmi_check_multi(void)
int apic_is_clustered_box(void)
{
dmi_check_multi();
- if (multi)
- return 1;
-
- if (!is_vsmp_box())
- return 0;
-
- /*
- * ScaleMP vSMPowered boxes have one cluster per board and TSCs are
- * not guaranteed to be synced between boards
- */
- if (apic_cluster_num() > 1)
- return 1;
-
- return 0;
+ return multi;
}
#endif