|
@@ -929,23 +929,25 @@ static int kcm_sendmsg(struct socket *sock, struct msghdr *msg, size_t len)
|
|
|
goto out_error;
|
|
|
}
|
|
|
|
|
|
- /* New message, alloc head skb */
|
|
|
- head = alloc_skb(0, sk->sk_allocation);
|
|
|
- while (!head) {
|
|
|
- kcm_push(kcm);
|
|
|
- err = sk_stream_wait_memory(sk, &timeo);
|
|
|
- if (err)
|
|
|
- goto out_error;
|
|
|
-
|
|
|
+ if (msg_data_left(msg)) {
|
|
|
+ /* New message, alloc head skb */
|
|
|
head = alloc_skb(0, sk->sk_allocation);
|
|
|
- }
|
|
|
+ while (!head) {
|
|
|
+ kcm_push(kcm);
|
|
|
+ err = sk_stream_wait_memory(sk, &timeo);
|
|
|
+ if (err)
|
|
|
+ goto out_error;
|
|
|
|
|
|
- skb = head;
|
|
|
+ head = alloc_skb(0, sk->sk_allocation);
|
|
|
+ }
|
|
|
|
|
|
- /* Set ip_summed to CHECKSUM_UNNECESSARY to avoid calling
|
|
|
- * csum_and_copy_from_iter from skb_do_copy_data_nocache.
|
|
|
- */
|
|
|
- skb->ip_summed = CHECKSUM_UNNECESSARY;
|
|
|
+ skb = head;
|
|
|
+
|
|
|
+ /* Set ip_summed to CHECKSUM_UNNECESSARY to avoid calling
|
|
|
+ * csum_and_copy_from_iter from skb_do_copy_data_nocache.
|
|
|
+ */
|
|
|
+ skb->ip_summed = CHECKSUM_UNNECESSARY;
|
|
|
+ }
|
|
|
|
|
|
start:
|
|
|
while (msg_data_left(msg)) {
|
|
@@ -1018,10 +1020,12 @@ wait_for_memory:
|
|
|
if (eor) {
|
|
|
bool not_busy = skb_queue_empty(&sk->sk_write_queue);
|
|
|
|
|
|
- /* Message complete, queue it on send buffer */
|
|
|
- __skb_queue_tail(&sk->sk_write_queue, head);
|
|
|
- kcm->seq_skb = NULL;
|
|
|
- KCM_STATS_INCR(kcm->stats.tx_msgs);
|
|
|
+ if (head) {
|
|
|
+ /* Message complete, queue it on send buffer */
|
|
|
+ __skb_queue_tail(&sk->sk_write_queue, head);
|
|
|
+ kcm->seq_skb = NULL;
|
|
|
+ KCM_STATS_INCR(kcm->stats.tx_msgs);
|
|
|
+ }
|
|
|
|
|
|
if (msg->msg_flags & MSG_BATCH) {
|
|
|
kcm->tx_wait_more = true;
|