Skip to content

Commit be12a1f

Browse files
strssndktndavem330
authored andcommitted
net: skbuff: add skb_append_pagefrags and use it
Signed-off-by: Hannes Frederic Sowa <[email protected]> Acked-by: Eric Dumazet <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent d98c3ed commit be12a1f

File tree

3 files changed

+25
-11
lines changed

3 files changed

+25
-11
lines changed

include/linux/skbuff.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -861,6 +861,9 @@ int skb_append_datato_frags(struct sock *sk, struct sk_buff *skb,
861861
int len, int odd, struct sk_buff *skb),
862862
void *from, int length);
863863

864+
int skb_append_pagefrags(struct sk_buff *skb, struct page *page,
865+
int offset, size_t size);
866+
864867
struct skb_seq_state {
865868
__u32 lower_offset;
866869
__u32 upper_offset;

net/core/skbuff.c

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2915,6 +2915,24 @@ int skb_append_datato_frags(struct sock *sk, struct sk_buff *skb,
29152915
}
29162916
EXPORT_SYMBOL(skb_append_datato_frags);
29172917

2918+
int skb_append_pagefrags(struct sk_buff *skb, struct page *page,
2919+
int offset, size_t size)
2920+
{
2921+
int i = skb_shinfo(skb)->nr_frags;
2922+
2923+
if (skb_can_coalesce(skb, i, page, offset)) {
2924+
skb_frag_size_add(&skb_shinfo(skb)->frags[i - 1], size);
2925+
} else if (i < MAX_SKB_FRAGS) {
2926+
get_page(page);
2927+
skb_fill_page_desc(skb, i, page, offset, size);
2928+
} else {
2929+
return -EMSGSIZE;
2930+
}
2931+
2932+
return 0;
2933+
}
2934+
EXPORT_SYMBOL_GPL(skb_append_pagefrags);
2935+
29182936
/**
29192937
* skb_pull_rcsum - pull skb and update receive checksum
29202938
* @skb: buffer to update

net/ipv4/ip_output.c

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1233,11 +1233,9 @@ ssize_t ip_append_page(struct sock *sk, struct flowi4 *fl4, struct page *page,
12331233
}
12341234

12351235
while (size > 0) {
1236-
int i;
1237-
1238-
if (skb_is_gso(skb))
1236+
if (skb_is_gso(skb)) {
12391237
len = size;
1240-
else {
1238+
} else {
12411239

12421240
/* Check if the remaining data fits into current packet. */
12431241
len = mtu - skb->len;
@@ -1289,15 +1287,10 @@ ssize_t ip_append_page(struct sock *sk, struct flowi4 *fl4, struct page *page,
12891287
continue;
12901288
}
12911289

1292-
i = skb_shinfo(skb)->nr_frags;
12931290
if (len > size)
12941291
len = size;
1295-
if (skb_can_coalesce(skb, i, page, offset)) {
1296-
skb_frag_size_add(&skb_shinfo(skb)->frags[i-1], len);
1297-
} else if (i < MAX_SKB_FRAGS) {
1298-
get_page(page);
1299-
skb_fill_page_desc(skb, i, page, offset, len);
1300-
} else {
1292+
1293+
if (skb_append_pagefrags(skb, page, offset, len)) {
13011294
err = -EMSGSIZE;
13021295
goto error;
13031296
}

0 commit comments

Comments
 (0)