Hi Hepeng, Thanks, now I understand. On Sat, Feb 27, 2021 at 12:54 AM 贺鹏 <xnhp0...@gmail.com> wrote: > > Hi, > > Thanks William and Ilya for a detailed revisiting of the origin of the > problem. I learned a lot. > > I now understand that the mix using of RCU and refcounts is not > intended in the first place. > But my point is that mix using RCU and refcounts now gives you more > choices, and actually eases the code changes. > > For example, the code for * ofproto_dpif_lookup_by_name* or other > ofproto lookup function, > when only using refcounts, you need to change it to: > > struct ofproto_dpif * > ofproto_dpif_lookup_by_uuid(const struct uuid *uuid) > { > struct ofproto_dpif *ofproto; > > HMAP_FOR_EACH_WITH_HASH (ofproto, all_ofproto_dpifs_by_uuid_node, > uuid_hash(uuid), &all_ofproto_dpifs_by_uuid) { > if (uuid_equals(&ofproto->uuid, uuid)) { > > ---> if ovs_refcount_try_ref(ofproto) > > return ofproto; > } > } > return NULL; > } > > and after finish its usage, you have to do ofproto_unref the ofproto. > > This is why I said, most accessing to ofproto is ephemeral. If you > change to use the pure refcounts solution, you have > to add refcount and release it every time you access the ofproto. We > should be more careful and remember to unref > the ofproto. > > However, if using RCU and refcounts, in the above case, you do not > need to change the code, since the RCU ensures that > these ephemeral accesses are safe.
How do we know which access is ephemeral, so no refcount is needed, and which access is not, so we have to add refcount? > > you only need to add refcount, when you find that the pointer to > ofproto lives longer than one grace period. > > > This is why in my patch, I do not add ref to ofproto after its > creation. I agree the patch is not complete and has issues, > and understand it could confuse people if changes into mix RCU and > refcounts version. > I see, thanks! William _______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev