On Thu, 05 Oct 2017, Waiman Long wrote:
Insertion and deletion is relatively cheap and mostly contention free for dlock-list. Lookup, on the other hand, can be rather costly because all the lists in a dlock-list will have to be iterated. Currently dlock-list insertion is based on the cpu that the task is running on. So a given object can be inserted into any one of the lists depending on what the current cpu is. This patch provides an alternative way of list selection. The caller can provide a object context which will be hashed to one of the list in a dlock-list. The object can then be added into that particular list. Lookup can be done by iterating elements in the provided list only instead of all the lists in a dlock-list.
Unless I'm misusing the api, I could not find a standard way of iterating a _particular_ list head (the one the dlock_list_hash() returned). This is because iterators always want the all the heads. Also, in my particular epoll case I'd need the head->lock _not_ to be dropped after the iteration, and therefore is pretty adhoc. Currently we do: dlist_for_each_entry() { // acquire head->lock for each list } // no locks held dlist_add() I'm thinking perhaps we could have dlist_check_add() which passes a callback to ensure we want to add the node. The function could acquire the head->lock and not release it until the very end. Thanks, Davidlohr