This patch turns the RTNL from a semaphore to a new 2.6.16 mutex
and gets rid of some of the leftover legacy. Only lightly tested,
so please hold off till 2.6.17

Signed-off-by: Stephen Hemminger <[EMAIL PROTECTED]>


 drivers/net/8139too.c     |    2 +-
 include/linux/rtnetlink.h |   20 +++++++-------------
 net/core/dev.c            |    8 ++++----
 net/core/link_watch.c     |    4 ++--
 net/core/netpoll.c        |    6 +++---
 net/core/rtnetlink.c      |   28 +++++++++++++++++-----------
 net/ipv4/igmp.c           |   24 ++++++++++++------------
 net/ipv4/ipconfig.c       |   10 +++++-----
 8 files changed, 51 insertions(+), 51 deletions(-)

--- git-2.6.orig/drivers/net/8139too.c  2006-01-19 11:07:38.000000000 -0800
+++ git-2.6/drivers/net/8139too.c       2006-01-19 11:51:20.000000000 -0800
@@ -1600,7 +1600,7 @@
        struct rtl8139_private *tp = netdev_priv(dev);
        unsigned long thr_delay;
 
-       if (rtnl_shlock_nowait() == 0) {
+       if (rtnl_trylock()) {
                rtl8139_thread_iter (dev, tp, tp->mmio_addr);
                rtnl_unlock ();
 
--- git-2.6.orig/include/linux/rtnetlink.h      2006-01-19 11:07:41.000000000 
-0800
+++ git-2.6/include/linux/rtnetlink.h   2006-01-19 11:57:08.000000000 -0800
@@ -905,6 +905,7 @@
 #ifdef __KERNEL__
 
 #include <linux/config.h>
+#include <linux/mutex.h>
 
 extern size_t rtattr_strlcpy(char *dest, const struct rtattr *rta, size_t 
size);
 static __inline__ int rtattr_strcmp(const struct rtattr *rta, const char *str)
@@ -1036,24 +1037,17 @@
 
 extern void rtmsg_ifinfo(int type, struct net_device *dev, unsigned change);
 
-extern struct semaphore rtnl_sem;
-
-#define rtnl_shlock()          down(&rtnl_sem)
-#define rtnl_shlock_nowait()   down_trylock(&rtnl_sem)
-
-#define rtnl_shunlock()        do { up(&rtnl_sem); \
-                            if (rtnl && rtnl->sk_receive_queue.qlen) \
-                                    rtnl->sk_data_ready(rtnl, 0); \
-                       } while(0)
-
+/* RTNL is used as a global lock for all changes to network configuration  */
 extern void rtnl_lock(void);
-extern int rtnl_lock_interruptible(void);
 extern void rtnl_unlock(void);
+extern int rtnl_trylock(void);
+
 extern void rtnetlink_init(void);
+extern void __rtnl_unlock(void);
 
 #define ASSERT_RTNL() do { \
-       if (unlikely(down_trylock(&rtnl_sem) == 0)) { \
-               up(&rtnl_sem); \
+       if (unlikely(rtnl_trylock())) { \
+               rtnl_unlock(); \
                printk(KERN_ERR "RTNL: assertion failed at %s (%d)\n", \
                       __FILE__,  __LINE__); \
                dump_stack(); \
--- git-2.6.orig/net/core/dev.c 2006-01-19 11:07:41.000000000 -0800
+++ git-2.6/net/core/dev.c      2006-01-19 11:58:02.000000000 -0800
@@ -2436,9 +2436,9 @@
         */
 
        if (cmd == SIOCGIFCONF) {
-               rtnl_shlock();
+               rtnl_lock();
                ret = dev_ifconf((char __user *) arg);
-               rtnl_shunlock();
+               rtnl_unlock();
                return ret;
        }
        if (cmd == SIOCGIFNAME)
@@ -2846,7 +2846,7 @@
        rebroadcast_time = warning_time = jiffies;
        while (atomic_read(&dev->refcnt) != 0) {
                if (time_after(jiffies, rebroadcast_time + 1 * HZ)) {
-                       rtnl_shlock();
+                       rtnl_lock();
 
                        /* Rebroadcast unregister notification */
                        notifier_call_chain(&netdev_chain,
@@ -2863,7 +2863,7 @@
                                linkwatch_run_queue();
                        }
 
-                       rtnl_shunlock();
+                       __rtnl_unlock();
 
                        rebroadcast_time = jiffies;
                }
--- git-2.6.orig/net/core/link_watch.c  2006-01-19 11:07:41.000000000 -0800
+++ git-2.6/net/core/link_watch.c       2006-01-19 12:28:13.000000000 -0800
@@ -99,9 +99,9 @@
        linkwatch_nextevent = jiffies + HZ;
        clear_bit(LW_RUNNING, &linkwatch_flags);
 
-       rtnl_shlock();
+       rtnl_lock();
        linkwatch_run_queue();
-       rtnl_shunlock();
+       rtnl_unlock();
 }
 
 
--- git-2.6.orig/net/core/netpoll.c     2006-01-19 11:07:41.000000000 -0800
+++ git-2.6/net/core/netpoll.c  2006-01-19 11:58:29.000000000 -0800
@@ -669,14 +669,14 @@
                printk(KERN_INFO "%s: device %s not up yet, forcing it\n",
                       np->name, np->dev_name);
 
-               rtnl_shlock();
+               rtnl_lock();
                if (dev_change_flags(ndev, ndev->flags | IFF_UP) < 0) {
                        printk(KERN_ERR "%s: failed to open %s\n",
                               np->name, np->dev_name);
-                       rtnl_shunlock();
+                       rtnl_unlock();
                        goto release;
                }
-               rtnl_shunlock();
+               rtnl_unlock();
 
                atleast = jiffies + HZ/10;
                atmost = jiffies + 4*HZ;
--- git-2.6.orig/net/core/rtnetlink.c   2006-01-19 11:07:41.000000000 -0800
+++ git-2.6/net/core/rtnetlink.c        2006-01-19 12:52:34.000000000 -0800
@@ -35,6 +35,7 @@
 #include <linux/skbuff.h>
 #include <linux/init.h>
 #include <linux/security.h>
+#include <linux/mutex.h>
 
 #include <asm/uaccess.h>
 #include <asm/system.h>
@@ -51,25 +52,31 @@
 #include <net/pkt_sched.h>
 #include <net/netlink.h>
 
-DECLARE_MUTEX(rtnl_sem);
+static DEFINE_MUTEX(rtnl_mutex);
 
 void rtnl_lock(void)
 {
-       rtnl_shlock();
+       mutex_lock(&rtnl_mutex);
 }
 
-int rtnl_lock_interruptible(void)
+void __rtnl_unlock(void)
 {
-       return down_interruptible(&rtnl_sem);
+       mutex_unlock(&rtnl_mutex);
 }
- 
+
 void rtnl_unlock(void)
 {
-       rtnl_shunlock();
-
+       mutex_unlock(&rtnl_mutex);
+       if (rtnl && rtnl->sk_receive_queue.qlen)
+               rtnl->sk_data_ready(rtnl, 0);
        netdev_run_todo();
 }
 
+int rtnl_trylock(void)
+{
+       return mutex_trylock(&rtnl_mutex);
+}
+
 int rtattr_parse(struct rtattr *tb[], int maxattr, struct rtattr *rta, int len)
 {
        memset(tb, 0, sizeof(struct rtattr*)*maxattr);
@@ -575,9 +582,9 @@
        unsigned int qlen = 0;
 
        do {
-               rtnl_lock();
+               mutex_lock(&rtnl_mutex);
                netlink_run_queue(sk, &qlen, &rtnetlink_rcv_msg);
-               up(&rtnl_sem);
+               mutex_unlock(&rtnl_mutex);
 
                netdev_run_todo();
        } while (qlen);
@@ -654,6 +661,5 @@
 EXPORT_SYMBOL(rtnetlink_put_metrics);
 EXPORT_SYMBOL(rtnl);
 EXPORT_SYMBOL(rtnl_lock);
-EXPORT_SYMBOL(rtnl_lock_interruptible);
-EXPORT_SYMBOL(rtnl_sem);
+EXPORT_SYMBOL(rtnl_trylock);
 EXPORT_SYMBOL(rtnl_unlock);
--- git-2.6.orig/net/ipv4/igmp.c        2006-01-19 11:07:41.000000000 -0800
+++ git-2.6/net/ipv4/igmp.c     2006-01-19 11:59:18.000000000 -0800
@@ -1730,7 +1730,7 @@
        if (!MULTICAST(addr))
                return -EINVAL;
 
-       rtnl_shlock();
+       rtnl_lock();
 
        in_dev = ip_mc_find_dev(imr);
 
@@ -1763,7 +1763,7 @@
        ip_mc_inc_group(in_dev, addr);
        err = 0;
 done:
-       rtnl_shunlock();
+       rtnl_unlock();
        return err;
 }
 
@@ -1837,7 +1837,7 @@
        if (!MULTICAST(addr))
                return -EINVAL;
 
-       rtnl_shlock();
+       rtnl_lock();
 
        imr.imr_multiaddr.s_addr = mreqs->imr_multiaddr;
        imr.imr_address.s_addr = mreqs->imr_interface;
@@ -1947,7 +1947,7 @@
        ip_mc_add_src(in_dev, &mreqs->imr_multiaddr, omode, 1, 
                &mreqs->imr_sourceaddr, 1);
 done:
-       rtnl_shunlock();
+       rtnl_unlock();
        if (leavegroup)
                return ip_mc_leave_group(sk, &imr);
        return err;
@@ -1970,7 +1970,7 @@
            msf->imsf_fmode != MCAST_EXCLUDE)
                return -EINVAL;
 
-       rtnl_shlock();
+       rtnl_lock();
 
        imr.imr_multiaddr.s_addr = msf->imsf_multiaddr;
        imr.imr_address.s_addr = msf->imsf_interface;
@@ -2030,7 +2030,7 @@
        pmc->sfmode = msf->imsf_fmode;
        err = 0;
 done:
-       rtnl_shunlock();
+       rtnl_unlock();
        if (leavegroup)
                err = ip_mc_leave_group(sk, &imr);
        return err;
@@ -2050,7 +2050,7 @@
        if (!MULTICAST(addr))
                return -EINVAL;
 
-       rtnl_shlock();
+       rtnl_lock();
 
        imr.imr_multiaddr.s_addr = msf->imsf_multiaddr;
        imr.imr_address.s_addr = msf->imsf_interface;
@@ -2072,7 +2072,7 @@
                goto done;
        msf->imsf_fmode = pmc->sfmode;
        psl = pmc->sflist;
-       rtnl_shunlock();
+       rtnl_unlock();
        if (!psl) {
                len = 0;
                count = 0;
@@ -2091,7 +2091,7 @@
                return -EFAULT;
        return 0;
 done:
-       rtnl_shunlock();
+       rtnl_unlock();
        return err;
 }
 
@@ -2112,7 +2112,7 @@
        if (!MULTICAST(addr))
                return -EINVAL;
 
-       rtnl_shlock();
+       rtnl_lock();
 
        err = -EADDRNOTAVAIL;
 
@@ -2125,7 +2125,7 @@
                goto done;
        gsf->gf_fmode = pmc->sfmode;
        psl = pmc->sflist;
-       rtnl_shunlock();
+       rtnl_unlock();
        count = psl ? psl->sl_count : 0;
        copycount = count < gsf->gf_numsrc ? count : gsf->gf_numsrc;
        gsf->gf_numsrc = count;
@@ -2146,7 +2146,7 @@
        }
        return 0;
 done:
-       rtnl_shunlock();
+       rtnl_unlock();
        return err;
 }
 
