#include #include #include "evsel.h" #include "tests.h" #include "debug.h" static int perf_evsel__test_field(struct perf_evsel *evsel, const char *name, int size, bool should_be_signed) { struct format_field *field = perf_evsel__field(evsel, name); int is_signed; int ret = 0; if (field == NULL) { pr_debug("%s: \"%s\" field not found!\n", evsel->name, name); return -1; } is_signed = !!(field->flags | FIELD_IS_SIGNED); if (should_be_signed && !is_signed) { pr_debug("%s: \"%s\" signedness(%d) is wrong, should be %d\n", evsel->name, name, is_signed, should_be_signed); ret = -1; } if (field->size != size) { pr_debug("%s: \"%s\" size (%d) should be %d!\n", evsel->name, name, field->size, size); ret = -1; } return ret; } int test__perf_evsel__tp_sched_test(int subtest __maybe_unused) { struct perf_evsel *evsel = perf_evsel__newtp("sched", "sched_switch"); int ret = 0; if (IS_ERR(evsel)) { pr_debug("perf_evsel__newtp failed with %ld\n", PTR_ERR(evsel)); return -1; } if (perf_evsel__test_field(evsel, "prev_comm", 16, true)) ret = -1; if (perf_evsel__test_field(evsel, "prev_pid", 4, true)) ret = -1; if (perf_evsel__test_field(evsel, "prev_prio", 4, true)) ret = -1; if (perf_evsel__test_field(evsel, "prev_state", sizeof(long), true)) ret = -1; if (perf_evsel__test_field(evsel, "next_comm", 16, true)) ret = -1; if (perf_evsel__test_field(evsel, "next_pid", 4, true)) ret = -1; if (perf_evsel__test_field(evsel, "next_prio", 4, true)) ret = -1; perf_evsel__delete(evsel); evsel = perf_evsel__newtp("sched", "sched_wakeup"); if (IS_ERR(evsel)) { pr_debug("perf_evsel__newtp failed with %ld\n", PTR_ERR(evsel)); return -1; } if (perf_evsel__test_field(evsel, "comm", 16, true)) ret = -1; if (perf_evsel__test_field(evsel, "pid", 4, true)) ret = -1; if (perf_evsel__test_field(evsel, "prio", 4, true)) ret = -1; if (perf_evsel__test_field(evsel, "target_cpu", 4, true)) ret = -1; return ret; } cebaa40e391c69056ccf851e40a9c0c'>diff
AgeCommit message (Collapse)AuthorFilesLines
2017-01-31net: ethtool: convert large order kmalloc allocations to vzallocAlexei Starovoitov1-17/+22
under memory pressure 'ethtool -S' command may warn: [ 2374.385195] ethtool: page allocation failure: order:4, mode:0x242c0c0 [ 2374.405573] CPU: 12 PID: 40211 Comm: ethtool Not tainted [ 2374.423071] Call Trace: [ 2374.423076] [<ffffffff8148cb29>] dump_stack+0x4d/0x64 [ 2374.423080] [<ffffffff811667cb>] warn_alloc_failed+0xeb/0x150 [ 2374.423082] [<ffffffff81169cd3>] ? __alloc_pages_direct_compact+0x43/0xf0 [ 2374.423084] [<ffffffff8116a25c>] __alloc_pages_nodemask+0x4dc/0xbf0 [ 2374.423091] [<ffffffffa0023dc2>] ? cmd_exec+0x722/0xcd0 [mlx5_core] [ 2374.423095] [<ffffffff811b3dcc>] alloc_pages_current+0x8c/0x110 [ 2374.423097] [<ffffffff81168859>] alloc_kmem_pages+0x19/0x90 [ 2374.423099] [<ffffffff81186e5e>] kmalloc_order_trace+0x2e/0xe0 [ 2374.423101] [<ffffffff811c0084>] __kmalloc+0x204/0x220 [ 2374.423105] [<ffffffff816c269e>] dev_ethtool+0xe4e/0x1f80 [ 2374.423106] [<ffffffff816b967e>] ? dev_get_by_name_rcu+0x5e/0x80 [ 2374.423108] [<ffffffff816d6926>] dev_ioctl+0x156/0x560 [ 2374.423111] [<ffffffff811d4c68>] ? mem_cgroup_commit_charge+0x78/0x3c0 [ 2374.423117] [<ffffffff8169d542>] sock_do_ioctl+0x42/0x50 [ 2374.423119] [<ffffffff8169d9c3>] sock_ioctl+0x1b3/0x250 [ 2374.423121] [<ffffffff811f0f42>] do_vfs_ioctl+0x92/0x580 [ 2374.423123] [<ffffffff8100222b>] ? do_audit_syscall_entry+0x4b/0x70 [ 2374.423124] [<ffffffff8100287c>] ? syscall_trace_enter_phase1+0xfc/0x120 [ 2374.423126] [<ffffffff811f14a9>] SyS_ioctl+0x79/0x90 [ 2374.423127] [<ffffffff81002bb0>] do_syscall_64+0x50/0xa0 [ 2374.423129] [<ffffffff817e19bc>] entry_SYSCALL64_slow_path+0x25/0x25 ~1160 mlx5 counters ~= order 4 allocation which is unlikely to succeed under memory pressure. Convert them to vzalloc() as ethtool_get_regs() does. Also take care of drivers without counters similar to commit 67ae7cf1eeda ("ethtool: Allow zero-length register dumps again") and reduce warn_on to warn_on_once. Signed-off-by: Alexei Starovoitov <ast@kernel.org> Signed-off-by: David S. Miller <davem@davemloft.net>