netdev
[Top] [All Lists]

[PATCH 2.6.13-rc1 6/17] bonding: ALB init kmalloc inside spinlock bugfix

To: fubar@xxxxxxxxxx, bonding-devel@xxxxxxxxxxxxxxxxxxxxx
Subject: [PATCH 2.6.13-rc1 6/17] bonding: ALB init kmalloc inside spinlock bugfix
From: Radheka Godse <radheka.godse@xxxxxxxxx>
Date: Fri, 1 Jul 2005 13:45:56 -0700 (PDT)
Cc: netdev@xxxxxxxxxxx
Replyto: "Radheka Godse" <radheka.godse@xxxxxxxxx>
Sender: netdev-bounce@xxxxxxxxxxx
This patch corrects bug in ALB init where kmalloc called inside a held
lock causes stacdump in debug mode

Signed-off-by: Radheka Godse <radheka.godse@xxxxxxxxx>
Signed-off-by: Mitch Williams <mitch.a.williams@xxxxxxxxx>

diff -urN -X dontdiff linux-2.6.12post/drivers/net/bonding/bond_alb.c 
linux-2.6.12post-sysfs/drivers/net/bonding/bond_alb.c
--- linux-2.6.12post/drivers/net/bonding/bond_alb.c     2005-06-17 
12:48:29.000000000 -0700
+++ linux-2.6.12post-sysfs/drivers/net/bonding/bond_alb.c       2005-06-28 
18:21:35.000000000 -0700
@@ -198,20 +198,21 @@
 {
        struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond));
        int size = TLB_HASH_TABLE_SIZE * sizeof(struct tlb_client_info);
+       struct tlb_client_info *new_hashtbl;
        int i;

        spin_lock_init(&(bond_info->tx_hashtbl_lock));

-       _lock_tx_hashtbl(bond);
-
-       bond_info->tx_hashtbl = kmalloc(size, GFP_KERNEL);
-       if (!bond_info->tx_hashtbl) {
+       new_hashtbl = kmalloc(size, GFP_KERNEL);
+       if (!new_hashtbl) {
                printk(KERN_ERR DRV_NAME
                       ": Error: %s: Failed to allocate TLB hash table\n",
                       bond->dev->name);
-               _unlock_tx_hashtbl(bond);
                return -1;
        }
+       _lock_tx_hashtbl(bond);
+
+       bond_info->tx_hashtbl = new_hashtbl;

        memset(bond_info->tx_hashtbl, 0, size);

@@ -798,21 +801,22 @@
 {
        struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond));
        struct packet_type *pk_type = &(BOND_ALB_INFO(bond).rlb_pkt_type);
+       struct rlb_client_info  *new_hashtbl;
        int size = RLB_HASH_TABLE_SIZE * sizeof(struct rlb_client_info);
        int i;

        spin_lock_init(&(bond_info->rx_hashtbl_lock));

-       _lock_rx_hashtbl(bond);
-
-       bond_info->rx_hashtbl = kmalloc(size, GFP_KERNEL);
-       if (!bond_info->rx_hashtbl) {
+       new_hashtbl = kmalloc(size, GFP_KERNEL);
+       if (!new_hashtbl) {
                printk(KERN_ERR DRV_NAME
                       ": Error: %s: Failed to allocate RLB hash table\n",
                       bond->dev->name);
-               _unlock_rx_hashtbl(bond);
                return -1;
        }
+       _lock_rx_hashtbl(bond);
+
+       bond_info->rx_hashtbl = new_hashtbl;

        bond_info->rx_hashtbl_head = RLB_NULL_INDEX;


<Prev in Thread] Current Thread [Next in Thread>
  • [PATCH 2.6.13-rc1 6/17] bonding: ALB init kmalloc inside spinlock bugfix, Radheka Godse <=