mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 10:41:38 -04:00
kfifo: move struct kfifo in place
This is a new generic kernel FIFO implementation.
The current kernel fifo API is not very widely used, because it has to
many constrains. Only 17 files in the current 2.6.31-rc5 used it.
FIFO's are like list's a very basic thing and a kfifo API which handles
the most use case would save a lot of development time and memory
resources.
I think this are the reasons why kfifo is not in use:
- The API is to simple, important functions are missing
- A fifo can be only allocated dynamically
- There is a requirement of a spinlock whether you need it or not
- There is no support for data records inside a fifo
So I decided to extend the kfifo in a more generic way without blowing up
the API to much. The new API has the following benefits:
- Generic usage: For kernel internal use and/or device driver.
- Provide an API for the most use case.
- Slim API: The whole API provides 25 functions.
- Linux style habit.
- DECLARE_KFIFO, DEFINE_KFIFO and INIT_KFIFO Macros
- Direct copy_to_user from the fifo and copy_from_user into the fifo.
- The kfifo itself is an in place member of the using data structure, this save an
indirection access and does not waste the kernel allocator.
- Lockless access: if only one reader and one writer is active on the fifo,
which is the common use case, no additional locking is necessary.
- Remove spinlock - give the user the freedom of choice what kind of locking to use if
one is required.
- Ability to handle records. Three type of records are supported:
- Variable length records between 0-255 bytes, with a record size
field of 1 bytes.
- Variable length records between 0-65535 bytes, with a record size
field of 2 bytes.
- Fixed size records, which no record size field.
- Preserve memory resource.
- Performance!
- Easy to use!
This patch:
Since most users want to have the kfifo as part of another object,
reorganize the code to allow including struct kfifo in another data
structure. This requires changing the kfifo_alloc and kfifo_init
prototypes so that we pass an existing kfifo pointer into them. This
patch changes the implementation and all existing users.
[[email protected]: fix warning]
Signed-off-by: Stefani Seibold <[email protected]>
Acked-by: Greg Kroah-Hartman <[email protected]>
Acked-by: Mauro Carvalho Chehab <[email protected]>
Acked-by: Andi Kleen <[email protected]>
Acked-by: Arnd Bergmann <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
This commit is contained in:
parent
2ec91eec47
commit
4546548789
24 changed files with 238 additions and 259 deletions
|
|
@ -28,6 +28,7 @@
|
|||
#include <linux/mutex.h>
|
||||
#include <linux/timer.h>
|
||||
#include <linux/workqueue.h>
|
||||
#include <linux/kfifo.h>
|
||||
#include <scsi/iscsi_proto.h>
|
||||
#include <scsi/iscsi_if.h>
|
||||
#include <scsi/scsi_transport_iscsi.h>
|
||||
|
|
@ -231,7 +232,7 @@ struct iscsi_conn {
|
|||
};
|
||||
|
||||
struct iscsi_pool {
|
||||
struct kfifo *queue; /* FIFO Queue */
|
||||
struct kfifo queue; /* FIFO Queue */
|
||||
void **pool; /* Pool of elements */
|
||||
int max; /* Max number of elements */
|
||||
};
|
||||
|
|
|
|||
|
|
@ -80,7 +80,7 @@ struct iscsi_tcp_task {
|
|||
int data_offset;
|
||||
struct iscsi_r2t_info *r2t; /* in progress solict R2T */
|
||||
struct iscsi_pool r2tpool;
|
||||
struct kfifo *r2tqueue;
|
||||
struct kfifo r2tqueue;
|
||||
void *dd_data;
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -21,7 +21,7 @@ struct srp_buf {
|
|||
struct srp_queue {
|
||||
void *pool;
|
||||
void *items;
|
||||
struct kfifo *queue;
|
||||
struct kfifo queue;
|
||||
spinlock_t lock;
|
||||
};
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue