|
@@ -67,7 +67,7 @@ nfp_map_ptr_record(struct nfp_app_bpf *bpf, struct nfp_prog *nfp_prog,
|
|
|
ASSERT_RTNL();
|
|
|
|
|
|
/* Reuse path - other offloaded program is already tracking this map. */
|
|
|
- record = rhashtable_lookup_fast(&bpf->maps_neutral, &map,
|
|
|
+ record = rhashtable_lookup_fast(&bpf->maps_neutral, &map->id,
|
|
|
nfp_bpf_maps_neutral_params);
|
|
|
if (record) {
|
|
|
nfp_prog->map_records[nfp_prog->map_records_cnt++] = record;
|
|
@@ -89,6 +89,7 @@ nfp_map_ptr_record(struct nfp_app_bpf *bpf, struct nfp_prog *nfp_prog,
|
|
|
}
|
|
|
|
|
|
record->ptr = map;
|
|
|
+ record->map_id = map->id;
|
|
|
record->count = 1;
|
|
|
|
|
|
err = rhashtable_insert_fast(&bpf->maps_neutral, &record->l,
|
|
@@ -457,15 +458,17 @@ int nfp_bpf_event_output(struct nfp_app_bpf *bpf, const void *data,
|
|
|
unsigned int len)
|
|
|
{
|
|
|
struct cmsg_bpf_event *cbe = (void *)data;
|
|
|
- u32 pkt_size, data_size;
|
|
|
- struct bpf_map *map;
|
|
|
+ struct nfp_bpf_neutral_map *record;
|
|
|
+ u32 pkt_size, data_size, map_id;
|
|
|
+ u64 map_id_full;
|
|
|
|
|
|
if (len < sizeof(struct cmsg_bpf_event))
|
|
|
return -EINVAL;
|
|
|
|
|
|
pkt_size = be32_to_cpu(cbe->pkt_size);
|
|
|
data_size = be32_to_cpu(cbe->data_size);
|
|
|
- map = (void *)(unsigned long)be64_to_cpu(cbe->map_ptr);
|
|
|
+ map_id_full = be64_to_cpu(cbe->map_ptr);
|
|
|
+ map_id = map_id_full;
|
|
|
|
|
|
if (len < sizeof(struct cmsg_bpf_event) + pkt_size + data_size)
|
|
|
return -EINVAL;
|
|
@@ -473,15 +476,16 @@ int nfp_bpf_event_output(struct nfp_app_bpf *bpf, const void *data,
|
|
|
return -EINVAL;
|
|
|
|
|
|
rcu_read_lock();
|
|
|
- if (!rhashtable_lookup_fast(&bpf->maps_neutral, &map,
|
|
|
- nfp_bpf_maps_neutral_params)) {
|
|
|
+ record = rhashtable_lookup_fast(&bpf->maps_neutral, &map_id,
|
|
|
+ nfp_bpf_maps_neutral_params);
|
|
|
+ if (!record || map_id_full > U32_MAX) {
|
|
|
rcu_read_unlock();
|
|
|
- pr_warn("perf event: dest map pointer %px not recognized, dropping event\n",
|
|
|
- map);
|
|
|
+ cmsg_warn(bpf, "perf event: map id %lld (0x%llx) not recognized, dropping event\n",
|
|
|
+ map_id_full, map_id_full);
|
|
|
return -EINVAL;
|
|
|
}
|
|
|
|
|
|
- bpf_event_output(map, be32_to_cpu(cbe->cpu_id),
|
|
|
+ bpf_event_output(record->ptr, be32_to_cpu(cbe->cpu_id),
|
|
|
&cbe->data[round_up(pkt_size, 4)], data_size,
|
|
|
cbe->data, pkt_size, nfp_bpf_perf_event_copy);
|
|
|
rcu_read_unlock();
|