diff options
author | Keir Fraser <keir.fraser@citrix.com> | 2010-04-13 13:27:46 +0100 |
---|---|---|
committer | Keir Fraser <keir.fraser@citrix.com> | 2010-04-13 13:27:46 +0100 |
commit | 66ff9844c1e1eeeadddc2e51dbc5c57fa8671ea7 (patch) | |
tree | 2843a6e6d1611cefec8b02e929642d7efa63eced /xen/arch/x86/sysctl.c | |
parent | 7da1c9269c679a7bc71b498c5bd0b1872445cd66 (diff) | |
download | xen-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.c | 65 |
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; |