Currently in tc batch mode, only one command is read from the batch file and sent to kernel to process. With this patchset, we can accumulate several commands before sending to kernel. The batch size is specified using option -bs or -batchsize.
To accumulate the commands in tc, client should allocate an array of struct iovec. If batchsize is bigger than 1, only after the client has accumulated enough commands, can the client call rtnl_talk_msg to send the message that includes the iov array. One exception is that there is no more command in the batch file. But please note that kernel still processes the requests one by one. To process the requests in parallel in kernel is another effort. The time we're saving in this patchset is the user mode and kernel mode context switch. So this patchset works on top of the current kernel. Using the following script in kernel, we can generate 1,000,000 rules. tools/testing/selftests/tc-testing/tdc_batch.py Without this patchset, 'tc -b $file' exection time is: real 0m15.125s user 0m6.982s sys 0m8.080s With this patchset, 'tc -b $file -bs 10' exection time is: real 0m12.772s user 0m5.984s sys 0m6.723s The insertion rate is improved more than 10%. In this patchset, we still ack for every rule. If we don't ack at all, 'tc -b $file' exection time is: real 0m14.484s user 0m6.919s sys 0m7.498s 'tc -b $file -bs 10' exection time is: real 0m11.664s user 0m6.017s sys 0m5.578s We can see that the performance win is to send multiple messages instead of no acking. I think that's because in tc, we don't spend too much time processing the ack message. v3 == 1. Instead of hacking function rtnl_talk directly, add a new function rtnl_talk_msg. 2. remove most of global variables to use parameter passing 3. divide the previous patch into 4 patches. Chris Mi (4): lib/libnetlink: Add a function rtnl_talk_msg utils: Add a function setcmdlinetotal tc: Add -bs option to batch mode man: Add -bs option to tc manpage include/libnetlink.h | 3 ++ include/utils.h | 4 ++ lib/libnetlink.c | 92 ++++++++++++++++++++++++++++++--------- lib/utils.c | 20 +++++++++ man/man8/tc.8 | 5 +++ tc/m_action.c | 91 +++++++++++++++++++++++++++++--------- tc/tc.c | 47 ++++++++++++++++---- tc/tc_common.h | 8 +++- tc/tc_filter.c | 121 +++++++++++++++++++++++++++++++++++++-------------- 9 files changed, 307 insertions(+), 84 deletions(-) -- 2.14.3