Skip to content

Commit 0c1c19f

Browse files
author
Trond Myklebust
committed
SUNRPC: Lockless lookup of RPCSEC_GSS mechanisms
Use RCU protected lookups for discovering the supported mechanisms. Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
1 parent 4e4c3be commit 0c1c19f

File tree

1 file changed

+14
-14
lines changed

1 file changed

+14
-14
lines changed

net/sunrpc/auth_gss/gss_mech_switch.c

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ int gss_mech_register(struct gss_api_mech *gm)
117117
if (status)
118118
return status;
119119
spin_lock(&registered_mechs_lock);
120-
list_add(&gm->gm_list, &registered_mechs);
120+
list_add_rcu(&gm->gm_list, &registered_mechs);
121121
spin_unlock(&registered_mechs_lock);
122122
dprintk("RPC: registered gss mechanism %s\n", gm->gm_name);
123123
return 0;
@@ -132,7 +132,7 @@ EXPORT_SYMBOL_GPL(gss_mech_register);
132132
void gss_mech_unregister(struct gss_api_mech *gm)
133133
{
134134
spin_lock(&registered_mechs_lock);
135-
list_del(&gm->gm_list);
135+
list_del_rcu(&gm->gm_list);
136136
spin_unlock(&registered_mechs_lock);
137137
dprintk("RPC: unregistered gss mechanism %s\n", gm->gm_name);
138138
gss_mech_free(gm);
@@ -151,15 +151,15 @@ _gss_mech_get_by_name(const char *name)
151151
{
152152
struct gss_api_mech *pos, *gm = NULL;
153153

154-
spin_lock(&registered_mechs_lock);
155-
list_for_each_entry(pos, &registered_mechs, gm_list) {
154+
rcu_read_lock();
155+
list_for_each_entry_rcu(pos, &registered_mechs, gm_list) {
156156
if (0 == strcmp(name, pos->gm_name)) {
157157
if (try_module_get(pos->gm_owner))
158158
gm = pos;
159159
break;
160160
}
161161
}
162-
spin_unlock(&registered_mechs_lock);
162+
rcu_read_unlock();
163163
return gm;
164164

165165
}
@@ -186,8 +186,8 @@ struct gss_api_mech *gss_mech_get_by_OID(struct rpcsec_gss_oid *obj)
186186
dprintk("RPC: %s(%s)\n", __func__, buf);
187187
request_module("rpc-auth-gss-%s", buf);
188188

189-
spin_lock(&registered_mechs_lock);
190-
list_for_each_entry(pos, &registered_mechs, gm_list) {
189+
rcu_read_lock();
190+
list_for_each_entry_rcu(pos, &registered_mechs, gm_list) {
191191
if (obj->len == pos->gm_oid.len) {
192192
if (0 == memcmp(obj->data, pos->gm_oid.data, obj->len)) {
193193
if (try_module_get(pos->gm_owner))
@@ -196,7 +196,7 @@ struct gss_api_mech *gss_mech_get_by_OID(struct rpcsec_gss_oid *obj)
196196
}
197197
}
198198
}
199-
spin_unlock(&registered_mechs_lock);
199+
rcu_read_unlock();
200200
return gm;
201201
}
202202

@@ -216,15 +216,15 @@ static struct gss_api_mech *_gss_mech_get_by_pseudoflavor(u32 pseudoflavor)
216216
{
217217
struct gss_api_mech *gm = NULL, *pos;
218218

219-
spin_lock(&registered_mechs_lock);
220-
list_for_each_entry(pos, &registered_mechs, gm_list) {
219+
rcu_read_lock();
220+
list_for_each_entry_rcu(pos, &registered_mechs, gm_list) {
221221
if (!mech_supports_pseudoflavor(pos, pseudoflavor))
222222
continue;
223223
if (try_module_get(pos->gm_owner))
224224
gm = pos;
225225
break;
226226
}
227-
spin_unlock(&registered_mechs_lock);
227+
rcu_read_unlock();
228228
return gm;
229229
}
230230

@@ -257,8 +257,8 @@ int gss_mech_list_pseudoflavors(rpc_authflavor_t *array_ptr, int size)
257257
struct gss_api_mech *pos = NULL;
258258
int j, i = 0;
259259

260-
spin_lock(&registered_mechs_lock);
261-
list_for_each_entry(pos, &registered_mechs, gm_list) {
260+
rcu_read_lock();
261+
list_for_each_entry_rcu(pos, &registered_mechs, gm_list) {
262262
for (j = 0; j < pos->gm_pf_num; j++) {
263263
if (i >= size) {
264264
spin_unlock(&registered_mechs_lock);
@@ -267,7 +267,7 @@ int gss_mech_list_pseudoflavors(rpc_authflavor_t *array_ptr, int size)
267267
array_ptr[i++] = pos->gm_pfs[j].pseudoflavor;
268268
}
269269
}
270-
spin_unlock(&registered_mechs_lock);
270+
rcu_read_unlock();
271271
return i;
272272
}
273273

0 commit comments

Comments
 (0)