diff options
author | Stefani Seibold <stefani@seibold.net> | 2009-12-21 17:37:27 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-12-22 17:17:56 -0500 |
commit | c1e13f25674ed564948ecb7dfe5f83e578892896 (patch) | |
tree | 24fac07b3e2b66dff01c3127b34077de1de4c101 | |
parent | 45465487897a1c6d508b14b904dc5777f7ec7e04 (diff) |
kfifo: move out spinlock
Move the pointer to the spinlock out of struct kfifo. Most users in
tree do not actually use a spinlock, so the few exceptions now have to
call kfifo_{get,put}_locked, which takes an extra argument to a
spinlock.
Signed-off-by: Stefani Seibold <stefani@seibold.net>
Acked-by: Greg Kroah-Hartman <gregkh@suse.de>
Acked-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Acked-by: Andi Kleen <ak@linux.intel.com>
Acked-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r-- | drivers/char/nozomi.c | 2 | ||||
-rw-r--r-- | drivers/char/sonypi.c | 21 | ||||
-rw-r--r-- | drivers/infiniband/hw/cxgb3/cxio_resource.c | 36 | ||||
-rw-r--r-- | drivers/media/video/meye.c | 35 | ||||
-rw-r--r-- | drivers/net/wireless/libertas/main.c | 2 | ||||
-rw-r--r-- | drivers/platform/x86/fujitsu-laptop.c | 18 | ||||
-rw-r--r-- | drivers/platform/x86/sony-laptop.c | 22 | ||||
-rw-r--r-- | drivers/scsi/libiscsi.c | 2 | ||||
-rw-r--r-- | drivers/scsi/libiscsi_tcp.c | 2 | ||||
-rw-r--r-- | drivers/scsi/libsrp.c | 9 | ||||
-rw-r--r-- | drivers/usb/host/fhci.h | 2 | ||||
-rw-r--r-- | drivers/usb/serial/generic.c | 4 | ||||
-rw-r--r-- | drivers/usb/serial/usb-serial.c | 3 | ||||
-rw-r--r-- | include/linux/kfifo.h | 80 | ||||
-rw-r--r-- | kernel/kfifo.c | 17 | ||||
-rw-r--r-- | net/dccp/probe.c | 6 |
16 files changed, 131 insertions, 130 deletions
diff --git a/drivers/char/nozomi.c b/drivers/char/nozomi.c index 0f39bec28b45..935b30d80adf 100644 --- a/drivers/char/nozomi.c +++ b/drivers/char/nozomi.c | |||
@@ -686,7 +686,7 @@ static int nozomi_read_config_table(struct nozomi *dc) | |||
686 | 686 | ||
687 | for (i = PORT_MDM; i < MAX_PORT; i++) { | 687 | for (i = PORT_MDM; i < MAX_PORT; i++) { |
688 | kfifo_alloc(&dc->port[i].fifo_ul, | 688 | kfifo_alloc(&dc->port[i].fifo_ul, |
689 | FIFO_BUFFER_SIZE_UL, GFP_ATOMIC, NULL); | 689 | FIFO_BUFFER_SIZE_UL, GFP_ATOMIC); |
690 | memset(&dc->port[i].ctrl_dl, 0, sizeof(struct ctrl_dl)); | 690 | memset(&dc->port[i].ctrl_dl, 0, sizeof(struct ctrl_dl)); |
691 | memset(&dc->port[i].ctrl_ul, 0, sizeof(struct ctrl_ul)); | 691 | memset(&dc->port[i].ctrl_ul, 0, sizeof(struct ctrl_ul)); |
692 | } | 692 | } |
diff --git a/drivers/char/sonypi.c b/drivers/char/sonypi.c index 9e6efb1f029f..dbcb3bd192c7 100644 --- a/drivers/char/sonypi.c +++ b/drivers/char/sonypi.c | |||
@@ -777,8 +777,9 @@ static void input_keyrelease(struct work_struct *work) | |||
777 | { | 777 | { |
778 | struct sonypi_keypress kp; | 778 | struct sonypi_keypress kp; |
779 | 779 | ||
780 | while (kfifo_get(&sonypi_device.input_fifo, (unsigned char *)&kp, | 780 | while (kfifo_get_locked(&sonypi_device.input_fifo, (unsigned char *)&kp, |
781 | sizeof(kp)) == sizeof(kp)) { | 781 | sizeof(kp), &sonypi_device.input_fifo_lock) |
782 | == sizeof(kp)) { | ||
782 | msleep(10); | 783 | msleep(10); |
783 | input_report_key(kp.dev, kp.key, 0); | 784 | input_report_key(kp.dev, kp.key, 0); |
784 | input_sync(kp.dev); | 785 | input_sync(kp.dev); |
@@ -827,8 +828,9 @@ static void sonypi_report_input_event(u8 event) | |||
827 | if (kp.dev) { | 828 | if (kp.dev) { |
828 | input_report_key(kp.dev, kp.key, 1); | 829 | input_report_key(kp.dev, kp.key, 1); |
829 | input_sync(kp.dev); | 830 | input_sync(kp.dev); |
830 | kfifo_put(&sonypi_device.input_fifo, | 831 | kfifo_put_locked(&sonypi_device.input_fifo, |
831 | (unsigned char *)&kp, sizeof(kp)); | 832 | (unsigned char *)&kp, sizeof(kp), |
833 | &sonypi_device.input_fifo_lock); | ||
832 | schedule_work(&sonypi_device.input_work); | 834 | schedule_work(&sonypi_device.input_work); |
833 | } | 835 | } |
834 | } | 836 | } |
@@ -880,7 +882,8 @@ found: | |||
880 | acpi_bus_generate_proc_event(sonypi_acpi_device, 1, event); | 882 | acpi_bus_generate_proc_event(sonypi_acpi_device, 1, event); |
881 | #endif | 883 | #endif |
882 | 884 | ||
883 | kfifo_put(&sonypi_device.fifo, (unsigned char *)&event, sizeof(event)); | 885 | kfifo_put_locked(&sonypi_device.fifo, (unsigned char *)&event, |
886 | sizeof(event), &sonypi_device.fifo_lock); | ||
884 | kill_fasync(&sonypi_device.fifo_async, SIGIO, POLL_IN); | 887 | kill_fasync(&sonypi_device.fifo_async, SIGIO, POLL_IN); |
885 | wake_up_interruptible(&sonypi_device.fifo_proc_list); | 888 | wake_up_interruptible(&sonypi_device.fifo_proc_list); |
886 | 889 | ||
@@ -929,7 +932,8 @@ static ssize_t sonypi_misc_read(struct file *file, char __user *buf, | |||
929 | return ret; | 932 | return ret; |
930 | 933 | ||
931 | while (ret < count && | 934 | while (ret < count && |
932 | (kfifo_get(&sonypi_device.fifo, &c, sizeof(c)) == sizeof(c))) { | 935 | (kfifo_get_locked(&sonypi_device.fifo, &c, sizeof(c), |
936 | &sonypi_device.fifo_lock) == sizeof(c))) { | ||
933 | if (put_user(c, buf++)) | 937 | if (put_user(c, buf++)) |
934 | return -EFAULT; | 938 | return -EFAULT; |
935 | ret++; | 939 | ret++; |
@@ -1313,8 +1317,7 @@ static int __devinit sonypi_probe(struct platform_device *dev) | |||
1313 | "http://www.linux.it/~malattia/wiki/index.php/Sony_drivers\n"); | 1317 | "http://www.linux.it/~malattia/wiki/index.php/Sony_drivers\n"); |
1314 | 1318 | ||
1315 | spin_lock_init(&sonypi_device.fifo_lock); | 1319 | spin_lock_init(&sonypi_device.fifo_lock); |
1316 | error = kfifo_alloc(&sonypi_device.fifo, SONYPI_BUF_SIZE, GFP_KERNEL, | 1320 | error = kfifo_alloc(&sonypi_device.fifo, SONYPI_BUF_SIZE, GFP_KERNEL); |
1317 | &sonypi_device.fifo_lock); | ||
1318 | if (error) { | 1321 | if (error) { |
1319 | printk(KERN_ERR "sonypi: kfifo_alloc failed\n"); | 1322 | printk(KERN_ERR "sonypi: kfifo_alloc failed\n"); |
1320 | return error; | 1323 | return error; |
@@ -1394,7 +1397,7 @@ static int __devinit sonypi_probe(struct platform_device *dev) | |||
1394 | 1397 | ||
1395 | spin_lock_init(&sonypi_device.input_fifo_lock); | 1398 | spin_lock_init(&sonypi_device.input_fifo_lock); |
1396 | error = kfifo_alloc(&sonypi_device.input_fifo, SONYPI_BUF_SIZE, | 1399 | error = kfifo_alloc(&sonypi_device.input_fifo, SONYPI_BUF_SIZE, |
1397 | GFP_KERNEL, &sonypi_device.input_fifo_lock); | 1400 | GFP_KERNEL); |
1398 | if (error) { | 1401 | if (error) { |
1399 | printk(KERN_ERR "sonypi: kfifo_alloc failed\n"); | 1402 | printk(KERN_ERR "sonypi: kfifo_alloc failed\n"); |
1400 | goto err_inpdev_unregister; | 1403 | goto err_inpdev_unregister; |
diff --git a/drivers/infiniband/hw/cxgb3/cxio_resource.c b/drivers/infiniband/hw/cxgb3/cxio_resource.c index 65072bdfc1bf..98f24e6d906e 100644 --- a/drivers/infiniband/hw/cxgb3/cxio_resource.c +++ b/drivers/infiniband/hw/cxgb3/cxio_resource.c | |||
@@ -55,7 +55,7 @@ static int __cxio_init_resource_fifo(struct kfifo *fifo, | |||
55 | u32 rarray[16]; | 55 | u32 rarray[16]; |
56 | spin_lock_init(fifo_lock); | 56 | spin_lock_init(fifo_lock); |
57 | 57 | ||
58 | if (kfifo_alloc(fifo, nr * sizeof(u32), GFP_KERNEL, fifo_lock)) | 58 | if (kfifo_alloc(fifo, nr * sizeof(u32), GFP_KERNEL)) |
59 | return -ENOMEM; | 59 | return -ENOMEM; |
60 | 60 | ||
61 | for (i = 0; i < skip_low + skip_high; i++) | 61 | for (i = 0; i < skip_low + skip_high; i++) |
@@ -86,7 +86,8 @@ static int __cxio_init_resource_fifo(struct kfifo *fifo, | |||
86 | __kfifo_put(fifo, (unsigned char *) &i, sizeof(u32)); | 86 | __kfifo_put(fifo, (unsigned char *) &i, sizeof(u32)); |
87 | 87 | ||
88 | for (i = 0; i < skip_low + skip_high; i++) | 88 | for (i = 0; i < skip_low + skip_high; i++) |
89 | kfifo_get(fifo, (unsigned char *) &entry, sizeof(u32)); | 89 | kfifo_get_locked(fifo, (unsigned char *) &entry, |
90 | sizeof(u32), fifo_lock); | ||
90 | return 0; | 91 | return 0; |
91 | } | 92 | } |
92 | 93 | ||
@@ -113,8 +114,7 @@ static int cxio_init_qpid_fifo(struct cxio_rdev *rdev_p) | |||
113 | spin_lock_init(&rdev_p->rscp->qpid_fifo_lock); | 114 | spin_lock_init(&rdev_p->rscp->qpid_fifo_lock); |
114 | 115 | ||
115 | if (kfifo_alloc(&rdev_p->rscp->qpid_fifo, T3_MAX_NUM_QP * sizeof(u32), | 116 | if (kfifo_alloc(&rdev_p->rscp->qpid_fifo, T3_MAX_NUM_QP * sizeof(u32), |
116 | GFP_KERNEL, | 117 | GFP_KERNEL)) |
117 | &rdev_p->rscp->qpid_fifo_lock)) | ||
118 | return -ENOMEM; | 118 | return -ENOMEM; |
119 | 119 | ||
120 | for (i = 16; i < T3_MAX_NUM_QP; i++) | 120 | for (i = 16; i < T3_MAX_NUM_QP; i++) |
@@ -177,33 +177,37 @@ tpt_err: | |||
177 | /* | 177 | /* |
178 | * returns 0 if no resource available | 178 | * returns 0 if no resource available |
179 | */ | 179 | */ |
180 | static u32 cxio_hal_get_resource(struct kfifo *fifo) | 180 | static u32 cxio_hal_get_resource(struct kfifo *fifo, spinlock_t * lock) |
181 | { | 181 | { |
182 | u32 entry; | 182 | u32 entry; |
183 | if (kfifo_get(fifo, (unsigned char *) &entry, sizeof(u32))) | 183 | if (kfifo_get_locked(fifo, (unsigned char *) &entry, sizeof(u32), lock)) |
184 | return entry; | 184 | return entry; |
185 | else | 185 | else |
186 | return 0; /* fifo emptry */ | 186 | return 0; /* fifo emptry */ |
187 | } | 187 | } |
188 | 188 | ||
189 | static void cxio_hal_put_resource(struct kfifo *fifo, u32 entry) | 189 | static void cxio_hal_put_resource(struct kfifo *fifo, spinlock_t * lock, |
190 | u32 entry) | ||
190 | { | 191 | { |
191 | BUG_ON(kfifo_put(fifo, (unsigned char *) &entry, sizeof(u32)) == 0); | 192 | BUG_ON( |
193 | kfifo_put_locked(fifo, (unsigned char *) &entry, sizeof(u32), lock) | ||
194 | == 0); | ||
192 | } | 195 | } |
193 | 196 | ||
194 | u32 cxio_hal_get_stag(struct cxio_hal_resource *rscp) | 197 | u32 cxio_hal_get_stag(struct cxio_hal_resource *rscp) |
195 | { | 198 | { |
196 | return cxio_hal_get_resource(&rscp->tpt_fifo); | 199 | return cxio_hal_get_resource(&rscp->tpt_fifo, &rscp->tpt_fifo_lock); |
197 | } | 200 | } |
198 | 201 | ||
199 | void cxio_hal_put_stag(struct cxio_hal_resource *rscp, u32 stag) | 202 | void cxio_hal_put_stag(struct cxio_hal_resource *rscp, u32 stag) |
200 | { | 203 | { |
201 | cxio_hal_put_resource(&rscp->tpt_fifo, stag); | 204 | cxio_hal_put_resource(&rscp->tpt_fifo, &rscp->tpt_fifo_lock, stag); |
202 | } | 205 | } |
203 | 206 | ||
204 | u32 cxio_hal_get_qpid(struct cxio_hal_resource *rscp) | 207 | u32 cxio_hal_get_qpid(struct cxio_hal_resource *rscp) |
205 | { | 208 | { |
206 | u32 qpid = cxio_hal_get_resource(&rscp->qpid_fifo); | 209 | u32 qpid = cxio_hal_get_resource(&rscp->qpid_fifo, |
210 | &rscp->qpid_fifo_lock); | ||
207 | PDBG("%s qpid 0x%x\n", __func__, qpid); | 211 | PDBG("%s qpid 0x%x\n", __func__, qpid); |
208 | return qpid; | 212 | return qpid; |
209 | } | 213 | } |
@@ -211,27 +215,27 @@ u32 cxio_hal_get_qpid(struct cxio_hal_resource *rscp) | |||
211 | void cxio_hal_put_qpid(struct cxio_hal_resource *rscp, u32 qpid) | 215 | void cxio_hal_put_qpid(struct cxio_hal_resource *rscp, u32 qpid) |
212 | { | 216 | { |
213 | PDBG("%s qpid 0x%x\n", __func__, qpid); | 217 | PDBG("%s qpid 0x%x\n", __func__, qpid); |
214 | cxio_hal_put_resource(&rscp->qpid_fifo, qpid); | 218 | cxio_hal_put_resource(&rscp->qpid_fifo, &rscp->qpid_fifo_lock, qpid); |
215 | } | 219 | } |
216 | 220 | ||
217 | u32 cxio_hal_get_cqid(struct cxio_hal_resource *rscp) | 221 | u32 cxio_hal_get_cqid(struct cxio_hal_resource *rscp) |
218 | { | 222 | { |
219 | return cxio_hal_get_resource(&rscp->cqid_fifo); | 223 | return cxio_hal_get_resource(&rscp->cqid_fifo, &rscp->cqid_fifo_lock); |
220 | } | 224 | } |
221 | 225 | ||
222 | void cxio_hal_put_cqid(struct cxio_hal_resource *rscp, u32 cqid) | 226 | void cxio_hal_put_cqid(struct cxio_hal_resource *rscp, u32 cqid) |
223 | { | 227 | { |
224 | cxio_hal_put_resource(&rscp->cqid_fifo, cqid); | 228 | cxio_hal_put_resource(&rscp->cqid_fifo, &rscp->cqid_fifo_lock, cqid); |
225 | } | 229 | } |
226 | 230 | ||
227 | u32 cxio_hal_get_pdid(struct cxio_hal_resource *rscp) | 231 | u32 cxio_hal_get_pdid(struct cxio_hal_resource *rscp) |
228 | { | 232 | { |
229 | return cxio_hal_get_resource(&rscp->pdid_fifo); | 233 | return cxio_hal_get_resource(&rscp->pdid_fifo, &rscp->pdid_fifo_lock); |
230 | } | 234 | } |
231 | 235 | ||
232 | void cxio_hal_put_pdid(struct cxio_hal_resource *rscp, u32 pdid) | 236 | void cxio_hal_put_pdid(struct cxio_hal_resource *rscp, u32 pdid) |
233 | { | 237 | { |
234 | cxio_hal_put_resource(&rscp->pdid_fifo, pdid); | 238 | cxio_hal_put_resource(&rscp->pdid_fifo, &rscp->pdid_fifo_lock, pdid); |
235 | } | 239 | } |
236 | 240 | ||
237 | void cxio_hal_destroy_resource(struct cxio_hal_resource *rscp) | 241 | void cxio_hal_destroy_resource(struct cxio_hal_resource *rscp) |
diff --git a/drivers/media/video/meye.c b/drivers/media/video/meye.c index dacbbb839b9e..38bcedfd9fec 100644 --- a/drivers/media/video/meye.c +++ b/drivers/media/video/meye.c | |||
@@ -800,8 +800,8 @@ again: | |||
800 | return IRQ_HANDLED; | 800 | return IRQ_HANDLED; |
801 | 801 | ||
802 | if (meye.mchip_mode == MCHIP_HIC_MODE_CONT_OUT) { | 802 | if (meye.mchip_mode == MCHIP_HIC_MODE_CONT_OUT) { |
803 | if (kfifo_get(&meye.grabq, (unsigned char *)&reqnr, | 803 | if (kfifo_get_locked(&meye.grabq, (unsigned char *)&reqnr, |
804 | sizeof(int)) != sizeof(int)) { | 804 | sizeof(int), &meye.grabq_lock) != sizeof(int)) { |
805 | mchip_free_frame(); | 805 | mchip_free_frame(); |
806 | return IRQ_HANDLED; | 806 | return IRQ_HANDLED; |
807 | } | 807 | } |
@@ -811,7 +811,8 @@ again: | |||
811 | meye.grab_buffer[reqnr].state = MEYE_BUF_DONE; | 811 | meye.grab_buffer[reqnr].state = MEYE_BUF_DONE; |
812 | do_gettimeofday(&meye.grab_buffer[reqnr].timestamp); | 812 | do_gettimeofday(&meye.grab_buffer[reqnr].timestamp); |
813 | meye.grab_buffer[reqnr].sequence = sequence++; | 813 | meye.grab_buffer[reqnr].sequence = sequence++; |
814 | kfifo_put(&meye.doneq, (unsigned char *)&reqnr, sizeof(int)); | 814 | kfifo_put_locked(&meye.doneq, (unsigned char *)&reqnr, |
815 | sizeof(int), &meye.doneq_lock); | ||
815 | wake_up_interruptible(&meye.proc_list); | 816 | wake_up_interruptible(&meye.proc_list); |
816 | } else { | 817 | } else { |
817 | int size; | 818 | int size; |
@@ -820,8 +821,8 @@ again: | |||
820 | mchip_free_frame(); | 821 | mchip_free_frame(); |
821 | goto again; | 822 | goto again; |
822 | } | 823 | } |
823 | if (kfifo_get(&meye.grabq, (unsigned char *)&reqnr, | 824 | if (kfifo_get_locked(&meye.grabq, (unsigned char *)&reqnr, |
824 | sizeof(int)) != sizeof(int)) { | 825 | sizeof(int), &meye.grabq_lock) != sizeof(int)) { |
825 | mchip_free_frame(); | 826 | mchip_free_frame(); |
826 | goto again; | 827 | goto again; |
827 | } | 828 | } |
@@ -831,7 +832,8 @@ again: | |||
831 | meye.grab_buffer[reqnr].state = MEYE_BUF_DONE; | 832 | meye.grab_buffer[reqnr].state = MEYE_BUF_DONE; |
832 | do_gettimeofday(&meye.grab_buffer[reqnr].timestamp); | 833 | do_gettimeofday(&meye.grab_buffer[reqnr].timestamp); |
833 | meye.grab_buffer[reqnr].sequence = sequence++; | 834 | meye.grab_buffer[reqnr].sequence = sequence++; |
834 | kfifo_put(&meye.doneq, (unsigned char *)&reqnr, sizeof(int)); | 835 | kfifo_put_locked(&meye.doneq, (unsigned char *)&reqnr, |
836 | sizeof(int), &meye.doneq_lock); | ||
835 | wake_up_interruptible(&meye.proc_list); | 837 | wake_up_interruptible(&meye.proc_list); |
836 | } | 838 | } |
837 | mchip_free_frame(); | 839 | mchip_free_frame(); |
@@ -933,7 +935,8 @@ static int meyeioc_qbuf_capt(int *nb) | |||
933 | mchip_cont_compression_start(); | 935 | mchip_cont_compression_start(); |
934 | 936 | ||
935 | meye.grab_buffer[*nb].state = MEYE_BUF_USING; | 937 | meye.grab_buffer[*nb].state = MEYE_BUF_USING; |
936 | kfifo_put(&meye.grabq, (unsigned char *)nb, sizeof(int)); | 938 | kfifo_put_locked(&meye.grabq, (unsigned char *)nb, sizeof(int), |
939 | &meye.grabq_lock); | ||
937 | mutex_unlock(&meye.lock); | 940 | mutex_unlock(&meye.lock); |
938 | 941 | ||
939 | return 0; | 942 | return 0; |
@@ -965,7 +968,8 @@ static int meyeioc_sync(struct file *file, void *fh, int *i) | |||
965 | /* fall through */ | 968 | /* fall through */ |
966 | case MEYE_BUF_DONE: | 969 | case MEYE_BUF_DONE: |
967 | meye.grab_buffer[*i].state = MEYE_BUF_UNUSED; | 970 | meye.grab_buffer[*i].state = MEYE_BUF_UNUSED; |
968 | kfifo_get(&meye.doneq, (unsigned char *)&unused, sizeof(int)); | 971 | kfifo_get_locked(&meye.doneq, (unsigned char *)&unused, |
972 | sizeof(int), &meye.doneq_lock); | ||
969 | } | 973 | } |
970 | *i = meye.grab_buffer[*i].size; | 974 | *i = meye.grab_buffer[*i].size; |
971 | mutex_unlock(&meye.lock); | 975 | mutex_unlock(&meye.lock); |
@@ -1452,7 +1456,8 @@ static int vidioc_qbuf(struct file *file, void *fh, struct v4l2_buffer *buf) | |||
1452 | buf->flags |= V4L2_BUF_FLAG_QUEUED; | 1456 | buf->flags |= V4L2_BUF_FLAG_QUEUED; |
1453 | buf->flags &= ~V4L2_BUF_FLAG_DONE; | 1457 | buf->flags &= ~V4L2_BUF_FLAG_DONE; |
1454 | meye.grab_buffer[buf->index].state = MEYE_BUF_USING; | 1458 | meye.grab_buffer[buf->index].state = MEYE_BUF_USING; |
1455 | kfifo_put(&meye.grabq, (unsigned char *)&buf->index, sizeof(int)); | 1459 | kfifo_put_locked(&meye.grabq, (unsigned char *)&buf->index, |
1460 | sizeof(int), &meye.grabq_lock); | ||
1456 | mutex_unlock(&meye.lock); | 1461 | mutex_unlock(&meye.lock); |
1457 | 1462 | ||
1458 | return 0; | 1463 | return 0; |
@@ -1478,8 +1483,8 @@ static int vidioc_dqbuf(struct file *file, void *fh, struct v4l2_buffer *buf) | |||
1478 | return -EINTR; | 1483 | return -EINTR; |
1479 | } | 1484 | } |
1480 | 1485 | ||
1481 | if (!kfifo_get(&meye.doneq, (unsigned char *)&reqnr, | 1486 | if (!kfifo_get_locked(&meye.doneq, (unsigned char *)&reqnr, |
1482 | sizeof(int))) { | 1487 | sizeof(int), &meye.doneq_lock)) { |
1483 | mutex_unlock(&meye.lock); | 1488 | mutex_unlock(&meye.lock); |
1484 | return -EBUSY; | 1489 | return -EBUSY; |
1485 | } | 1490 | } |
@@ -1745,14 +1750,14 @@ static int __devinit meye_probe(struct pci_dev *pcidev, | |||
1745 | } | 1750 | } |
1746 | 1751 | ||
1747 | spin_lock_init(&meye.grabq_lock); | 1752 | spin_lock_init(&meye.grabq_lock); |
1748 | if (kfifo_alloc(&meye.grabq, sizeof(int) * MEYE_MAX_BUFNBRS, GFP_KERNEL, | 1753 | if (kfifo_alloc(&meye.grabq, sizeof(int) * MEYE_MAX_BUFNBRS, |
1749 | &meye.grabq_lock)) { | 1754 | GFP_KERNEL)) { |
1750 | printk(KERN_ERR "meye: fifo allocation failed\n"); | 1755 | printk(KERN_ERR "meye: fifo allocation failed\n"); |
1751 | goto outkfifoalloc1; | 1756 | goto outkfifoalloc1; |
1752 | } | 1757 | } |
1753 | spin_lock_init(&meye.doneq_lock); | 1758 | spin_lock_init(&meye.doneq_lock); |
1754 | if (kfifo_alloc(&meye.doneq, sizeof(int) * MEYE_MAX_BUFNBRS, GFP_KERNEL, | 1759 | if (kfifo_alloc(&meye.doneq, sizeof(int) * MEYE_MAX_BUFNBRS, |
1755 | &meye.doneq_lock)) { | 1760 | GFP_KERNEL)) { |
1756 | printk(KERN_ERR "meye: fifo allocation failed\n"); | 1761 | printk(KERN_ERR "meye: fifo allocation failed\n"); |
1757 | goto outkfifoalloc2; | 1762 | goto outkfifoalloc2; |
1758 | } | 1763 | } |
diff --git a/drivers/net/wireless/libertas/main.c b/drivers/net/wireless/libertas/main.c index 403909287414..2cc7ecd8d123 100644 --- a/drivers/net/wireless/libertas/main.c +++ b/drivers/net/wireless/libertas/main.c | |||
@@ -883,7 +883,7 @@ static int lbs_init_adapter(struct lbs_private *priv) | |||
883 | priv->resp_len[0] = priv->resp_len[1] = 0; | 883 | priv->resp_len[0] = priv->resp_len[1] = 0; |
884 | 884 | ||
885 | /* Create the event FIFO */ | 885 | /* Create the event FIFO */ |
886 | ret = kfifo_alloc(&priv->event_fifo, sizeof(u32) * 16, GFP_KERNEL, NULL); | 886 | ret = kfifo_alloc(&priv->event_fifo, sizeof(u32) * 16, GFP_KERNEL); |
887 | if (ret) { | 887 | if (ret) { |
888 | lbs_pr_err("Out of memory allocating event FIFO buffer\n"); | 888 | lbs_pr_err("Out of memory allocating event FIFO buffer\n"); |
889 | goto out; | 889 | goto out; |
diff --git a/drivers/platform/x86/fujitsu-laptop.c b/drivers/platform/x86/fujitsu-laptop.c index f999fba0e25e..13dc7bedcfce 100644 --- a/drivers/platform/x86/fujitsu-laptop.c +++ b/drivers/platform/x86/fujitsu-laptop.c | |||
@@ -825,7 +825,7 @@ static int acpi_fujitsu_hotkey_add(struct acpi_device *device) | |||
825 | /* kfifo */ | 825 | /* kfifo */ |
826 | spin_lock_init(&fujitsu_hotkey->fifo_lock); | 826 | spin_lock_init(&fujitsu_hotkey->fifo_lock); |
827 | error = kfifo_alloc(&fujitsu_hotkey->fifo, RINGBUFFERSIZE * sizeof(int), | 827 | error = kfifo_alloc(&fujitsu_hotkey->fifo, RINGBUFFERSIZE * sizeof(int), |
828 | GFP_KERNEL, &fujitsu_hotkey->fifo_lock); | 828 | GFP_KERNEL); |
829 | if (error) { | 829 | if (error) { |
830 | printk(KERN_ERR "kfifo_alloc failed\n"); | 830 | printk(KERN_ERR "kfifo_alloc failed\n"); |
831 | goto err_stop; | 831 | goto err_stop; |
@@ -1006,9 +1006,10 @@ static void acpi_fujitsu_hotkey_notify(struct acpi_device *device, u32 event) | |||
1006 | vdbg_printk(FUJLAPTOP_DBG_TRACE, | 1006 | vdbg_printk(FUJLAPTOP_DBG_TRACE, |
1007 | "Push keycode into ringbuffer [%d]\n", | 1007 | "Push keycode into ringbuffer [%d]\n", |
1008 | keycode); | 1008 | keycode); |
1009 | status = kfifo_put(&fujitsu_hotkey->fifo, | 1009 | status = kfifo_put_locked(&fujitsu_hotkey->fifo, |
1010 | (unsigned char *)&keycode, | 1010 | (unsigned char *)&keycode, |
1011 | sizeof(keycode)); | 1011 | sizeof(keycode), |
1012 | &fujitsu_hotkey->fifo_lock); | ||
1012 | if (status != sizeof(keycode)) { | 1013 | if (status != sizeof(keycode)) { |
1013 | vdbg_printk(FUJLAPTOP_DBG_WARN, | 1014 | vdbg_printk(FUJLAPTOP_DBG_WARN, |
1014 | "Could not push keycode [0x%x]\n", | 1015 | "Could not push keycode [0x%x]\n", |
@@ -1019,11 +1020,12 @@ static void acpi_fujitsu_hotkey_notify(struct acpi_device *device, u32 event) | |||
1019 | } | 1020 | } |
1020 | } else if (keycode == 0) { | 1021 | } else if (keycode == 0) { |
1021 | while ((status = | 1022 | while ((status = |
1022 | kfifo_get | 1023 | kfifo_get_locked( |
1023 | (&fujitsu_hotkey->fifo, (unsigned char *) | 1024 | &fujitsu_hotkey->fifo, |
1024 | &keycode_r, | 1025 | (unsigned char *) &keycode_r, |
1025 | sizeof | 1026 | sizeof(keycode_r), |
1026 | (keycode_r))) == sizeof(keycode_r)) { | 1027 | &fujitsu_hotkey->fifo_lock)) |
1028 | == sizeof(keycode_r)) { | ||
1027 | input_report_key(input, keycode_r, 0); | 1029 | input_report_key(input, keycode_r, 0); |
1028 | input_sync(input); | 1030 | input_sync(input); |
1029 | vdbg_printk(FUJLAPTOP_DBG_TRACE, | 1031 | vdbg_printk(FUJLAPTOP_DBG_TRACE, |
diff --git a/drivers/platform/x86/sony-laptop.c b/drivers/platform/x86/sony-laptop.c index 04625a048e74..1538a0a3c0af 100644 --- a/drivers/platform/x86/sony-laptop.c +++ b/drivers/platform/x86/sony-laptop.c | |||
@@ -300,8 +300,9 @@ static void do_sony_laptop_release_key(struct work_struct *work) | |||
300 | { | 300 | { |
301 | struct sony_laptop_keypress kp; | 301 | struct sony_laptop_keypress kp; |
302 | 302 | ||
303 | while (kfifo_get(&sony_laptop_input.fifo, (unsigned char *)&kp, | 303 | while (kfifo_get_locked(&sony_laptop_input.fifo, (unsigned char *)&kp, |
304 | sizeof(kp)) == sizeof(kp)) { | 304 | sizeof(kp), &sony_laptop_input.fifo_lock) |
305 | == sizeof(kp)) { | ||
305 | msleep(10); | 306 | msleep(10); |
306 | input_report_key(kp.dev, kp.key, 0); | 307 | input_report_key(kp.dev, kp.key, 0); |
307 | input_sync(kp.dev); | 308 | input_sync(kp.dev); |
@@ -362,8 +363,9 @@ static void sony_laptop_report_input_event(u8 event) | |||
362 | /* we emit the scancode so we can always remap the key */ | 363 | /* we emit the scancode so we can always remap the key */ |
363 | input_event(kp.dev, EV_MSC, MSC_SCAN, event); | 364 | input_event(kp.dev, EV_MSC, MSC_SCAN, event); |
364 | input_sync(kp.dev); | 365 | input_sync(kp.dev); |
365 | kfifo_put(&sony_laptop_input.fifo, | 366 | kfifo_put_locked(&sony_laptop_input.fifo, |
366 | (unsigned char *)&kp, sizeof(kp)); | 367 | (unsigned char *)&kp, sizeof(kp), |
368 | &sony_laptop_input.fifo_lock); | ||
367 | 369 | ||
368 | if (!work_pending(&sony_laptop_release_key_work)) | 370 | if (!work_pending(&sony_laptop_release_key_work)) |
369 | queue_work(sony_laptop_input.wq, | 371 | queue_work(sony_laptop_input.wq, |
@@ -386,8 +388,7 @@ static int sony_laptop_setup_input(struct acpi_device *acpi_device) | |||
386 | /* kfifo */ | 388 | /* kfifo */ |
387 | spin_lock_init(&sony_laptop_input.fifo_lock); | 389 | spin_lock_init(&sony_laptop_input.fifo_lock); |
388 | error = | 390 | error = |
389 | kfifo_alloc(&sony_laptop_input.fifo, SONY_LAPTOP_BUF_SIZE, GFP_KERNEL, | 391 | kfifo_alloc(&sony_laptop_input.fifo, SONY_LAPTOP_BUF_SIZE, GFP_KERNEL); |
390 | &sony_laptop_input.fifo_lock); | ||
391 | if (error) { | 392 | if (error) { |
392 | printk(KERN_ERR DRV_PFX "kfifo_alloc failed\n"); | 393 | printk(KERN_ERR DRV_PFX "kfifo_alloc failed\n"); |
393 | goto err_dec_users; | 394 | goto err_dec_users; |
@@ -2129,7 +2130,8 @@ static ssize_t sonypi_misc_read(struct file *file, char __user *buf, | |||
2129 | return ret; | 2130 | return ret; |
2130 | 2131 | ||
2131 | while (ret < count && | 2132 | while (ret < count && |
2132 | (kfifo_get(&sonypi_compat.fifo, &c, sizeof(c)) == sizeof(c))) { | 2133 | (kfifo_get_locked(&sonypi_compat.fifo, &c, sizeof(c), |
2134 | &sonypi_compat.fifo_lock) == sizeof(c))) { | ||
2133 | if (put_user(c, buf++)) | 2135 | if (put_user(c, buf++)) |
2134 | return -EFAULT; | 2136 | return -EFAULT; |
2135 | ret++; | 2137 | ret++; |
@@ -2308,7 +2310,8 @@ static struct miscdevice sonypi_misc_device = { | |||
2308 | 2310 | ||
2309 | static void sonypi_compat_report_event(u8 event) | 2311 | static void sonypi_compat_report_event(u8 event) |
2310 | { | 2312 | { |
2311 | kfifo_put(&sonypi_compat.fifo, (unsigned char *)&event, sizeof(event)); | 2313 | kfifo_put_locked(&sonypi_compat.fifo, (unsigned char *)&event, |
2314 | sizeof(event), &sonypi_compat.fifo_lock); | ||
2312 | kill_fasync(&sonypi_compat.fifo_async, SIGIO, POLL_IN); | 2315 | kill_fasync(&sonypi_compat.fifo_async, SIGIO, POLL_IN); |
2313 | wake_up_interruptible(&sonypi_compat.fifo_proc_list); | 2316 | wake_up_interruptible(&sonypi_compat.fifo_proc_list); |
2314 | } | 2317 | } |
@@ -2319,8 +2322,7 @@ static int sonypi_compat_init(void) | |||
2319 | 2322 | ||
2320 | spin_lock_init(&sonypi_compat.fifo_lock); | 2323 | spin_lock_init(&sonypi_compat.fifo_lock); |
2321 | error = | 2324 | error = |
2322 | kfifo_alloc(&sonypi_compat.fifo, SONY_LAPTOP_BUF_SIZE, GFP_KERNEL, | 2325 | kfifo_alloc(&sonypi_compat.fifo, SONY_LAPTOP_BUF_SIZE, GFP_KERNEL); |
2323 | &sonypi_compat.fifo_lock); | ||
2324 | if (error) { | 2326 | if (error) { |
2325 | printk(KERN_ERR DRV_PFX "kfifo_alloc failed\n"); | 2327 | printk(KERN_ERR DRV_PFX "kfifo_alloc failed\n"); |
2326 | return error; | 2328 | return error; |
diff --git a/drivers/scsi/libiscsi.c b/drivers/scsi/libiscsi.c index cf0aa7e90be9..1bccbc1e588e 100644 --- a/drivers/scsi/libiscsi.c +++ b/drivers/scsi/libiscsi.c | |||
@@ -2461,7 +2461,7 @@ iscsi_pool_init(struct iscsi_pool *q, int max, void ***items, int item_size) | |||
2461 | if (q->pool == NULL) | 2461 | if (q->pool == NULL) |
2462 | return -ENOMEM; | 2462 | return -ENOMEM; |
2463 | 2463 | ||
2464 | kfifo_init(&q->queue, (void*)q->pool, max * sizeof(void*), NULL); | 2464 | kfifo_init(&q->queue, (void*)q->pool, max * sizeof(void*)); |
2465 | 2465 | ||
2466 | for (i = 0; i < max; i++) { | 2466 | for (i = 0; i < max; i++) { |
2467 | q->pool[i] = kzalloc(item_size, GFP_KERNEL); | 2467 | q->pool[i] = kzalloc(item_size, GFP_KERNEL); |
diff --git a/drivers/scsi/libiscsi_tcp.c b/drivers/scsi/libiscsi_tcp.c index a83ee56a185e..41643c860d26 100644 --- a/drivers/scsi/libiscsi_tcp.c +++ b/drivers/scsi/libiscsi_tcp.c | |||
@@ -1128,7 +1128,7 @@ int iscsi_tcp_r2tpool_alloc(struct iscsi_session *session) | |||
1128 | 1128 | ||
1129 | /* R2T xmit queue */ | 1129 | /* R2T xmit queue */ |
1130 | if (kfifo_alloc(&tcp_task->r2tqueue, | 1130 | if (kfifo_alloc(&tcp_task->r2tqueue, |
1131 | session->max_r2t * 4 * sizeof(void*), GFP_KERNEL, NULL)) { | 1131 | session->max_r2t * 4 * sizeof(void*), GFP_KERNEL)) { |
1132 | iscsi_pool_free(&tcp_task->r2tpool); | 1132 | iscsi_pool_free(&tcp_task->r2tpool); |
1133 | goto r2t_alloc_fail; | 1133 | goto r2t_alloc_fail; |
1134 | } | 1134 | } |
diff --git a/drivers/scsi/libsrp.c b/drivers/scsi/libsrp.c index b1b5e51ca8e3..db1b41c55fd3 100644 --- a/drivers/scsi/libsrp.c +++ b/drivers/scsi/libsrp.c | |||
@@ -58,8 +58,7 @@ static int srp_iu_pool_alloc(struct srp_queue *q, size_t max, | |||
58 | goto free_pool; | 58 | goto free_pool; |
59 | 59 | ||
60 | spin_lock_init(&q->lock); | 60 | spin_lock_init(&q->lock); |
61 | kfifo_init(&q->queue, (void *) q->pool, max * sizeof(void *), | 61 | kfifo_init(&q->queue, (void *) q->pool, max * sizeof(void *)); |
62 | &q->lock); | ||
63 | 62 | ||
64 | for (i = 0, iue = q->items; i < max; i++) { | 63 | for (i = 0, iue = q->items; i < max; i++) { |
65 | __kfifo_put(&q->queue, (void *) &iue, sizeof(void *)); | 64 | __kfifo_put(&q->queue, (void *) &iue, sizeof(void *)); |
@@ -164,7 +163,8 @@ struct iu_entry *srp_iu_get(struct srp_target *target) | |||
164 | { | 163 | { |
165 | struct iu_entry *iue = NULL; | 164 | struct iu_entry *iue = NULL; |
166 | 165 | ||
167 | kfifo_get(&target->iu_queue.queue, (void *) &iue, sizeof(void *)); | 166 | kfifo_get_locked(&target->iu_queue.queue, (void *) &iue, |
167 | sizeof(void *), &target->iu_queue.lock); | ||
168 | if (!iue) | 168 | if (!iue) |
169 | return iue; | 169 | return iue; |
170 | iue->target = target; | 170 | iue->target = target; |
@@ -176,7 +176,8 @@ EXPORT_SYMBOL_GPL(srp_iu_get); | |||
176 | 176 | ||
177 | void srp_iu_put(struct iu_entry *iue) | 177 | void srp_iu_put(struct iu_entry *iue) |
178 | { | 178 | { |
179 | kfifo_put(&iue->target->iu_queue.queue, (void *) &iue, sizeof(void *)); | 179 | kfifo_put_locked(&iue->target->iu_queue.queue, (void *) &iue, |
180 | sizeof(void *), &iue->target->iu_queue.lock); | ||
180 | } | 181 | } |
181 | EXPORT_SYMBOL_GPL(srp_iu_put); | 182 | EXPORT_SYMBOL_GPL(srp_iu_put); |
182 | 183 | ||
diff --git a/drivers/usb/host/fhci.h b/drivers/usb/host/fhci.h index 2277428ef5d3..a76da201183b 100644 --- a/drivers/usb/host/fhci.h +++ b/drivers/usb/host/fhci.h | |||
@@ -495,7 +495,7 @@ static inline struct usb_hcd *fhci_to_hcd(struct fhci_hcd *fhci) | |||
495 | /* fifo of pointers */ | 495 | /* fifo of pointers */ |
496 | static inline int cq_new(struct kfifo *fifo, int size) | 496 | static inline int cq_new(struct kfifo *fifo, int size) |
497 | { | 497 | { |
498 | return kfifo_alloc(fifo, size * sizeof(void *), GFP_KERNEL, NULL); | 498 | return kfifo_alloc(fifo, size * sizeof(void *), GFP_KERNEL); |
499 | } | 499 | } |
500 | 500 | ||
501 | static inline void cq_delete(struct kfifo *kfifo) | 501 | static inline void cq_delete(struct kfifo *kfifo) |
diff --git a/drivers/usb/serial/generic.c b/drivers/usb/serial/generic.c index bbe005cefcfb..61eef18218be 100644 --- a/drivers/usb/serial/generic.c +++ b/drivers/usb/serial/generic.c | |||
@@ -285,7 +285,7 @@ static int usb_serial_generic_write_start(struct usb_serial_port *port) | |||
285 | return 0; | 285 | return 0; |
286 | 286 | ||
287 | data = port->write_urb->transfer_buffer; | 287 | data = port->write_urb->transfer_buffer; |
288 | count = kfifo_get(port->write_fifo, data, port->bulk_out_size); | 288 | count = kfifo_get_locked(port->write_fifo, data, port->bulk_out_size, &port->lock); |
289 | usb_serial_debug_data(debug, &port->dev, __func__, count, data); | 289 | usb_serial_debug_data(debug, &port->dev, __func__, count, data); |
290 | 290 | ||
291 | /* set up our urb */ | 291 | /* set up our urb */ |
@@ -345,7 +345,7 @@ int usb_serial_generic_write(struct tty_struct *tty, | |||
345 | return usb_serial_multi_urb_write(tty, port, | 345 | return usb_serial_multi_urb_write(tty, port, |
346 | buf, count); | 346 | buf, count); |
347 | 347 | ||
348 | count = kfifo_put(port->write_fifo, buf, count); | 348 | count = kfifo_put_locked(port->write_fifo, buf, count, &port->lock); |
349 | result = usb_serial_generic_write_start(port); | 349 | result = usb_serial_generic_write_start(port); |
350 | 350 | ||
351 | if (result >= 0) | 351 | if (result >= 0) |
diff --git a/drivers/usb/serial/usb-serial.c b/drivers/usb/serial/usb-serial.c index 44b72d47fac2..636a4f23445e 100644 --- a/drivers/usb/serial/usb-serial.c +++ b/drivers/usb/serial/usb-serial.c | |||
@@ -939,8 +939,7 @@ int usb_serial_probe(struct usb_interface *interface, | |||
939 | dev_err(&interface->dev, "No free urbs available\n"); | 939 | dev_err(&interface->dev, "No free urbs available\n"); |
940 | goto probe_error; | 940 | goto probe_error; |
941 | } | 941 | } |
942 | if (kfifo_alloc(&port->write_fifo, PAGE_SIZE, GFP_KERNEL, | 942 | if (kfifo_alloc(port->write_fifo, PAGE_SIZE, GFP_KERNEL)) |
943 | &port->lock)) | ||
944 | goto probe_error; | 943 | goto probe_error; |
945 | buffer_size = le16_to_cpu(endpoint->wMaxPacketSize); | 944 | buffer_size = le16_to_cpu(endpoint->wMaxPacketSize); |
946 | port->bulk_out_size = buffer_size; | 945 | port->bulk_out_size = buffer_size; |
diff --git a/include/linux/kfifo.h b/include/linux/kfifo.h index c3f8d82efd34..e0f5c9d4197d 100644 --- a/include/linux/kfifo.h +++ b/include/linux/kfifo.h | |||
@@ -30,13 +30,12 @@ struct kfifo { | |||
30 | unsigned int size; /* the size of the allocated buffer */ | 30 | unsigned int size; /* the size of the allocated buffer */ |
31 | unsigned int in; /* data is added at offset (in % size) */ | 31 | unsigned int in; /* data is added at offset (in % size) */ |
32 | unsigned int out; /* data is extracted from off. (out % size) */ | 32 | unsigned int out; /* data is extracted from off. (out % size) */ |
33 | spinlock_t *lock; /* protects concurrent modifications */ | ||
34 | }; | 33 | }; |
35 | 34 | ||
36 | extern void kfifo_init(struct kfifo *fifo, unsigned char *buffer, | 35 | extern void kfifo_init(struct kfifo *fifo, unsigned char *buffer, |
37 | unsigned int size, spinlock_t *lock); | 36 | unsigned int size); |
38 | extern __must_check int kfifo_alloc(struct kfifo *fifo, unsigned int size, | 37 | extern __must_check int kfifo_alloc(struct kfifo *fifo, unsigned int size, |
39 | gfp_t gfp_mask, spinlock_t *lock); | 38 | gfp_t gfp_mask); |
40 | extern void kfifo_free(struct kfifo *fifo); | 39 | extern void kfifo_free(struct kfifo *fifo); |
41 | extern unsigned int __kfifo_put(struct kfifo *fifo, | 40 | extern unsigned int __kfifo_put(struct kfifo *fifo, |
42 | const unsigned char *buffer, unsigned int len); | 41 | const unsigned char *buffer, unsigned int len); |
@@ -58,58 +57,67 @@ static inline void __kfifo_reset(struct kfifo *fifo) | |||
58 | */ | 57 | */ |
59 | static inline void kfifo_reset(struct kfifo *fifo) | 58 | static inline void kfifo_reset(struct kfifo *fifo) |
60 | { | 59 | { |
61 | unsigned long flags; | ||
62 | |||
63 | spin_lock_irqsave(fifo->lock, flags); | ||
64 | |||
65 | __kfifo_reset(fifo); | 60 | __kfifo_reset(fifo); |
61 | } | ||
62 | |||
63 | /** | ||
64 | * __kfifo_len - returns the number of bytes available in the FIFO | ||
65 | * @fifo: the fifo to be used. | ||
66 | */ | ||
67 | static inline unsigned int __kfifo_len(struct kfifo *fifo) | ||
68 | { | ||
69 | register unsigned int out; | ||
66 | 70 | ||
67 | spin_unlock_irqrestore(fifo->lock, flags); | 71 | out = fifo->out; |
72 | smp_rmb(); | ||
73 | return fifo->in - out; | ||
68 | } | 74 | } |
69 | 75 | ||
70 | /** | 76 | /** |
71 | * kfifo_put - puts some data into the FIFO | 77 | * kfifo_put_locked - puts some data into the FIFO using a spinlock for locking |
72 | * @fifo: the fifo to be used. | 78 | * @fifo: the fifo to be used. |
73 | * @buffer: the data to be added. | 79 | * @from: the data to be added. |
74 | * @len: the length of the data to be added. | 80 | * @n: the length of the data to be added. |
81 | * @lock: pointer to the spinlock to use for locking. | ||
75 | * | 82 | * |
76 | * This function copies at most @len bytes from the @buffer into | 83 | * This function copies at most @len bytes from the @from buffer into |
77 | * the FIFO depending on the free space, and returns the number of | 84 | * the FIFO depending on the free space, and returns the number of |
78 | * bytes copied. | 85 | * bytes copied. |
79 | */ | 86 | */ |
80 | static inline unsigned int kfifo_put(struct kfifo *fifo, | 87 | static inline __must_check unsigned int kfifo_put_locked(struct kfifo *fifo, |
81 | const unsigned char *buffer, unsigned int len) | 88 | const unsigned char *from, unsigned int n, spinlock_t *lock) |
82 | { | 89 | { |
83 | unsigned long flags; | 90 | unsigned long flags; |
84 | unsigned int ret; | 91 | unsigned int ret; |
85 | 92 | ||
86 | spin_lock_irqsave(fifo->lock, flags); | 93 | spin_lock_irqsave(lock, flags); |
87 | 94 | ||
88 | ret = __kfifo_put(fifo, buffer, len); | 95 | ret = __kfifo_put(fifo, from, n); |
89 | 96 | ||
90 | spin_unlock_irqrestore(fifo->lock, flags); | 97 | spin_unlock_irqrestore(lock, flags); |
91 | 98 | ||
92 | return ret; | 99 | return ret; |
93 | } | 100 | } |
94 | 101 | ||
95 | /** | 102 | /** |
96 | * kfifo_get - gets some data from the FIFO | 103 | * kfifo_get_locked - gets some data from the FIFO using a spinlock for locking |
97 | * @fifo: the fifo to be used. | 104 | * @fifo: the fifo to be used. |
98 | * @buffer: where the data must be copied. | 105 | * @to: where the data must be copied. |
99 | * @len: the size of the destination buffer. | 106 | * @n: the size of the destination buffer. |
107 | * @lock: pointer to the spinlock to use for locking. | ||
100 | * | 108 | * |
101 | * This function copies at most @len bytes from the FIFO into the | 109 | * This function copies at most @len bytes from the FIFO into the |
102 | * @buffer and returns the number of copied bytes. | 110 | * @to buffer and returns the number of copied bytes. |
103 | */ | 111 | */ |
104 | static inline unsigned int kfifo_get(struct kfifo *fifo, | 112 | static inline __must_check unsigned int kfifo_get_locked(struct kfifo *fifo, |
105 | unsigned char *buffer, unsigned int len) | 113 | unsigned char *to, unsigned int n, spinlock_t *lock) |
106 | { | 114 | { |
107 | unsigned long flags; | 115 | unsigned long flags; |
108 | unsigned int ret; | 116 | unsigned int ret; |
109 | 117 | ||
110 | spin_lock_irqsave(fifo->lock, flags); | 118 | spin_lock_irqsave(lock, flags); |
111 | 119 | ||
112 | ret = __kfifo_get(fifo, buffer, len); | 120 | ret = __kfifo_get(fifo, to, n); |
113 | 121 | ||
114 | /* | 122 | /* |
115 | * optimization: if the FIFO is empty, set the indices to 0 | 123 | * optimization: if the FIFO is empty, set the indices to 0 |
@@ -118,36 +126,18 @@ static inline unsigned int kfifo_get(struct kfifo *fifo, | |||
118 | if (fifo->in == fifo->out) | 126 | if (fifo->in == fifo->out) |
119 | fifo->in = fifo->out = 0; | 127 | fifo->in = fifo->out = 0; |
120 | 128 | ||
121 | spin_unlock_irqrestore(fifo->lock, flags); | 129 | spin_unlock_irqrestore(lock, flags); |
122 | 130 | ||
123 | return ret; | 131 | return ret; |
124 | } | 132 | } |
125 | 133 | ||
126 | /** | 134 | /** |
127 | * __kfifo_len - returns the number of bytes available in the FIFO, no locking version | ||
128 | * @fifo: the fifo to be used. | ||
129 | */ | ||
130 | static inline unsigned int __kfifo_len(struct kfifo *fifo) | ||
131 | { | ||
132 | return fifo->in - fifo->out; | ||
133 | } | ||
134 | |||
135 | /** | ||
136 | * kfifo_len - returns the number of bytes available in the FIFO | 135 | * kfifo_len - returns the number of bytes available in the FIFO |
137 | * @fifo: the fifo to be used. | 136 | * @fifo: the fifo to be used. |
138 | */ | 137 | */ |
139 | static inline unsigned int kfifo_len(struct kfifo *fifo) | 138 | static inline unsigned int kfifo_len(struct kfifo *fifo) |
140 | { | 139 | { |
141 | unsigned long flags; | 140 | return __kfifo_len(fifo); |
142 | unsigned int ret; | ||
143 | |||
144 | spin_lock_irqsave(fifo->lock, flags); | ||
145 | |||
146 | ret = __kfifo_len(fifo); | ||
147 | |||
148 | spin_unlock_irqrestore(fifo->lock, flags); | ||
149 | |||
150 | return ret; | ||
151 | } | 141 | } |
152 | 142 | ||
153 | #endif | 143 | #endif |
diff --git a/kernel/kfifo.c b/kernel/kfifo.c index 8da6bb9782bb..4950bdbe3477 100644 --- a/kernel/kfifo.c +++ b/kernel/kfifo.c | |||
@@ -28,11 +28,10 @@ | |||
28 | #include <linux/log2.h> | 28 | #include <linux/log2.h> |
29 | 29 | ||
30 | static void _kfifo_init(struct kfifo *fifo, unsigned char *buffer, | 30 | static void _kfifo_init(struct kfifo *fifo, unsigned char *buffer, |
31 | unsigned int size, spinlock_t *lock) | 31 | unsigned int size) |
32 | { | 32 | { |
33 | fifo->buffer = buffer; | 33 | fifo->buffer = buffer; |
34 | fifo->size = size; | 34 | fifo->size = size; |
35 | fifo->lock = lock; | ||
36 | 35 | ||
37 | kfifo_reset(fifo); | 36 | kfifo_reset(fifo); |
38 | } | 37 | } |
@@ -42,16 +41,14 @@ static void _kfifo_init(struct kfifo *fifo, unsigned char *buffer, | |||
42 | * @fifo: the fifo to assign the buffer | 41 | * @fifo: the fifo to assign the buffer |
43 | * @buffer: the preallocated buffer to be used. | 42 | * @buffer: the preallocated buffer to be used. |
44 | * @size: the size of the internal buffer, this have to be a power of 2. | 43 | * @size: the size of the internal buffer, this have to be a power of 2. |
45 | * @lock: the lock to be used to protect the fifo buffer | ||
46 | * | 44 | * |
47 | */ | 45 | */ |
48 | void kfifo_init(struct kfifo *fifo, unsigned char *buffer, unsigned int size, | 46 | void kfifo_init(struct kfifo *fifo, unsigned char *buffer, unsigned int size) |
49 | spinlock_t *lock) | ||
50 | { | 47 | { |
51 | /* size must be a power of 2 */ | 48 | /* size must be a power of 2 */ |
52 | BUG_ON(!is_power_of_2(size)); | 49 | BUG_ON(!is_power_of_2(size)); |
53 | 50 | ||
54 | _kfifo_init(fifo, buffer, size, lock); | 51 | _kfifo_init(fifo, buffer, size); |
55 | } | 52 | } |
56 | EXPORT_SYMBOL(kfifo_init); | 53 | EXPORT_SYMBOL(kfifo_init); |
57 | 54 | ||
@@ -60,7 +57,6 @@ EXPORT_SYMBOL(kfifo_init); | |||
60 | * @fifo: the fifo to assign then new buffer | 57 | * @fifo: the fifo to assign then new buffer |
61 | * @size: the size of the buffer to be allocated, this have to be a power of 2. | 58 | * @size: the size of the buffer to be allocated, this have to be a power of 2. |
62 | * @gfp_mask: get_free_pages mask, passed to kmalloc() | 59 | * @gfp_mask: get_free_pages mask, passed to kmalloc() |
63 | * @lock: the lock to be used to protect the fifo buffer | ||
64 | * | 60 | * |
65 | * This function dynamically allocates a new fifo internal buffer | 61 | * This function dynamically allocates a new fifo internal buffer |
66 | * | 62 | * |
@@ -68,8 +64,7 @@ EXPORT_SYMBOL(kfifo_init); | |||
68 | * The buffer will be release with kfifo_free(). | 64 | * The buffer will be release with kfifo_free(). |
69 | * Return 0 if no error, otherwise the an error code | 65 | * Return 0 if no error, otherwise the an error code |
70 | */ | 66 | */ |
71 | int kfifo_alloc(struct kfifo *fifo, unsigned int size, gfp_t gfp_mask, | 67 | int kfifo_alloc(struct kfifo *fifo, unsigned int size, gfp_t gfp_mask) |
72 | spinlock_t *lock) | ||
73 | { | 68 | { |
74 | unsigned char *buffer; | 69 | unsigned char *buffer; |
75 | 70 | ||
@@ -84,11 +79,11 @@ int kfifo_alloc(struct kfifo *fifo, unsigned int size, gfp_t gfp_mask, | |||
84 | 79 | ||
85 | buffer = kmalloc(size, gfp_mask); | 80 | buffer = kmalloc(size, gfp_mask); |
86 | if (!buffer) { | 81 | if (!buffer) { |
87 | _kfifo_init(fifo, 0, 0, NULL); | 82 | _kfifo_init(fifo, 0, 0); |
88 | return -ENOMEM; | 83 | return -ENOMEM; |
89 | } | 84 | } |
90 | 85 | ||
91 | _kfifo_init(fifo, buffer, size, lock); | 86 | _kfifo_init(fifo, buffer, size); |
92 | 87 | ||
93 | return 0; | 88 | return 0; |
94 | } | 89 | } |
diff --git a/net/dccp/probe.c b/net/dccp/probe.c index 6230ceb0823e..c6b50351aa78 100644 --- a/net/dccp/probe.c +++ b/net/dccp/probe.c | |||
@@ -67,7 +67,7 @@ static void printl(const char *fmt, ...) | |||
67 | len += vscnprintf(tbuf+len, sizeof(tbuf)-len, fmt, args); | 67 | len += vscnprintf(tbuf+len, sizeof(tbuf)-len, fmt, args); |
68 | va_end(args); | 68 | va_end(args); |
69 | 69 | ||
70 | kfifo_put(&dccpw.fifo, tbuf, len); | 70 | kfifo_put_locked(&dccpw.fifo, tbuf, len, &dccpw.lock); |
71 | wake_up(&dccpw.wait); | 71 | wake_up(&dccpw.wait); |
72 | } | 72 | } |
73 | 73 | ||
@@ -135,7 +135,7 @@ static ssize_t dccpprobe_read(struct file *file, char __user *buf, | |||
135 | if (error) | 135 | if (error) |
136 | goto out_free; | 136 | goto out_free; |
137 | 137 | ||
138 | cnt = kfifo_get(&dccpw.fifo, tbuf, len); | 138 | cnt = kfifo_get_locked(&dccpw.fifo, tbuf, len, &dccpw.lock); |
139 | error = copy_to_user(buf, tbuf, cnt) ? -EFAULT : 0; | 139 | error = copy_to_user(buf, tbuf, cnt) ? -EFAULT : 0; |
140 | 140 | ||
141 | out_free: | 141 | out_free: |
@@ -156,7 +156,7 @@ static __init int dccpprobe_init(void) | |||
156 | 156 | ||
157 | init_waitqueue_head(&dccpw.wait); | 157 | init_waitqueue_head(&dccpw.wait); |
158 | spin_lock_init(&dccpw.lock); | 158 | spin_lock_init(&dccpw.lock); |
159 | if (kfifo_alloc(&dccpw.fifo, bufsize, GFP_KERNEL, &dccpw.lock)) | 159 | if (kfifo_alloc(&dccpw.fifo, bufsize, GFP_KERNEL)) |
160 | return ret; | 160 | return ret; |
161 | if (!proc_net_fops_create(&init_net, procname, S_IRUSR, &dccpprobe_fops)) | 161 | if (!proc_net_fops_create(&init_net, procname, S_IRUSR, &dccpprobe_fops)) |
162 | goto err0; | 162 | goto err0; |