On 21/04/2016 16:16, Bhanuprakash Bodireddy wrote:
Set the DPDK pmd thread scheduling policy to SCHED_RR and static
priority to highest priority value of the policy. This is to deal with
pmd thread starvation case where another cpu hogging process can get
scheduled/affinitized to the same core where pmd is running there by
significantly impacting the datapath performance.
The realtime scheduling policy is applied only when CPU mask is passed
to 'pmd-cpu-mask'. The exception to this is 'pmd-cpu-mask=1', where the
policy and priority shall not be applied to pmd thread spawned on core0.
For example:
* In the absence of pmd-cpu-mask or if pmd-cpu-mask=1, one pmd
thread shall be created and affinitized to 'core 0' with default
scheduling policy and priority applied.
* If pmd-cpu-mask is specified with CPU mask > 1, one or more pmd
threads shall be spawned on the corresponding core(s) in the mask
and real time scheduling policy SCHED_RR and highest static
priority is applied to the pmd thread(s).
To reproduce use following commands:
ovs-vsctl set Open_vSwitch . other_config:pmd-cpu-mask=6
taskset 0x2 cat /dev/zero > /dev/null &
Even though it seems the most likely case - I'm not sure that we can
always assume the user who put the non-OVS process on the core did so by
mistake and would want us to increase our priority.
Signed-off-by: Bhanuprakash Bodireddy <bhanuprakash.bodire...@intel.com>
---
lib/dpif-netdev.c | 9 +++++++++
lib/netdev-dpdk.c | 14 ++++++++++++++
lib/netdev-dpdk.h | 1 +
3 files changed, 24 insertions(+)
diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
index 1e8a37c..4a46816 100644
--- a/lib/dpif-netdev.c
+++ b/lib/dpif-netdev.c
@@ -2670,6 +2670,15 @@ pmd_thread_main(void *f_)
/* Stores the pmd thread's 'pmd' to 'per_pmd_key'. */
ovsthread_setspecific(pmd->dp->per_pmd_key, pmd);
pmd_thread_setaffinity_cpu(pmd->core_id);
+
+#ifdef DPDK_NETDEV
+ /* Set pmd thread's scheduling policy to SCHED_RR and priority to
+ * highest priority of SCHED_RR policy, In absence of pmd-cpu-mask (or)
+ * pmd-cpu-mask=1, default scheduling policy and priority shall
+ * apply to pmd thread */
+ if (pmd->core_id)
+ pmd_thread_setpriority();
Similar to above, I don't think we can assume anything special about
core 0. This type of change sounds like something that would be better
done at a layer above vswitch which has more system wide knowledge.
fwiw, it would be cleaner to remove the #ifdef from here and create a
dummy fn in netdev-dpdk.h, also the 'if' needs {}
+#endif
reload:
emc_cache_init(&pmd->flow_cache);
diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c
index 208c5f5..6518c87 100644
--- a/lib/netdev-dpdk.c
+++ b/lib/netdev-dpdk.c
@@ -2926,6 +2926,20 @@ pmd_thread_setaffinity_cpu(unsigned cpu)
return 0;
}
+void
+pmd_thread_setpriority(void)
+{
+ struct sched_param threadparam;
+ int err;
+
+ memset(&threadparam, 0, sizeof(threadparam));
+ threadparam.sched_priority = sched_get_priority_max(SCHED_RR);
+ err = pthread_setschedparam(pthread_self(), SCHED_RR, &threadparam);
+ if (err) {
+ VLOG_WARN("Thread priority error %d",err);
+ }
+}
+
static bool
dpdk_thread_is_pmd(void)
{
diff --git a/lib/netdev-dpdk.h b/lib/netdev-dpdk.h
index 646d3e2..168673b 100644
--- a/lib/netdev-dpdk.h
+++ b/lib/netdev-dpdk.h
@@ -26,6 +26,7 @@ int dpdk_init(int argc, char **argv);
void netdev_dpdk_register(void);
void free_dpdk_buf(struct dp_packet *);
int pmd_thread_setaffinity_cpu(unsigned cpu);
+void pmd_thread_setpriority(void);
#else
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev