summaryrefslogtreecommitdiffstats
path: root/net/xfrm/xfrm_state.c
diff options
context:
space:
mode:
authorFlorian Westphal <fw@strlen.de>2017-01-09 14:20:49 +0100
committerSteffen Klassert <steffen.klassert@secunet.com>2017-01-10 10:57:14 +0100
commit75cda62d9ca2cd3fab0412d438fcd1bfa0580b3d (patch)
tree8440ffce5bf5161b762fa15be57e019cfb4917c8 /net/xfrm/xfrm_state.c
parent711059b9752ad09ae6bcd4be8e48d30e5db483d8 (diff)
downloadlinux-75cda62d9ca2cd3fab0412d438fcd1bfa0580b3d.tar.gz
linux-75cda62d9ca2cd3fab0412d438fcd1bfa0580b3d.tar.bz2
linux-75cda62d9ca2cd3fab0412d438fcd1bfa0580b3d.zip
xfrm: state: simplify rcu_read_unlock handling in two spots
Instead of: if (foo) { unlock(); return bar(); } unlock(); do: unlock(); if (foo) return bar(); This is ok because rcu protected structure is only dereferenced before the conditional. Signed-off-by: Florian Westphal <fw@strlen.de> Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com>
Diffstat (limited to 'net/xfrm/xfrm_state.c')
-rw-r--r--net/xfrm/xfrm_state.c13
1 files changed, 7 insertions, 6 deletions
diff --git a/net/xfrm/xfrm_state.c b/net/xfrm/xfrm_state.c
index b5dad899fb0e..a62097e640b5 100644
--- a/net/xfrm/xfrm_state.c
+++ b/net/xfrm/xfrm_state.c
@@ -231,17 +231,18 @@ retry:
return NULL;
typemap = afinfo->type_map;
- type = typemap[proto];
+ type = READ_ONCE(typemap[proto]);
if (unlikely(type && !try_module_get(type->owner)))
type = NULL;
+
+ rcu_read_unlock();
+
if (!type && !modload_attempted) {
- rcu_read_unlock();
request_module("xfrm-type-%d-%d", family, proto);
modload_attempted = 1;
goto retry;
}
- rcu_read_unlock();
return type;
}
@@ -327,17 +328,17 @@ retry:
if (unlikely(afinfo == NULL))
return NULL;
- mode = afinfo->mode_map[encap];
+ mode = READ_ONCE(afinfo->mode_map[encap]);
if (unlikely(mode && !try_module_get(mode->owner)))
mode = NULL;
+
+ rcu_read_unlock();
if (!mode && !modload_attempted) {
- rcu_read_unlock();
request_module("xfrm-mode-%d-%d", family, encap);
modload_attempted = 1;
goto retry;
}
- rcu_read_unlock();
return mode;
}