Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
DISCONTINUED:openSUSE:11.1:Update
xen
20290-numa-unpopulated-nodes.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 20290-numa-unpopulated-nodes.patch of Package xen
# HG changeset patch # User Keir Fraser <keir.fraser@citrix.com> # Date 1254927506 -3600 # Node ID 42a53969eb7e1f84c35f48cb685aca31111bb80d # Parent e1cac8e4bdeb9c02a6f936e060d625ffa8cb09e3 Fix hypervisor crash with unpopulated NUMA nodes On NUMA systems with memory-less nodes Xen crashes quite early in the hypervisor (while initializing the heaps). This is not an issue if this happens to be the last node, but "inner" nodes trigger this reliably. On multi-node processors it is much more likely to leave a node unequipped. The attached patch fixes this by enumerating the node via the node_online_map instead of counting from 0 to num_nodes. The resulting NUMA setup is still somewhat strange, but at least it does not crash. In lowlevel/xc/xc.c there is again this enumeration bug, but I suppose we cannot access the HV's node_online_map from this context, so the xm info output is not correct (but xm debug-keys H is). I plan to rework the handling of memory-less nodes later. Signed-off-by: Andre Przywara <andre.przywara@amd.com> --- a/xen/common/page_alloc.c +++ b/xen/common/page_alloc.c @@ -314,7 +314,6 @@ static struct page_info *alloc_heap_page node = cpu_to_node(smp_processor_id()); ASSERT(node >= 0); - ASSERT(node < num_nodes); ASSERT(zone_lo <= zone_hi); ASSERT(zone_hi < NR_ZONES); @@ -343,8 +342,9 @@ static struct page_info *alloc_heap_page } while ( zone-- > zone_lo ); /* careful: unsigned zone may wrap */ /* Pick next node, wrapping around if needed. */ - if ( ++node == num_nodes ) - node = 0; + node = next_node(node, node_online_map); + if (node == MAX_NUMNODES) + node = first_node(node_online_map); } /* No suitable memory blocks. Fail the request. */ @@ -405,7 +405,6 @@ static void free_heap_pages( ASSERT(zone < NR_ZONES); ASSERT(order <= MAX_ORDER); ASSERT(node >= 0); - ASSERT(node < num_online_nodes()); for ( i = 0; i < (1 << order); i++ ) { @@ -511,13 +510,13 @@ static void init_heap_pages( static unsigned long avail_heap_pages( unsigned int zone_lo, unsigned int zone_hi, unsigned int node) { - unsigned int i, zone, num_nodes = num_online_nodes(); + unsigned int i, zone; unsigned long free_pages = 0; if ( zone_hi >= NR_ZONES ) zone_hi = NR_ZONES - 1; - for ( i = 0; i < num_nodes; i++ ) + for_each_online_node(i) { if ( !avail[i] ) continue;
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor