Search Linux Wireless

Re: [PATCH v3 1/2] mac80211_hwsim: fix duplicate beacons on TSF adjust

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Mon, Jan 6, 2014 at 11:09 AM, Johannes Berg
<johannes@xxxxxxxxxxxxxxxx> wrote:
> On Thu, 2013-12-19 at 10:25 -0800, Thomas Pedersen wrote:
>> There was some bug when rescheduling the next beacon from
>> the beacon tasklet after adjusting TSF which would cause
>> the beacon timer to trigger twice. Beaconing at "old" TBT
>> (previously scheduled interface TBTT) with new timestamp
>> was incorrect anyway.
>>
>> Instead, reschedule the beacon straight away when
>> adjusting TSF.
>>
>> Signed-off-by: Thomas Pedersen <twpedersen@xxxxxxxxx>
>>
>> ---
>> v2:
>>
>>       don't kill hrtimer tasklet if currently running to
>>       avoid deadlock (Johannes)
>>
>>  drivers/net/wireless/mac80211_hwsim.c |   57 +++++++++++++++------------------
>>  1 file changed, 26 insertions(+), 31 deletions(-)
>>
>> diff --git a/drivers/net/wireless/mac80211_hwsim.c b/drivers/net/wireless/mac80211_hwsim.c
>> index 9c0cc8d..cf3b9d3 100644
>> --- a/drivers/net/wireless/mac80211_hwsim.c
>> +++ b/drivers/net/wireless/mac80211_hwsim.c
>> @@ -442,17 +442,36 @@ static u64 mac80211_hwsim_get_tsf(struct ieee80211_hw *hw,
>>       return le64_to_cpu(__mac80211_hwsim_get_tsf(data));
>>  }
>>
>> +static void mac80211_hwsim_beacon_sched(struct ieee80211_hw *hw)
>> +{
>> +     struct mac80211_hwsim_data *data = hw->priv;
>> +     u64 tsf = mac80211_hwsim_get_tsf(hw, NULL);
>> +     u32 bcn_int = data->beacon_int;
>> +     u64 until_tbtt;
>> +
>> +     if (!bcn_int)
>> +             return;
>> +
>> +     until_tbtt = bcn_int - do_div(tsf, bcn_int);
>> +     if (!hrtimer_callback_running(&data->beacon_timer.timer) &&
>> +         !test_bit(TASKLET_STATE_RUN, &data->beacon_timer.tasklet.state))
>> +             tasklet_hrtimer_cancel(&data->beacon_timer);
>
> That test_bit() really seems suspicious - there are no other users in
> the tree except for the internal tasklet code... What are you trying to
> do?

I'm trying to avoid calling tasklet_hrtimer_cancel() recursively, that
is, when mac80211_hwsim_beacon_sched() is called from within the
hrtimer tasklet itself. Looking at it again this does seem ugly. Would
it be acceptable to pass a flag to _beacon_sched() indicating whether
a reschedule is taking place from within the tasklet? We could also
have a mac80211_hwsim_beacon_sched() (which would cance the hrtimer
tasklet) and __mac80211_hwsim_beacon_sched() pair, but I'm not sure if
that nomenclature applies here.

Thanks for reviewing.
Thomas
--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Host AP]     [ATH6KL]     [Linux Wireless Personal Area Network]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [Linux Kernel]     [IDE]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite Hiking]     [MIPS Linux]     [ARM Linux]     [Linux RAID]

  Powered by Linux