Page MenuHomeFreeBSD

netlink: use protocol specific receive buffer
ClosedPublic

Authored by glebius on Nov 9 2023, 6:31 AM.
Tags
None
Referenced Files
Unknown Object (File)
Sun, Nov 3, 1:49 AM
Unknown Object (File)
Tue, Oct 29, 10:35 PM
Unknown Object (File)
Oct 3 2024, 5:41 PM
Unknown Object (File)
Sep 30 2024, 2:44 PM
Unknown Object (File)
Sep 26 2024, 12:33 PM
Unknown Object (File)
Sep 15 2024, 2:54 AM
Unknown Object (File)
Sep 7 2024, 4:10 AM
Unknown Object (File)
Sep 5 2024, 7:05 PM
Subscribers

Details

Summary

Implement Netlink socket receive buffer as a simple TAILQ of nl_buf's,
same part of struct sockbuf that is used for send buffer already.
This shaves a lot of code and a lot of extra processing. The pcb rids
of the I/O queues as the socket buffer is exactly the queue. The
message writer is simplified a lot, as we now always deal with linear
buf. Notion of different buffer types goes away as way as different
kinds of writers. The only things remaining are: a socket writer and
a group writer.
The impact on the network stack is that we no longer use mbufs, so
a workaround from d18715475071 disappears.

Note on message throttling. Now the taskqueue throttling mechanism
needs to look at both socket buffers protected by their respective
locks and on flags in the pcb that are protected by the pcb lock.
There is definitely some room for optimization, but this changes tries
to preserve as much as possible.

Note on new nl_soreceive(). It emulates soreceive_generic(). It
must undergo further optimization, see large comment put in there.

Note on tests/sys/netlink/test_netlink_message_writer.py. This test
boiled down almost to nothing with mbufs removed. However, I left
it with minimal functionality (it basically checks that allocating N
bytes we get N bytes) as it is one of not so many examples of ktest
framework that allows to test KPIs with python.

Note on Linux support. It got much simplier: Netlink message writer
loses notion of Linux support lifetime, it is same regardless of
process ABI. On socket write from Linux process we perform
conversion immediately in nl_receive_message() and on an output
conversion to Linux happens in in nl_send_one(). XXX: both
conversions use M_NOWAIT allocation, which used to be the case
before this change, too.

Diff Detail

Repository
rG FreeBSD src repository
Lint
Lint Skipped
Unit
Tests Skipped
Build Status
Buildable 54348
Build 51238: arc lint + arc unit

Event Timeline

melifaro added inline comments.
sys/netlink/netlink_domain.c
671

Nit: could you move it out from the function?

sys/netlink/netlink_io.c
84

Will that be better? now the implementation logic is kept here

This revision is now accepted and ready to land.Dec 26 2023, 7:02 PM