WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-changelog

[Xen-changelog] Fix alloc_skb() to ensure data is always physically cont

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] Fix alloc_skb() to ensure data is always physically contiguous.
From: Xen patchbot -unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Tue, 08 Nov 2005 16:54:08 +0000
Delivery-date: Tue, 08 Nov 2005 16:54:31 +0000
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-id: BK change log <xen-changelog.lists.xensource.com>
List-post: <mailto:xen-changelog@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
Reply-to: xen-devel@xxxxxxxxxxxxxxxxxxx
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
# HG changeset patch
# User kaf24@xxxxxxxxxxxxxxxxxxxx
# Node ID 98bcd8fbd5e36662c10becdcd0222a22161bb2b6
# Parent  0915074c356e37017562298ded188c5c354ed463
Fix alloc_skb() to ensure data is always physically contiguous.
Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx>

diff -r 0915074c356e -r 98bcd8fbd5e3 linux-2.6-xen-sparse/arch/xen/Kconfig
--- a/linux-2.6-xen-sparse/arch/xen/Kconfig     Tue Nov  8 14:58:31 2005
+++ b/linux-2.6-xen-sparse/arch/xen/Kconfig     Tue Nov  8 15:48:42 2005
@@ -173,6 +173,10 @@
 
 endmenu
 
+config HAVE_ARCH_ALLOC_SKB
+       bool
+       default y
+
 config HAVE_ARCH_DEV_ALLOC_SKB
        bool
        default y
diff -r 0915074c356e -r 98bcd8fbd5e3 
linux-2.6-xen-sparse/arch/xen/configs/xen0_defconfig_x86_32
--- a/linux-2.6-xen-sparse/arch/xen/configs/xen0_defconfig_x86_32       Tue Nov 
 8 14:58:31 2005
+++ b/linux-2.6-xen-sparse/arch/xen/configs/xen0_defconfig_x86_32       Tue Nov 
 8 15:48:42 2005
@@ -25,6 +25,7 @@
 CONFIG_XEN_SCRUB_PAGES=y
 CONFIG_XEN_X86=y
 # CONFIG_XEN_X86_64 is not set
+CONFIG_HAVE_ARCH_ALLOC_SKB=y
 CONFIG_HAVE_ARCH_DEV_ALLOC_SKB=y
 
 #
diff -r 0915074c356e -r 98bcd8fbd5e3 
linux-2.6-xen-sparse/arch/xen/configs/xen0_defconfig_x86_64
--- a/linux-2.6-xen-sparse/arch/xen/configs/xen0_defconfig_x86_64       Tue Nov 
 8 14:58:31 2005
+++ b/linux-2.6-xen-sparse/arch/xen/configs/xen0_defconfig_x86_64       Tue Nov 
 8 15:48:42 2005
@@ -25,6 +25,7 @@
 CONFIG_XEN_SCRUB_PAGES=y
 # CONFIG_XEN_X86 is not set
 CONFIG_XEN_X86_64=y
+CONFIG_HAVE_ARCH_ALLOC_SKB=y
 CONFIG_HAVE_ARCH_DEV_ALLOC_SKB=y
 
 #
diff -r 0915074c356e -r 98bcd8fbd5e3 
linux-2.6-xen-sparse/arch/xen/configs/xenU_defconfig_x86_32
--- a/linux-2.6-xen-sparse/arch/xen/configs/xenU_defconfig_x86_32       Tue Nov 
 8 14:58:31 2005
+++ b/linux-2.6-xen-sparse/arch/xen/configs/xenU_defconfig_x86_32       Tue Nov 
 8 15:48:42 2005
@@ -22,6 +22,7 @@
 CONFIG_XEN_SCRUB_PAGES=y
 CONFIG_XEN_X86=y
 # CONFIG_XEN_X86_64 is not set
+CONFIG_HAVE_ARCH_ALLOC_SKB=y
 CONFIG_HAVE_ARCH_DEV_ALLOC_SKB=y
 
 #
diff -r 0915074c356e -r 98bcd8fbd5e3 
linux-2.6-xen-sparse/arch/xen/configs/xenU_defconfig_x86_64
--- a/linux-2.6-xen-sparse/arch/xen/configs/xenU_defconfig_x86_64       Tue Nov 
 8 14:58:31 2005
+++ b/linux-2.6-xen-sparse/arch/xen/configs/xenU_defconfig_x86_64       Tue Nov 
 8 15:48:42 2005
@@ -22,6 +22,7 @@
 CONFIG_XEN_SCRUB_PAGES=y
 # CONFIG_XEN_X86 is not set
 CONFIG_XEN_X86_64=y
+CONFIG_HAVE_ARCH_ALLOC_SKB=y
 CONFIG_HAVE_ARCH_DEV_ALLOC_SKB=y
 
 #
diff -r 0915074c356e -r 98bcd8fbd5e3 
linux-2.6-xen-sparse/arch/xen/configs/xen_defconfig_x86_32
--- a/linux-2.6-xen-sparse/arch/xen/configs/xen_defconfig_x86_32        Tue Nov 
 8 14:58:31 2005
+++ b/linux-2.6-xen-sparse/arch/xen/configs/xen_defconfig_x86_32        Tue Nov 
 8 15:48:42 2005
