|
@@ -326,7 +326,7 @@ static void skb_release_data(struct sk_buff *skb)
|
|
|
if (skb_shinfo(skb)->nr_frags) {
|
|
|
int i;
|
|
|
for (i = 0; i < skb_shinfo(skb)->nr_frags; i++)
|
|
|
- put_page(skb_shinfo(skb)->frags[i].page);
|
|
|
+ skb_frag_unref(skb, i);
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -809,7 +809,7 @@ struct sk_buff *pskb_copy(struct sk_buff *skb, gfp_t gfp_mask)
|
|
|
}
|
|
|
for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
|
|
|
skb_shinfo(n)->frags[i] = skb_shinfo(skb)->frags[i];
|
|
|
- get_page(skb_shinfo(n)->frags[i].page);
|
|
|
+ skb_frag_ref(skb, i);
|
|
|
}
|
|
|
skb_shinfo(n)->nr_frags = i;
|
|
|
}
|
|
@@ -901,7 +901,7 @@ int pskb_expand_head(struct sk_buff *skb, int nhead, int ntail,
|
|
|
skb_shinfo(skb)->tx_flags &= ~SKBTX_DEV_ZEROCOPY;
|
|
|
}
|
|
|
for (i = 0; i < skb_shinfo(skb)->nr_frags; i++)
|
|
|
- get_page(skb_shinfo(skb)->frags[i].page);
|
|
|
+ skb_frag_ref(skb, i);
|
|
|
|
|
|
if (skb_has_frag_list(skb))
|
|
|
skb_clone_fraglist(skb);
|
|
@@ -1181,7 +1181,7 @@ drop_pages:
|
|
|
skb_shinfo(skb)->nr_frags = i;
|
|
|
|
|
|
for (; i < nfrags; i++)
|
|
|
- put_page(skb_shinfo(skb)->frags[i].page);
|
|
|
+ skb_frag_unref(skb, i);
|
|
|
|
|
|
if (skb_has_frag_list(skb))
|
|
|
skb_drop_fraglist(skb);
|
|
@@ -1350,7 +1350,7 @@ pull_pages:
|
|
|
k = 0;
|
|
|
for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
|
|
|
if (skb_shinfo(skb)->frags[i].size <= eat) {
|
|
|
- put_page(skb_shinfo(skb)->frags[i].page);
|
|
|
+ skb_frag_unref(skb, i);
|
|
|
eat -= skb_shinfo(skb)->frags[i].size;
|
|
|
} else {
|
|
|
skb_shinfo(skb)->frags[k] = skb_shinfo(skb)->frags[i];
|
|
@@ -1609,7 +1609,8 @@ static int __skb_splice_bits(struct sk_buff *skb, struct pipe_inode_info *pipe,
|
|
|
for (seg = 0; seg < skb_shinfo(skb)->nr_frags; seg++) {
|
|
|
const skb_frag_t *f = &skb_shinfo(skb)->frags[seg];
|
|
|
|
|
|
- if (__splice_segment(f->page, f->page_offset, f->size,
|
|
|
+ if (__splice_segment(skb_frag_page(f),
|
|
|
+ f->page_offset, f->size,
|
|
|
offset, len, skb, spd, 0, sk, pipe))
|
|
|
return 1;
|
|
|
}
|
|
@@ -2154,7 +2155,7 @@ static inline void skb_split_no_header(struct sk_buff *skb,
|
|
|
* where splitting is expensive.
|
|
|
* 2. Split is accurately. We make this.
|
|
|
*/
|
|
|
- get_page(skb_shinfo(skb)->frags[i].page);
|
|
|
+ skb_frag_ref(skb, i);
|
|
|
skb_shinfo(skb1)->frags[0].page_offset += len - pos;
|
|
|
skb_shinfo(skb1)->frags[0].size -= len - pos;
|
|
|
skb_shinfo(skb)->frags[i].size = len - pos;
|
|
@@ -2229,7 +2230,8 @@ int skb_shift(struct sk_buff *tgt, struct sk_buff *skb, int shiftlen)
|
|
|
* commit all, so that we don't have to undo partial changes
|
|
|
*/
|
|
|
if (!to ||
|
|
|
- !skb_can_coalesce(tgt, to, fragfrom->page, fragfrom->page_offset)) {
|
|
|
+ !skb_can_coalesce(tgt, to, skb_frag_page(fragfrom),
|
|
|
+ fragfrom->page_offset)) {
|
|
|
merge = -1;
|
|
|
} else {
|
|
|
merge = to - 1;
|
|
@@ -2276,7 +2278,7 @@ int skb_shift(struct sk_buff *tgt, struct sk_buff *skb, int shiftlen)
|
|
|
to++;
|
|
|
|
|
|
} else {
|
|
|
- get_page(fragfrom->page);
|
|
|
+ __skb_frag_ref(fragfrom);
|
|
|
fragto->page = fragfrom->page;
|
|
|
fragto->page_offset = fragfrom->page_offset;
|
|
|
fragto->size = todo;
|
|
@@ -2298,7 +2300,7 @@ int skb_shift(struct sk_buff *tgt, struct sk_buff *skb, int shiftlen)
|
|
|
fragto = &skb_shinfo(tgt)->frags[merge];
|
|
|
|
|
|
fragto->size += fragfrom->size;
|
|
|
- put_page(fragfrom->page);
|
|
|
+ __skb_frag_unref(fragfrom);
|
|
|
}
|
|
|
|
|
|
/* Reposition in the original skb */
|
|
@@ -2543,8 +2545,7 @@ int skb_append_datato_frags(struct sock *sk, struct sk_buff *skb,
|
|
|
left = PAGE_SIZE - frag->page_offset;
|
|
|
copy = (length > left)? left : length;
|
|
|
|
|
|
- ret = getfrag(from, (page_address(frag->page) +
|
|
|
- frag->page_offset + frag->size),
|
|
|
+ ret = getfrag(from, skb_frag_address(frag) + frag->size,
|
|
|
offset, copy, 0, skb);
|
|
|
if (ret < 0)
|
|
|
return -EFAULT;
|
|
@@ -2696,7 +2697,7 @@ struct sk_buff *skb_segment(struct sk_buff *skb, u32 features)
|
|
|
|
|
|
while (pos < offset + len && i < nfrags) {
|
|
|
*frag = skb_shinfo(skb)->frags[i];
|
|
|
- get_page(frag->page);
|
|
|
+ __skb_frag_ref(frag);
|
|
|
size = frag->size;
|
|
|
|
|
|
if (pos < offset) {
|
|
@@ -2919,7 +2920,7 @@ __skb_to_sgvec(struct sk_buff *skb, struct scatterlist *sg, int offset, int len)
|
|
|
|
|
|
if (copy > len)
|
|
|
copy = len;
|
|
|
- sg_set_page(&sg[elt], frag->page, copy,
|
|
|
+ sg_set_page(&sg[elt], skb_frag_page(frag), copy,
|
|
|
frag->page_offset+offset-start);
|
|
|
elt++;
|
|
|
if (!(len -= copy))
|