[PATCH] ARM: mx3/pcm037: properly allocate memory for mx3-camera
Russell King - ARM Linux
linux at arm.linux.org.uk
Mon Dec 6 06:46:29 EST 2010
On Mon, Dec 06, 2010 at 12:37:22PM +0100, Alberto Panizzo wrote:
> On lun, 2010-12-06 at 10:26 +0000, Russell King - ARM Linux wrote:
> > On Mon, Dec 06, 2010 at 11:14:52AM +0100, Alberto Panizzo wrote:
> > > Uwe, the following function works for me:
> > > +static void __init mx31_3ds_reserve(void)
> > > +{
> > > + long ret;
> > > + /* reserve MX3_CAMERA_BUF_SIZE for mx3-camera */
> > > + mx3_camera_base = memblock_alloc(MX3_CAMERA_BUF_SIZE,
> > > + /* ??? */ MX3_CAMERA_BUF_SIZE);
> > > + memblock_free(mx3_camera_base, MX3_CAMERA_BUF_SIZE);
> > > + memblock_remove(mx3_camera_base, MX3_CAMERA_BUF_SIZE);
> > > + if (!mx3_camera_base) {
> > > + pr_err("%s: Wrong base allocation\n", __func__);
> > > + return;
> > > + }
> > > + ret = memblock_reserve(mx3_camera_base, MX3_CAMERA_BUF_SIZE);
> > > + if (ret) {
> > > + pr_err("%s: Memory not reserved\n", __func__);
> > > + return;
> > > + }
> > > +}
> > >
> > > The basic Idea is: why a region allocated, freed and removed can
> > > be declared safely as dma memory for the camera in a second time?
> > > Instead, I used the reserve API on the previous region so I am
> > > sure that region is not used by someone else before declaring it
> > > ad dma region for camera.
> > >
> > > The ugly part of this code is that memblock_reserve want a base address
> > > that I have to decide before and I am supposing that the base address
> > > resulting from the allocate/free/remove operations, can be safely fed
> > > to it.
> >
> > It really is not on to have a region of memory marked as being reserved
> > and at the same time tell memblock that it's not part of the memory map.
> > When we pass this information to bootmem, we will reserve a region which
> > does not exist in the memory map.
> >
> > Try passing memblock=debug to get a display of the memblock information
> > at boot time - and debugging a bit further from there.
>
> Ok, I've done as you suggested and the results are the following debug:
>
> [ 17.620000] mx3-camera mx3-camera.0: __videobuf_mmap_mapper
> [ 17.640000] mx3-camera mx3-camera.0: dma_alloc_coherent data is at addr c9000000 (size 155648)
> [ 17.660000] mx3-camera mx3-camera.0: mmap c7fe9cc0: q=c7f65508 4066b000-40691000 (25800) pgoff 00087800 buf 0
> [ 17.690000] mx3-camera mx3-camera.0: vm_open c7fe9cc0 [count=0,vma=4066b000-40691000]
> [ 17.710000] mx3-camera mx3-camera.0: __videobuf_mmap_mapper
> [ 17.730000] mx3-camera mx3-camera.0: dma_alloc_coherent data is at addr c9040000 (size 155648)
> [ 17.760000] mx3-camera mx3-camera.0: mmap c7d85dc0: q=c7f65508 40744000-4076a000 (25800) pgoff 00087840 buf 1
> [ 17.790000] mx3-camera mx3-camera.0: vm_open c7d85dc0 [count=0,vma=40744000-4076a000]
> [ 17.810000] mx3-camera mx3-camera.0: __videobuf_iolock memory method MMAP
> [ 17.830000] mx3-camera mx3-camera.0: __videobuf_iolock memory method MMAP
>
> The allocation goes..
>
> [ 17.860000] rw_verify_area: inode
>
> in rw_verify_area the inode structure is NULL and from now start
> a non terming sequence of errors:
>
> [ 17.860000] Unable to handle kernel NULL pointer dereference at virtual address 00000098
> [ 17.890000] pgd = c7fb8000
> [ 17.900000] [00000098] *pgd=87fb4031, *pte=00000000, *ppte=00000000
> [ 17.920000] Internal error: Oops: 17 [#1] PREEMPT
> [ 17.920000] last sysfs file: /sys/kernel/uevent_seqnum
> [ 17.920000] Modules linked in: ov2640 mx3_camera soc_camera soc_mediabus videobuf_dma_contig videobuf_core
> [ 17.920000] CPU: 0 Not tainted (2.6.36-10808-ga06e72c-dirty #178)
> [ 17.920000] PC is at rw_verify_area+0x80/0x110
> [ 17.920000] LR is at rw_verify_area+0x80/0x110
> [ 17.920000] pc : [<c00a3c50>] lr : [<c00a3c50>] psr: 60000013
> [ 17.920000] sp : c7faff30 ip : 00000000 fp : 00000003
> [ 17.920000] r10: 00000001 r9 : c7fae000 r8 : c7f64820
> [ 17.920000] r7 : 0000010f r6 : 00000000 r5 : 00000000 r4 : 00000000
> [ 17.920000] r3 : 00000000 r2 : 00000000 r1 : c7fae000 r0 : 0000002a
> [ 17.920000] Flags: nZCv IRQs on FIQs on Mode SVC_32 ISA ARM Segment user
> [ 17.920000] Control: 00c5387d Table: 87fb8000 DAC: 00000015
> [ 17.920000] Process gst-launch-0.10 (pid: 646, stack limit = 0xc7fae268)
> [ 17.920000] Stack: (0xc7faff30 to 0xc7fb0000)
> [ 17.920000] ff20: c7ced818 c003b7d0 c7ced6a0 c7ced6d0
> [ 17.920000] ff40: c03e2ee0 c7f64820 00000000 40006000 c7faff80 0000010f 00000000 c00a44bc
> [ 17.920000] ff60: c7ced6a0 c7fae000 00000000 00000000 c7f64820 40006000 0000010f c00a462c
> [ 17.920000] ff80: 00000000 00000000 fc400000 00000000 0000010f 40006000 404035e0 00000004
> [ 17.920000] ffa0: c0029048 c0028ea0 0000010f 40006000 00000001 40006000 0000010f 00000000
> [ 17.920000] ffc0: 0000010f 40006000 404035e0 00000004 0000010f 00000000 0008b40f 00000003
> [ 17.920000] ffe0: 00000000 bec20f08 40347d1c 40396f0c 60000010 00000001 bfffffef ffffff7f
> [ 17.920000] [<c00a3c50>] (rw_verify_area+0x80/0x110) from [<c00a44bc>] (vfs_write+0x80/0x138)
> [ 17.920000] [<c00a44bc>] (vfs_write+0x80/0x138) from [<c00a462c>] (sys_write+0x40/0x6c)
> [ 17.920000] [<c00a462c>] (sys_write+0x40/0x6c) from [<c0028ea0>] (ret_fast_syscall+0x0/0x30)
> [ 17.920000] Code: 1a000002 e59f0088 e59f107c eb0916b2 (e5963098)
> [ 18.430000] Unable to handle kernel paging request at virtual address 19612181
> [ 18.430000] pgd = c0004000
> [ 18.430000] [19612181] *pgd=00000000
> [ 18.430000] Internal error: Oops: 805 [#2] PREEMPT
> [ 18.430000] last sysfs file: /sys/kernel/uevent_seqnum
> [ 18.430000] Modules linked in: ov2640 mx3_camera soc_camera soc_mediabus videobuf_dma_contig videobuf_core
> [ 18.430000] CPU: 0 Tainted: G D (2.6.36-10808-ga06e72c-dirty #178)
> [ 18.430000] PC is at free_block+0x7c/0x148
> [ 18.430000] LR is at drain_array+0xb0/0xfc
> [ 18.430000] pc : [<c00a0760>] lr : [<c00a0a40>] psr: 00000193
> [ 18.430000] sp : c7cb1f10 ip : c7809020 fp : 00100100
> [ 18.430000] r10: c7d28df0 r9 : 00200200 r8 : 00000001
> [ 18.430000] r7 : c7c0c30c r6 : c7c0c2c0 r5 : 00000000 r4 : c7cba920
> [ 18.430000] r3 : 21611961 r2 : 19612181 r1 : 00000080 r0 : c7809b00
> [ 18.430000] Flags: nzcv IRQs off FIQs on Mode SVC_32 ISA ARM Segment kernel
> [ 18.430000] Control: 00c5387d Table: 87fb8000 DAC: 00000017
> [ 18.430000] Process kworker/0:2 (pid: 284, stack limit = 0xc7cb0268)
> [ 18.430000] Stack: (0xc7cb1f10 to 0xc7cb2000)
> [ 18.430000] 1f00: c7fae000 c7d28df0 00000001 c7d28de0
> [ 18.430000] 1f20: 00000000 c7c0c2c0 c0403d58 00000005 c7c11815 c00a0a40 c7cba920 c7c0c2c0
> [ 18.430000] 1f40: 00000000 c03e991c c03e4110 c00a0bd0 00000000 c7d5fd90 c03e991c c7c536a0
> [ 18.430000] 1f60: 00000037 00000000 c7c11800 c00a0b80 00000000 c0054764 c03e47ec c7c536a0
> [ 18.430000] 1f80: c03e47ec 00000009 c7cb0000 c03e47ec c7c536b0 c7c536b0 c03e496c c0054f44
> [ 18.430000] 1fa0: c7c25f0c c7cb1fd4 c7c25f0c c7c536a0 c0054d24 00000000 00000000 00000000
> [ 18.430000] 1fc0: 00000000 c005a694 c0029f0c 00000000 c7c536a0 00000000 c7cb1fd8 c7cb1fd8
> [ 18.430000] 1fe0: 00000000 c7c25f0c c005a618 c0029f0c 00000013 c0029f0c 00000001 02000000
> [ 18.430000] [<c00a0760>] (free_block+0x7c/0x148) from [<c00a0a40>] (drain_array+0xb0/0xfc)
> [ 18.430000] [<c00a0a40>] (drain_array+0xb0/0xfc) from [<c00a0bd0>] (cache_reap+0x50/0x118)
> [ 18.430000] [<c00a0bd0>] (cache_reap+0x50/0x118) from [<c0054764>] (process_one_work+0x258/0x3c8)
> [ 18.430000] [<c0054764>] (process_one_work+0x258/0x3c8) from [<c0054f44>] (worker_thread+0x220/0x438)
> [ 18.430000] [<c0054f44>] (worker_thread+0x220/0x438) from [<c005a694>] (kthread+0x7c/0x84)
> [ 18.430000] [<c005a694>] (kthread+0x7c/0x84) from [<c0029f0c>] (kernel_thread_exit+0x0/0x8)
> [ 18.430000] Code: e592c01c e5974000 e59c2004 e59c3000 (e5823000)
> [ 19.060000] ---[ end trace c880c727f016a30b ]---
> [ 19.070000] note: kworker/0:2[284] exited with preempt_count 1
> [ 19.100000] Unable to handle kernel paging request at virtual address 21412146
> [ 19.120000] pgd = c0004000
> [ 19.130000] [21412146] *pgd=00000000
> [ 19.140000] Internal error: Oops: 5 [#3] PREEMPT
> [ 19.140000] last sysfs file: /sys/kernel/uevent_seqnum
> [ 19.140000] Modules linked in: ov2640 mx3_camera soc_camera soc_mediabus videobuf_dma_contig videobuf_core
> [ 19.140000] CPU: 0 Tainted: G D (2.6.36-10808-ga06e72c-dirty #178)
> [ 19.140000] PC is at d_hash_and_lookup+0x5c/0x9c
> [ 19.140000] LR is at proc_flush_task+0x68/0x260
> [ 19.140000] pc : [<c00b6ec4>] lr : [<c00e6c1c>] psr: 20000113
> [ 19.140000] sp : c7cb1c38 ip : 00121bc5 fp : c7cb1c67
> [ 19.140000] r10: c7c0d800 r9 : c7c1ce20 r8 : c7c1ce20
> [ 19.140000] r7 : 0000000b r6 : c7801698 r5 : 00000000 r4 : c7cb1c74
>
>
> Sorry but I have not enough time to go down deeply in this problem.
> If you have suggestions I will appreciate it..
And the memblock debug output?
More information about the linux-arm-kernel
mailing list