Messages in this thread | | | Date | Fri, 29 Mar 2013 12:26:45 -0700 | Subject | Re: ipc,sem: sysv semaphore scalability | From | Linus Torvalds <> |
| |
On Fri, Mar 29, 2013 at 12:06 PM, Dave Jones <davej@redhat.com> wrote: > > Here's an oops I just hit.. > > BUG: unable to handle kernel NULL pointer dereference at 000000000000000f > IP: [<ffffffff812c24ca>] testmsg.isra.5+0x1a/0x60
Btw, looking at the code leading up to this, what the f*ck is wrong with the IPC stuff?
It's using the generic list stuff for most of the lists, but then it open-codes the accesses.
So instead of using
for_each_entry(walk_msg, &msq->q_messages, m_list) { .. }
the ipc/msg.c code does all that by hand, with
tmp = msq->q_messages.next; while (tmp != &msq->q_messages) { struct msg_msg *walk_msg;
walk_msg = list_entry(tmp, struct msg_msg, m_list); ... tmp = tmp->next; }
Ugh. The code is near unreadable. And then it has magic memory barriers etc, implying that it doesn't lock the data structures, but no comments about them. See expunge_all() and pipelined_send().
The code seems entirely random, and it's badly set up (annoyance of the day: crazy helper functions in ipc/msgutil.c to make sure that (a) you have to spend more effort looking for them, and (b) they won't get inlined).
Clearly nobody has cared for the crazy IPC message code in a long time.
Linus
| |