diff options
author | Herbert Xu <herbert@gondor.apana.org.au> | 2006-06-09 19:10:40 -0400 |
---|---|---|
committer | David S. Miller <davem@sunset.davemloft.net> | 2006-06-18 00:30:16 -0400 |
commit | 364c6badde0dd62a0a38e5ed67f85d87d6665780 (patch) | |
tree | 56c8ad3e3f45fafec010da4f5858825db5dbc86c /include/linux/skbuff.h | |
parent | 932ff279a43ab7257942cddff2595acd541cc49b (diff) |
[NET]: Clean up skb_linearize
The linearisation operation doesn't need to be super-optimised. So we can
replace __skb_linearize with __pskb_pull_tail which does the same thing but
is more general.
Also, most users of skb_linearize end up testing whether the skb is linear
or not so it helps to make skb_linearize do just that.
Some callers of skb_linearize also use it to copy cloned data, so it's
useful to have a new function skb_linearize_cow to copy the data if it's
either non-linear or cloned.
Last but not least, I've removed the gfp argument since nobody uses it
anymore. If it's ever needed we can easily add it back.
Misc bugs fixed by this patch:
* via-velocity error handling (also, no SG => no frags)
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include/linux/skbuff.h')
-rw-r--r-- | include/linux/skbuff.h | 24 |
1 files changed, 20 insertions, 4 deletions
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h index fe2c58e5306f..830f58fa03a2 100644 --- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h | |||
@@ -1169,18 +1169,34 @@ static inline int skb_can_coalesce(struct sk_buff *skb, int i, | |||
1169 | return 0; | 1169 | return 0; |
1170 | } | 1170 | } |
1171 | 1171 | ||
1172 | static inline int __skb_linearize(struct sk_buff *skb) | ||
1173 | { | ||
1174 | return __pskb_pull_tail(skb, skb->data_len) ? 0 : -ENOMEM; | ||
1175 | } | ||
1176 | |||
1172 | /** | 1177 | /** |
1173 | * skb_linearize - convert paged skb to linear one | 1178 | * skb_linearize - convert paged skb to linear one |
1174 | * @skb: buffer to linarize | 1179 | * @skb: buffer to linarize |
1175 | * @gfp: allocation mode | ||
1176 | * | 1180 | * |
1177 | * If there is no free memory -ENOMEM is returned, otherwise zero | 1181 | * If there is no free memory -ENOMEM is returned, otherwise zero |
1178 | * is returned and the old skb data released. | 1182 | * is returned and the old skb data released. |
1179 | */ | 1183 | */ |
1180 | extern int __skb_linearize(struct sk_buff *skb, gfp_t gfp); | 1184 | static inline int skb_linearize(struct sk_buff *skb) |
1181 | static inline int skb_linearize(struct sk_buff *skb, gfp_t gfp) | 1185 | { |
1186 | return skb_is_nonlinear(skb) ? __skb_linearize(skb) : 0; | ||
1187 | } | ||
1188 | |||
1189 | /** | ||
1190 | * skb_linearize_cow - make sure skb is linear and writable | ||
1191 | * @skb: buffer to process | ||
1192 | * | ||
1193 | * If there is no free memory -ENOMEM is returned, otherwise zero | ||
1194 | * is returned and the old skb data released. | ||
1195 | */ | ||
1196 | static inline int skb_linearize_cow(struct sk_buff *skb) | ||
1182 | { | 1197 | { |
1183 | return __skb_linearize(skb, gfp); | 1198 | return skb_is_nonlinear(skb) || skb_cloned(skb) ? |
1199 | __skb_linearize(skb) : 0; | ||
1184 | } | 1200 | } |
1185 | 1201 | ||
1186 | /** | 1202 | /** |