Hello. Thank you for your comment. James Morris wrote:I don't need to use spinlocks here. What I need to do here is avoid read/write reordering, so mb() will be appropriate here. struct something { struct something *next; void *data; }; struct something *prev_ptr = ...; struct something *new_ptr = kmalloc(sizeof(*new_ptr), GFP_KERNEL); new_ptr->next = NULL; new_ptr->data = some_value; mb(); prev_ptr->next = new_ptr; TOMOYO Linux doesn't use locks for reading singly-linked list. Thus, new_ptr->data has to be made visible to other CPUs before new_ptr is appended at the tail of singly-linked list. Otherwise, other CPU may read undefined new_ptr->data values. Performance is not critical because this mb() is called only when appending new entry to the singly-linked list. Since new_ptr never be removed, new_ptr needn't to know it's previous element's address, thus having only ->next pointer is enough. new_ptr->next is assigned *only once* (initialized with NULL, and assigned non-NULL later), indicating "if ptr->next == NULL, ptr is the last element" and "if ptr->next != NULL, ptr is not the last element". If I use "struct hlist_node" which has two pointers, it needs more memory than "struct something" which has one pointer. It is possible to use API defined in include/linux/list.h , but to reduce memory usage, I dare not use these API. Singly-linked list's rule in TOMOYO Linux is quite simple, "ptr->next is NULL if the last element" and "non-NULL if not". Regards. -
| Justin C. Sherrill | Re: dragonflybsd.org website link? |
| David Woodhouse | Re: -mm merge plans for 2.6.23 |
| Greg Kroah-Hartman | [PATCH 002/196] Chinese: rephrase English introduction in HOWTO |
| Eric Sandeen | Re: [RFC] Heads up on sys_fallocate() |
git: | |
| David Miller | [GIT]: Networking |
| Gerrit Renker | [PATCH 15/37] dccp: Set per-connection CCIDs via socket options |
| Patrick McHardy | [NET_SCHED 01/15]: sch_atm: fix format string warning |
