소스 검색

mac80211_hwsim: refactor radio cleanup

Refactor the radio cleanup into a new function to later
allow deleting a single radio from the list.

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Johannes Berg 11 년 전
부모
커밋
e4afb603c0
1개의 변경된 파일18개의 추가작업 그리고 14개의 파일을 삭제
  1. 18 14
      drivers/net/wireless/mac80211_hwsim.c

+ 18 - 14
drivers/net/wireless/mac80211_hwsim.c

@@ -1623,25 +1623,29 @@ static const struct ieee80211_ops mac80211_hwsim_ops = {
 
 
 static struct ieee80211_ops mac80211_hwsim_mchan_ops;
 static struct ieee80211_ops mac80211_hwsim_mchan_ops;
 
 
-static void mac80211_hwsim_free(void)
+static void mac80211_hwsim_destroy_radio(struct mac80211_hwsim_data *data)
 {
 {
-	struct list_head tmplist, *i, *tmp;
-	struct mac80211_hwsim_data *data, *tmpdata;
+	debugfs_remove_recursive(data->debugfs);
+	ieee80211_unregister_hw(data->hw);
+	device_release_driver(data->dev);
+	device_unregister(data->dev);
+	ieee80211_free_hw(data->hw);
+}
 
 
-	INIT_LIST_HEAD(&tmplist);
+static void mac80211_hwsim_free(void)
+{
+	struct mac80211_hwsim_data *data;
 
 
 	spin_lock_bh(&hwsim_radio_lock);
 	spin_lock_bh(&hwsim_radio_lock);
-	list_for_each_safe(i, tmp, &hwsim_radios)
-		list_move(i, &tmplist);
-	spin_unlock_bh(&hwsim_radio_lock);
-
-	list_for_each_entry_safe(data, tmpdata, &tmplist, list) {
-		debugfs_remove_recursive(data->debugfs);
-		ieee80211_unregister_hw(data->hw);
-		device_release_driver(data->dev);
-		device_unregister(data->dev);
-		ieee80211_free_hw(data->hw);
+	while ((data = list_first_entry_or_null(&hwsim_radios,
+						struct mac80211_hwsim_data,
+						list))) {
+		list_del(&data->list);
+		spin_unlock_bh(&hwsim_radio_lock);
+		mac80211_hwsim_destroy_radio(data);
+		spin_lock_bh(&hwsim_radio_lock);
 	}
 	}
+	spin_unlock_bh(&hwsim_radio_lock);
 	class_destroy(hwsim_class);
 	class_destroy(hwsim_class);
 }
 }