From: Evgeniy Polyakov <[EMAIL PROTECTED]>
Date: Mon, 7 Aug 2006 10:01:56 +0400
> + int order = get_order(size + sizeof(void *));
> + struct skb_shared_info *sh;
>
> cache = fclone ? skbuff_fclone_cache : skbuff_head_cache;
>
> @@ -156,11 +159,28 @@ struct sk_buff *__alloc_skb(unsigned int
>
> /* Get the DATA. Size must match skb_add_mtu(). */
> size = SKB_DATA_ALIGN(size);
> - data = ____kmalloc(size + sizeof(struct skb_shared_info), gfp_mask);
> - if (!data)
> - goto nodata;
> + if ((1UL << order) > size + sizeof(void *) + sizeof(struct
> skb_shared_info)) {
get_order() returns a PAGE_SIZE order not a byte one. So this test
here at the end is incorrect. It should probably be something
like "if ((PAGE_SIZE << order) > ..."
I don't know if I want to eat an entire extra allocation for every SKB
just to handle broken e1000 cards that can't be bothered to support
non-power-of-2 receive buffer sizes and a proper MTU setting.
I guess we might have to, but this is extremely unfortunate. :-/
-
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at http://vger.kernel.org/majordomo-info.html