Re: LiS 2-16 : OOPS in lis_safe_SAMESTR()
phil <[email protected]> Mon, 28 Nov 2005 12:43:09 +0100
| Newsgroups | gmane.linux.kernel.streams |
|---|---|
| Message-ID | <[email protected]> |
Hello Brian,
Thanks a lot for your explanations.
Concerning your questions :
We used LiS 2-16 for historical reason, in fact for an old project based
on this version of LiS.
I don't know Linux Fast-STREAMS,and I'm afraid that, within the scope
of this project, we can't move from LiS 2-16, however for future
project, I would be very interested if you have a link to the
documentation for Linux Fast Streams. (I couldn't find it on openss7.org).
Best regards,
-Philippe
Brian F. G. Bidulock wrote:
>Phil,
>
>Well, no it was not just an SMP problem. The problem exists on UP under
>LiS-2.18.0 as well. There I put two lines in LiS-2.18.1 that made the
>problem go away on UP at least. Just
>
> if (q == 0)
> return (0);
>
>at the top of lis_await_qsched() in LiS/head/head.c This correction was
>made to LiS-2.18.1 in July 2005.
>
>The problem is a lack of proper plumbing locks in LiS. The situation is
>aggravated if there are different processes at either end of the pipe (the
>normal case) closing their ends at about the same time. It seems on 2.18
>that queue service procedure run after the queue pairs have been severed.
>For LiS-2.16 it is also a race.
>
>For LiS-2.16 and before this fix to 2.18, I had to put this in all module
>and driver put procedure and service procedures that used pipes: (I use
>pipes extensively for testing modules and drivers, so that meant about all
>of them.)
>
>int
>xxx_put(queue_t *q, mblk_t *mp)
>{
>#if defined LIS
> if (q->q_next == NULL || OTHERQ(q)->q_next == NULL) {
> cmn_err(CE_WARN, "%s: %s: LiS pipe bug: called with NULL q->q_next pointer.",
> MOD_NAME, __FUNCTION__);
> freemsg(mp);
> return (0);
> }
>#endif
> ...
>}
>
>int
>xxx_srv(queue_t *q)
>{
>#if defined LIS
> if (q->q_next == NULL || OTHERQ(q)->q_next == NULL) {
> cmn_err(CE_WARN, "%s: %s: LiS pipe bug: called with NULL q->q_next pointer.",
> MOD_NAME, __FUNCTION__);
> return (0);
> }
>#endif
> ...
>}
>
>And in close procedures that try to pass messages.
>
>LiS is full of races. Be amazed if it runs on SMP at all.
>
>Linux Fast-STREAMS does not have this problem because it has proper
>plumbing locks and no put or service procedure can run while or after
>it has severed the queue pair. (Thus the #ifdef's above.)
>
>Any particular reason why you're still using 2.16?
>
>I'm just wrapping documentation for release:
>Would you like to try using Linux Fast-STREAMS?
>
>--brian
>
>
>On Wed, 23 Nov 2005, phil wrote:
>
>
>
>> Hello Gentlemen,
>> I analyzed a oops that occured on an "old" version of LiS : 2-16 in a
>> process which is closing a streams pipe. I've attached the oops and
>> the corresponding section of code hereafter.
>> The process is multithreaded and we've perheaps reached a race
>> condition where two threads are dealing with the closing of the same
>> pipe ...
>> I found similar errors reported on Linux archive and I understand that
>> such race conditions have been fixed with upper release of LiS. (i.e
>> 2-18).
>> In particular, in the below mail there's a reference to a patch for
>> problem 3) "synchronization problem between pipes." And I think that
>> it could be the root cause of my problem.
>> [1]http://www.mail-archive.com/[email protected]/msg018
>> 55.html
>> My question is : beyond the fact that LiS 2-18 will certainly fixed
>> this issue, I was wondering if someone could point me to the specific
>> modification that has fixed this specific issue (perheaps the patch
>> mentioned in the email from Jeff)
>> Best regards,
>> -Philippe
>> ----------------------------------------------------------------------
>> -------------------------------------------------------
>> == Section of code where the oops occured
>> ----------------------------------------------------------------------
>> -------------------------------------------------------
>> int lis_safe_SAMESTR(queue_t *q, char *f, int l)
>> {
>> if ( lis_check_q_magic(q,f,l)
>> && q->q_next != NULL
>> && lis_check_q_magic(q->q_next,f,l)
>> )
>> return ((q->q_flag&QREADR) == (q->q_next->q_flag&QREADR));
>> ^^^^^^^^^
>> ksymoops
>> showed that q->q_next is null
>> in spite
>> of the condition test in if statement.
>> return 0;
>> }
>> ----------------------------------------------------------------------
>> -------------------------------------------------------
>> == The OOPS :
>> ----------------------------------------------------------------------
>> -------------------------------------------------------
>> Unable to handle kernel NULL pointer dereference at virtual address
>> 0000001c
>> printing eip:
>> f8b332b9
>> *pde = 32ba1001
>> *pte = 58e29067
>> Oops: 0000
>> netconsole nfs lockd sunrpc streams swrmm parport_pc lp parport
>> autofs4 audit e1000 tg3 ipv6 floppy sg microcode keybdev mousedev hid
>> input usb-ohci usbcore e
>> CPU: 3
>> EIP: 0060:[<f8b332b9>] Tainted: P
>> EFLAGS: 00010002
>> EIP is at lis_safe_SAMESTR [streams] 0x41 (2.4.21-20.ELsmp/i686)
>> eax: 00000000 ebx: cb2852ac ecx: f8bd4ad4 edx: 00000020
>> esi: 0000068a edi: f8bd4ad4 ebp: d6f61ed8 esp: d6f61ebc
>> ds: 0068 es: 0068 ss: 0068
>> Process oracle (pid: 1131, stackpage=d6f61000)
>> Stack: cb2852ac 00000000 cb2852ac f8b32c80 cb2852ac f8bd4ad4 0000068a
>> 00000202
>> d6f61f00 f4f272b4 00003a98 f4f2753c f8b291d1 cb2852ac f4f272b4
>> f8c0c960
>> 00000286 00000282 f4f2753c d6f61f30 00000000 f4f272b4 f8b29639
>> f4f272b4
>> Call Trace: [<f8b32c80>] lis_qcountstrm [streams] 0x50 (0xd6f61ec8)
>> [<f8bd4ad4>] .rodata.str1.4 [streams] 0x4584 (0xd6f61ed0)
>> [<f8b291d1>] close_action [streams] 0x1c9 (0xd6f61eec)
>> [<f8c0c960>] lis_stdata_sem [streams] 0x0 (0xd6f61ef8)
>> [<f8b29639>] lis_doclose [streams] 0x2c9 (0xd6f61f14)
>> [<f8b29850>] lis_strclose [streams] 0x178 (0xd6f61f44)
>> [<c016472a>] __fput [kernel] 0xea (0xd6f61f78)
>> [<c01628ae>] filp_close [kernel] 0x8e (0xd6f61f94)
>> [<c0162956>] sys_close [kernel] 0x66 (0xd6f61fb0)
>> Code: 8b 40 1c 83 e0 10 83 e2 10 39 c2 0f 94 c0 0f b6 c0 eb d3 55
>> ----------------------------------------------------------------------
>> -------------------------------------------------------
>>
>>References
>>
>> 1. http://www.mail-archive.com/[email protected]/msg01855.html
>>
>>
>
>
>