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