mirror of
https://github.com/freebsd/freebsd-src
synced 2024-10-02 22:54:52 +00:00
17083b94a9
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 d187154750
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.
Reviewed by: melifaro
Differential Revision: https://reviews.freebsd.org/D42524
40 lines
1 KiB
Python
40 lines
1 KiB
Python
import mmap
|
|
import pytest
|
|
|
|
from atf_python.ktest import BaseKernelTest
|
|
from atf_python.sys.netlink.attrs import NlAttrU32
|
|
|
|
M_NOWAIT = 1
|
|
M_WAITOK = 2
|
|
|
|
NLMSG_SMALL = 128
|
|
NLMSG_LARGE = 2048
|
|
|
|
class TestNetlinkMessageWriter(BaseKernelTest):
|
|
KTEST_MODULE_NAME = "ktest_netlink_message_writer"
|
|
|
|
@pytest.mark.parametrize(
|
|
"malloc_flags",
|
|
[
|
|
pytest.param(M_NOWAIT, id="NOWAIT"),
|
|
pytest.param(M_WAITOK, id="WAITOK"),
|
|
],
|
|
)
|
|
@pytest.mark.parametrize(
|
|
"sz",
|
|
[
|
|
pytest.param([NLMSG_SMALL, NLMSG_SMALL], id="NLMSG_SMALL"),
|
|
pytest.param([NLMSG_LARGE, NLMSG_LARGE], id="NLMSG_LARGE"),
|
|
pytest.param([NLMSG_LARGE + 256, NLMSG_LARGE + 256], id="NLMSG_LARGE+256"),
|
|
],
|
|
)
|
|
def test_nlbuf_writer_allocation(self, sz, malloc_flags):
|
|
"""override to parametrize"""
|
|
|
|
test_meta = [
|
|
NlAttrU32(1, sz[0]), # size
|
|
NlAttrU32(2, sz[1]), # expected_avail
|
|
NlAttrU32(3, malloc_flags),
|
|
]
|
|
self.runtest(test_meta)
|