Skip to content

Commit fa9251a

Browse files
trondmypdJ. Bruce Fields
authored and
J. Bruce Fields
committed
SUNRPC: Call the default socket callbacks instead of open coding
Rather than code up our own versions of the socket callbacks, just call the defaults. This also allows us to merge svc_udp_data_ready() and svc_tcp_data_ready(). Signed-off-by: Trond Myklebust <[email protected]> Signed-off-by: J. Bruce Fields <[email protected]>
1 parent 069c225 commit fa9251a

File tree

1 file changed

+19
-69
lines changed

1 file changed

+19
-69
lines changed

net/sunrpc/svcsock.c

Lines changed: 19 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,6 @@
6060

6161
static struct svc_sock *svc_setup_socket(struct svc_serv *, struct socket *,
6262
int flags);
63-
static void svc_udp_data_ready(struct sock *);
6463
static int svc_udp_recvfrom(struct svc_rqst *);
6564
static int svc_udp_sendto(struct svc_rqst *);
6665
static void svc_sock_detach(struct svc_xprt *);
@@ -398,48 +397,21 @@ static int svc_sock_secure_port(struct svc_rqst *rqstp)
398397
return svc_port_is_privileged(svc_addr(rqstp));
399398
}
400399

401-
static bool sunrpc_waitqueue_active(wait_queue_head_t *wq)
402-
{
403-
if (!wq)
404-
return false;
405-
/*
406-
* There should normally be a memory * barrier here--see
407-
* wq_has_sleeper().
408-
*
409-
* It appears that isn't currently necessary, though, basically
410-
* because callers all appear to have sufficient memory barriers
411-
* between the time the relevant change is made and the
412-
* time they call these callbacks.
413-
*
414-
* The nfsd code itself doesn't actually explicitly wait on
415-
* these waitqueues, but it may wait on them for example in
416-
* sendpage() or sendmsg() calls. (And those may be the only
417-
* places, since it it uses nonblocking reads.)
418-
*
419-
* Maybe we should add the memory barriers anyway, but these are
420-
* hot paths so we'd need to be convinced there's no sigificant
421-
* penalty.
422-
*/
423-
return waitqueue_active(wq);
424-
}
425-
426400
/*
427401
* INET callback when data has been received on the socket.
428402
*/
429-
static void svc_udp_data_ready(struct sock *sk)
403+
static void svc_data_ready(struct sock *sk)
430404
{
431405
struct svc_sock *svsk = (struct svc_sock *)sk->sk_user_data;
432-
wait_queue_head_t *wq = sk_sleep(sk);
433406

434407
if (svsk) {
435408
dprintk("svc: socket %p(inet %p), busy=%d\n",
436409
svsk, sk,
437410
test_bit(XPT_BUSY, &svsk->sk_xprt.xpt_flags));
411+
svsk->sk_odata(sk);
438412
set_bit(XPT_DATA, &svsk->sk_xprt.xpt_flags);
439413
svc_xprt_enqueue(&svsk->sk_xprt);
440414
}
441-
if (sunrpc_waitqueue_active(wq))
442-
wake_up_interruptible(wq);
443415
}
444416

