netifd: add a packet steering mode matching the old script
authorFelix Fietkau <nbd@nbd.name>
Wed, 24 Apr 2024 17:16:05 +0000 (19:16 +0200)
committerFelix Fietkau <nbd@nbd.name>
Wed, 24 Apr 2024 17:16:42 +0000 (19:16 +0200)
This spreads packet processing across all cores

Signed-off-by: Felix Fietkau <nbd@nbd.name>
package/network/config/netifd/files/usr/libexec/network/packet-steering.uc

index 72f96024d8101b10213a1f0626030b0f01019e1d..1b9695dc0e686b9554ed3fdb4954d17acc269955 100755 (executable)
@@ -9,6 +9,7 @@ let eth_bias = 2.0;
 let debug = 0, do_nothing = 0;
 let disable;
 let cpus;
+let all_cpus;
 
 for (let arg in ARGV) {
        switch (arg) {
@@ -21,6 +22,9 @@ for (let arg in ARGV) {
        case '0':
                disable = true;
                break;
+       case '2':
+               all_cpus = true;
+               break;
        }
 }
 
@@ -46,9 +50,19 @@ function set_task_cpu(pid, cpu) {
                system(`taskset -p -c ${cpu} ${pid}`);
 }
 
+function cpu_mask(cpu)
+{
+       let mask;
+       if (cpu < 0)
+               mask = (1 << length(cpus)) - 1;
+       else
+               mask = (1 << int(cpu));
+       return sprintf("%x", mask);
+}
+
 function set_netdev_cpu(dev, cpu) {
        let queues = glob(`/sys/class/net/${dev}/queues/rx-*/rps_cpus`);
-       let val = sprintf("%x", (1 << int(cpu)));
+       let val = cpu_mask(cpu);
        if (disable)
                val = 0;
        for (let queue in queues) {
@@ -173,7 +187,12 @@ function assign_dev_cpu(dev) {
        }
 
        if (length(dev.netdev) > 0) {
-               let cpu = dev.rx_cpu = get_next_cpu(rx_weight, dev.napi_cpu);
+               let cpu;
+               if (all_cpus)
+                       cpu = -1;
+               else
+                       get_next_cpu(rx_weight, dev.napi_cpu);
+               dev.rx_cpu = cpu;
                for (let netdev in dev.netdev)
                        set_netdev_cpu(netdev, cpu);
        }