--- git-2.6.orig/net/ipv4/ipconfig.c    2006-01-19 11:07:41.000000000 -0800
+++ git-2.6/net/ipv4/ipconfig.c 2006-01-19 11:59:57.000000000 -0800
@@ -186,7 +186,7 @@
        unsigned short oflags;
 
        last = &ic_first_dev;
-       rtnl_shlock();
+       rtnl_lock();
 
        /* bring loopback device up first */
        if (dev_change_flags(&loopback_dev, loopback_dev.flags | IFF_UP) < 0)
@@ -215,7 +215,7 @@
                                continue;
                        }
                        if (!(d = kmalloc(sizeof(struct ic_device), 
GFP_KERNEL))) {
-                               rtnl_shunlock();
+                               rtnl_unlock();
                                return -1;
                        }
                        d->dev = dev;
@@ -232,7 +232,7 @@
                                dev->name, able, d->xid));
                }
        }
-       rtnl_shunlock();
+       rtnl_unlock();
 
        *last = NULL;
 
@@ -251,7 +251,7 @@
        struct ic_device *d, *next;
        struct net_device *dev;
 
-       rtnl_shlock();
+       rtnl_lock();
        next = ic_first_dev;
        while ((d = next)) {
                next = d->next;
@@ -262,7 +262,7 @@
                }
                kfree(d);
        }
-       rtnl_shunlock();
+       rtnl_unlock();
 }
 
 /*
-
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

Reply via email to