aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/kfifo.h
diff options
context:
space:
mode:
authorStefani Seibold <stefani@seibold.net>2009-12-21 17:37:27 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2009-12-22 17:17:56 -0500
commitc1e13f25674ed564948ecb7dfe5f83e578892896 (patch)
tree24fac07b3e2b66dff01c3127b34077de1de4c101 /include/linux/kfifo.h
parent45465487897a1c6d508b14b904dc5777f7ec7e04 (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>
Diffstat (limited to 'include/linux/kfifo.h')
-rw-r--r--include/linux/kfifo.h80
1 files changed, 35 insertions, 45 deletions
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
36extern void kfifo_init(struct kfifo *fifo, unsigned char *buffer, 35extern void kfifo_init(struct kfifo *fifo, unsigned char *buffer,
37 unsigned int size, spinlock_t *lock); 36 unsigned int size);
38extern __must_check int kfifo_alloc(struct kfifo *fifo, unsigned int size, 37extern __must_check int kfifo_alloc(struct kfifo *fifo, unsigned int size,
39 gfp_t gfp_mask, spinlock_t *lock); 38 gfp_t gfp_mask);
40extern void kfifo_free(struct kfifo *fifo); 39extern void kfifo_free(struct kfifo *fifo);
41extern unsigned int __kfifo_put(struct kfifo *fifo, 40extern 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 */
59static inline void kfifo_reset(struct kfifo *fifo) 58static 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 */
67static 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 */
80static inline unsigned int kfifo_put(struct kfifo *fifo, 87static 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 */
104static inline unsigned int kfifo_get(struct kfifo *fifo, 112static 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 */
130static 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 */
139static inline unsigned int kfifo_len(struct kfifo *fifo) 138static 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