>-----Original Message-----
>From: Honnappa Nagarahalli [mailto:honnappa.nagaraha...@arm.com]
>> @@ -1317,16 +1317,19 @@ rte_hash_iterate(const struct rte_hash *h, const
>> void **key, void **data, uint32
>>      bucket_idx = *next / RTE_HASH_BUCKET_ENTRIES;
>>      idx = *next % RTE_HASH_BUCKET_ENTRIES;
>>
>> +    __hash_rw_reader_lock(h);
>This does not work well with the lock-less changes I am making.  We should 
>leave the lock in its original position. Instead change the
>while loop as follows:
>
>while ((position = h->buckets[bucket_idx].key_idx[idx]) == EMPTY_SLOT)
>
>>      /* If current position is empty, go to the next one */
>>      while (h->buckets[bucket_idx].key_idx[idx] == EMPTY_SLOT) {
>>              (*next)++;
>>              /* End of table */
>> -            if (*next == total_entries)
>> +            if (*next == total_entries) {
>> +                    __hash_rw_reader_unlock(h);
>>                      return -ENOENT;
>> +            }
>>              bucket_idx = *next / RTE_HASH_BUCKET_ENTRIES;
>>              idx = *next % RTE_HASH_BUCKET_ENTRIES;
>>      }
>> -    __hash_rw_reader_lock(h);
>> +
>>      /* Get position of entry in key table */
>>      position = h->buckets[bucket_idx].key_idx[idx];
>If we change the while loop as I suggested as above, we can remove this line.
>
>>      next_key = (struct rte_hash_key *) ((char *)h->key_store +

[Wang, Yipeng] Sorry that I did not realize you already have it in your patch 
set and I agree.
Do you want to export it as a bug fix in your patch set? I will remove my 
change.

For the lock free, do we need to protect it with version counter? Imagine the 
following corner case:
While the iterator read the key and data, there is a writer deleted, removed, 
and recycled the key-data pair,
and write a new key and data into it. While the writer are writing, will the 
reader reads out wrong key/data, or
mismatched key/data?


Reply via email to