Re: Kernel panic using a webcam

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Sun, Oct 12, 2014 at 12:20 PM, Andrew Klofas <aklofas@xxxxxxxxx> wrote:
>
> On Sat, Oct 11, 2014 at 5:02 AM, Laurent Pinchart
> <laurent.pinchart@xxxxxxxxxxxxxxxx> wrote:
>>
>> Hi Andrew,
>>
>> On Friday 10 October 2014 17:55:54 Andrew Klofas wrote:
>> > Greetings,
>> >
>> > I am new to the linux kernel community (first time contacting anyone),
>> > so I
>> > apologize if I am not doing this the proper way.
>>
>> No worries. You should have CC'ed the linux-media@xxxxxxxxxxxxxxx mailing
>> list, which I've done on this reply.
>>
>> > I am trying to get to the bottom of a kernel panic that occurs under
>> > normal
>> > operation when using a webcam. I have a kernel dump (you can download it
>> > at
>> > http://static.novarianteng.net/dump.201410101406), and I can answer any
>> > questions you have.
>>
>> The first question would be, why do I get a 403 error when trying to
>> download
>> the file ? :-)
>
>
> Sorry, wrong file permissions (should have tested the link), it's fixed now.
>
>>
>>
>> > I am using the low-level ioctl for v4l2. I am mmap'ing the raw yuyv
>> > frames
>> > and can start streaming. However, when I stop streaming:
>> >
>> > // Call VIDIOC_STREAMOFF
>> > enum v4l2_buf_type type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
>> > ioctl(fd, VIDIOC_STREAMOFF, &type);
>> >
>> > I get a kernel panic: BUG: unable to handle kernel NULL pointer
>> > dereference
>> > at (null)
>> >
>> > It took a while to follow the static inlining and indirect calls, but I
>> > think I found where the kernel panic is reported to have occured.
>> >
>> >
>> > crash command line
>> > - sys
>> >       KERNEL: /usr/lib/debug/boot/vmlinux-3.13.0-24-generic
>> >     DUMPFILE: /var/crash/201410101406/dump.201410101406  [PARTIAL DUMP]
>> >         CPUS: 4
>> >         DATE: Fri Oct 10 14:06:08 2014
>> >       UPTIME: 00:01:48
>> > LOAD AVERAGE: 0.71, 0.41, 0.16
>> >        TASKS: 341
>> >     NODENAME: workstation
>> >      RELEASE: 3.13.0-24-generic
>> >      VERSION: #47-Ubuntu SMP Fri May 2 23:30:00 UTC 2014
>> >      MACHINE: x86_64  (2693 Mhz)
>> >       MEMORY: 7.9 GB
>> >        PANIC: "Oops: 0002 [#1] SMP " (check log for details)
>> >
>> > - bt
>> > PID: 2461   TASK: ffff8802208edfc0  CPU: 0   COMMAND: "python"
>> >  #0 [ffff88022ec03988] machine_kexec at ffffffff8104a732
>> >  #1 [ffff88022ec039d8] crash_kexec at ffffffff810e6ab3
>> >  #2 [ffff88022ec03aa0] oops_end at ffffffff8171efe8
>> >  #3 [ffff88022ec03ac8] no_context at ffffffff8170e784
>> >  #4 [ffff88022ec03b10] __bad_area_nosemaphore at ffffffff8170e804
>> >  #5 [ffff88022ec03b58] bad_area_nosemaphore at ffffffff8170e96e
>> >  #6 [ffff88022ec03b68] __do_page_fault at ffffffff81721947
>> >  #7 [ffff88022ec03c68] do_page_fault at ffffffff81721e1a
>> >  #8 [ffff88022ec03c90] page_fault at ffffffff8171e288
>> >     [exception RIP: uvc_video_decode_start+658]
>> >     RIP: ffffffffa07bbc22  RSP: ffff88022ec03d40  RFLAGS: 00010002
>> >     RAX: 0000000000000000  RBX: ffff88003551c000  RCX: 000000000000045b
>> > <---------- RAX is NULL
>> >     RDX: 00000000e370dc50  RSI: 0000000000000046  RDI: 0000000000000060
>> >     RBP: ffff88022ec03de8   R8: ffff88003551c580   R9: 0000000000000000
>> >     R10: ffff8800af7ed000  R11: 0000000000000060  R12: ffff8800af020000
>> >     R13: ffff88021f659800  R14: 0000000000000bf4  R15: 0000000000000001
>> >     ORIG_RAX: ffffffffffffffff  CS: 0010  SS: 0000
>> >  #9 [ffff88022ec03d50] ehci_urb_done at ffffffff8154e64d
>> > #10 [ffff88022ec03d78] ehci_work at ffffffff81556162
>> > #11 [ffff88022ec03e48] uvc_video_complete at ffffffffa07bb912 [uvcvideo]
>> > #12 [ffff88022ec03e78] __usb_hcd_giveback_urb at ffffffff8153a107
>> > #13 [ffff88022ec03ea8] usb_giveback_urb_bh at ffffffff8153aeb6
>> > #14 [ffff88022ec03ee8] tasklet_hi_action at ffffffff8106c5e3
>> > #15 [ffff88022ec03f08] __do_softirq at ffffffff8106caec
>> > #16 [ffff88022ec03f68] irq_exit at ffffffff8106d035
>> > #17 [ffff88022ec03f80] do_IRQ at ffffffff817287d6
>> > --- <IRQ stack> ---
>> > #18 [ffff880220e6df58] ret_from_intr at ffffffff8171df6d
>> >     RIP: 000000000053eacf  RSP: 00007fff8a062820  RFLAGS: 00000202
>> >     RAX: 0000000000913940  RBX: 0000000002090010  RCX: 000000000000003f
>> >     RDX: 00000000022f22e0  RSI: 0000000000000000  RDI: 00007f8a17b3a908
>> >     RBP: 00007f8a17b3a908   R8: 00000000022f27c0   R9: 0000000000000030
>> >     R10: 00000000022f2778  R11: 00000000022f2790  R12: 00007f8a2d088a01
>> >     R13: 00007fff8a0648f3  R14: 0000000000000001  R15: 0000000000000000
>> >     ORIG_RAX: ffffffffffffff3c  CS: 0033  SS: 002b
>> >
>> > > Looking at the code:
>> >
>> > http://lxr.free-electrons.com/source/drivers/media/usb/uvc/uvc_video.c?v=3.1
>> > 3#L454 - C
>> > 454         spin_lock_irqsave(&stream->clock.lock, flags);
>> > 455
>> > 456         sample = &stream->clock.samples[stream->clock.head];
>> >  <------------------------------ Somehow 'sample' becomes NULL
>>
>> That would be *really* weird. How have you determined the location of the
>> crash in the source code ? Have you used addr2line ?
>
> I downloaded the kernel debugging symbols. I could zip them up (~250MB IIRC)
> and upload them on monday when I'm back in the office.

