@@ -696,6 +696,40 @@ xs_stream_reset_connect(struct sock_xprt *transport)
696
696
697
697
#define XS_SENDMSG_FLAGS (MSG_DONTWAIT | MSG_NOSIGNAL)
698
698
699
+ /* Common case:
700
+ * - stream transport
701
+ * - sending from byte 0 of the message
702
+ * - the message is wholly contained in @xdr's head iovec
703
+ */
704
+ static int xs_send_rm_and_kvec (struct socket * sock , struct xdr_buf * xdr ,
705
+ unsigned int remainder )
706
+ {
707
+ struct msghdr msg = {
708
+ .msg_flags = XS_SENDMSG_FLAGS | (remainder ? MSG_MORE : 0 )
709
+ };
710
+ rpc_fraghdr marker = cpu_to_be32 (RPC_LAST_STREAM_FRAGMENT |
711
+ (u32 )xdr -> len );
712
+ struct kvec iov [2 ] = {
713
+ {
714
+ .iov_base = & marker ,
715
+ .iov_len = sizeof (marker )
716
+ },
717
+ {
718
+ .iov_base = xdr -> head [0 ].iov_base ,
719
+ .iov_len = xdr -> head [0 ].iov_len
720
+ },
721
+ };
722
+ int ret ;
723
+
724
+ ret = kernel_sendmsg (sock , & msg , iov , 2 ,
725
+ iov [0 ].iov_len + iov [1 ].iov_len );
726
+ if (ret < 0 )
727
+ return ret ;
728
+ if (ret < iov [0 ].iov_len )
729
+ return - EPIPE ;
730
+ return ret - iov [0 ].iov_len ;
731
+ }
732
+
699
733
static int xs_send_kvec (struct socket * sock , struct sockaddr * addr , int addrlen , struct kvec * vec , unsigned int base , int more )
700
734
{
701
735
struct msghdr msg = {
@@ -779,7 +813,11 @@ static int xs_sendpages(struct socket *sock, struct sockaddr *addr, int addrlen,
779
813
if (base < xdr -> head [0 ].iov_len || addr != NULL ) {
780
814
unsigned int len = xdr -> head [0 ].iov_len - base ;
781
815
remainder -= len ;
782
- err = xs_send_kvec (sock , addr , addrlen , & xdr -> head [0 ], base , remainder != 0 );
816
+ if (!base && !addr )
817
+ err = xs_send_rm_and_kvec (sock , xdr , remainder );
818
+ else
819
+ err = xs_send_kvec (sock , addr , addrlen , & xdr -> head [0 ],
820
+ base , remainder != 0 );
783
821
if (remainder == 0 || err != len )
784
822
goto out ;
785
823
* sent_p += err ;
@@ -869,16 +907,6 @@ xs_send_request_was_aborted(struct sock_xprt *transport, struct rpc_rqst *req)
869
907
return transport -> xmit .offset != 0 && req -> rq_bytes_sent == 0 ;
870
908
}
871
909
872
- /*
873
- * Construct a stream transport record marker in @buf.
874
- */
875
- static inline void xs_encode_stream_record_marker (struct xdr_buf * buf )
876
- {
877
- u32 reclen = buf -> len - sizeof (rpc_fraghdr );
878
- rpc_fraghdr * base = buf -> head [0 ].iov_base ;
879
- * base = cpu_to_be32 (RPC_LAST_STREAM_FRAGMENT | reclen );
880
- }
881
-
882
910
/**
883
911
* xs_local_send_request - write an RPC request to an AF_LOCAL socket
884
912
* @req: pointer to RPC request
@@ -905,8 +933,6 @@ static int xs_local_send_request(struct rpc_rqst *req)
905
933
return - ENOTCONN ;
906
934
}
907
935
908
- xs_encode_stream_record_marker (& req -> rq_snd_buf );
909
-
910
936
xs_pktdump ("packet data:" ,
911
937
req -> rq_svec -> iov_base , req -> rq_svec -> iov_len );
912
938
@@ -1057,8 +1083,6 @@ static int xs_tcp_send_request(struct rpc_rqst *req)
1057
1083
return - ENOTCONN ;
1058
1084
}
1059
1085
1060
- xs_encode_stream_record_marker (& req -> rq_snd_buf );
1061
-
1062
1086
xs_pktdump ("packet data:" ,
1063
1087
req -> rq_svec -> iov_base ,
1064
1088
req -> rq_svec -> iov_len );
@@ -2534,26 +2558,35 @@ static int bc_sendto(struct rpc_rqst *req)
2534
2558
{
2535
2559
int len ;
2536
2560
struct xdr_buf * xbufp = & req -> rq_snd_buf ;
2537
- struct rpc_xprt * xprt = req -> rq_xprt ;
2538
2561
struct sock_xprt * transport =
2539
- container_of (xprt , struct sock_xprt , xprt );
2540
- struct socket * sock = transport -> sock ;
2562
+ container_of (req -> rq_xprt , struct sock_xprt , xprt );
2541
2563
unsigned long headoff ;
2542
2564
unsigned long tailoff ;
2565
+ struct page * tailpage ;
2566
+ struct msghdr msg = {
2567
+ .msg_flags = MSG_MORE
2568
+ };
2569
+ rpc_fraghdr marker = cpu_to_be32 (RPC_LAST_STREAM_FRAGMENT |
2570
+ (u32 )xbufp -> len );
2571
+ struct kvec iov = {
2572
+ .iov_base = & marker ,
2573
+ .iov_len = sizeof (marker ),
2574
+ };
2543
2575
2544
- xs_encode_stream_record_marker (xbufp );
2576
+ len = kernel_sendmsg (transport -> sock , & msg , & iov , 1 , iov .iov_len );
2577
+ if (len != iov .iov_len )
2578
+ return - EAGAIN ;
2545
2579
2580
+ tailpage = NULL ;
2581
+ if (xbufp -> tail [0 ].iov_len )
2582
+ tailpage = virt_to_page (xbufp -> tail [0 ].iov_base );
2546
2583
tailoff = (unsigned long )xbufp -> tail [0 ].iov_base & ~PAGE_MASK ;
2547
2584
headoff = (unsigned long )xbufp -> head [0 ].iov_base & ~PAGE_MASK ;
2548
- len = svc_send_common (sock , xbufp ,
2585
+ len = svc_send_common (transport -> sock , xbufp ,
2549
2586
virt_to_page (xbufp -> head [0 ].iov_base ), headoff ,
2550
- xbufp -> tail [0 ].iov_base , tailoff );
2551
-
2552
- if (len != xbufp -> len ) {
2553
- printk (KERN_NOTICE "Error sending entire callback!\n" );
2554
- len = - EAGAIN ;
2555
- }
2556
-
2587
+ tailpage , tailoff );
2588
+ if (len != xbufp -> len )
2589
+ return - EAGAIN ;
2557
2590
return len ;
2558
2591
}
2559
2592
@@ -2793,7 +2826,6 @@ static struct rpc_xprt *xs_setup_local(struct xprt_create *args)
2793
2826
transport = container_of (xprt , struct sock_xprt , xprt );
2794
2827
2795
2828
xprt -> prot = 0 ;
2796
- xprt -> tsh_size = sizeof (rpc_fraghdr ) / sizeof (u32 );
2797
2829
xprt -> max_payload = RPC_MAX_FRAGMENT_SIZE ;
2798
2830
2799
2831
xprt -> bind_timeout = XS_BIND_TO ;
@@ -2862,7 +2894,6 @@ static struct rpc_xprt *xs_setup_udp(struct xprt_create *args)
2862
2894
transport = container_of (xprt , struct sock_xprt , xprt );
2863
2895
2864
2896
xprt -> prot = IPPROTO_UDP ;
2865
- xprt -> tsh_size = 0 ;
2866
2897
/* XXX: header size can vary due to auth type, IPv6, etc. */
2867
2898
xprt -> max_payload = (1U << 16 ) - (MAX_HEADER << 3 );
2868
2899
@@ -2942,7 +2973,6 @@ static struct rpc_xprt *xs_setup_tcp(struct xprt_create *args)
2942
2973
transport = container_of (xprt , struct sock_xprt , xprt );
2943
2974
2944
2975
xprt -> prot = IPPROTO_TCP ;
2945
- xprt -> tsh_size = sizeof (rpc_fraghdr ) / sizeof (u32 );
2946
2976
xprt -> max_payload = RPC_MAX_FRAGMENT_SIZE ;
2947
2977
2948
2978
xprt -> bind_timeout = XS_BIND_TO ;
@@ -3015,7 +3045,6 @@ static struct rpc_xprt *xs_setup_bc_tcp(struct xprt_create *args)
3015
3045
transport = container_of (xprt , struct sock_xprt , xprt );
3016
3046
3017
3047
xprt -> prot = IPPROTO_TCP ;
3018
- xprt -> tsh_size = sizeof (rpc_fraghdr ) / sizeof (u32 );
3019
3048
xprt -> max_payload = RPC_MAX_FRAGMENT_SIZE ;
3020
3049
xprt -> timeout = & xs_tcp_default_timeout ;
3021
3050
0 commit comments