On Wed, 30 Nov 2022 18:41:16 +0000
bugzi...@dpdk.org wrote:

> https://bugs.dpdk.org/show_bug.cgi?id=1137
> 
>             Bug ID: 1137
>            Summary: CPU affinity set incorrectly when lcore_id 0 is not
>                     the master-lcore
>            Product: DPDK
>            Version: 22.11
>           Hardware: All
>                 OS: Linux
>             Status: UNCONFIRMED
>           Severity: normal
>           Priority: Normal
>          Component: core
>           Assignee: dev@dpdk.org
>           Reporter: ltr...@cisco.com
>   Target Milestone: ---
> 
> Created attachment 233
>   --> https://bugs.dpdk.org/attachment.cgi?id=233&action=edit  
> Logs showing incorrect CPU set assignment
> 
> When a range of CPUs are used (e.g. 0-3), and the master-lcore is set to
> non-zero, the CPU affinity for lcore-id 0 is set incorrectly, due to its 
> cpuset
> being overwritten by the control-thread creation.
> 
> CPU arguments passed are '-c f --master-lcore 3', to indicate that CPUs 0-3
> should be used, with the master on CPU 3. In particular, DPDK itself is
> initialized from CPU 3.
> 
> When the control threads (eal-intr-thread, rte_mp_handle) are created, they 
> are
> initialized from CPU3 - so inherit the cpuset containing just this CPU. When
> calling __rte_thread_init(), ctrl_thread_init() passes the result of
> rte_lcore_id() - but this is not yet initialized for this thread - so is set 
> to
> 0.
> 
> This means that internally, the lcore_id for the control-thread is set to 0 -
> and 
> in particular, the call to thread_update_affinity() overwrites the cpuset for
> lcore_id=0 with the cpuset of CPU3:
> 
> memmove(&lcore_config[lcore_id].cpuset, cpusetp,
>                         sizeof(rte_cpuset_t));
> 
> This all occurs before the main __rte_thread_init() call for each Slave thread
> - so that the slave thread associated with lcore_id, which should be running 
> on
> CPU0, instead has its affinity incorrectly set to CPU3.
> 
> RTE logs are attached showing this behavior (and including some additional 
> logs
> added locally to print the lcore-id and cpusets being passed).
> 
> The fix for this should be to make ctrl_thread_init() more similar to
> rte_thread_register(), so that it calls eal_lcore_non_eal_allocate() to assign
> an lcore-id, then passes this to __rte_thread_init(). I have tested a fix for
> this locally to confirm.
> 

Side note: using CPU 0 with DPDK is not recommended for any real application.
It is impossible to fully isolate CPU 0 and therefore you will get poor 
performance
and mystery latency spikes.

Reply via email to