diff options
author | Arnd Bergmann <arnd@arndb.de> | 2010-07-11 07:18:57 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2010-07-12 23:21:47 -0400 |
commit | 15fd0cd9a2ad24a78fbee369dec8ca660979d57e (patch) | |
tree | d81059460702ebfe4617ec6efd6efa7886ac673b /drivers/net | |
parent | 76a64921dad9acd76270dc74249f0dfe11c84bb8 (diff) |
net: autoconvert trivial BKL users to private mutex
All these files use the big kernel lock in a trivial
way to serialize their private file operations,
typically resulting from an earlier semi-automatic
pushdown from VFS.
None of these drivers appears to want to lock against
other code, and they all use the BKL as the top-level
lock in their file operations, meaning that there
is no lock-order inversion problem.
Consequently, we can remove the BKL completely,
replacing it with a per-file mutex in every case.
Using a scripted approach means we can avoid
typos.
file=$1
name=$2
if grep -q lock_kernel ${file} ; then
if grep -q 'include.*linux.mutex.h' ${file} ; then
sed -i '/include.*<linux\/smp_lock.h>/d' ${file}
else
sed -i 's/include.*<linux\/smp_lock.h>.*$/include <linux\/mutex.h>/g' ${file}
fi
sed -i ${file} \
-e "/^#include.*linux.mutex.h/,$ {
1,/^\(static\|int\|long\)/ {
/^\(static\|int\|long\)/istatic DEFINE_MUTEX(${name}_mutex);
} }" \
-e "s/\(un\)*lock_kernel\>[ ]*()/mutex_\1lock(\&${name}_mutex)/g" \
-e '/[ ]*cycle_kernel_lock();/d'
else
sed -i -e '/include.*\<smp_lock.h\>/d' ${file} \
-e '/cycle_kernel_lock()/d'
fi
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Cc: "David S. Miller" <davem@davemloft.net>
Cc: netdev@vger.kernel.org
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/ppp_generic.c | 19 | ||||
-rw-r--r-- | drivers/net/wan/cosa.c | 10 |
2 files changed, 14 insertions, 15 deletions
diff --git a/drivers/net/ppp_generic.c b/drivers/net/ppp_generic.c index e7b4187da057..6695a51e09e9 100644 --- a/drivers/net/ppp_generic.c +++ b/drivers/net/ppp_generic.c | |||
@@ -40,7 +40,6 @@ | |||
40 | #include <linux/if_arp.h> | 40 | #include <linux/if_arp.h> |
41 | #include <linux/ip.h> | 41 | #include <linux/ip.h> |
42 | #include <linux/tcp.h> | 42 | #include <linux/tcp.h> |
43 | #include <linux/smp_lock.h> | ||
44 | #include <linux/spinlock.h> | 43 | #include <linux/spinlock.h> |
45 | #include <linux/rwsem.h> | 44 | #include <linux/rwsem.h> |
46 | #include <linux/stddef.h> | 45 | #include <linux/stddef.h> |
@@ -180,6 +179,7 @@ struct channel { | |||
180 | * channel.downl. | 179 | * channel.downl. |
181 | */ | 180 | */ |
182 | 181 | ||
182 | static DEFINE_MUTEX(ppp_mutex); | ||
183 | static atomic_t ppp_unit_count = ATOMIC_INIT(0); | 183 | static atomic_t ppp_unit_count = ATOMIC_INIT(0); |
184 | static atomic_t channel_count = ATOMIC_INIT(0); | 184 | static atomic_t channel_count = ATOMIC_INIT(0); |
185 | 185 | ||
@@ -362,7 +362,6 @@ static const int npindex_to_ethertype[NUM_NP] = { | |||
362 | */ | 362 | */ |
363 | static int ppp_open(struct inode *inode, struct file *file) | 363 | static int ppp_open(struct inode *inode, struct file *file) |
364 | { | 364 | { |
365 | cycle_kernel_lock(); | ||
366 | /* | 365 | /* |
367 | * This could (should?) be enforced by the permissions on /dev/ppp. | 366 | * This could (should?) be enforced by the permissions on /dev/ppp. |
368 | */ | 367 | */ |
@@ -582,7 +581,7 @@ static long ppp_ioctl(struct file *file, unsigned int cmd, unsigned long arg) | |||
582 | * this fd and reopening /dev/ppp. | 581 | * this fd and reopening /dev/ppp. |
583 | */ | 582 | */ |
584 | err = -EINVAL; | 583 | err = -EINVAL; |
585 | lock_kernel(); | 584 | mutex_lock(&ppp_mutex); |
586 | if (pf->kind == INTERFACE) { | 585 | if (pf->kind == INTERFACE) { |
587 | ppp = PF_TO_PPP(pf); | 586 | ppp = PF_TO_PPP(pf); |
588 | if (file == ppp->owner) | 587 | if (file == ppp->owner) |
@@ -594,7 +593,7 @@ static long ppp_ioctl(struct file *file, unsigned int cmd, unsigned long arg) | |||
594 | } else | 593 | } else |
595 | printk(KERN_DEBUG "PPPIOCDETACH file->f_count=%ld\n", | 594 | printk(KERN_DEBUG "PPPIOCDETACH file->f_count=%ld\n", |
596 | atomic_long_read(&file->f_count)); | 595 | atomic_long_read(&file->f_count)); |
597 | unlock_kernel(); | 596 | mutex_unlock(&ppp_mutex); |
598 | return err; | 597 | return err; |
599 | } | 598 | } |
600 | 599 | ||
@@ -602,7 +601,7 @@ static long ppp_ioctl(struct file *file, unsigned int cmd, unsigned long arg) | |||
602 | struct channel *pch; | 601 | struct channel *pch; |
603 | struct ppp_channel *chan; | 602 | struct ppp_channel *chan; |
604 | 603 | ||
605 | lock_kernel(); | 604 | mutex_lock(&ppp_mutex); |
606 | pch = PF_TO_CHANNEL(pf); | 605 | pch = PF_TO_CHANNEL(pf); |
607 | 606 | ||
608 | switch (cmd) { | 607 | switch (cmd) { |
@@ -624,7 +623,7 @@ static long ppp_ioctl(struct file *file, unsigned int cmd, unsigned long arg) | |||
624 | err = chan->ops->ioctl(chan, cmd, arg); | 623 | err = chan->ops->ioctl(chan, cmd, arg); |
625 | up_read(&pch->chan_sem); | 624 | up_read(&pch->chan_sem); |
626 | } | 625 | } |
627 | unlock_kernel(); | 626 | mutex_unlock(&ppp_mutex); |
628 | return err; | 627 | return err; |
629 | } | 628 | } |
630 | 629 | ||
@@ -634,7 +633,7 @@ static long ppp_ioctl(struct file *file, unsigned int cmd, unsigned long arg) | |||
634 | return -EINVAL; | 633 | return -EINVAL; |
635 | } | 634 | } |
636 | 635 | ||
637 | lock_kernel(); | 636 | mutex_lock(&ppp_mutex); |
638 | ppp = PF_TO_PPP(pf); | 637 | ppp = PF_TO_PPP(pf); |
639 | switch (cmd) { | 638 | switch (cmd) { |
640 | case PPPIOCSMRU: | 639 | case PPPIOCSMRU: |
@@ -782,7 +781,7 @@ static long ppp_ioctl(struct file *file, unsigned int cmd, unsigned long arg) | |||
782 | default: | 781 | default: |
783 | err = -ENOTTY; | 782 | err = -ENOTTY; |
784 | } | 783 | } |
785 | unlock_kernel(); | 784 | mutex_unlock(&ppp_mutex); |
786 | return err; | 785 | return err; |
787 | } | 786 | } |
788 | 787 | ||
@@ -795,7 +794,7 @@ static int ppp_unattached_ioctl(struct net *net, struct ppp_file *pf, | |||
795 | struct ppp_net *pn; | 794 | struct ppp_net *pn; |
796 | int __user *p = (int __user *)arg; | 795 | int __user *p = (int __user *)arg; |
797 | 796 | ||
798 | lock_kernel(); | 797 | mutex_lock(&ppp_mutex); |
799 | switch (cmd) { | 798 | switch (cmd) { |
800 | case PPPIOCNEWUNIT: | 799 | case PPPIOCNEWUNIT: |
801 | /* Create a new ppp unit */ | 800 | /* Create a new ppp unit */ |
@@ -846,7 +845,7 @@ static int ppp_unattached_ioctl(struct net *net, struct ppp_file *pf, | |||
846 | default: | 845 | default: |
847 | err = -ENOTTY; | 846 | err = -ENOTTY; |
848 | } | 847 | } |
849 | unlock_kernel(); | 848 | mutex_unlock(&ppp_mutex); |
850 | return err; | 849 | return err; |
851 | } | 850 | } |
852 | 851 | ||
diff --git a/drivers/net/wan/cosa.c b/drivers/net/wan/cosa.c index f0bd70fb650c..04c6cd4333f1 100644 --- a/drivers/net/wan/cosa.c +++ b/drivers/net/wan/cosa.c | |||
@@ -89,7 +89,6 @@ | |||
89 | #include <linux/spinlock.h> | 89 | #include <linux/spinlock.h> |
90 | #include <linux/mutex.h> | 90 | #include <linux/mutex.h> |
91 | #include <linux/device.h> | 91 | #include <linux/device.h> |
92 | #include <linux/smp_lock.h> | ||
93 | #include <asm/io.h> | 92 | #include <asm/io.h> |
94 | #include <asm/dma.h> | 93 | #include <asm/dma.h> |
95 | #include <asm/byteorder.h> | 94 | #include <asm/byteorder.h> |
@@ -174,6 +173,7 @@ struct cosa_data { | |||
174 | * Character device major number. 117 was allocated for us. | 173 | * Character device major number. 117 was allocated for us. |
175 | * The value of 0 means to allocate a first free one. | 174 | * The value of 0 means to allocate a first free one. |
176 | */ | 175 | */ |
176 | static DEFINE_MUTEX(cosa_chardev_mutex); | ||
177 | static int cosa_major = 117; | 177 | static int cosa_major = 117; |
178 | 178 | ||
179 | /* | 179 | /* |
@@ -944,7 +944,7 @@ static int cosa_open(struct inode *inode, struct file *file) | |||
944 | int n; | 944 | int n; |
945 | int ret = 0; | 945 | int ret = 0; |
946 | 946 | ||
947 | lock_kernel(); | 947 | mutex_lock(&cosa_chardev_mutex); |
948 | if ((n=iminor(file->f_path.dentry->d_inode)>>CARD_MINOR_BITS) | 948 | if ((n=iminor(file->f_path.dentry->d_inode)>>CARD_MINOR_BITS) |
949 | >= nr_cards) { | 949 | >= nr_cards) { |
950 | ret = -ENODEV; | 950 | ret = -ENODEV; |
@@ -976,7 +976,7 @@ static int cosa_open(struct inode *inode, struct file *file) | |||
976 | chan->rx_done = chrdev_rx_done; | 976 | chan->rx_done = chrdev_rx_done; |
977 | spin_unlock_irqrestore(&cosa->lock, flags); | 977 | spin_unlock_irqrestore(&cosa->lock, flags); |
978 | out: | 978 | out: |
979 | unlock_kernel(); | 979 | mutex_unlock(&cosa_chardev_mutex); |
980 | return ret; | 980 | return ret; |
981 | } | 981 | } |
982 | 982 | ||
@@ -1212,10 +1212,10 @@ static long cosa_chardev_ioctl(struct file *file, unsigned int cmd, | |||
1212 | struct cosa_data *cosa; | 1212 | struct cosa_data *cosa; |
1213 | long ret; | 1213 | long ret; |
1214 | 1214 | ||
1215 | lock_kernel(); | 1215 | mutex_lock(&cosa_chardev_mutex); |
1216 | cosa = channel->cosa; | 1216 | cosa = channel->cosa; |
1217 | ret = cosa_ioctl_common(cosa, channel, cmd, arg); | 1217 | ret = cosa_ioctl_common(cosa, channel, cmd, arg); |
1218 | unlock_kernel(); | 1218 | mutex_unlock(&cosa_chardev_mutex); |
1219 | return ret; | 1219 | return ret; |
1220 | } | 1220 | } |
1221 | 1221 | ||