Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933139AbbGVIKM (ORCPT ); Wed, 22 Jul 2015 04:10:12 -0400 Received: from szxga01-in.huawei.com ([58.251.152.64]:36863 "EHLO szxga01-in.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756156AbbGVIKA (ORCPT ); Wed, 22 Jul 2015 04:10:00 -0400 From: Kaixu Xia To: , , , , , , CC: , , , , Subject: [PATCH v2 2/5] bpf: Add function map->ops->map_traverse_elem() to traverse map elems Date: Wed, 22 Jul 2015 08:09:29 +0000 Message-ID: <1437552572-84748-3-git-send-email-xiakaixu@huawei.com> X-Mailer: git-send-email 1.8.3.4 In-Reply-To: <1437552572-84748-1-git-send-email-xiakaixu@huawei.com> References: <1437552572-84748-1-git-send-email-xiakaixu@huawei.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [10.107.193.250] X-CFilter-Loop: Reflected Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2338 Lines: 73 We want to traverse the map elements and make use of the map value one by one. So add new function map->ops->map_traverse_elem() to traverse map elements. Signed-off-by: Kaixu Xia --- include/linux/bpf.h | 3 +++ kernel/bpf/arraymap.c | 17 +++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/include/linux/bpf.h b/include/linux/bpf.h index f6a2442..257149c 100644 --- a/include/linux/bpf.h +++ b/include/linux/bpf.h @@ -15,6 +15,8 @@ struct bpf_map; +typedef int (*bpf_map_traverse_callback)(void *value); + /* map is generic key/value storage optionally accesible by eBPF programs */ struct bpf_map_ops { /* funcs callable from userspace (via syscall) */ @@ -26,6 +28,7 @@ struct bpf_map_ops { void *(*map_lookup_elem)(struct bpf_map *map, void *key); int (*map_update_elem)(struct bpf_map *map, void *key, void *value, u64 flags); int (*map_delete_elem)(struct bpf_map *map, void *key); + int (*map_traverse_elem)(bpf_map_traverse_callback func, struct bpf_map *map); }; struct bpf_map { diff --git a/kernel/bpf/arraymap.c b/kernel/bpf/arraymap.c index 183c1f7..410bc40 100644 --- a/kernel/bpf/arraymap.c +++ b/kernel/bpf/arraymap.c @@ -276,12 +276,29 @@ static int perf_event_array_map_get_next_key(struct bpf_map *map, void *key, return -EINVAL; } +static int perf_event_array_map_traverse_elem(bpf_map_traverse_callback func, + struct bpf_map *map) +{ + struct bpf_array *array = container_of(map, struct bpf_array, map); + void *value; + int i; + + for(i = 0; i < array->map.max_entries; i++) { + value = array->value + array->elem_size * i; + + func(value); + } + + return 0; +} + static const struct bpf_map_ops perf_event_array_ops = { .map_alloc = perf_event_array_map_alloc, .map_free = array_map_free, .map_get_next_key = perf_event_array_map_get_next_key, .map_lookup_elem = array_map_lookup_elem, .map_delete_elem = array_map_delete_elem, + .map_traverse_elem = perf_event_array_map_traverse_elem, }; static struct bpf_map_type_list perf_event_array_type __read_mostly = { -- 1.8.3.4 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/