summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPravin <pshelar@nicira.com>2014-03-20 22:07:44 -0700
committerPravin B Shelar <pshelar@nicira.com>2014-03-21 11:48:28 -0700
commit8617affff4f6570ef9ebeafe471e7f14a2c630e3 (patch)
tree24e3ec57a7862609f721b0935bda16420dd37003
parent8a9562d21a40c765a8ae6775a070cb279cb2147a (diff)
downloadopenvswitch-8617affff4f6570ef9ebeafe471e7f14a2c630e3.tar.gz
netdev-dpdk: Use multiple core for dpdk IO.
DPDK need to set _lcore_id for using multiple core. Signed-off-by: Pravin B Shelar <pshelar@nicira.com> Acked-by: Thomas Graf <tgraf@redhat.com>
-rw-r--r--lib/dpif-netdev.c2
-rw-r--r--lib/netdev-dpdk.c18
-rw-r--r--lib/netdev-dpdk.h2
3 files changed, 22 insertions, 0 deletions
diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
index d1097e9ae..4d0462907 100644
--- a/lib/dpif-netdev.c
+++ b/lib/dpif-netdev.c
@@ -43,6 +43,7 @@
#include "list.h"
#include "meta-flow.h"
#include "netdev.h"
+#include "netdev-dpdk.h"
#include "netdev-vport.h"
#include "netlink.h"
#include "odp-execute.h"
@@ -1864,6 +1865,7 @@ pmd_thread_main(void *f_)
poll_cnt = 0;
poll_list = NULL;
+ pmd_thread_setaffinity_cpu(f->id);
reload:
poll_cnt = pmd_load_queues(f, &poll_list, poll_cnt);
atomic_read(&f->change_seq, &port_seq);
diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c
index 520d6422f..f6adf87cc 100644
--- a/lib/netdev-dpdk.c
+++ b/lib/netdev-dpdk.c
@@ -1196,3 +1196,21 @@ netdev_dpdk_register(void)
{
netdev_register_provider(&netdev_dpdk_class);
}
+
+int
+pmd_thread_setaffinity_cpu(int cpu)
+{
+ cpu_set_t cpuset;
+ int err;
+
+ CPU_ZERO(&cpuset);
+ CPU_SET(cpu, &cpuset);
+ err = pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset);
+ if (err) {
+ VLOG_ERR("Thread affinity error %d",err);
+ return err;
+ }
+ RTE_PER_LCORE(_lcore_id) = cpu;
+
+ return 0;
+}
diff --git a/lib/netdev-dpdk.h b/lib/netdev-dpdk.h
index 5449a6b39..55984e873 100644
--- a/lib/netdev-dpdk.h
+++ b/lib/netdev-dpdk.h
@@ -21,12 +21,14 @@
int dpdk_init(int argc, char **argv);
void netdev_dpdk_register(void);
void free_dpdk_buf(struct ofpbuf *);
+int pmd_thread_setaffinity_cpu(int cpu);
#else
#define dpdk_init(arg1, arg2) (0)
#define netdev_dpdk_register()
#define free_dpdk_buf(arg)
+#define pmd_thread_setaffinity_cpu(c) (0)
#endif /* DPDK_NETDEV */
#endif