[dpdk-dev] 回复:RE: 回复:RE: Thread safety in rte_acl

Ramia, Kannan Babu kannan.babu.ramia at intel.com
Wed Jan 10 05:00:46 CET 2018


The way the application is written assumes there will be a transition phase where few threads will have OLD ACL results for the packets that are currently handled, but once those set is flushed out all the new set of packets will be back to the active set. So the system will be consistent after this transition period.

PS: Please also look at the vCG-NAT and vFW to see how this could be achieved in the application.

Regards
Kannan Babu

From: 真我风采 [mailto:1534057243 at qq.com]
Sent: Wednesday, January 10, 2018 8:20 AM
To: Ananyev, Konstantin <konstantin.ananyev at intel.com>; Ramia, Kannan Babu <kannan.babu.ramia at intel.com>; dev <dev at dpdk.org>
Subject: 回复:RE: 回复:RE: [dpdk-dev] Thread safety in rte_acl


>Yes, you'll need some sort of synchronization.
>Lock (or rwlock) is one option, but as build could take quite long time - probably not the best one.
>Another way - have a struct cthat ontains pointers to 2 ctx and an index for active one.
>Then you can do classify() on active one while doing add_rules/build on second one.
>Then when the second one is re-build you can switch an active index to it.
>I think librte_table uses that method.
>Of course you might need a reference counter or some other way to deternine that
>no-one is using old copy anymore and it is free to update it again.
>Konstantin

I have look at the source of samplevnf as below doc, it switchover active and standby directlt without ensuring old copy not used anymore.
https://github.com/opnfv/samplevnf/blob/master/VNFs/vACL/pipeline/pipeline_acl.c: cmd_acl_applyruleset_parsed

So, my question is that how to ensure that no-one is using old copy anymore ?

thanks!
------------------ 原始邮件 ------------------
发件人: "Ananyev, Konstantin";<konstantin.ananyev at intel.com<mailto:konstantin.ananyev at intel.com>>;
发送时间: 2018年1月8日(星期一) 晚上8:17
收件人: "真我风采"<1534057243 at qq.com<mailto:1534057243 at qq.com>>;"dev"<dev at dpdk.org<mailto:dev at dpdk.org>>;
主题: RE: 回复:RE: [dpdk-dev] Thread safety in rte_acl




>> 2. Is it safe that one
>> thread will run  "rte_acl_classify" when another thread tries to add new rules to same ctx? thanks,

>Just add new rules is safe, but applying them (calling rte_acl_build()) is not.

> In my case, there are two process sharing hugepage memory(struct rte_acl_ctx),  one process call 'rte_acl_build' to add and apply rule, another process call  frequently 'rte_acl_classify' to > match rule, does it need to add lock? if not, is there other method to implement this safely?

Yes, you'll need some sort of synchronization.
Lock (or rwlock) is one option, but as build could take quite long time - probably not the best one.
Another way - have a struct cthat ontains pointers to 2 ctx and an index for active one.
Then you can do classify() on active one while doing add_rules/build on second one.
Then when the second one is re-build you can switch an active index to it.
I think librte_table uses that method.
Of course you might need a reference counter or some other way to deternine that
no-one is using old copy anymore and it is free to update it again.
Konstantin


------------------ 原始邮件 ------------------
发件人: "Ananyev, Konstantin";<konstantin.ananyev at intel.com<mailto:konstantin.ananyev at intel.com>>;
发送时间: 2018年1月8日(星期一) 晚上7:42
收件人: "真我风采"<1534057243 at qq.com<mailto:1534057243 at qq.com>>;"dev"<dev at dpdk.org<mailto:dev at dpdk.org>>;
主题: RE: [dpdk-dev] Thread safety in rte_acl

>
> Hi, I have two questions : 1. Is it safe that multiple threads will run "rte_acl_classify" in parallel  (on the same ctx )?

Yes.

> 2. Is it safe that one
> thread will run  "rte_acl_classify" when another thread tries to add new rules to same ctx? thanks,

Just add new rules is safe, but applying them (calling rte_acl_build()) is not.
Konstantin


More information about the dev mailing list