Skip to content

Commit

Permalink
net: skbuff: add skb_append_pagefrags and use it
Browse files Browse the repository at this point in the history
Signed-off-by: Hannes Frederic Sowa <hannes@stressinduktion.org>
Acked-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Hannes Frederic Sowa authored and David S. Miller committed May 25, 2015
1 parent d98c3ed commit be12a1f
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 11 deletions.
3 changes: 3 additions & 0 deletions include/linux/skbuff.h
Original file line number Diff line number Diff line change
Expand Up @@ -861,6 +861,9 @@ int skb_append_datato_frags(struct sock *sk, struct sk_buff *skb,
int len, int odd, struct sk_buff *skb),
void *from, int length);

int skb_append_pagefrags(struct sk_buff *skb, struct page *page,
int offset, size_t size);

struct skb_seq_state {
__u32 lower_offset;
__u32 upper_offset;
Expand Down
18 changes: 18 additions & 0 deletions net/core/skbuff.c
Original file line number Diff line number Diff line change
Expand Up @@ -2915,6 +2915,24 @@ int skb_append_datato_frags(struct sock *sk, struct sk_buff *skb,
}
EXPORT_SYMBOL(skb_append_datato_frags);

int skb_append_pagefrags(struct sk_buff *skb, struct page *page,
int offset, size_t size)
{
int i = skb_shinfo(skb)->nr_frags;

if (skb_can_coalesce(skb, i, page, offset)) {
skb_frag_size_add(&skb_shinfo(skb)->frags[i - 1], size);
} else if (i < MAX_SKB_FRAGS) {
get_page(page);
skb_fill_page_desc(skb, i, page, offset, size);
} else {
return -EMSGSIZE;
}

return 0;
}
EXPORT_SYMBOL_GPL(skb_append_pagefrags);

/**
* skb_pull_rcsum - pull skb and update receive checksum
* @skb: buffer to update
Expand Down
15 changes: 4 additions & 11 deletions net/ipv4/ip_output.c
Original file line number Diff line number Diff line change
Expand Up @@ -1233,11 +1233,9 @@ ssize_t ip_append_page(struct sock *sk, struct flowi4 *fl4, struct page *page,
}

while (size > 0) {
int i;

if (skb_is_gso(skb))
if (skb_is_gso(skb)) {
len = size;
else {
} else {

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

i = skb_shinfo(skb)->nr_frags;
if (len > size)
len = size;
if (skb_can_coalesce(skb, i, page, offset)) {
skb_frag_size_add(&skb_shinfo(skb)->frags[i-1], len);
} else if (i < MAX_SKB_FRAGS) {
get_page(page);
skb_fill_page_desc(skb, i, page, offset, len);
} else {

if (skb_append_pagefrags(skb, page, offset, len)) {
err = -EMSGSIZE;
goto error;
}
Expand Down

0 comments on commit be12a1f

Please sign in to comment.