Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Design proposal for new ring buffer API #3848

Open
wants to merge 18 commits into
base: main
Choose a base branch
from

Conversation

mikeagun
Copy link
Contributor

@mikeagun mikeagun commented Sep 18, 2024

Description

Add docs/RingBuffer.md with proposal for new ebpf ring buffer map API exposing mapped memory so consumers can directly read the records written by the producer (similar to linux mmap/epoll style ring buffer consumer).

Testing

N/A

Documentation

Documentation only.

Installation

N/A

Alan-Jowett
Alan-Jowett previously approved these changes Sep 23, 2024
@mikeagun mikeagun changed the title New ringbuffer proposal Design proposal for new ring buffer API Sep 24, 2024
docs/RingBuffer.md Outdated Show resolved Hide resolved
docs/RingBuffer.md Outdated Show resolved Hide resolved
docs/RingBuffer.md Outdated Show resolved Hide resolved
@mikeagun mikeagun marked this pull request as draft October 2, 2024 22:51
@mikeagun
Copy link
Contributor Author

mikeagun commented Oct 2, 2024

Converting to draft while I make a few design updates.

@mikeagun mikeagun marked this pull request as ready for review October 3, 2024 19:03
docs/RingBuffer.md Outdated Show resolved Hide resolved
docs/RingBuffer.md Outdated Show resolved Hide resolved
docs/RingBuffer.md Outdated Show resolved Hide resolved
matthewige
matthewige previously approved these changes Oct 9, 2024
docs/RingBuffer.md Outdated Show resolved Hide resolved
docs/RingBuffer.md Outdated Show resolved Hide resolved
Copy link
Member

@Alan-Jowett Alan-Jowett left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please fix the sample code. Its broken as it will not work correctly on weakly ordered systems (ARM64 as an example).

docs/RingBuffer.md Outdated Show resolved Hide resolved
Splits the design so callback consumers use the existing libbpf APIs,
and mapped memory consumers use the new windows-specific functions.
docs/RingBuffer.md Outdated Show resolved Hide resolved
shpalani
shpalani previously approved these changes Oct 26, 2024
docs/RingBuffer.md Show resolved Hide resolved
docs/RingBuffer.md Outdated Show resolved Hide resolved
docs/RingBuffer.md Outdated Show resolved Hide resolved
docs/RingBuffer.md Outdated Show resolved Hide resolved
docs/RingBuffer.md Show resolved Hide resolved
docs/RingBuffer.md Outdated Show resolved Hide resolved
docs/RingBuffer.md Outdated Show resolved Hide resolved
docs/RingBuffer.md Outdated Show resolved Hide resolved
docs/RingBuffer.md Outdated Show resolved Hide resolved
docs/RingBuffer.md Outdated Show resolved Hide resolved
docs/RingBuffer.md Outdated Show resolved Hide resolved
*
* @returns Pointer to consumer offset
*/
uint64_t* rb__consumer_offset(void *cons);
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does this exact same prototype exist on Linux? I couldn't find it, I could only find
https://github.com/torvalds/linux/blob/master/include/uapi/linux/bpf.h#L4558 as a helper function.
This doesn't follow https://github.com/microsoft/ebpf-for-windows/blob/main/docs/DevelopmentGuide.md#coding-conventions so is only ok if it's identical to Linux.

*
* @returns Pointer to producer offset
*/
volatile const uint64_t* rb__producer_offset(volatile const void *prod);
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does this exact same prototype exist on Linux? I couldn't find it, I could only find
https://github.com/torvalds/linux/blob/master/include/uapi/linux/bpf.h#L4558

docs/RingBuffer.md Show resolved Hide resolved
Michael Agun added 2 commits January 8, 2025 11:18
Copy link
Collaborator

@lmb lmb left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for this, the "Memory mapped consumers" API is pretty much what is necessary for a native ringbuf reader for ebpf-go. Left some comments, excited to see this take shape!

*
* @returns Wait handle
*/
HANDLE ebpf_ring_buffer_get_wait_handle(fd_t map_fd);
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
HANDLE ebpf_ring_buffer_get_wait_handle(fd_t map_fd);
ebpf_handle_t ebpf_ring_buffer_get_wait_handle(fd_t map_fd);

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same question as above, can I get multiple handles? Do I need to close this?

* @retval EBPF_SUCCESS The operation was successful.
* @retval other An error occurred.
*/
ebpf_result_t ebpf_ring_buffer_get_buffer(fd_t map_fd, _Out_ void **producer, _Out_ void **consumer);
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does this return the same buffer every time it's called? How long is the mapping valid for? Until the fd is closed?

pages mapped into user space, and `ebpf_ring_buffer_get_wait_handle()` to get the SynchronizationEvent (auto-reset) KEVENT
to use with `WaitForSingleObject`/`WaitForMultipleObject`.

Similar to the linux memory layout, the first page of the producer and consumer memory is the "producer page" and "consumer page",
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Are you going to document the layout, or are users required to use the C helpers to retrieve offsets?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

8 participants