kernel list data structure

Jonathan Neuschäfer j.neuschaefer at gmx.net
Sun Jun 5 21:47:34 EDT 2011


On Sun, Jun 05, 2011 at 06:09:50PM +0430, Amirali Shambayati wrote:
> Hello all,
> I wanted to use list data structure implemented inside kernel. It seems that
> it is too different with usual concept from a list data structure. I studied
> about it, and I thought that I got familiar enough to use it. I have
> implemented a two-dimensioned list, using what I understood about kernel
> list.  But as I debugged my code, it seems that my concept is wrong. Would
> anyone guide me how to implement a two-dimensioned list, or introduce me a
> manual to learn about it more?

http://lwn.net/Articles/262464/ (What is RCU, Fundamentally?) includes
a bit of description of the linked lists used in the kernel, maybe this
helps a bit.

A good example of a structure with two list_heads is struct task_struct
(include/linux/sched.h, line 1311):
	...
	/*
	 * children/sibling forms the list of my natural children
	 */
	struct list_head children;	/* list of my children */
	struct list_head sibling;       /* linkage in my parent's children list */
	...

> 
> I have two data structures called "noop_data" and "bundle". I have a list of
> bundles, which each one has a list of requests.
> I implemented it, this way:
> "noop_data" has a reference to start point of bundles list, called
> "writeQueue"
> "bundle" has a reference to start point of requests list, called
> "reqsQueue".
> "bundle" knows its related list using "bundlesQueue".
> "request" knows its related list using "queuelist". (request struct is
> already implemented in kernel)
> 
> struct bundle {
>     int bundleNumber;
>     int size;
>     struct list_head bundlesQueue;
>     struct list_head reqsQueue;
>     int filled[8];
> };
> 
> struct noop_data {
>     struct list_head readQueue;
>     struct list_head writeQueue;
>     struct bundle bun;

Why are you embedding a struct bundle here?

>     unsigned int starved;
> };

I can't see anything fundamentally wrong with this. Maybe your list-
walking code is wrong, somewhere.

HTH,
	Jonathan Neuschäfer



More information about the Kernelnewbies mailing list