mirror of
https://github.com/torvalds/linux.git
synced 2024-12-28 13:51:44 +00:00
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: Frank Ramsay <framsay@sgi.com> Tested-by: John Estabrook <estabrook@sgi.com> Signed-off-by: Mike Travis <travis@sgi.com> Reviewed-by: Dimitri Sivanich <sivanich@sgi.com> Reviewed-by: Nathan 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.com Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
parent
3e03530587
commit
054f621fd5
@ -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_s *grt;
|
||||
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)
|
||||
return;
|
||||
@ -356,11 +356,12 @@ static __init void build_uv_gr_table(void)
|
||||
}
|
||||
sid = gre->sockid - _min_socket;
|
||||
if (lsid < sid) { /* new range */
|
||||
grt = &_gr_table[sid];
|
||||
grt->base = lsid;
|
||||
grt = &_gr_table[indx];
|
||||
grt->base = lindx;
|
||||
grt->nasid = gre->nasid;
|
||||
grt->limit = last_limit = gre->limit;
|
||||
lsid = sid;
|
||||
lindx = indx++;
|
||||
continue;
|
||||
}
|
||||
if (lsid == sid && !ram_limit) { /* update range */
|
||||
@ -371,7 +372,7 @@ static __init void build_uv_gr_table(void)
|
||||
}
|
||||
if (!ram_limit) { /* non-contiguous ram range */
|
||||
grt++;
|
||||
grt->base = sid - 1;
|
||||
grt->base = lindx;
|
||||
grt->nasid = gre->nasid;
|
||||
grt->limit = last_limit = gre->limit;
|
||||
continue;
|
||||
|
Loading…
Reference in New Issue
Block a user