> >On 08.12.2017 18:44, Bodireddy, Bhanuprakash wrote: >>> >>> On 08.12.2017 16:45, Stokes, Ian wrote: >>>>> All instances of struct dp_netdev_pmd_thread are allocated by >>>>> xzalloc and therefore doesn't guarantee memory allocation aligned >>>>> on CACHE_LINE_SIZE boundary. Due to this any padding done inside >>>>> the structure with this assumption might create holes. >>>>> >>>>> This commit replaces xzalloc, free with xzalloc_cacheline and >>>>> free_cacheline. With the changes the memory is 64 byte aligned. >>>> >>>> Thanks for this Bhanu, >>>> >>>> I think this looks OK and I'm considering pushing to the DPDK_Merge >>>> branch >>> but as there has been a fair bit of debate lately regarding memory >>> and cache alignment I want to flag to others who have engaged to date >>> to have their say before I apply it as there has been no input yet for the >patch. >>>> >>>> @Jan/Ilya, are you ok with this change? >>> >>> OVS will likely crash on destroying non_pmd thread because it still >>> allocated by usual xzalloc, but freed with others by free_cacheline(). >> >> Are you sure OvS crashes in this case and reproducible? >> Firstly I didn't see a crash and to double check this I enabled a DBG >> in dp_netdev_destroy_pmd() to see if free_cacheline() is called for >> the non pmd thread (whose core_id is NON_PMD_CORE_ID) and that >doesn't seem to be hitting and gets hit only for pmd threads having valid >core_ids. > >This should happen in dp_netdev_free() on ovs exit or deletion of the >datapath. > >I guess, you need following patch to reproduce: >https://mail.openvswitch.org/pipermail/ovs-dev/2017- >December/341617.html > >Ian is going to include it to the closest pull request. > >Even if it's not reproducible you have to fix memory allocation for non_pmd >anyway. Current code logically wrong.
Ok, that makes sense I would use the xzalloc_cacheline() for allocating memory for non_pmd too.. Bhanuprakash. > >> >> Also AFAIK, non pmd thread is nothing but vswitchd thread and I don’t >> see how that can be freed from the above function. Also I started >wondering where the memory allocated for non_pmd thread is getting freed >now. >> >> Let me know the steps if you can reproduce the crash as you mentioned. >> >> - Bhanuprakash. >> >>> >>>> >>>> Thanks >>>> Ian >>>> >>>>> >>>>> Before: >>>>> With xzalloc, all the memory is 16 byte aligned. >>>>> >>>>> (gdb) p pmd >>>>> $1 = (struct dp_netdev_pmd_thread *) 0x7eff8a813010 >>>>> (gdb) p &pmd->cacheline0 >>>>> $2 = (OVS_CACHE_LINE_MARKER *) 0x7eff8a813010 >>>>> (gdb) p &pmd->cacheline1 >>>>> $3 = (OVS_CACHE_LINE_MARKER *) 0x7eff8a813050 >>>>> (gdb) p &pmd->flow_cache >>>>> $4 = (struct emc_cache *) 0x7eff8a813090 >>>>> (gdb) p &pmd->flow_table >>>>> $5 = (struct cmap *) 0x7eff8acb30d0 >>>>> (gdb) p &pmd->stats >>>>> $6 = (struct dp_netdev_pmd_stats *) 0x7eff8acb3110 >>>>> (gdb) p &pmd->port_mutex >>>>> $7 = (struct ovs_mutex *) 0x7eff8acb3150 >>>>> (gdb) p &pmd->poll_list >>>>> $8 = (struct hmap *) 0x7eff8acb3190 >>>>> (gdb) p &pmd->tnl_port_cache >>>>> $9 = (struct hmap *) 0x7eff8acb31d0 >>>>> (gdb) p &pmd->stats_zero >>>>> $10 = (unsigned long long (*)[5]) 0x7eff8acb3210 >>>>> >>>>> After: >>>>> With xzalloc_cacheline, all the memory is 64 byte aligned. >>>>> >>>>> (gdb) p pmd >>>>> $1 = (struct dp_netdev_pmd_thread *) 0x7f39e2365040 >>>>> (gdb) p &pmd->cacheline0 >>>>> $2 = (OVS_CACHE_LINE_MARKER *) 0x7f39e2365040 >>>>> (gdb) p &pmd->cacheline1 >>>>> $3 = (OVS_CACHE_LINE_MARKER *) 0x7f39e2365080 >>>>> (gdb) p &pmd->flow_cache >>>>> $4 = (struct emc_cache *) 0x7f39e23650c0 >>>>> (gdb) p &pmd->flow_table >>>>> $5 = (struct cmap *) 0x7f39e2805100 >>>>> (gdb) p &pmd->stats >>>>> $6 = (struct dp_netdev_pmd_stats *) 0x7f39e2805140 >>>>> (gdb) p &pmd->port_mutex >>>>> $7 = (struct ovs_mutex *) 0x7f39e2805180 >>>>> (gdb) p &pmd->poll_list >>>>> $8 = (struct hmap *) 0x7f39e28051c0 >>>>> (gdb) p &pmd->tnl_port_cache >>>>> $9 = (struct hmap *) 0x7f39e2805200 >>>>> (gdb) p &pmd->stats_zero >>>>> $10 = (unsigned long long (*)[5]) 0x7f39e2805240 >>>>> >>>>> Reported-by: Ilya Maximets <i.maxim...@samsung.com> >>>>> Signed-off-by: Bhanuprakash Bodireddy >>>>> <bhanuprakash.bodire...@intel.com> >>>>> --- >>>>> lib/dpif-netdev.c | 4 ++-- >>>>> 1 file changed, 2 insertions(+), 2 deletions(-) >>>>> >>>>> diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index >>>>> db78318..3e281ae >>>>> 100644 >>>>> --- a/lib/dpif-netdev.c >>>>> +++ b/lib/dpif-netdev.c >>>>> @@ -3646,7 +3646,7 @@ reconfigure_pmd_threads(struct dp_netdev >>> *dp) >>>>> FOR_EACH_CORE_ON_DUMP(core, pmd_cores) { >>>>> pmd = dp_netdev_get_pmd(dp, core->core_id); >>>>> if (!pmd) { >>>>> - pmd = xzalloc(sizeof *pmd); >>>>> + pmd = xzalloc_cacheline(sizeof *pmd); >>>>> dp_netdev_configure_pmd(pmd, dp, core->core_id, core- >>>>>> numa_id); >>>>> pmd->thread = ovs_thread_create("pmd", >>>>> pmd_thread_main, >>> pmd); >>>>> VLOG_INFO("PMD thread on numa_id: %d, core id: %2d >>>>> created.", @@ -4574,7 +4574,7 @@ dp_netdev_destroy_pmd(struct >>>>> dp_netdev_pmd_thread >>>>> *pmd) >>>>> xpthread_cond_destroy(&pmd->cond); >>>>> ovs_mutex_destroy(&pmd->cond_mutex); >>>>> ovs_mutex_destroy(&pmd->port_mutex); >>>>> - free(pmd); >>>>> + free_cacheline(pmd); >>>>> } >>>>> >>>>> /* Stops the pmd thread, removes it from the 'dp->poll_threads', >>>>> -- >>>>> 2.4.11 >>>>> >>>>> _______________________________________________ >>>>> dev mailing list >>>>> d...@openvswitch.org >>>>> https://mail.openvswitch.org/mailman/listinfo/ovs-dev >>>> >>>> >>>> _______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev