From a4da0c8b792a35e3e505f58e70d62c299f2e0549 Mon Sep 17 00:00:00 2001 From: "Dmitry V. Levin" Date: Wed, 27 Apr 2016 05:06:06 +0000 Subject: [PATCH] Move parsers of NUMA related syscalls to numa.c * mem.c (get_nodes, SYS_FUNC(mbind), SYS_FUNC(set_mempolicy), SYS_FUNC(get_mempolicy), SYS_FUNC(migrate_pages), SYS_FUNC(move_pages)): Move ... * numa.c: ... here. * Makefile.am (strace_SOURCES): Add numa.c --- Makefile.am | 1 + mem.c | 166 ------------------------------------------- numa.c | 197 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 198 insertions(+), 166 deletions(-) create mode 100644 numa.c diff --git a/Makefile.am b/Makefile.am index 96146dd0..b14f8ed8 100644 --- a/Makefile.am +++ b/Makefile.am @@ -152,6 +152,7 @@ strace_SOURCES = \ mtd.c \ native_defs.h \ net.c \ + numa.c \ open.c \ or1k_atomic.c \ pathtrace.c \ diff --git a/mem.c b/mem.c index 09d1af91..ec931ea1 100644 --- a/mem.c +++ b/mem.c @@ -315,172 +315,6 @@ SYS_FUNC(remap_file_pages) return RVAL_DECODED; } -#include "xlat/policies.h" -#include "xlat/mbindflags.h" -#include "xlat/mempolicyflags.h" -#include "xlat/move_pages_flags.h" - -static void -get_nodes(struct tcb *tcp, unsigned long ptr, unsigned long maxnodes, int err) -{ - unsigned long nlongs, size, end; - - nlongs = (maxnodes + 8 * sizeof(long) - 1) / (8 * sizeof(long)); - size = nlongs * sizeof(long); - end = ptr + size; - if (nlongs == 0 || ((err || verbose(tcp)) && (size * 8 == maxnodes) - && (end > ptr))) { - unsigned long n, cur, abbrev_end; - int failed = 0; - - if (abbrev(tcp)) { - abbrev_end = ptr + max_strlen * sizeof(long); - if (abbrev_end < ptr) - abbrev_end = end; - } else { - abbrev_end = end; - } - tprints(", {"); - for (cur = ptr; cur < end; cur += sizeof(long)) { - if (cur > ptr) - tprints(", "); - if (cur >= abbrev_end) { - tprints("..."); - break; - } - if (umoven(tcp, cur, sizeof(n), &n) < 0) { - tprints("?"); - failed = 1; - break; - } - tprintf("%#0*lx", (int) sizeof(long) * 2 + 2, n); - } - tprints("}"); - if (failed) { - tprints(" "); - printaddr(ptr); - } - } else { - tprints(" "); - printaddr(ptr); - } - tprintf(", %lu", maxnodes); -} - -SYS_FUNC(mbind) -{ - printaddr(tcp->u_arg[0]); - tprintf(", %lu, ", tcp->u_arg[1]); - printxval(policies, tcp->u_arg[2], "MPOL_???"); - get_nodes(tcp, tcp->u_arg[3], tcp->u_arg[4], 0); - tprints(", "); - printflags(mbindflags, tcp->u_arg[5], "MPOL_???"); - - return RVAL_DECODED; -} - -SYS_FUNC(set_mempolicy) -{ - printxval(policies, tcp->u_arg[0], "MPOL_???"); - get_nodes(tcp, tcp->u_arg[1], tcp->u_arg[2], 0); - - return RVAL_DECODED; -} - -SYS_FUNC(get_mempolicy) -{ - if (exiting(tcp)) { - int pol; - if (!umove_or_printaddr(tcp, tcp->u_arg[0], &pol)) - printxval(policies, pol, "MPOL_???"); - get_nodes(tcp, tcp->u_arg[1], tcp->u_arg[2], syserror(tcp)); - tprints(", "); - printaddr(tcp->u_arg[3]); - tprints(", "); - printflags(mempolicyflags, tcp->u_arg[4], "MPOL_???"); - } - return 0; -} - -SYS_FUNC(migrate_pages) -{ - tprintf("%ld, ", (long) (pid_t) tcp->u_arg[0]); - get_nodes(tcp, tcp->u_arg[2], tcp->u_arg[1], 0); - tprints(", "); - get_nodes(tcp, tcp->u_arg[3], tcp->u_arg[1], 0); - - return RVAL_DECODED; -} - -SYS_FUNC(move_pages) -{ - if (entering(tcp)) { - unsigned long npages = tcp->u_arg[1]; - tprintf("%ld, %lu, ", tcp->u_arg[0], npages); - if (tcp->u_arg[2] == 0) - tprints("NULL, "); - else { - unsigned int i; - long puser = tcp->u_arg[2]; - tprints("{"); - for (i = 0; i < npages; ++i) { - void *p; - if (i > 0) - tprints(", "); - if (umove(tcp, puser, &p) < 0) { - tprints("???"); - break; - } - tprintf("%p", p); - puser += sizeof(void *); - } - tprints("}, "); - } - if (tcp->u_arg[3] == 0) - tprints("NULL, "); - else { - unsigned int i; - long nodeuser = tcp->u_arg[3]; - tprints("{"); - for (i = 0; i < npages; ++i) { - int node; - if (i > 0) - tprints(", "); - if (umove(tcp, nodeuser, &node) < 0) { - tprints("???"); - break; - } - tprintf("%#x", node); - nodeuser += sizeof(int); - } - tprints("}, "); - } - } else { - unsigned long npages = tcp->u_arg[1]; - if (tcp->u_arg[4] == 0) - tprints("NULL, "); - else { - unsigned int i; - long statususer = tcp->u_arg[4]; - tprints("{"); - for (i = 0; i < npages; ++i) { - int status; - if (i > 0) - tprints(", "); - if (umove(tcp, statususer, &status) < 0) { - tprints("???"); - break; - } - tprintf("%#x", status); - statususer += sizeof(int); - } - tprints("}, "); - } - printflags(move_pages_flags, tcp->u_arg[5], "MPOL_???"); - } - return 0; -} - #if defined(POWERPC) SYS_FUNC(subpage_prot) { diff --git a/numa.c b/numa.c new file mode 100644 index 00000000..3beb0788 --- /dev/null +++ b/numa.c @@ -0,0 +1,197 @@ +/* + * Copyright (c) 2003-2007 Ulrich Drepper + * Copyright (c) 2005-2016 Dmitry V. Levin + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "defs.h" + +static void +get_nodes(struct tcb *tcp, unsigned long ptr, unsigned long maxnodes, int err) +{ + unsigned long nlongs, size, end; + + nlongs = (maxnodes + 8 * sizeof(long) - 1) / (8 * sizeof(long)); + size = nlongs * sizeof(long); + end = ptr + size; + if (nlongs == 0 || ((err || verbose(tcp)) && (size * 8 == maxnodes) + && (end > ptr))) { + unsigned long n, cur, abbrev_end; + int failed = 0; + + if (abbrev(tcp)) { + abbrev_end = ptr + max_strlen * sizeof(long); + if (abbrev_end < ptr) + abbrev_end = end; + } else { + abbrev_end = end; + } + tprints(", {"); + for (cur = ptr; cur < end; cur += sizeof(long)) { + if (cur > ptr) + tprints(", "); + if (cur >= abbrev_end) { + tprints("..."); + break; + } + if (umoven(tcp, cur, sizeof(n), &n) < 0) { + tprints("?"); + failed = 1; + break; + } + tprintf("%#0*lx", (int) sizeof(long) * 2 + 2, n); + } + tprints("}"); + if (failed) { + tprints(" "); + printaddr(ptr); + } + } else { + tprints(" "); + printaddr(ptr); + } + tprintf(", %lu", maxnodes); +} + +SYS_FUNC(migrate_pages) +{ + tprintf("%ld, ", (long) (pid_t) tcp->u_arg[0]); + get_nodes(tcp, tcp->u_arg[2], tcp->u_arg[1], 0); + tprints(", "); + get_nodes(tcp, tcp->u_arg[3], tcp->u_arg[1], 0); + + return RVAL_DECODED; +} + +#include "xlat/policies.h" +#include "xlat/mbindflags.h" + +SYS_FUNC(mbind) +{ + printaddr(tcp->u_arg[0]); + tprintf(", %lu, ", tcp->u_arg[1]); + printxval(policies, tcp->u_arg[2], "MPOL_???"); + get_nodes(tcp, tcp->u_arg[3], tcp->u_arg[4], 0); + tprints(", "); + printflags(mbindflags, tcp->u_arg[5], "MPOL_???"); + + return RVAL_DECODED; +} + +SYS_FUNC(set_mempolicy) +{ + printxval(policies, tcp->u_arg[0], "MPOL_???"); + get_nodes(tcp, tcp->u_arg[1], tcp->u_arg[2], 0); + + return RVAL_DECODED; +} + +#include "xlat/mempolicyflags.h" + +SYS_FUNC(get_mempolicy) +{ + if (exiting(tcp)) { + int pol; + if (!umove_or_printaddr(tcp, tcp->u_arg[0], &pol)) + printxval(policies, pol, "MPOL_???"); + get_nodes(tcp, tcp->u_arg[1], tcp->u_arg[2], syserror(tcp)); + tprints(", "); + printaddr(tcp->u_arg[3]); + tprints(", "); + printflags(mempolicyflags, tcp->u_arg[4], "MPOL_???"); + } + return 0; +} + +#include "xlat/move_pages_flags.h" + +SYS_FUNC(move_pages) +{ + if (entering(tcp)) { + unsigned long npages = tcp->u_arg[1]; + tprintf("%ld, %lu, ", tcp->u_arg[0], npages); + if (tcp->u_arg[2] == 0) + tprints("NULL, "); + else { + unsigned int i; + long puser = tcp->u_arg[2]; + tprints("{"); + for (i = 0; i < npages; ++i) { + void *p; + if (i > 0) + tprints(", "); + if (umove(tcp, puser, &p) < 0) { + tprints("???"); + break; + } + tprintf("%p", p); + puser += sizeof(void *); + } + tprints("}, "); + } + if (tcp->u_arg[3] == 0) + tprints("NULL, "); + else { + unsigned int i; + long nodeuser = tcp->u_arg[3]; + tprints("{"); + for (i = 0; i < npages; ++i) { + int node; + if (i > 0) + tprints(", "); + if (umove(tcp, nodeuser, &node) < 0) { + tprints("???"); + break; + } + tprintf("%#x", node); + nodeuser += sizeof(int); + } + tprints("}, "); + } + } else { + unsigned long npages = tcp->u_arg[1]; + if (tcp->u_arg[4] == 0) + tprints("NULL, "); + else { + unsigned int i; + long statususer = tcp->u_arg[4]; + tprints("{"); + for (i = 0; i < npages; ++i) { + int status; + if (i > 0) + tprints(", "); + if (umove(tcp, statususer, &status) < 0) { + tprints("???"); + break; + } + tprintf("%#x", status); + statususer += sizeof(int); + } + tprints("}, "); + } + printflags(move_pages_flags, tcp->u_arg[5], "MPOL_???"); + } + return 0; +} -- 2.40.0