RxRPC: Don't call skb_add_data() if there's no data to copy
authorDavid Howells <dhowells@redhat.com>
Wed, 1 Apr 2015 14:48:00 +0000 (15:48 +0100)
committerDavid Howells <dhowells@redhat.com>
Wed, 1 Apr 2015 14:48:00 +0000 (15:48 +0100)
Don't call skb_add_data() in rxrpc_send_data() if there's no data to copy and
also skip the calculations associated with it in such a case.

Signed-off-by: David Howells <dhowells@redhat.com>
net/rxrpc/ar-output.c

index 833a33b5c1809da92696343fb362a6e86465aca9..f48dc1aa48401ef393ac5289075f76aa9d84d591 100644 (file)
@@ -549,8 +549,6 @@ static int rxrpc_send_data(struct kiocb *iocb,
        if (len > iov_iter_count(&msg->msg_iter))
                len = iov_iter_count(&msg->msg_iter);
        do {
-               int copy;
-
                if (!skb) {
                        size_t size, chunk, max, space;
 
@@ -616,23 +614,25 @@ static int rxrpc_send_data(struct kiocb *iocb,
                sp = rxrpc_skb(skb);
 
                /* append next segment of data to the current buffer */
-               copy = skb_tailroom(skb);
-               ASSERTCMP(copy, >, 0);
-               if (copy > len)
-                       copy = len;
-               if (copy > sp->remain)
-                       copy = sp->remain;
-
-               _debug("add");
-               ret = skb_add_data(skb, &msg->msg_iter, copy);
-               _debug("added");
-               if (ret < 0)
-                       goto efault;
-               sp->remain -= copy;
-               skb->mark += copy;
-               copied += copy;
-
-               len -= copy;
+               if (len > 0) {
+                       int copy = skb_tailroom(skb);
+                       ASSERTCMP(copy, >, 0);
+                       if (copy > len)
+                               copy = len;
+                       if (copy > sp->remain)
+                               copy = sp->remain;
+
+                       _debug("add");
+                       ret = skb_add_data(skb, &msg->msg_iter, copy);
+                       _debug("added");
+                       if (ret < 0)
+                               goto efault;
+                       sp->remain -= copy;
+                       skb->mark += copy;
+                       copied += copy;
+
+                       len -= copy;
+               }
 
                /* check for the far side aborting the call or a network error
                 * occurring */