In the test harness you can inject onto a given worker, e.g. see IpsecTun6HandoffTests.
/neale From: <vpp-dev@lists.fd.io> on behalf of Paul Vinciguerra <pvi...@vinciconsulting.com> Date: Sunday 5 April 2020 at 17:24 To: "Dave Barach (dbarach)" <dbar...@cisco.com> Cc: Elias Rudberg <elias.rudb...@bahnhof.net>, "vpp-dev@lists.fd.io" <vpp-dev@lists.fd.io> Subject: Re: [vpp-dev] VPP nat ipfix logging problem, need to use thread-specific vlib_main_t? How can we test scenarios like this? 'set interface rx-placement' doesn't support pg interfaces. DBGvpp# set interface rx-placement TenGigabitEthernet5/0/0 worker 2 DBGvpp# set interface rx-placement pg0 worker 2 set interface rx-placement: not found DBGvpp# Is there another command to bind a pg interface to a worker thread? On Sun, Apr 5, 2020 at 8:08 AM Dave Barach via lists.fd.io<http://lists.fd.io> <dbarach=cisco....@lists.fd.io<mailto:cisco....@lists.fd.io>> wrote: If you have the thread index handy, that's OK. Otherwise, use vlib_get_main() which grabs the thread index from thread local storage. -----Original Message----- From: vpp-dev@lists.fd.io<mailto:vpp-dev@lists.fd.io> <vpp-dev@lists.fd.io<mailto:vpp-dev@lists.fd.io>> On Behalf Of Elias Rudberg Sent: Sunday, April 5, 2020 4:58 AM To: vpp-dev@lists.fd.io<mailto:vpp-dev@lists.fd.io> Subject: [vpp-dev] VPP nat ipfix logging problem, need to use thread-specific vlib_main_t? Hello VPP experts, We have been using VPP for NAT44 for a while and it has been working fine, but a few days ago when we tried turing on nat ipfix logging, vpp crashed. It turned out that the problem went away if we used only a single thread, so it seemed related to how threading was handled in the ipfix logging code. The crash happened in different ways on different runs but often seemed related to the snat_ipfix_send() function in plugins/nat/nat_ipfix_logging.c. Having looked at the code in nat_ipfix_logging.c I have the following theory about what goes wrong (I might have misunderstood something, if so please correct me): In the the snat_ipfix_send() function, a vlib_main_t data structure is used, a pointer to it is fetched in the following way: vlib_main_t *vm = frm->vlib_main; So the frm->vlib_main pointer comes from "frm" which has been set to flow_report_main which is a global data structure from vnet/ipfix- export/flow_report.c that as far as I can tell only exists once in memory (not once per thread). This means that different threads calling the snat_ipfix_send() function are using the same vlib_main_t data structure. That is not how it should be, I think, instead each thread should be using its own thread-specific vlib_main_t data structure. A suggestion for how to fix this is to replace the line vlib_main_t *vm = frm->vlib_main; with the following line vlib_main_t *vm = vlib_mains[thread_index]; in all places where worker threads are using such a vlib_main_t pointer. Using vlib_mains[thread_index] means that we are picking the thread-specific vlib_main_t data structure for the current thread, instead of all threads using the same vlib_main_t. I pushed such a change to gerrit, here: https://gerrit.fd.io/r/c/vpp/+/26359 That fix seems to solve the issue in my tests, vpp does not crash anymore after the change. Please have a look at it and let me know if this seems reasonable or if I have misunderstood something. Best regards, Elias
-=-=-=-=-=-=-=-=-=-=-=- Links: You receive all messages sent to this group. View/Reply Online (#15997): https://lists.fd.io/g/vpp-dev/message/15997 Mute This Topic: https://lists.fd.io/mt/72786912/21656 Group Owner: vpp-dev+ow...@lists.fd.io Unsubscribe: https://lists.fd.io/g/vpp-dev/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-