hc
2024-09-20 cf4ce59b3b70238352c7f1729f0f7223214828ad
kernel/net/sunrpc/svc_xprt.c
....@@ -1,3 +1,4 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * linux/net/sunrpc/svc_xprt.c
34 *
....@@ -34,7 +35,7 @@
3435 /* apparently the "standard" is that clients close
3536 * idle connections after 5 minutes, servers after
3637 * 6 minutes
37
- * http://www.connectathon.org/talks96/nfstcp.pdf
38
+ * http://nfsv4bat.org/Documents/ConnectAThon/1996/nfstcp.pdf
3839 */
3940 static int svc_conn_age_period = 6*60;
4041
....@@ -145,12 +146,14 @@
145146 struct module *owner = xprt->xpt_class->xcl_owner;
146147 if (test_bit(XPT_CACHE_AUTH, &xprt->xpt_flags))
147148 svcauth_unix_info_release(xprt);
149
+ put_cred(xprt->xpt_cred);
148150 put_net(xprt->xpt_net);
149151 /* See comment on corresponding get in xs_setup_bc_tcp(): */
150152 if (xprt->xpt_bc_xprt)
151153 xprt_put(xprt->xpt_bc_xprt);
152154 if (xprt->xpt_bc_xps)
153155 xprt_switch_put(xprt->xpt_bc_xps);
156
+ trace_svc_xprt_free(xprt);
154157 xprt->xpt_ops->xpo_free(xprt);
155158 module_put(owner);
156159 }
....@@ -180,7 +183,6 @@
180183 mutex_init(&xprt->xpt_mutex);
181184 spin_lock_init(&xprt->xpt_lock);
182185 set_bit(XPT_BUSY, &xprt->xpt_flags);
183
- rpc_init_wait_queue(&xprt->xpt_bc_pending, "xpt_bc_pending");
184186 xprt->xpt_net = get_net(net);
185187 strcpy(xprt->xpt_remotebuf, "uninitialized");
186188 }
....@@ -205,6 +207,7 @@
205207 .sin6_port = htons(port),
206208 };
207209 #endif
210
+ struct svc_xprt *xprt;
208211 struct sockaddr *sap;
209212 size_t len;
210213
....@@ -223,7 +226,11 @@
223226 return ERR_PTR(-EAFNOSUPPORT);
224227 }
225228
226
- return xcl->xcl_ops->xpo_create(serv, net, sap, len, flags);
229
+ xprt = xcl->xcl_ops->xpo_create(serv, net, sap, len, flags);
230
+ if (IS_ERR(xprt))
231
+ trace_svc_xprt_create_err(serv->sv_program->pg_name,
232
+ xcl->xcl_name, sap, xprt);
233
+ return xprt;
227234 }
228235
229236 /*
....@@ -262,7 +269,8 @@
262269
263270 static int _svc_create_xprt(struct svc_serv *serv, const char *xprt_name,
264271 struct net *net, const int family,
265
- const unsigned short port, int flags)
272
+ const unsigned short port, int flags,
273
+ const struct cred *cred)
266274 {
267275 struct svc_xprt_class *xcl;
268276
....@@ -283,6 +291,7 @@
283291 module_put(xcl->xcl_owner);
284292 return PTR_ERR(newxprt);
285293 }
294
+ newxprt->xpt_cred = get_cred(cred);
286295 svc_add_new_perm_xprt(serv, newxprt);
287296 newport = svc_xprt_local_port(newxprt);
288297 return newport;
....@@ -296,19 +305,16 @@
296305
297306 int svc_create_xprt(struct svc_serv *serv, const char *xprt_name,
298307 struct net *net, const int family,
299
- const unsigned short port, int flags)
308
+ const unsigned short port, int flags,
309
+ const struct cred *cred)
300310 {
301311 int err;
302312
303
- dprintk("svc: creating transport %s[%d]\n", xprt_name, port);
304
- err = _svc_create_xprt(serv, xprt_name, net, family, port, flags);
313
+ err = _svc_create_xprt(serv, xprt_name, net, family, port, flags, cred);
305314 if (err == -EPROTONOSUPPORT) {
306315 request_module("svc%s", xprt_name);
307
- err = _svc_create_xprt(serv, xprt_name, net, family, port, flags);
316
+ err = _svc_create_xprt(serv, xprt_name, net, family, port, flags, cred);
308317 }
309
- if (err)
310
- dprintk("svc: transport %s not found, err %d\n",
311
- xprt_name, err);
312318 return err;
313319 }
314320 EXPORT_SYMBOL_GPL(svc_create_xprt);
....@@ -367,15 +373,29 @@
367373 struct svc_xprt *xprt = rqstp->rq_xprt;
368374 if (test_and_clear_bit(RQ_DATA, &rqstp->rq_flags)) {
369375 atomic_dec(&xprt->xpt_nr_rqsts);
376
+ smp_wmb(); /* See smp_rmb() in svc_xprt_ready() */
370377 svc_xprt_enqueue(xprt);
371378 }
372379 }
373380
374
-static bool svc_xprt_has_something_to_do(struct svc_xprt *xprt)
381
+static bool svc_xprt_ready(struct svc_xprt *xprt)
375382 {
376
- if (xprt->xpt_flags & ((1<<XPT_CONN)|(1<<XPT_CLOSE)))
383
+ unsigned long xpt_flags;
384
+
385
+ /*
386
+ * If another cpu has recently updated xpt_flags,
387
+ * sk_sock->flags, xpt_reserved, or xpt_nr_rqsts, we need to
388
+ * know about it; otherwise it's possible that both that cpu and
389
+ * this one could call svc_xprt_enqueue() without either
390
+ * svc_xprt_enqueue() recognizing that the conditions below
391
+ * are satisfied, and we could stall indefinitely:
392
+ */
393
+ smp_rmb();
394
+ xpt_flags = READ_ONCE(xprt->xpt_flags);
395
+
396
+ if (xpt_flags & (BIT(XPT_CONN) | BIT(XPT_CLOSE)))
377397 return true;
378
- if (xprt->xpt_flags & ((1<<XPT_DATA)|(1<<XPT_DEFERRED))) {
398
+ if (xpt_flags & (BIT(XPT_DATA) | BIT(XPT_DEFERRED))) {
379399 if (xprt->xpt_ops->xpo_has_wspace(xprt) &&
380400 svc_xprt_slots_in_range(xprt))
381401 return true;
....@@ -391,7 +411,7 @@
391411 struct svc_rqst *rqstp = NULL;
392412 int cpu;
393413
394
- if (!svc_xprt_has_something_to_do(xprt))
414
+ if (!svc_xprt_ready(xprt))
395415 return;
396416
397417 /* Mark transport as busy. It will remain in this state until
....@@ -485,7 +505,7 @@
485505 if (xprt && space < rqstp->rq_reserved) {
486506 atomic_sub((rqstp->rq_reserved - space), &xprt->xpt_reserved);
487507 rqstp->rq_reserved = space;
488
-
508
+ smp_wmb(); /* See smp_rmb() in svc_xprt_ready() */
489509 svc_xprt_enqueue(xprt);
490510 }
491511 }
....@@ -762,7 +782,6 @@
762782 int len = 0;
763783
764784 if (test_bit(XPT_CLOSE, &xprt->xpt_flags)) {
765
- dprintk("svc_recv: found XPT_CLOSE\n");
766785 if (test_and_clear_bit(XPT_KILL_TEMP, &xprt->xpt_flags))
767786 xprt->xpt_ops->xpo_kill_temp_xprt(xprt);
768787 svc_delete_xprt(xprt);
....@@ -778,9 +797,11 @@
778797 __module_get(xprt->xpt_class->xcl_owner);
779798 svc_check_conn_limits(xprt->xpt_server);
780799 newxpt = xprt->xpt_ops->xpo_accept(xprt);
781
- if (newxpt)
800
+ if (newxpt) {
801
+ newxpt->xpt_cred = get_cred(xprt->xpt_cred);
782802 svc_add_new_temp_xprt(serv, newxpt);
783
- else
803
+ trace_svc_xprt_accept(newxpt, serv->sv_name);
804
+ } else
784805 module_put(xprt->xpt_class->xcl_owner);
785806 } else if (svc_xprt_reserve_slot(rqstp, xprt)) {
786807 /* XPT_DATA|XPT_DEFERRED case: */
....@@ -792,6 +813,8 @@
792813 len = svc_deferred_recv(rqstp);
793814 else
794815 len = xprt->xpt_ops->xpo_recvfrom(rqstp);
816
+ if (len > 0)
817
+ trace_svc_xdr_recvfrom(rqstp, &rqstp->rq_arg);
795818 rqstp->rq_stime = ktime_get();
796819 rqstp->rq_reserved = serv->sv_max_mesg;
797820 atomic_add(rqstp->rq_reserved, &xprt->xpt_reserved);
....@@ -813,14 +836,6 @@
813836 struct svc_xprt *xprt = NULL;
814837 struct svc_serv *serv = rqstp->rq_server;
815838 int len, err;
816
-
817
- dprintk("svc: server %p waiting for data (to = %ld)\n",
818
- rqstp, timeout);
819
-
820
- if (rqstp->rq_xprt)
821
- printk(KERN_ERR
822
- "svc_recv: service %p, transport not NULL!\n",
823
- rqstp);
824839
825840 err = svc_alloc_arg(rqstp);
826841 if (err)
....@@ -869,7 +884,6 @@
869884 void svc_drop(struct svc_rqst *rqstp)
870885 {
871886 trace_svc_drop(rqstp);
872
- dprintk("svc: xprt %p dropped request\n", rqstp->rq_xprt);
873887 svc_xprt_release(rqstp);
874888 }
875889 EXPORT_SYMBOL_GPL(svc_drop);
....@@ -892,17 +906,11 @@
892906 xb->len = xb->head[0].iov_len +
893907 xb->page_len +
894908 xb->tail[0].iov_len;
895
-
896
- /* Grab mutex to serialize outgoing data. */
897
- mutex_lock(&xprt->xpt_mutex);
909
+ trace_svc_xdr_sendto(rqstp, xb);
898910 trace_svc_stats_latency(rqstp);
899
- if (test_bit(XPT_DEAD, &xprt->xpt_flags)
900
- || test_bit(XPT_CLOSE, &xprt->xpt_flags))
901
- len = -ENOTCONN;
902
- else
903
- len = xprt->xpt_ops->xpo_sendto(rqstp);
904
- mutex_unlock(&xprt->xpt_mutex);
905
- rpc_wake_up(&xprt->xpt_bc_pending);
911
+
912
+ len = xprt->xpt_ops->xpo_sendto(rqstp);
913
+
906914 trace_svc_send(rqstp, len);
907915 svc_xprt_release(rqstp);
908916
....@@ -1010,12 +1018,13 @@
10101018 struct svc_serv *serv = xprt->xpt_server;
10111019 struct svc_deferred_req *dr;
10121020
1013
- /* Only do this once */
10141021 if (test_and_set_bit(XPT_DEAD, &xprt->xpt_flags))
1015
- BUG();
1022
+ return;
10161023
1017
- dprintk("svc: svc_delete_xprt(%p)\n", xprt);
1024
+ trace_svc_xprt_detach(xprt);
10181025 xprt->xpt_ops->xpo_detach(xprt);
1026
+ if (xprt->xpt_bc_xprt)
1027
+ xprt->xpt_bc_xprt->ops->close(xprt->xpt_bc_xprt);
10191028
10201029 spin_lock_bh(&serv->sv_lock);
10211030 list_del_init(&xprt->xpt_list);
....@@ -1033,6 +1042,7 @@
10331042
10341043 void svc_close_xprt(struct svc_xprt *xprt)
10351044 {
1045
+ trace_svc_xprt_close(xprt);
10361046 set_bit(XPT_CLOSE, &xprt->xpt_flags);
10371047 if (test_and_set_bit(XPT_BUSY, &xprt->xpt_flags))
10381048 /* someone else will have to effect the close */
....@@ -1135,16 +1145,15 @@
11351145 set_bit(XPT_DEFERRED, &xprt->xpt_flags);
11361146 if (too_many || test_bit(XPT_DEAD, &xprt->xpt_flags)) {
11371147 spin_unlock(&xprt->xpt_lock);
1138
- dprintk("revisit canceled\n");
1148
+ trace_svc_defer_drop(dr);
11391149 svc_xprt_put(xprt);
1140
- trace_svc_drop_deferred(dr);
11411150 kfree(dr);
11421151 return;
11431152 }
1144
- dprintk("revisit queued\n");
11451153 dr->xprt = NULL;
11461154 list_add(&dr->handle.recent, &xprt->xpt_deferred);
11471155 spin_unlock(&xprt->xpt_lock);
1156
+ trace_svc_defer_queue(dr);
11481157 svc_xprt_enqueue(xprt);
11491158 svc_xprt_put(xprt);
11501159 }
....@@ -1190,21 +1199,23 @@
11901199 memcpy(dr->args, rqstp->rq_arg.head[0].iov_base - skip,
11911200 dr->argslen << 2);
11921201 }
1202
+ trace_svc_defer(rqstp);
11931203 svc_xprt_get(rqstp->rq_xprt);
11941204 dr->xprt = rqstp->rq_xprt;
11951205 set_bit(RQ_DROPME, &rqstp->rq_flags);
11961206
11971207 dr->handle.revisit = svc_revisit;
1198
- trace_svc_defer(rqstp);
11991208 return &dr->handle;
12001209 }
12011210
12021211 /*
12031212 * recv data from a deferred request into an active one
12041213 */
1205
-static int svc_deferred_recv(struct svc_rqst *rqstp)
1214
+static noinline int svc_deferred_recv(struct svc_rqst *rqstp)
12061215 {
12071216 struct svc_deferred_req *dr = rqstp->rq_deferred;
1217
+
1218
+ trace_svc_defer_recv(dr);
12081219
12091220 /* setup iov_base past transport header */
12101221 rqstp->rq_arg.head[0].iov_base = dr->args + (dr->xprt_hlen>>2);
....@@ -1236,7 +1247,6 @@
12361247 struct svc_deferred_req,
12371248 handle.recent);
12381249 list_del_init(&dr->handle.recent);
1239
- trace_svc_revisit_deferred(dr);
12401250 } else
12411251 clear_bit(XPT_DEFERRED, &xprt->xpt_flags);
12421252 spin_unlock(&xprt->xpt_lock);