@@ -399,13 +399,13 @@ static int xs_send_kvec(struct socket *sock, struct sockaddr *addr, int addrlen,
399
399
return kernel_sendmsg (sock , & msg , NULL , 0 , 0 );
400
400
}
401
401
402
- static int xs_send_pagedata (struct socket * sock , struct xdr_buf * xdr , unsigned int base , int more , bool zerocopy )
402
+ static int xs_send_pagedata (struct socket * sock , struct xdr_buf * xdr , unsigned int base , int more , bool zerocopy , int * sent_p )
403
403
{
404
404
ssize_t (* do_sendpage )(struct socket * sock , struct page * page ,
405
405
int offset , size_t size , int flags );
406
406
struct page * * ppage ;
407
407
unsigned int remainder ;
408
- int err , sent = 0 ;
408
+ int err ;
409
409
410
410
remainder = xdr -> page_len - base ;
411
411
base += xdr -> page_base ;
@@ -424,15 +424,15 @@ static int xs_send_pagedata(struct socket *sock, struct xdr_buf *xdr, unsigned i
424
424
err = do_sendpage (sock , * ppage , base , len , flags );
425
425
if (remainder == 0 || err != len )
426
426
break ;
427
- sent += err ;
427
+ * sent_p += err ;
428
428
ppage ++ ;
429
429
base = 0 ;
430
430
}
431
- if (sent == 0 )
432
- return err ;
433
- if ( err > 0 )
434
- sent += err ;
435
- return sent ;
431
+ if (err > 0 ) {
432
+ * sent_p += err ;
433
+ err = 0 ;
434
+ }
435
+ return err ;
436
436
}
437
437
438
438
/**
@@ -443,12 +443,14 @@ static int xs_send_pagedata(struct socket *sock, struct xdr_buf *xdr, unsigned i
443
443
* @xdr: buffer containing this request
444
444
* @base: starting position in the buffer
445
445
* @zerocopy: true if it is safe to use sendpage()
446
+ * @sent_p: return the total number of bytes successfully queued for sending
446
447
*
447
448
*/
448
- static int xs_sendpages (struct socket * sock , struct sockaddr * addr , int addrlen , struct xdr_buf * xdr , unsigned int base , bool zerocopy )
449
+ static int xs_sendpages (struct socket * sock , struct sockaddr * addr , int addrlen , struct xdr_buf * xdr , unsigned int base , bool zerocopy , int * sent_p )
449
450
{
450
451
unsigned int remainder = xdr -> len - base ;
451
- int err , sent = 0 ;
452
+ int err = 0 ;
453
+ int sent = 0 ;
452
454
453
455
if (unlikely (!sock ))
454
456
return - ENOTSOCK ;
@@ -465,31 +467,31 @@ static int xs_sendpages(struct socket *sock, struct sockaddr *addr, int addrlen,
465
467
err = xs_send_kvec (sock , addr , addrlen , & xdr -> head [0 ], base , remainder != 0 );
466
468
if (remainder == 0 || err != len )
467
469
goto out ;
468
- sent += err ;
470
+ * sent_p += err ;
469
471
base = 0 ;
470
472
} else
471
473
base -= xdr -> head [0 ].iov_len ;
472
474
473
475
if (base < xdr -> page_len ) {
474
476
unsigned int len = xdr -> page_len - base ;
475
477
remainder -= len ;
476
- err = xs_send_pagedata (sock , xdr , base , remainder != 0 , zerocopy );
477
- if (remainder == 0 || err != len )
478
+ err = xs_send_pagedata (sock , xdr , base , remainder != 0 , zerocopy , & sent );
479
+ * sent_p += sent ;
480
+ if (remainder == 0 || sent != len )
478
481
goto out ;
479
- sent += err ;
480
482
base = 0 ;
481
483
} else
482
484
base -= xdr -> page_len ;
483
485
484
486
if (base >= xdr -> tail [0 ].iov_len )
485
- return sent ;
487
+ return 0 ;
486
488
err = xs_send_kvec (sock , NULL , 0 , & xdr -> tail [0 ], base , 0 );
487
489
out :
488
- if (sent == 0 )
489
- return err ;
490
- if ( err > 0 )
491
- sent += err ;
492
- return sent ;
490
+ if (err > 0 ) {
491
+ * sent_p += err ;
492
+ err = 0 ;
493
+ }
494
+ return err ;
493
495
}
494
496
495
497
static void xs_nospace_callback (struct rpc_task * task )
@@ -573,19 +575,20 @@ static int xs_local_send_request(struct rpc_task *task)
573
575
container_of (xprt , struct sock_xprt , xprt );
574
576
struct xdr_buf * xdr = & req -> rq_snd_buf ;
575
577
int status ;
578
+ int sent = 0 ;
576
579
577
580
xs_encode_stream_record_marker (& req -> rq_snd_buf );
578
581
579
582
xs_pktdump ("packet data:" ,
580
583
req -> rq_svec -> iov_base , req -> rq_svec -> iov_len );
581
584
582
- status = xs_sendpages (transport -> sock , NULL , 0 ,
583
- xdr , req -> rq_bytes_sent , true);
585
+ status = xs_sendpages (transport -> sock , NULL , 0 , xdr , req -> rq_bytes_sent ,
586
+ true, & sent );
584
587
dprintk ("RPC: %s(%u) = %d\n" ,
585
588
__func__ , xdr -> len - req -> rq_bytes_sent , status );
586
- if (likely (status >= 0 )) {
587
- req -> rq_bytes_sent += status ;
588
- req -> rq_xmit_bytes_sent += status ;
589
+ if (likely (sent > 0 ) || status == 0 ) {
590
+ req -> rq_bytes_sent += sent ;
591
+ req -> rq_xmit_bytes_sent += sent ;
589
592
if (likely (req -> rq_bytes_sent >= req -> rq_slen )) {
590
593
req -> rq_bytes_sent = 0 ;
591
594
return 0 ;
@@ -626,6 +629,7 @@ static int xs_udp_send_request(struct rpc_task *task)
626
629
struct rpc_xprt * xprt = req -> rq_xprt ;
627
630
struct sock_xprt * transport = container_of (xprt , struct sock_xprt , xprt );
628
631
struct xdr_buf * xdr = & req -> rq_snd_buf ;
632
+ int sent = 0 ;
629
633
int status ;
630
634
631
635
xs_pktdump ("packet data:" ,
@@ -634,17 +638,15 @@ static int xs_udp_send_request(struct rpc_task *task)
634
638
635
639
if (!xprt_bound (xprt ))
636
640
return - ENOTCONN ;
637
- status = xs_sendpages (transport -> sock ,
638
- xs_addr (xprt ),
639
- xprt -> addrlen , xdr ,
640
- req -> rq_bytes_sent , true);
641
+ status = xs_sendpages (transport -> sock , xs_addr (xprt ), xprt -> addrlen ,
642
+ xdr , req -> rq_bytes_sent , true, & sent );
641
643
642
644
dprintk ("RPC: xs_udp_send_request(%u) = %d\n" ,
643
645
xdr -> len - req -> rq_bytes_sent , status );
644
646
645
- if (status > = 0 ) {
646
- req -> rq_xmit_bytes_sent += status ;
647
- if (status >= req -> rq_slen )
647
+ if (sent > 0 || status = = 0 ) {
648
+ req -> rq_xmit_bytes_sent += sent ;
649
+ if (sent >= req -> rq_slen )
648
650
return 0 ;
649
651
/* Still some bytes left; set up for a retry later. */
650
652
status = - EAGAIN ;
@@ -713,6 +715,7 @@ static int xs_tcp_send_request(struct rpc_task *task)
713
715
struct xdr_buf * xdr = & req -> rq_snd_buf ;
714
716
bool zerocopy = true;
715
717
int status ;
718
+ int sent ;
716
719
717
720
xs_encode_stream_record_marker (& req -> rq_snd_buf );
718
721
@@ -730,26 +733,26 @@ static int xs_tcp_send_request(struct rpc_task *task)
730
733
* to cope with writespace callbacks arriving _after_ we have
731
734
* called sendmsg(). */
732
735
while (1 ) {
733
- status = xs_sendpages ( transport -> sock ,
734
- NULL , 0 , xdr , req -> rq_bytes_sent ,
735
- zerocopy );
736
+ sent = 0 ;
737
+ status = xs_sendpages ( transport -> sock , NULL , 0 , xdr ,
738
+ req -> rq_bytes_sent , zerocopy , & sent );
736
739
737
740
dprintk ("RPC: xs_tcp_send_request(%u) = %d\n" ,
738
741
xdr -> len - req -> rq_bytes_sent , status );
739
742
740
- if (unlikely (status < 0 ))
743
+ if (unlikely (sent == 0 && status < 0 ))
741
744
break ;
742
745
743
746
/* If we've sent the entire packet, immediately
744
747
* reset the count of bytes sent. */
745
- req -> rq_bytes_sent += status ;
746
- req -> rq_xmit_bytes_sent += status ;
748
+ req -> rq_bytes_sent += sent ;
749
+ req -> rq_xmit_bytes_sent += sent ;
747
750
if (likely (req -> rq_bytes_sent >= req -> rq_slen )) {
748
751
req -> rq_bytes_sent = 0 ;
749
752
return 0 ;
750
753
}
751
754
752
- if (status != 0 )
755
+ if (sent != 0 )
753
756
continue ;
754
757
status = - EAGAIN ;
755
758
break ;
0 commit comments