Commit 054f621f authored by Mike Travis's avatar Mike Travis Committed by Ingo Molnar

x86/platform/UV: Fix problem with UV4 Socket IDs not being contiguous

The UV4 Socket IDs are not guaranteed to equate to Node values which
can cause the GAM (Global Addressable Memory) table lookups to fail.
Fix this by using an independent index into the GAM table instead of
the Socket ID to reference the base address.
Tested-by: default avatarFrank Ramsay <framsay@sgi.com>
Tested-by: default avatarJohn Estabrook <estabrook@sgi.com>
Signed-off-by: default avatarMike Travis <travis@sgi.com>
Reviewed-by: default avatarDimitri Sivanich <sivanich@sgi.com>
Reviewed-by: default avatarNathan Zimmer <nzimmer@sgi.com>
Cc: Alex Thorlton <athorlton@sgi.com>
Cc: Andrew Banman <abanman@sgi.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Russ Anderson <rja@sgi.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Link: http://lkml.kernel.org/r/20160801184050.048755337@asylum.americas.sgi.comSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
parent 3e035305
...@@ -325,7 +325,7 @@ static __init void build_uv_gr_table(void) ...@@ -325,7 +325,7 @@ static __init void build_uv_gr_table(void)
struct uv_gam_range_entry *gre = uv_gre_table; struct uv_gam_range_entry *gre = uv_gre_table;
struct uv_gam_range_s *grt; struct uv_gam_range_s *grt;
unsigned long last_limit = 0, ram_limit = 0; unsigned long last_limit = 0, ram_limit = 0;
int bytes, i, sid, lsid = -1; int bytes, i, sid, lsid = -1, indx = 0, lindx = -1;
if (!gre) if (!gre)
return; return;
...@@ -356,11 +356,12 @@ static __init void build_uv_gr_table(void) ...@@ -356,11 +356,12 @@ static __init void build_uv_gr_table(void)
} }
sid = gre->sockid - _min_socket; sid = gre->sockid - _min_socket;
if (lsid < sid) { /* new range */ if (lsid < sid) { /* new range */
grt = &_gr_table[sid]; grt = &_gr_table[indx];
grt->base = lsid; grt->base = lindx;
grt->nasid = gre->nasid; grt->nasid = gre->nasid;
grt->limit = last_limit = gre->limit; grt->limit = last_limit = gre->limit;
lsid = sid; lsid = sid;
lindx = indx++;
continue; continue;
} }
if (lsid == sid && !ram_limit) { /* update range */ if (lsid == sid && !ram_limit) { /* update range */
...@@ -371,7 +372,7 @@ static __init void build_uv_gr_table(void) ...@@ -371,7 +372,7 @@ static __init void build_uv_gr_table(void)
} }
if (!ram_limit) { /* non-contiguous ram range */ if (!ram_limit) { /* non-contiguous ram range */
grt++; grt++;
grt->base = sid - 1; grt->base = lindx;
grt->nasid = gre->nasid; grt->nasid = gre->nasid;
grt->limit = last_limit = gre->limit; grt->limit = last_limit = gre->limit;
continue; continue;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment