[RFC PATCH 2/2] net: mvneta: Add naive RSS support
From: Gregory CLEMENT <hidden>
Date: 2015-11-06 20:53:46
Also in:
lkml, netdev
Hi Marcin, [...]
quoted
+static int mvneta_config_rss(struct mvneta_port *pp) +{ + int cpu; + u32 val; + + netif_tx_stop_all_queues(pp->dev); + + /* Mask all ethernet port interrupts */ + mvreg_write(pp, MVNETA_INTR_NEW_MASK, 0);Shouldn't the interrupts be masked on each online cpu? There is percpu unmask function (mvneta_percpu_unmask_interrupt), so maybe ther should be also mvneta_percpu_mask_interrupt. With this masking should look like below: for_each_online_cpu(cpu) smp_call_function_single(cpu, mvneta_percpu_unmask_interrupt, pp, true);
Indeed you are right, however I am a bit surprised to not had had issue cause by this. I will fix it.
quoted
+ mvreg_write(pp, MVNETA_INTR_OLD_MASK, 0); + mvreg_write(pp, MVNETA_INTR_MISC_MASK, 0); + + /* We have to synchronise on the napi of each CPU */ + for_each_online_cpu(cpu) { + struct mvneta_pcpu_port *pcpu_port = + per_cpu_ptr(pp->ports, cpu); + + napi_synchronize(&pcpu_port->napi); + napi_disable(&pcpu_port->napi); + } + + pp->rxq_def = pp->indir[0]; + + /* update unicast mapping */ + mvneta_set_rx_mode(pp->dev); + + /* Update val of portCfg register accordingly with all RxQueue types */ + val = MVNETA_PORT_CONFIG_DEFL_VALUE(pp->rxq_def); + mvreg_write(pp, MVNETA_PORT_CONFIG, val); + + /* Update the elected CPU matching the new rxq_def */ + mvneta_percpu_elect(pp); + + /* We have to synchronise on the napi of each CPU */ + for_each_online_cpu(cpu) { + struct mvneta_pcpu_port *pcpu_port = + per_cpu_ptr(pp->ports, cpu); + + napi_enable(&pcpu_port->napi); + } +rxq_def changed, but txq vs CPU mapping remained as in the beginning - is it intentional?
txq vs CPU mapping is change in the mvneta_percpu_elect() function. Thanks for this prompt review Gregory -- Gregory Clement, Free Electrons Kernel, drivers, real-time and embedded Linux development, consulting, training and support. http://free-electrons.com