Just uploaded the kernel w/ syms:
http://static.novarianteng.net/3.13.0-24-generic-debugsyms.tar.gz
(With all the modules gzipped, ~880MB be warned)

>
>
> My current (possibly crazy) theory is that it might be related to a race
> condition. If
> stream->clock.samples
> is set to NULL earlier when un-mmap, and
> stream->clock.head
> is '0', the evaluation of
> &stream->clock.samples[stream->clock.head];
> could be NULL:
> &stream->clock.samples[0]; == stream->clock.samples; == NULL?
>
>
>
>>
>>
>> > 457         sample->dev_stc = get_unaligned_le32(&data[header_size -
>> > 6]);
>> > <-------------------- CRASHES HERE (according to IP) when trying to
>> > deref
>> > sample->dev_stc
>> > 458         sample->dev_sof = dev_sof;
>> > 459         sample->host_sof = host_sof;
>> > 460         sample->host_ts = ts;
>> > 461
>> > 462         /* Update the sliding window head and count. */
>> > 463         stream->clock.head = (stream->clock.head + 1) %
>> > stream->clock.size;
>> > 464
>> > 465         if (stream->clock.count < stream->clock.size)
>> > 466                 stream->clock.count++;
>> > 467
>> > 468         spin_unlock_irqrestore(&stream->clock.lock, flags);
>> >
>> > - Asm (from crash dump)
>> > 0xffffffffa07bbbe3 <uvc_video_decode_start+595>:        callq
>> >  0xffffffff8171dab0 <_raw_spin_lock_irqsave>
>> > 0xffffffffa07bbbe8 <uvc_video_decode_start+600>:        mov    %rax,%rsi
>> > 0xffffffffa07bbbeb <uvc_video_decode_start+603>:        mov
>> >  0x570(%rbx),%eax
>> > 0xffffffffa07bbbf1 <uvc_video_decode_start+609>:        mov
>> >  0x54(%rsp),%edx
>> > 0xffffffffa07bbbf5 <uvc_video_decode_start+613>:        mov
>> >  0x50(%rsp),%ecx
>> > 0xffffffffa07bbbf9 <uvc_video_decode_start+617>:        mov
>> >  0x4c(%rsp),%r9d
>> > 0xffffffffa07bbbfe <uvc_video_decode_start+622>:        movzwl
>> > 0x60(%rsp),%edi
>> > 0xffffffffa07bbc03 <uvc_video_decode_start+627>:        mov
>> >  0x58(%rsp),%r8
>> > 0xffffffffa07bbc08 <uvc_video_decode_start+632>:        sub    $0x6,%edx
>> > 0xffffffffa07bbc0b <uvc_video_decode_start+635>:        shl    $0x5,%rax
>> > 0xffffffffa07bbc0f <uvc_video_decode_start+639>:        add
>> >  0x568(%rbx),%rax
>> > 0xffffffffa07bbc16 <uvc_video_decode_start+646>:        mov
>> >  (%r12,%rdx,1),%edx
>> > 0xffffffffa07bbc1a <uvc_video_decode_start+650>:        add    %r9d,%ecx
>> > 0xffffffffa07bbc1d <uvc_video_decode_start+653>:        and
>> > $0x7ff,%cx
>> > 0xffffffffa07bbc22 <uvc_video_decode_start+658>:        mov
>> > %edx,(%rax)
>> >  <--------------------- CRASHES HERE (according to IP) where RAX
>> > (address
>> > of sample) = NULL
>> > 0xffffffffa07bbc24 <uvc_video_decode_start+660>:        mov
>> > %cx,0x4(%rax)
>> > 0xffffffffa07bbc28 <uvc_video_decode_start+664>:        mov
>> >  %di,0x18(%rax)
>> > 0xffffffffa07bbc2c <uvc_video_decode_start+668>:        mov
>> >  0x70(%rsp),%rdx
>> > 0xffffffffa07bbc31 <uvc_video_decode_start+673>:        mov
>> >  0x78(%rsp),%rcx
>> > 0xffffffffa07bbc36 <uvc_video_decode_start+678>:        mov
>> >  %rdx,0x8(%rax)
>> > 0xffffffffa07bbc3a <uvc_video_decode_start+682>:        xor    %edx,%edx
>> > 0xffffffffa07bbc3c <uvc_video_decode_start+684>:        mov
>> >  %rcx,0x10(%rax)
>> > 0xffffffffa07bbc40 <uvc_video_decode_start+688>:        mov
>> >  0x570(%rbx),%eax
>> > 0xffffffffa07bbc46 <uvc_video_decode_start+694>:        mov
>> >  0x578(%rbx),%ecx
>> > 0xffffffffa07bbc4c <uvc_video_decode_start+700>:        add    $0x1,%eax
>> > 0xffffffffa07bbc4f <uvc_video_decode_start+703>:        div    %ecx
>> > 0xffffffffa07bbc51 <uvc_video_decode_start+705>:        mov
>> >  0x574(%rbx),%eax
>> > 0xffffffffa07bbc57 <uvc_video_decode_start+711>:        cmp    %eax,%ecx
>> > 0xffffffffa07bbc59 <uvc_video_decode_start+713>:        mov
>> >  %edx,0x570(%rbx)
>> > 0xffffffffa07bbc5f <uvc_video_decode_start+719>:        jbe
>> >  0xffffffffa07bbc6a <uvc_video_decode_start+730>
>> > 0xffffffffa07bbc61 <uvc_video_decode_start+721>:        add    $0x1,%eax
>> > 0xffffffffa07bbc64 <uvc_video_decode_start+724>:        mov
>> >  %eax,0x574(%rbx)
>> > 0xffffffffa07bbc6a <uvc_video_decode_start+730>:        mov    %r8,%rdi
>> > 0xffffffffa07bbc6d <uvc_video_decode_start+733>:        callq
>> >  0xffffffff8171d8c0 <_raw_spin_unlock_irqrestore>
>> >
>> > Please let me know any other information you think is needed.
>>
>> --
>> Regards,
>>
>> Laurent Pinchart
>>
>
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]
  Powered by Linux