diff mbox

[v10,3/3] cfg80211: Schedule timeout for all CRDA calls

Message ID 1425447127-22958-3-git-send-email-ilan.peer@intel.com (mailing list archive)
State Accepted
Delegated to: Johannes Berg
Headers show

Commit Message

Peer, Ilan March 4, 2015, 5:32 a.m. UTC
Timeout was scheduled only in case CRDA was called due to user hints,
but was not scheduled for other cases. This can result in regulatory
hint processing getting stuck in case that there is no CRDA configured.

Change this by scheduling a timeout every time CRDA is called. In
addition, in restore_regulatory_settings() all pending requests are
restored (and not only the user ones).

Signed-off-by: Ilan Peer <ilan.peer@intel.com>
---
 net/wireless/reg.c | 15 +++++----------
 1 file changed, 5 insertions(+), 10 deletions(-)

Comments

Luis Chamberlain March 5, 2015, 10:55 p.m. UTC | #1
On Wed, Mar 04, 2015 at 12:32:07AM -0500, Ilan Peer wrote:
> Timeout was scheduled only in case CRDA was called due to user hints,
> but was not scheduled for other cases. This can result in regulatory
> hint processing getting stuck in case that there is no CRDA configured.
> 
> Change this by scheduling a timeout every time CRDA is called. In
> addition, in restore_regulatory_settings() all pending requests are
> restored (and not only the user ones).
> 
> Signed-off-by: Ilan Peer <ilan.peer@intel.com>

Acked-by: Luis R. Rodriguez <mcgrof@suse.com>

For all of these.

 Luis
--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Johannes Berg March 6, 2015, 8:39 a.m. UTC | #2
On Thu, 2015-03-05 at 23:55 +0100, Luis R. Rodriguez wrote:
> On Wed, Mar 04, 2015 at 12:32:07AM -0500, Ilan Peer wrote:
> > Timeout was scheduled only in case CRDA was called due to user hints,
> > but was not scheduled for other cases. This can result in regulatory
> > hint processing getting stuck in case that there is no CRDA configured.
> > 
> > Change this by scheduling a timeout every time CRDA is called. In
> > addition, in restore_regulatory_settings() all pending requests are
> > restored (and not only the user ones).
> > 
> > Signed-off-by: Ilan Peer <ilan.peer@intel.com>
> 
> Acked-by: Luis R. Rodriguez <mcgrof@suse.com>
> 
> For all of these.

Great, all three applied, thanks guys.

johannes

--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Peer, Ilan March 8, 2015, 7:34 a.m. UTC | #3
Thanks :)

Ilan.

> -----Original Message-----
> From: Luis R. Rodriguez [mailto:mcgrof@suse.com]
> Sent: Friday, March 06, 2015 00:55
> To: Peer, Ilan
> Cc: linux-wireless@vger.kernel.org
> Subject: Re: [PATCH v10 3/3] cfg80211: Schedule timeout for all CRDA calls
> 
> On Wed, Mar 04, 2015 at 12:32:07AM -0500, Ilan Peer wrote:
> > Timeout was scheduled only in case CRDA was called due to user hints,
> > but was not scheduled for other cases. This can result in regulatory
> > hint processing getting stuck in case that there is no CRDA configured.
> >
> > Change this by scheduling a timeout every time CRDA is called. In
> > addition, in restore_regulatory_settings() all pending requests are
> > restored (and not only the user ones).
> >
> > Signed-off-by: Ilan Peer <ilan.peer@intel.com>
> 
> Acked-by: Luis R. Rodriguez <mcgrof@suse.com>
> 
> For all of these.
> 
>  Luis
--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/net/wireless/reg.c b/net/wireless/reg.c
index 4239dd4..d867103 100644
--- a/net/wireless/reg.c
+++ b/net/wireless/reg.c
@@ -552,6 +552,9 @@  reg_call_crda(struct regulatory_request *request)
 {
 	if (call_crda(request->alpha2))
 		return REG_REQ_IGNORE;
+
+	queue_delayed_work(system_power_efficient_wq,
+			   &reg_timeout, msecs_to_jiffies(3142));
 	return REG_REQ_OK;
 }
 
@@ -1791,8 +1794,7 @@  static void reg_set_request_processed(void)
 		need_more_processing = true;
 	spin_unlock(&reg_requests_lock);
 
-	if (lr->initiator == NL80211_REGDOM_SET_BY_USER)
-		cancel_delayed_work(&reg_timeout);
+	cancel_delayed_work(&reg_timeout);
 
 	if (need_more_processing)
 		schedule_work(&reg_work);
@@ -2071,8 +2073,6 @@  static void reg_process_hint(struct regulatory_request *reg_request)
 		if (treatment == REG_REQ_IGNORE ||
 		    treatment == REG_REQ_ALREADY_SET)
 			return;
-		queue_delayed_work(system_power_efficient_wq,
-				   &reg_timeout, msecs_to_jiffies(3142));
 		return;
 	case NL80211_REGDOM_SET_BY_DRIVER:
 		if (!wiphy)
@@ -2496,7 +2496,6 @@  static void restore_regulatory_settings(bool reset_user)
 	char alpha2[2];
 	char world_alpha2[2];
 	struct reg_beacon *reg_beacon, *btmp;
-	struct regulatory_request *reg_request, *tmp;
 	LIST_HEAD(tmp_reg_req_list);
 	struct cfg80211_registered_device *rdev;
 
@@ -2524,11 +2523,7 @@  static void restore_regulatory_settings(bool reset_user)
 	 * settings.
 	 */
 	spin_lock(&reg_requests_lock);
-	list_for_each_entry_safe(reg_request, tmp, &reg_requests_list, list) {
-		if (reg_request->initiator != NL80211_REGDOM_SET_BY_USER)
-			continue;
-		list_move_tail(&reg_request->list, &tmp_reg_req_list);
-	}
+	list_splice_tail_init(&reg_requests_list, &tmp_reg_req_list);
 	spin_unlock(&reg_requests_lock);
 
 	/* Clear beacon hints */