[RFTv2 3/5] ath10k: rework peer accounting

Michal Kazior michal.kazior at tieto.com
Thu Apr 10 03:43:13 EDT 2014


On 10 April 2014 09:18, Kalle Valo <kvalo at qca.qualcomm.com> wrote:
> Michal Kazior <michal.kazior at tieto.com> writes:
>
>>>> +/* hold conf_mutex for simple iteration, or conf_mutex+data_lock for
>>>> + * modifications */
>>>>  struct ath10k_peer *ath10k_peer_find(struct ath10k *ar, int vdev_id,
>>>>                                    const u8 *addr)
>>>>  {
>>>>       struct ath10k_peer *peer;
>>>>
>>>> -     lockdep_assert_held(&ar->data_lock);
>>>> -
>>>>       list_for_each_entry(peer, &ar->peers, list) {
>>>>               if (peer->vdev_id != vdev_id)
>>>>                       continue;
>>>
>>> The comment here makes me suspicious. How can we safely iterate the list
>>> if we don't take data_lock? Doesn't it mean that the list can change
>>> while we have conf_mutex?
>>
>> The idea is you need BOTH locks to modify the list structure, but you
>> need only one of them to iterate over the list safely and
>> consistently. This means writer will not alter the list structure
>> until there are no readers.
>
> Still not understanding this. Why not then use conf_mutex always, why do
> we need data_lock at all?

htt peer map/unmap which is in tasklet context needs to iterate over
the list. It can't take conf_mutex.


> Or are you saying that one can iterate the list by either taking
> conf_mutex or by taking data_lock, depending on context?

Yes.


Michał



More information about the ath10k mailing list