#include "tests.h" #include #include "cpumap.h" #include "event.h" #include #include #include "debug.h" struct machine; static int process_event_mask(struct perf_tool *tool __maybe_unused, union perf_event *event, struct perf_sample *sample __maybe_unused, struct machine *machine __maybe_unused) { struct cpu_map_event *map_event = &event->cpu_map; struct cpu_map_mask *mask; struct cpu_map_data *data; struct cpu_map *map; int i; data = &map_event->data; TEST_ASSERT_VAL("wrong type", data->type == PERF_CPU_MAP__MASK); mask = (struct cpu_map_mask *)data->data; TEST_ASSERT_VAL("wrong nr", mask->nr == 1); for (i = 0; i < 20; i++) { TEST_ASSERT_VAL("wrong cpu", test_bit(i, mask->mask)); } map = cpu_map__new_data(data); TEST_ASSERT_VAL("wrong nr", map->nr == 20); for (i = 0; i < 20; i++) { TEST_ASSERT_VAL("wrong cpu", map->map[i] == i); } cpu_map__put(map); return 0; } static int process_event_cpus(struct perf_tool *tool __maybe_unused, union perf_event *event, struct perf_sample *sample __maybe_unused, struct machine *machine __maybe_unused) { struct cpu_map_event *map_event = &event->cpu_map; struct cpu_map_entries *cpus; struct cpu_map_data *data; struct cpu_map *map; data = &map_event->data; TEST_ASSERT_VAL("wrong type", data->type == PERF_CPU_MAP__CPUS); cpus = (struct cpu_map_entries *)data->data; TEST_ASSERT_VAL("wrong nr", cpus->nr == 2); TEST_ASSERT_VAL("wrong cpu", cpus->cpu[0] == 1); TEST_ASSERT_VAL("wrong cpu", cpus->cpu[1] == 256); map = cpu_map__new_data(data); TEST_ASSERT_VAL("wrong nr", map->nr == 2); TEST_ASSERT_VAL("wrong cpu", map->map[0] == 1); TEST_ASSERT_VAL("wrong cpu", map->map[1] == 256); TEST_ASSERT_VAL("wrong refcnt", atomic_read(&map->refcnt) == 1); cpu_map__put(map); return 0; } int test__cpu_map_synthesize(int subtest __maybe_unused) { struct cpu_map *cpus; /* This one is better stores in mask. */ cpus = cpu_map__new("0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19"); TEST_ASSERT_VAL("failed to synthesize map", !perf_event__synthesize_cpu_map(NULL, cpus, process_event_mask, NULL)); cpu_map__put(cpus); /* This one is better stores in cpu values. */ cpus = cpu_map__new("1,256"); TEST_ASSERT_VAL("failed to synthesize map", !perf_event__synthesize_cpu_map(NULL, cpus, process_event_cpus, NULL)); cpu_map__put(cpus); return 0; } static int cpu_map_print(const char *str) { struct cpu_map *map = cpu_map__new(str); char buf[100]; if (!map) return -1; cpu_map__snprint(map, buf, sizeof(buf)); return !strcmp(buf, str); } int test__cpu_map_print(int subtest __maybe_unused) { TEST_ASSERT_VAL("failed to convert map", cpu_map_print("1")); TEST_ASSERT_VAL("failed to convert map", cpu_map_print("1,5")); TEST_ASSERT_VAL("failed to convert map", cpu_map_print("1,3,5,7,9,11,13,15,17,19,21-40")); TEST_ASSERT_VAL("failed to convert map", cpu_map_print("2-5")); TEST_ASSERT_VAL("failed to convert map", cpu_map_print("1,3-6,8-10,24,35-37")); TEST_ASSERT_VAL("failed to convert map", cpu_map_print("1,3-6,8-10,24,35-37")); TEST_ASSERT_VAL("failed to convert map", cpu_map_print("1-10,12-20,22-30,32-40")); return 0; } ion value='3' selected='selected'>3space:mode:
authorJulian Anastasov <ja@ssi.bg>2017-02-06 23:14:15 +0200
committerDavid S. Miller <davem@davemloft.net>2017-02-07 13:07:46 -0500
commit63fca65d08632fbec9d9b655f671cf08aa1aeeb8 (patch)
tree103ac18cddcdf911a8589f52fbcefb7140411a51 /net/ipv4
parentc3a2e8370534f810cac6050169db0ed3e0f94f0b (diff)
net: add confirm_neigh method to dst_ops
Add confirm_neigh method to dst_ops and use it from IPv4 and IPv6 to lookup and confirm the neighbour. Its usage via the new helper dst_confirm_neigh() should be restricted to MSG_PROBE users for performance reasons. For XFRM prefer the last tunnel address, if present. With help from Steffen Klassert. Signed-off-by: Julian Anastasov <ja@ssi.bg> Acked-by: Steffen Klassert <steffen.klassert@secunet.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv4')
-rw-r--r--net/ipv4/route.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/net/ipv4/route.c b/net/ipv4/route.c