445417
/*
@@ -448,19 +420,13 @@ static void svc_udp_data_ready(struct sock *sk)
448420
static void svc_write_space(struct sock *sk)
449421
{
450422
struct svc_sock *svsk = (struct svc_sock *)(sk->sk_user_data);
451-
wait_queue_head_t *wq = sk_sleep(sk);
452423

453424
if (svsk) {
454425
dprintk("svc: socket %p(inet %p), write_space busy=%d\n",
455426
svsk, sk, test_bit(XPT_BUSY, &svsk->sk_xprt.xpt_flags));
427+
svsk->sk_owspace(sk);
456428
svc_xprt_enqueue(&svsk->sk_xprt);
457429
}
458-
459-
if (sunrpc_waitqueue_active(wq)) {
460-
dprintk("RPC svc_write_space: someone sleeping on %p\n",
461-
svsk);
462-
wake_up_interruptible(wq);
463-
}
464430
}
465431

466432
static int svc_tcp_has_wspace(struct svc_xprt *xprt)
@@ -485,11 +451,15 @@ static void svc_tcp_write_space(struct sock *sk)
485451
struct svc_sock *svsk = (struct svc_sock *)(sk->sk_user_data);
486452
struct socket *sock = sk->sk_socket;
487453

454+
if (!svsk)
455+
return;
456+
488457
if (!sk_stream_is_writeable(sk) || !sock)
489458
return;
490-
if (!svsk || svc_tcp_has_wspace(&svsk->sk_xprt))
459+
if (svc_tcp_has_wspace(&svsk->sk_xprt)) {
491460
clear_bit(SOCK_NOSPACE, &sock->flags);
492-
svc_write_space(sk);
461+
svc_write_space(sk);
462+
}
493463
}
494464

495465
static void svc_tcp_adjust_wspace(struct svc_xprt *xprt)
@@ -746,7 +716,7 @@ static void svc_udp_init(struct svc_sock *svsk, struct svc_serv *serv)
746716
svc_xprt_init(sock_net(svsk->sk_sock->sk), &svc_udp_class,
747717
&svsk->sk_xprt, serv);
748718
clear_bit(XPT_CACHE_AUTH, &svsk->sk_xprt.xpt_flags);
749-
svsk->sk_sk->sk_data_ready = svc_udp_data_ready;
719+
svsk->sk_sk->sk_data_ready = svc_data_ready;
750720
svsk->sk_sk->sk_write_space = svc_write_space;
751721

752722
/* initialise setting must have enough space to
@@ -786,11 +756,12 @@ static void svc_udp_init(struct svc_sock *svsk, struct svc_serv *serv)
786756
static void svc_tcp_listen_data_ready(struct sock *sk)
787757
{
788758
struct svc_sock *svsk = (struct svc_sock *)sk->sk_user_data;
789-
wait_queue_head_t *wq;
790759

791760
dprintk("svc: socket %p TCP (listen) state change %d\n",
792761
sk, sk->sk_state);
793762

763+
if (svsk)
764+
svsk->sk_odata(sk);
794765
/*
795766
* This callback may called twice when a new connection
796767
* is established as a child socket inherits everything
@@ -808,10 +779,6 @@ static void svc_tcp_listen_data_ready(struct sock *sk)
808779
} else
809780
printk("svc: socket %p: no user data\n", sk);
810781
}
811-
812-
wq = sk_sleep(sk);
813-
if (sunrpc_waitqueue_active(wq))
814-
wake_up_interruptible_all(wq);
815782
}
816783

817784
/*
@@ -820,34 +787,17 @@ static void svc_tcp_listen_data_ready(struct sock *sk)
820787
static void svc_tcp_state_change(struct sock *sk)
821788
{
822789
struct svc_sock *svsk = (struct svc_sock *)sk->sk_user_data;
823-
wait_queue_head_t *wq = sk_sleep(sk);
824790

825791
dprintk("svc: socket %p TCP (connected) state change %d (svsk %p)\n",
826792
sk, sk->sk_state, sk->sk_user_data);
827793

828794
if (!svsk)
829795
printk("svc: socket %p: no user data\n", sk);
830796
else {
797+
svsk->sk_ostate(sk);
831798
set_bit(XPT_CLOSE, &svsk->sk_xprt.xpt_flags);
832799
svc_xprt_enqueue(&svsk->sk_xprt);
833800
}
834-
if (sunrpc_waitqueue_active(wq))
835-
wake_up_interruptible_all(wq);
836-
}
837-
838-
static void svc_tcp_data_ready(struct sock *sk)
839-
{
840-
struct svc_sock *svsk = (struct svc_sock *)sk->sk_user_data;
841-
wait_queue_head_t *wq = sk_sleep(sk);
842-
843-
dprintk("svc: socket %p TCP data ready (svsk %p)\n",
844-
sk, sk->sk_user_data);
845-
if (svsk) {
846-
set_bit(XPT_DATA, &svsk->sk_xprt.xpt_flags);
847-
svc_xprt_enqueue(&svsk->sk_xprt);
848-
}
849-
if (sunrpc_waitqueue_active(wq))
850-
wake_up_interruptible(wq);
851801
}
852802

853803
/*
@@ -901,6 +851,11 @@ static struct svc_xprt *svc_tcp_accept(struct svc_xprt *xprt)
901851
dprintk("%s: connect from %s\n", serv->sv_name,
902852
__svc_print_addr(sin, buf, sizeof(buf)));
903853

854+
/* Reset the inherited callbacks before calling svc_setup_socket */
855+
newsock->sk->sk_state_change = svsk->sk_ostate;
856+
newsock->sk->sk_data_ready = svsk->sk_odata;
857+
newsock->sk->sk_write_space = svsk->sk_owspace;
858+
904859
/* make sure that a write doesn't block forever when
905860
* low on memory
906861
*/
@@ -1357,7 +1312,7 @@ static void svc_tcp_init(struct svc_sock *svsk, struct svc_serv *serv)
13571312
} else {
13581313
dprintk("setting up TCP socket for reading\n");
13591314
sk->sk_state_change = svc_tcp_state_change;
1360-
sk->sk_data_ready = svc_tcp_data_ready;
1315+
sk->sk_data_ready = svc_data_ready;
13611316
sk->sk_write_space = svc_tcp_write_space;
13621317

13631318
svsk->sk_reclen = 0;
@@ -1606,7 +1561,6 @@ static void svc_sock_detach(struct svc_xprt *xprt)
16061561
{
16071562
struct svc_sock *svsk = container_of(xprt, struct svc_sock, sk_xprt);
16081563
struct sock *sk = svsk->sk_sk;
1609-
wait_queue_head_t *wq;
16101564

16111565
dprintk("svc: svc_sock_detach(%p)\n", svsk);
16121566

@@ -1617,10 +1571,6 @@ static void svc_sock_detach(struct svc_xprt *xprt)
16171571
sk->sk_write_space = svsk->sk_owspace;
16181572
sk->sk_user_data = NULL;
16191573
release_sock(sk);
1620-
1621-
wq = sk_sleep(sk);
1622-
if (sunrpc_waitqueue_active(wq))
1623-
wake_up_interruptible(wq);
16241574
}
16251575

16261576
/*

0 commit comments

Comments
 (0)