[dpdk-dev] KNI latency improvement

Message ID 0a4ff780-55fc-7c42-e3ab-b6b22a73cfbd@suse.de (mailing list archive)
State Not Applicable, archived
Delegated to: Thomas Monjalon
Headers

Checks

Context Check Description
ci/checkpatch warning coding style issues
ci/Intel-compilation success Compilation OK

Commit Message

Nirmoy Das Dec. 29, 2017, 2:27 p.m. UTC
  Hi Ferruh,

There is latency in the range of milliseconds when packets are passed
through KNI up to the IP stack. With CONFIG_RTE_KNI_PREEMPT_DEFAULT=n
its required sacrifice a cpu core. Do you have any suggestion to improve
latency without sacrificing a cpu?

What do you think about using cond_resched() instead of
schedule_timeout_interruptible(), in our test it helped to reduce
latency?


Regards,
Nirmoy
  

Comments

Stephen Hemminger Dec. 29, 2017, 5:13 p.m. UTC | #1
On Fri, 29 Dec 2017 15:27:03 +0100
Nirmoy Das <ndas@suse.de> wrote:

> Hi Ferruh,
> 
> There is latency in the range of milliseconds when packets are passed
> through KNI up to the IP stack. With CONFIG_RTE_KNI_PREEMPT_DEFAULT=n
> its required sacrifice a cpu core. Do you have any suggestion to improve
> latency without sacrificing a cpu?
> 
> What do you think about using cond_resched() instead of
> schedule_timeout_interruptible(), in our test it helped to reduce
> latency?
> 

That fully consumes a CPU  core when doing KNI.
It would be better to figure out how to use a a NAPI style
API for this.  I.e keep processing packet until idle,
then poll for a small window more, then if still idle
wait in kernel to be kicked by syscall from user space.
  

Patch

Index: dpdk-stable-16.11.1/lib/librte_eal/linuxapp/kni/kni_misc.c
===================================================================
--- dpdk/lib/librte_eal/linuxapp/kni/kni_misc.c
+++ dpdk/lib/librte_eal/linuxapp/kni/kni_misc.c
@@ -150,9 +150,8 @@  kni_thread_single(void *data)
 		}
 		up_read(&knet->kni_list_lock);
 #ifdef RTE_KNI_PREEMPT_DEFAULT
-		/* reschedule out for a while */
-		schedule_timeout_interruptible(
-			usecs_to_jiffies(KNI_KTHREAD_RESCHEDULE_INTERVAL));
+		/* reschedule out */
+		cond_resched();
 #endif
 	}