Thread (20 messages) 20 messages, 4 authors, 2023-12-25

Re: [PATCH bpf-next 1/3] bpf: implement relay map basis

From: Hou Tao <hidden>
Date: 2023-12-25 13:06:35
Also in: bpf

Hi,

On 12/25/2023 7:36 PM, Philo Lu wrote:
On 2023/12/23 21:02, Philo Lu wrote:
quoted

On 2023/12/23 19:22, Hou Tao wrote:
quoted
Hi,

On 12/22/2023 8:21 PM, Philo Lu wrote:
quoted
BPF_MAP_TYPE_RELAY is implemented based on relay interface, which
creates per-cpu buffer to transfer data. Each buffer is essentially a
list of fix-sized sub-buffers, and is exposed to user space as
files in
debugfs. attr->max_entries is used as subbuf size and
attr->map_extra is
used as subbuf num. Currently, the default value of subbuf num is 8.

The data can be accessed by read or mmap via these files. For example,
if there are 2 cpus, files could be `/sys/kernel/debug/mydir/my_rmap0`
and `/sys/kernel/debug/mydir/my_rmap1`.

Buffer-only mode is used to create the relay map, which just allocates
the buffer without creating user-space files. Then user can setup the
files with map_update_elem, thus allowing user to define the directory
name in debugfs. map_update_elem is implemented in the following
patch.

A new map flag named BPF_F_OVERWRITE is introduced to set overwrite
mode
of relay map.
Beside adding a new map type, could we consider only use kfuncs to
support the creation of rchan and the write of rchan ? I think
bpf_cpumask will be a good reference.
This is a good question. TBH, I have thought of implement it with
helpers (I'm not very familiar with kfuncs, but I think they could be
similar?), but I was stumped by how to close the channel. We can
create a relay channel, hold it with a map, but it could be difficult
for the bpf program to close the channel with relay_close(). And I
think it could be the difference compared with bpf_cpumask.
I've learned more about kfunc and kptr, and find that kptr can be
automatically released with a given map. Then, it is technically
feasible to use relay interface with kfuncs. Specificially, creating a
relay channel and getting the pointer with kfunc, transferring it as a
kptr into a map, and then it lives with the map.
Yes. kptr of bpf_cpumask can be destroyed by the freeing of map or doing
it explicitly through bpf_kptr_xchg() and release kfunc.
Though I'm not sure if this is better than map-based implementation,
as mostly it will be used with a map (I haven't thought of a case
without a map yet). And with kfunc, it will be a little more complex
to create a relay channel.
The motivation for requesting to implement BPF_MAP_TYPE_REPLAY through
kfunc is that Alexei had expressed the tendency to freeze the stable map
type [1] and to implement new map type through kfunc. However we can let
the maintainers to decide which way is better and more acceptable.

[1]
https://lore.kernel.org/bpf/CAEf4BzZTYcGNVWL7gSPHCqao_Ehx_3P7YK6r+p_-hrvpE8fEvA@mail.gmail.com/T/ (local)
Thanks.
  
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help