From: Thomas Gleixner <t...@linutronix.de>

Switch the timer to HRTIMER_MODE_SOFT, which executed the timer
callback in softirq context and remove the hrtimer_tasklet.

Signed-off-by: Thomas Gleixner <t...@linutronix.de>
Signed-off-by: Anna-Maria Gleixner <anna-ma...@linutronix.de>
Cc: Johannes Berg <johan...@sipsolutions.net>
Cc: Kalle Valo <kv...@codeaurora.org>
Cc: linux-wireless@vger.kernel.org

---
 drivers/net/wireless/mac80211_hwsim.c |   44 +++++++++++++++-------------------
 1 file changed, 20 insertions(+), 24 deletions(-)

--- a/drivers/net/wireless/mac80211_hwsim.c
+++ b/drivers/net/wireless/mac80211_hwsim.c
@@ -537,7 +537,7 @@ struct mac80211_hwsim_data {
        unsigned int rx_filter;
        bool started, idle, scanning;
        struct mutex mutex;
-       struct tasklet_hrtimer beacon_timer;
+       struct hrtimer beacon_timer;
        enum ps_mode {
                PS_DISABLED, PS_ENABLED, PS_AUTO_POLL, PS_MANUAL_POLL
        } ps;
@@ -1418,7 +1418,7 @@ static void mac80211_hwsim_stop(struct i
 {
        struct mac80211_hwsim_data *data = hw->priv;
        data->started = false;
-       tasklet_hrtimer_cancel(&data->beacon_timer);
+       hrtimer_cancel(&data->beacon_timer);
        wiphy_debug(hw->wiphy, "%s\n", __func__);
 }
 
@@ -1541,14 +1541,12 @@ static enum hrtimer_restart
 mac80211_hwsim_beacon(struct hrtimer *timer)
 {
        struct mac80211_hwsim_data *data =
-               container_of(timer, struct mac80211_hwsim_data,
-                            beacon_timer.timer);
+               container_of(timer, struct mac80211_hwsim_data, beacon_timer);
        struct ieee80211_hw *hw = data->hw;
        u64 bcn_int = data->beacon_int;
-       ktime_t next_bcn;
 
        if (!data->started)
-               goto out;
+               return HRTIMER_NORESTART;
 
        ieee80211_iterate_active_interfaces_atomic(
                hw, IEEE80211_IFACE_ITER_NORMAL,
@@ -1560,11 +1558,9 @@ mac80211_hwsim_beacon(struct hrtimer *ti
                data->bcn_delta = 0;
        }
 
-       next_bcn = ktime_add(hrtimer_get_expires(timer),
-                            ns_to_ktime(bcn_int * 1000));
-       tasklet_hrtimer_start(&data->beacon_timer, next_bcn, HRTIMER_MODE_ABS);
-out:
-       return HRTIMER_NORESTART;
+       hrtimer_forward(&data->beacon_timer, hrtimer_get_expires(timer),
+                       ns_to_ktime(bcn_int * NSEC_PER_USEC));
+       return HRTIMER_RESTART;
 }
 
 static const char * const hwsim_chanwidths[] = {
@@ -1638,15 +1634,15 @@ static int mac80211_hwsim_config(struct
        mutex_unlock(&data->mutex);
 
        if (!data->started || !data->beacon_int)
-               tasklet_hrtimer_cancel(&data->beacon_timer);
-       else if (!hrtimer_is_queued(&data->beacon_timer.timer)) {
+               hrtimer_cancel(&data->beacon_timer);
+       else if (!hrtimer_is_queued(&data->beacon_timer)) {
                u64 tsf = mac80211_hwsim_get_tsf(hw, NULL);
                u32 bcn_int = data->beacon_int;
                u64 until_tbtt = bcn_int - do_div(tsf, bcn_int);
 
-               tasklet_hrtimer_start(&data->beacon_timer,
-                                     ns_to_ktime(until_tbtt * 1000),
-                                     HRTIMER_MODE_REL);
+               hrtimer_start(&data->beacon_timer,
+                             ns_to_ktime(until_tbtt * 1000),
+                             HRTIMER_MODE_REL_SOFT);
        }
 
        return 0;
@@ -1709,7 +1705,7 @@ static void mac80211_hwsim_bss_info_chan
                            info->enable_beacon, info->beacon_int);
                vp->bcn_en = info->enable_beacon;
                if (data->started &&
-                   !hrtimer_is_queued(&data->beacon_timer.timer) &&
+                   !hrtimer_is_queued(&data->beacon_timer) &&
                    info->enable_beacon) {
                        u64 tsf, until_tbtt;
                        u32 bcn_int;
@@ -1717,9 +1713,9 @@ static void mac80211_hwsim_bss_info_chan
                        tsf = mac80211_hwsim_get_tsf(hw, vif);
                        bcn_int = data->beacon_int;
                        until_tbtt = bcn_int - do_div(tsf, bcn_int);
-                       tasklet_hrtimer_start(&data->beacon_timer,
-                                             ns_to_ktime(until_tbtt * 1000),
-                                             HRTIMER_MODE_REL);
+                       hrtimer_start(&data->beacon_timer,
+                                     ns_to_ktime(until_tbtt * 1000),
+                                     HRTIMER_MODE_REL_SOFT);
                } else if (!info->enable_beacon) {
                        unsigned int count = 0;
                        ieee80211_iterate_active_interfaces_atomic(
@@ -1728,7 +1724,7 @@ static void mac80211_hwsim_bss_info_chan
                        wiphy_debug(hw->wiphy, "  beaconing vifs remaining: %u",
                                    count);
                        if (count == 0) {
-                               tasklet_hrtimer_cancel(&data->beacon_timer);
+                               hrtimer_cancel(&data->beacon_timer);
                                data->beacon_int = 0;
                        }
                }
@@ -2720,9 +2716,9 @@ static int mac80211_hwsim_new_radio(stru
                                    data->debugfs,
                                    data, &hwsim_simulate_radar);
 
-       tasklet_hrtimer_init(&data->beacon_timer,
-                            mac80211_hwsim_beacon,
-                            CLOCK_MONOTONIC, HRTIMER_MODE_ABS);
+       hrtimer_init(&data->beacon_timer, CLOCK_MONOTONIC,
+                    HRTIMER_MODE_ABS_SOFT);
+       data->beacon_timer.function = mac80211_hwsim_beacon;
 
        spin_lock_bh(&hwsim_radio_lock);
        list_add_tail(&data->list, &hwsim_radios);


Reply via email to