aboutsummaryrefslogtreecommitdiffstats
path: root/xen/arch/x86/sysctl.c
diff options
context:
space:
mode:
authorKeir Fraser <keir.fraser@citrix.com>2010-04-13 13:27:46 +0100
committerKeir Fraser <keir.fraser@citrix.com>2010-04-13 13:27:46 +0100
commit66ff9844c1e1eeeadddc2e51dbc5c57fa8671ea7 (patch)
tree2843a6e6d1611cefec8b02e929642d7efa63eced /xen/arch/x86/sysctl.c
parent7da1c9269c679a7bc71b498c5bd0b1872445cd66 (diff)
downloadxen-66ff9844c1e1eeeadddc2e51dbc5c57fa8671ea7.tar.gz
xen-66ff9844c1e1eeeadddc2e51dbc5c57fa8671ea7.tar.bz2
xen-66ff9844c1e1eeeadddc2e51dbc5c57fa8671ea7.zip
Clean up numa-info sysctl.
Signed-off-by: Keir Fraser <keir.fraser@citrix.com>
Diffstat (limited to 'xen/arch/x86/sysctl.c')
-rw-r--r--xen/arch/x86/sysctl.c65
1 files changed, 20 insertions, 45 deletions
diff --git a/xen/arch/x86/sysctl.c b/xen/arch/x86/sysctl.c
index bc3fc8d25a..4ffc76b145 100644
--- a/xen/arch/x86/sysctl.c
+++ b/xen/arch/x86/sysctl.c
@@ -116,74 +116,49 @@ long arch_do_sysctl(
case XEN_SYSCTL_numainfo:
{
- uint32_t i, max_node_index;
- XEN_GUEST_HANDLE_64(uint64) node_to_memsize_arr;
- XEN_GUEST_HANDLE_64(uint64) node_to_memfree_arr;
- XEN_GUEST_HANDLE_64(uint32) node_to_node_distance_arr;
-
+ uint32_t i, j, max_node_index, last_online_node;
xen_sysctl_numainfo_t *ni = &sysctl->u.numainfo;
- max_node_index = ni->max_node_index;
- node_to_memsize_arr = ni->node_to_memsize;
- node_to_memfree_arr = ni->node_to_memfree;
- node_to_node_distance_arr = ni->node_to_node_distance;
-
- memset(ni, 0, sizeof(*ni));
- ni->node_to_memsize = node_to_memsize_arr;
- ni->node_to_memfree = node_to_memfree_arr;
- ni->node_to_node_distance = node_to_node_distance_arr;
-
- max_node_index = min_t(uint32_t, max_node_index, num_online_nodes());
- ni->max_node_index = max_node_index;
-
- ret = 0;
+ last_online_node = last_node(node_online_map);
+ max_node_index = min_t(uint32_t, ni->max_node_index, last_online_node);
+ ni->max_node_index = last_online_node;
- for ( i = 0; i < max_node_index; i++ )
+ for ( i = 0; i <= max_node_index; i++ )
{
- if ( !guest_handle_is_null(node_to_memsize_arr) )
+ if ( !guest_handle_is_null(ni->node_to_memsize) )
{
uint64_t memsize = node_online(i) ?
node_spanned_pages(i) << PAGE_SHIFT : 0ul;
- if ( copy_to_guest_offset(node_to_memsize_arr, i, &memsize, 1) )
- {
- ret = -EFAULT;
+ if ( copy_to_guest_offset(ni->node_to_memsize, i, &memsize, 1) )
break;
- }
}
- if ( !guest_handle_is_null(node_to_memfree_arr) )
+ if ( !guest_handle_is_null(ni->node_to_memfree) )
{
uint64_t memfree = node_online(i) ?
avail_node_heap_pages(i) << PAGE_SHIFT : 0ul;
- if ( copy_to_guest_offset(node_to_memfree_arr, i, &memfree, 1) )
- {
- ret = -EFAULT;
+ if ( copy_to_guest_offset(ni->node_to_memfree, i, &memfree, 1) )
break;
- }
}
- if ( !guest_handle_is_null(node_to_node_distance_arr) )
- {
- int j;
- for ( j = 0; j < max_node_index; j++)
+ if ( !guest_handle_is_null(ni->node_to_node_distance) )
+ {
+ for ( j = 0; j <= max_node_index; j++)
{
uint32_t distance = ~0u;
- if (node_online(i) && node_online (j))
+ if ( node_online(i) && node_online(j) )
distance = __node_distance(i, j);
-
- if ( copy_to_guest_offset(node_to_node_distance_arr,
- (i * max_node_index + j), &distance, 1) )
- {
- ret = -EFAULT;
+ if ( copy_to_guest_offset(
+ ni->node_to_node_distance,
+ i*(max_node_index+1) + j, &distance, 1) )
break;
- }
}
+ if ( j <= max_node_index )
+ break;
}
}
- if (ret)
- break;
- if ( copy_to_guest(u_sysctl, sysctl, 1) )
- ret = -EFAULT;
+ ret = ((i <= max_node_index) || copy_to_guest(u_sysctl, sysctl, 1))
+ ? -EFAULT : 0;
}
break;