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

Commit-ID:     4fb7d08707565d27ec84a364d011043ade8c38b4
Gitweb:        
https://git.kernel.org/tip/4fb7d08707565d27ec84a364d011043ade8c38b4
Author:        Mike Travis <[email protected]>
AuthorDate:    Tue, 10 Sep 2019 09:58:47 -05:00
Committer:     Ingo Molnar <[email protected]>
CommitterDate: Mon, 07 Oct 2019 13:42:11 +02:00

x86/platform/uv: Account for UV Hubless in is_uvX_hub Ops

The references in the is_uvX_hub() function uses the hub_info pointer
which will be NULL when the system is hubless.  This change avoids
that NULL dereference.  It is also an optimization in performance.

Signed-off-by: Mike Travis <[email protected]>
Reviewed-by: Steve Wahl <[email protected]>
Reviewed-by: Dimitri Sivanich <[email protected]>
Cc: Andrew Morton <[email protected]>
Cc: Borislav Petkov <[email protected]>
Cc: Christoph Hellwig <[email protected]>
Cc: H. Peter Anvin <[email protected]>
Cc: Hedi Berriche <[email protected]>
Cc: Justin Ernst <[email protected]>
Cc: Linus Torvalds <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Cc: Russ Anderson <[email protected]>
Cc: Thomas Gleixner <[email protected]>
Link: 
https://lkml.kernel.org/r/[email protected]
Signed-off-by: Ingo Molnar <[email protected]>
---
 arch/x86/include/asm/uv/uv_hub.h | 61 ++++++++++---------------------
 1 file changed, 20 insertions(+), 41 deletions(-)

diff --git a/arch/x86/include/asm/uv/uv_hub.h b/arch/x86/include/asm/uv/uv_hub.h
index 44cf6d6..950cd13 100644
--- a/arch/x86/include/asm/uv/uv_hub.h
+++ b/arch/x86/include/asm/uv/uv_hub.h
@@ -19,6 +19,7 @@
 #include <linux/topology.h>
 #include <asm/types.h>
 #include <asm/percpu.h>
+#include <asm/uv/uv.h>
 #include <asm/uv/uv_mmrs.h>
 #include <asm/uv/bios.h>
 #include <asm/irq_vectors.h>
@@ -243,83 +244,61 @@ static inline int uv_hub_info_check(int version)
 #define UV4_HUB_REVISION_BASE          7
 #define UV4A_HUB_REVISION_BASE         8       /* UV4 (fixed) rev 2 */
 
-#ifdef UV1_HUB_IS_SUPPORTED
+/* WARNING: UVx_HUB_IS_SUPPORTED defines are deprecated and will be removed */
 static inline int is_uv1_hub(void)
 {
-       return uv_hub_info->hub_revision < UV2_HUB_REVISION_BASE;
-}
+#ifdef UV1_HUB_IS_SUPPORTED
+       return is_uv_hubbed(uv(1));
 #else
-static inline int is_uv1_hub(void)
-{
        return 0;
-}
 #endif
+}
 
-#ifdef UV2_HUB_IS_SUPPORTED
 static inline int is_uv2_hub(void)
 {
-       return ((uv_hub_info->hub_revision >= UV2_HUB_REVISION_BASE) &&
-               (uv_hub_info->hub_revision < UV3_HUB_REVISION_BASE));
-}
+#ifdef UV2_HUB_IS_SUPPORTED
+       return is_uv_hubbed(uv(2));
 #else
-static inline int is_uv2_hub(void)
-{
        return 0;
-}
 #endif
+}
 
-#ifdef UV3_HUB_IS_SUPPORTED
 static inline int is_uv3_hub(void)
 {
-       return ((uv_hub_info->hub_revision >= UV3_HUB_REVISION_BASE) &&
-               (uv_hub_info->hub_revision < UV4_HUB_REVISION_BASE));
-}
+#ifdef UV3_HUB_IS_SUPPORTED
+       return is_uv_hubbed(uv(3));
 #else
-static inline int is_uv3_hub(void)
-{
        return 0;
-}
 #endif
+}
 
 /* First test "is UV4A", then "is UV4" */
-#ifdef UV4A_HUB_IS_SUPPORTED
-static inline int is_uv4a_hub(void)
-{
-       return (uv_hub_info->hub_revision >= UV4A_HUB_REVISION_BASE);
-}
-#else
 static inline int is_uv4a_hub(void)
 {
+#ifdef UV4A_HUB_IS_SUPPORTED
+       if (is_uv_hubbed(uv(4)))
+               return (uv_hub_info->hub_revision == UV4A_HUB_REVISION_BASE);
+#endif
        return 0;
 }
-#endif
 
-#ifdef UV4_HUB_IS_SUPPORTED
 static inline int is_uv4_hub(void)
 {
-       return uv_hub_info->hub_revision >= UV4_HUB_REVISION_BASE;
-}
+#ifdef UV4_HUB_IS_SUPPORTED
+       return is_uv_hubbed(uv(4));
 #else
-static inline int is_uv4_hub(void)
-{
        return 0;
-}
 #endif
+}
 
 static inline int is_uvx_hub(void)
 {
-       if (uv_hub_info->hub_revision >= UV2_HUB_REVISION_BASE)
-               return uv_hub_info->hub_revision;
-
-       return 0;
+       return (is_uv_hubbed(-2) >= uv(2));
 }
 
 static inline int is_uv_hub(void)
 {
-#ifdef UV1_HUB_IS_SUPPORTED
-       return uv_hub_info->hub_revision;
-#endif
-       return is_uvx_hub();
+       return is_uv1_hub() || is_uvx_hub();
 }
 
 union uvh_apicid {

Reply via email to