Browse Source

nfp: lock area cache earlier

We shouldn't access area_cache_list without its lock even
to check if it's empty.

Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Jakub Kicinski 8 years ago
parent
commit
a831ffb560
1 changed files with 8 additions and 6 deletions
  1. 8 6
      drivers/net/ethernet/netronome/nfp/nfpcore/nfp_cppcore.c

+ 8 - 6
drivers/net/ethernet/netronome/nfp/nfpcore/nfp_cppcore.c

@@ -821,10 +821,7 @@ area_cache_get(struct nfp_cpp *cpp, u32 id,
 	 * the need for special case code below when
 	 * the need for special case code below when
 	 * checking against available cache size.
 	 * checking against available cache size.
 	 */
 	 */
-	if (length == 0)
-		return NULL;
-
-	if (list_empty(&cpp->area_cache_list) || id == 0)
+	if (length == 0 || id == 0)
 		return NULL;
 		return NULL;
 
 
 	/* Remap from cpp_island to cpp_target */
 	/* Remap from cpp_island to cpp_target */
@@ -832,10 +829,15 @@ area_cache_get(struct nfp_cpp *cpp, u32 id,
 	if (err < 0)
 	if (err < 0)
 		return NULL;
 		return NULL;
 
 
-	addr += *offset;
-
 	mutex_lock(&cpp->area_cache_mutex);
 	mutex_lock(&cpp->area_cache_mutex);
 
 
+	if (list_empty(&cpp->area_cache_list)) {
+		mutex_unlock(&cpp->area_cache_mutex);
+		return NULL;
+	}
+
+	addr += *offset;
+
 	/* See if we have a match */
 	/* See if we have a match */
 	list_for_each_entry(cache, &cpp->area_cache_list, entry) {
 	list_for_each_entry(cache, &cpp->area_cache_list, entry) {
 		if (id == cache->id &&
 		if (id == cache->id &&