[ovs-dev] OvS DPDK crash when HPET timer enabled

Tonghao Zhang xiangxia.m.yue at gmail.com
Tue Apr 14 00:28:12 UTC 2020


On Mon, Apr 13, 2020 at 11:26 PM Ravi Kerur <rkerur at gmail.com> wrote:
>
>
>
> On Sun, Apr 12, 2020 at 5:05 AM Tonghao Zhang <xiangxia.m.yue at gmail.com> wrote:
>>
>> On Sun, Apr 12, 2020 at 7:57 AM Ravi Kerur <rkerur at gmail.com> wrote:
>> >
>> > Hello OvS DPDK team,
>> >
>> > I am using OvS 2.13.90 and DPDK 19.11 and wanted to use HPET timer instead
>> > of invariant TSC.
>> >
>> > Enabled CONFIG_RTE_LIBEAL_USE_HPET=y in DPDK
>> >
>> > Kernel has
>> > CONFIG_HPET_TIMER=y
>> > CONFIG_HPET_EMULATE_RTC=y
>> > CONFIG_HPET=y
>> > CONFIG_HPET_MMAP=y
>> > CONFIG_HPET_MMAP_DEFAULT=y
>> >
>> > cat /sys/devices/system/clocksource/clocksource0/current_clocksource
>> > tsc
>> > # cat /sys/devices/system/clocksource/clocksource0/available_clocksource
>> > tsc hpet acpi_pm
>> >
>> > OvS crashes at
>> >
>> > gdb ovsdb-server /core
>> > GNU gdb (Ubuntu 8.1-0ubuntu3) 8.1.0.20180409-git
>> > Copyright (C) 2018 Free Software Foundation, Inc.
>> > License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html
>> > >
>> > This is free software: you are free to change and redistribute it.
>> > There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
>> > and "show warranty" for details.
>> > This GDB was configured as "x86_64-linux-gnu".
>> > Type "show configuration" for configuration details.
>> > For bug reporting instructions, please see:
>> > <http://www.gnu.org/software/gdb/bugs/>.
>> > Find the GDB manual and other documentation resources online at:
>> > <http://www.gnu.org/software/gdb/documentation/>.
>> > For help, type "help".
>> > Type "apropos word" to search for commands related to "word"...
>> > Reading symbols from ovsdb-server...done.
>> > [New LWP 9729]
>> > [Thread debugging using libthread_db enabled]
>> > Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
>> > Core was generated by `ovsdb-server /usr/local/etc/openvswitch/conf.db
>> > -vconsole:emer -vsyslog:err -vf'.
>> > Program terminated with signal SIGSEGV, Segmentation fault.
>> > #0  0x0000560fc6db8ac1 in rte_get_hpet_cycles ()
>> Hi,
>> This is a bug on dpdk, NOT ovs.
>> I guess that your kernel does't support getentropy which supported in
>> 3.17 and your cpu don't support rdseed.
>> and that cause a dpdk bug. To workaround, you change: Not tested, hope
>> it's useful for you
>>
>
> You are correct CPU doesn't support RDSEED instruction but RDRAND is supported.
>
> It's a RT kernel based on 4.19 + RT patches.
>
> Setting CONFIG_RTE_LIBEAL_USE_HPET=n which is the default,'Invariant TSC' will be used. However, I want to use HPET so should I check with DPDK dev?
You can change code as I said, and set CONFIG_RTE_LIBEAL_USE_HPET=y.
The codes changed as stated above only affect dpdk init. hpet shoud be ok.
> Thanks,
> Ravi
>
>
>>
>> diff --git a/lib/librte_eal/linux/eal_timer.c b/lib/librte_eal/linux/eal_timer.c
>> index a904a8297cd2..4067e46da534 100644
>> --- a/lib/librte_eal/linux/eal_timer.c
>> +++ b/lib/librte_eal/linux/eal_timer.c
>> @@ -26,7 +26,7 @@
>>  #include "eal_private.h"
>>  #include "eal_internal_cfg.h"
>>
>> -enum timer_source eal_timer_source = EAL_TIMER_HPET;
>> +enum timer_source eal_timer_source = EAL_TIMER_TSC;
>>
>>  #ifdef RTE_LIBEAL_USE_HPET
>>
>>
>> > (gdb) bt
>> > #0  0x0000560fc6db8ac1 in rte_get_hpet_cycles ()
>> > #1  0x0000560fc6c482b0 in rte_rand_init ()
>> > #2  0x0000560fc6e125bd in __libc_csu_init ()
>> > #3  0x00007f5e1f930b28 in __libc_start_main (main=0x560fc6c45940 <main>,
>> > argc=14, argv=0x7fff61ae5088, init=0x560fc6e12570 <__libc_csu_init>,
>> >     fini=<optimized out>, rtld_fini=<optimized out>,
>> > stack_end=0x7fff61ae5078) at ../csu/libc-start.c:266
>> > #4  0x0000560fc6c485da in _start ()
>> > (gdb) quit
>> >
>> > RTE_INIT(rte_rand_init)
>> > {
>> > ...
>> > }
>> >
>> > rte_rand_init is defined as initializer, following diffs won't help,
>> >
>> > diff --git a/lib/dpdk.c b/lib/dpdk.c
>> > index 31450d470..f3d3989c8 100644
>> > --- a/lib/dpdk.c
>> > +++ b/lib/dpdk.c
>> > @@ -405,6 +405,12 @@ dpdk_init__(const struct smap *ovs_other_config)
>> >      if (result < 0) {
>> >          VLOG_EMER("Unable to initialize DPDK: %s",
>> > ovs_strerror(rte_errno));
>> >          return false;
>> > +    } else {
>> > +#ifdef RTE_LIBEAL_USE_HPET
>> > +        if (rte_eal_hpet_init(1) < 0) {
>> > +            VLOG_ERR("HPET is not enabled, using TSC as default timer\n");
>> > +        }
>> > +#endif
>> >      }
>> >
>> >      if (VLOG_IS_DBG_ENABLED()) {
>> >
>> > Kindly let me know your inputs on how to overcome this issue.
>> >
>> > Thanks,
>> > Ravi
>> > _______________________________________________
>> > dev mailing list
>> > dev at openvswitch.org
>> > https://mail.openvswitch.org/mailman/listinfo/ovs-dev
>>
>>
>>
>> --
>> Best regards, Tonghao



-- 
Best regards, Tonghao


More information about the dev mailing list