> -----Original Message-----
> From: Burakov, Anatoly
> Sent: Thursday, June 21, 2018 4:51 PM
> To: Zhang, Qi Z <qi.z.zh...@intel.com>; tho...@monjalon.net
> Cc: Ananyev, Konstantin <konstantin.anan...@intel.com>; dev@dpdk.org;
> Richardson, Bruce <bruce.richard...@intel.com>; Yigit, Ferruh
> <ferruh.yi...@intel.com>; Shelton, Benjamin H
> <benjamin.h.shel...@intel.com>; Vangati, Narender
> <narender.vang...@intel.com>
> Subject: Re: [PATCH v2 05/22] ethdev: introduce device lock
> 
> On 21-Jun-18 3:00 AM, Qi Zhang wrote:
> > Introduce API rte_eth_dev_lock and rte_eth_dev_unlock to let
> > application lock or unlock on specific ethdev, a locked device can't
> > be detached, this help application to prevent unexpected device
> > detaching, especially in multi-process environment.
> >
> > Also introduce the new API rte_eth_dev_lock_with_callback and
> > rte_eth_dev_unlock_with callback to let application to register a
> > callback function which will be invoked before a device is going to be
> > detached, the return value of the function will decide if device will
> > continue be detached or not, this support application to do condition
> > check at runtime.
> >
> > Signed-off-by: Qi Zhang <qi.z.zh...@intel.com>
> > ---
> 
> <snip>
> 
> > +
> > +static int clean_lock_callback_one(uint16_t port_id) {
> > +   struct lock_entry *le;
> > +   int ret = 0;
> > +
> > +   rte_spinlock_lock(&lock_entry_lock);
> > +
> > +   TAILQ_FOREACH(le, &lock_entry_list, next) {
> > +           if (le->port_id == port_id)
> > +                   break;
> > +   }
> > +
> > +   if (le != NULL) {
> > +           le->ref_count--;
> > +           if (le->ref_count == 0) {
> > +                   TAILQ_REMOVE(&lock_entry_list, le, next);
> > +                   free(le);
> > +           }
> > +   } else {
> > +           ret = -ENOENT;
> > +   }
> > +
> > +   rte_spinlock_unlock(&lock_entry_lock);
> > +   return ret;
> > +
> > +}
> > +
> > +void clean_lock_callback(uint16_t port_id) {
> > +   int ret;
> > +
> > +   for (;;) {
> > +           ret = clean_lock_callback_one(port_id);
> > +           if (ret == -ENOENT)
> > +                   break;
> > +   }
> > +}
> 
> Why not lock/unlock the list in clean_lock_callback() and proceed to cleaning
> callbacks one by one, instead of locking-and-unlocking the list over and over
> again?

Definitely!

> 
> --
> Thanks,
> Anatoly

Reply via email to