@@ -25,6 +25,7 @@
 CONFIG_XEN_SCRUB_PAGES=y
 CONFIG_XEN_X86=y
 # CONFIG_XEN_X86_64 is not set
+CONFIG_HAVE_ARCH_ALLOC_SKB=y
 CONFIG_HAVE_ARCH_DEV_ALLOC_SKB=y
 
 #
diff -r 0915074c356e -r 98bcd8fbd5e3 
linux-2.6-xen-sparse/arch/xen/configs/xen_defconfig_x86_64
--- a/linux-2.6-xen-sparse/arch/xen/configs/xen_defconfig_x86_64        Tue Nov 
 8 14:58:31 2005
+++ b/linux-2.6-xen-sparse/arch/xen/configs/xen_defconfig_x86_64        Tue Nov 
 8 15:48:42 2005
@@ -25,6 +25,7 @@
 CONFIG_XEN_SCRUB_PAGES=y
 # CONFIG_XEN_X86 is not set
 CONFIG_XEN_X86_64=y
+CONFIG_HAVE_ARCH_ALLOC_SKB=y
 CONFIG_HAVE_ARCH_DEV_ALLOC_SKB=y
 
 #
diff -r 0915074c356e -r 98bcd8fbd5e3 
linux-2.6-xen-sparse/arch/xen/kernel/skbuff.c
--- a/linux-2.6-xen-sparse/arch/xen/kernel/skbuff.c     Tue Nov  8 14:58:31 2005
+++ b/linux-2.6-xen-sparse/arch/xen/kernel/skbuff.c     Tue Nov  8 15:48:42 2005
@@ -19,6 +19,37 @@
 
 #define MAX_SKBUFF_ORDER 2
 static kmem_cache_t *skbuff_order_cachep[MAX_SKBUFF_ORDER + 1];
+
+static struct {
+       int size;
+       kmem_cache_t *cachep;
+} skbuff_small[] = { { 512, NULL }, { 2048, NULL } };
+
+struct sk_buff *alloc_skb(unsigned int length, int gfp_mask)
+{
+       int order, i;
+       kmem_cache_t *cachep;
+
+       length = SKB_DATA_ALIGN(length) + sizeof(struct skb_shared_info);
+
+       if (length <= skbuff_small[ARRAY_SIZE(skbuff_small)-1].size) {
+               for (i = 0; skbuff_small[i].size < length; i++)
+                       continue;
+               cachep = skbuff_small[i].cachep;
+       } else {
+               order = get_order(length);
+               if (order > MAX_SKBUFF_ORDER) {
+                       printk(KERN_ALERT "Attempt to allocate order %d "
+                              "skbuff. Increase MAX_SKBUFF_ORDER.\n", order);
+                       return NULL;
+               }
+               cachep = skbuff_order_cachep[order];
+       }
+
+       length -= sizeof(struct skb_shared_info);
+
+       return alloc_skb_from_cache(cachep, length, gfp_mask);
+}
 
 struct sk_buff *__dev_alloc_skb(unsigned int length, int gfp_mask)
 {
@@ -68,8 +99,20 @@
 static int __init skbuff_init(void)
 {
        static char name[MAX_SKBUFF_ORDER + 1][20];
+       static char small_name[ARRAY_SIZE(skbuff_small)][20];
        unsigned long size;
-       int order;
+       int i, order;
+
+       for (i = 0; i < ARRAY_SIZE(skbuff_small); i++) {
+               size = skbuff_small[i].size;
+               sprintf(small_name[i], "xen-skb-%lu", size);
+               /*
+                * No ctor/dtor: objects do not span page boundaries, and they
+                * are only used on transmit path so no need for scrubbing.
+                */
+               skbuff_small[i].cachep = kmem_cache_create(
+                       small_name[i], size, size, 0, NULL, NULL);
+       }
 
        for (order = 0; order <= MAX_SKBUFF_ORDER; order++) {
                size = PAGE_SIZE << order;
@@ -82,7 +125,7 @@
 
        return 0;
 }
-__initcall(skbuff_init);
+core_initcall(skbuff_init);
 
 EXPORT_SYMBOL(__dev_alloc_skb);
 
diff -r 0915074c356e -r 98bcd8fbd5e3 linux-2.6-xen-sparse/net/core/skbuff.c
--- a/linux-2.6-xen-sparse/net/core/skbuff.c    Tue Nov  8 14:58:31 2005
+++ b/linux-2.6-xen-sparse/net/core/skbuff.c    Tue Nov  8 15:48:42 2005
@@ -129,6 +129,7 @@
  *     Buffers may only be allocated from interrupts using a @gfp_mask of
  *     %GFP_ATOMIC.
  */
+#ifndef CONFIG_HAVE_ARCH_ALLOC_SKB
 struct sk_buff *alloc_skb(unsigned int size, int gfp_mask)
 {
        struct sk_buff *skb;
@@ -166,6 +167,7 @@
        skb = NULL;
        goto out;
 }
+#endif /* !CONFIG_HAVE_ARCH_ALLOC_SKB */
 
 /**
  *     alloc_skb_from_cache    -       allocate a network buffer

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] Fix alloc_skb() to ensure data is always physically contiguous., Xen patchbot -unstable <=