From: Arend van Spriel <arend.vanspriel@broadcom.com>
To: Johannes Berg <johannes@sipsolutions.net>
Cc: linux-wireless <linux-wireless@vger.kernel.org>,
Arend van Spriel <arend.vanspriel@broadcom.com>
Subject: [PATCH V2 09/10] brcmfmac: add mutex to protect pno requests
Date: Thu, 13 Apr 2017 13:06:35 +0100 [thread overview]
Message-ID: <1492085196-4574-10-git-send-email-arend.vanspriel@broadcom.com> (raw)
In-Reply-To: <1492085196-4574-1-git-send-email-arend.vanspriel@broadcom.com>
The request references kept in pno are accessed in user-space context
and in firmware event handler context. As such we need to protect it
with a lock. As both context allow sleep a mutex seems appropriate.
Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com>
Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com>
Reviewed-by: Franky Lin <franky.lin@broadcom.com>
Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
---
.../net/wireless/broadcom/brcm80211/brcmfmac/pno.c | 33 ++++++++++++++++------
1 file changed, 25 insertions(+), 8 deletions(-)
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pno.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pno.c
index d0e4283..5f4c67a 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pno.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pno.c
@@ -43,6 +43,7 @@
struct brcmf_pno_info {
int n_reqs;
struct cfg80211_sched_scan_request *reqs[BRCMF_PNO_MAX_BUCKETS];
+ struct mutex req_lock;
};
#define ifp_to_pno(_ifp) (_ifp)->drvr->config->pno
@@ -55,13 +56,17 @@ static int brcmf_pno_store_request(struct brcmf_pno_info *pi,
return -ENOSPC;
}
brcmf_dbg(SCAN, "reqid=%llu\n", req->reqid);
+ mutex_lock(&pi->req_lock);
pi->reqs[pi->n_reqs++] = req;
+ mutex_unlock(&pi->req_lock);
return 0;
}
static int brcmf_pno_remove_request(struct brcmf_pno_info *pi, u64 reqid)
{
- int i;
+ int i, err = 0;
+
+ mutex_lock(&pi->req_lock);
/* find request */
for (i = 0; i < pi->n_reqs; i++) {
@@ -71,7 +76,8 @@ static int brcmf_pno_remove_request(struct brcmf_pno_info *pi, u64 reqid)
/* request not found */
if (WARN_ON(i == pi->n_reqs)) {
brcmf_err("reqid not found\n");
- return -ENOENT;
+ err = -ENOENT;
+ goto done;
}
brcmf_dbg(SCAN, "reqid=%llu\n", reqid);
@@ -79,14 +85,17 @@ static int brcmf_pno_remove_request(struct brcmf_pno_info *pi, u64 reqid)
/* if last we are done */
if (!pi->n_reqs || i == pi->n_reqs)
- return 0;
+ goto done;
/* fill the gap with remaining requests */
while (i <= pi->n_reqs - 1) {
pi->reqs[i] = pi->reqs[i + 1];
i++;
}
- return 0;
+
+done:
+ mutex_unlock(&pi->req_lock);
+ return err;
}
static int brcmf_pno_channel_config(struct brcmf_if *ifp,
@@ -489,6 +498,7 @@ int brcmf_pno_attach(struct brcmf_cfg80211_info *cfg)
return -ENOMEM;
cfg->pno = pi;
+ mutex_init(&pi->req_lock);
return 0;
}
@@ -501,6 +511,7 @@ void brcmf_pno_detach(struct brcmf_cfg80211_info *cfg)
cfg->pno = NULL;
WARN_ON(pi->n_reqs);
+ mutex_destroy(&pi->req_lock);
kfree(pi);
}
@@ -516,11 +527,15 @@ void brcmf_pno_wiphy_params(struct wiphy *wiphy, bool gscan)
u64 brcmf_pno_find_reqid_by_bucket(struct brcmf_pno_info *pi, u32 bucket)
{
- /* bucket appears to be gone */
- if (bucket >= pi->n_reqs)
- return 0;
+ u64 reqid = 0;
+
+ mutex_lock(&pi->req_lock);
+
+ if (bucket < pi->n_reqs)
+ reqid = pi->reqs[bucket]->reqid;
- return pi->reqs[bucket]->reqid;
+ mutex_unlock(&pi->req_lock);
+ return reqid;
}
u32 brcmf_pno_get_bucket_map(struct brcmf_pno_info *pi,
@@ -531,6 +546,7 @@ u32 brcmf_pno_get_bucket_map(struct brcmf_pno_info *pi,
u32 bucket_map = 0;
int i, j;
+ mutex_lock(&pi->req_lock);
for (i = 0; i < pi->n_reqs; i++) {
req = pi->reqs[i];
@@ -545,5 +561,6 @@ u32 brcmf_pno_get_bucket_map(struct brcmf_pno_info *pi,
}
}
}
+ mutex_unlock(&pi->req_lock);
return bucket_map;
}
--
1.9.1
next prev parent reply other threads:[~2017-04-13 12:07 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-04-13 12:06 [PATCH V2 00/10] cfg80211: support multiple scheduled scans Arend van Spriel
2017-04-13 12:06 ` [PATCH V2 01/10] nl80211: add request id in scheduled scan event messages Arend van Spriel
2017-04-18 8:56 ` Johannes Berg
2017-04-13 12:06 ` [PATCH V2 02/10] nl80211: allow multiple active scheduled scan requests Arend van Spriel
2017-04-18 8:53 ` Johannes Berg
2017-04-18 8:55 ` Johannes Berg
2017-04-18 19:14 ` Arend van Spriel
2017-04-13 12:06 ` [PATCH V2 03/10] nl80211: add support for BSSIDs in scheduled scan matchsets Arend van Spriel
2017-04-13 12:06 ` [PATCH V2 04/10] cfg80211: add request id parameter to .sched_scan_stop() signature Arend van Spriel
2017-04-13 12:06 ` [PATCH V2 05/10] cfg80211: add request id to cfg80211_sched_scan_*() api Arend van Spriel
2017-04-13 12:06 ` [PATCH V2 06/10] brcmfmac: add firmware feature detection for gscan feature Arend van Spriel
2017-04-13 12:06 ` [PATCH V2 07/10] brcmfmac: move scheduled scan wiphy param setting to pno module Arend van Spriel
2017-04-13 12:06 ` [PATCH V2 08/10] brcmfmac: add support multi-scheduled scan Arend van Spriel
2017-04-13 12:06 ` Arend van Spriel [this message]
2017-04-13 12:06 ` [PATCH V2 10/10] brcmfmac: add scheduled scan support for specified BSSIDs Arend van Spriel
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1492085196-4574-10-git-send-email-arend.vanspriel@broadcom.com \
--to=arend.vanspriel@broadcom.com \
--cc=johannes@sipsolutions.net \
--cc=linux-wireless@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).