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