[PATCH] iio: Don't OOPS if dummy evgen failed init

Jonathan Cameron jic23 at kernel.org
Mon Nov 21 21:48:40 UTC 2011


On 11/21/2011 09:11 PM, Sasha Levin wrote:
> If the dummy evgen failed init, the irq allocation functions which assume
> init succeeded may still be called - causing an OOPS due to wrong assumption.
> 
> Here's the oops:
> 
> [    3.914332] BUG: unable to handle kernel NULL pointer dereference at 0000000000000148
> [    3.915310] IP: [<ffffffff810b3008>] __lock_acquire+0xac/0xe50
> [    3.915310] PGD 0
> [    3.915310] Oops: 0000 [#1] PREEMPT SMP DEBUG_PAGEALLOC
> [    3.915310] CPU 1
> [    3.915310] Pid: 1, comm: swapper Not tainted 3.2.0-rc2-sasha-00279-gd7bfb12-dirty #20
> [    3.915310] RIP: 0010:[<ffffffff810b3008>]  [<ffffffff810b3008>] __lock_acquire+0xac/0xe50
> [    3.915310] RSP: 0018:ffff880012499bc0  EFLAGS: 00010046
> [    3.915310] RAX: 0000000000000086 RBX: ffff880012490000 RCX: 0000000000000000
> [    3.915310] RDX: 0000000000000000 RSI: 0000000000000000 RDI: 0000000000000148
> [    3.915310] RBP: ffff880012499c90 R08: 0000000000000002 R09: 0000000000000000
> [    3.915310] R10: 0000000000000148 R11: 0000000000000000 R12: 0000000000000148
> [    3.915310] R13: 0000000000000002 R14: 0000000000000000 R15: 0000000000000000
> [    3.915310] FS:  0000000000000000(0000) GS:ffff880013c00000(0000) knlGS:0000000000000000
> [    3.915310] CS:  0010 DS: 0000 ES: 0000 CR0: 000000008005003b
> [    3.915310] CR2: 0000000000000148 CR3: 0000000002605000 CR4: 00000000000406e0
> [    3.915310] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
> [    3.915310] DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
> [    3.915310] Process swapper (pid: 1, threadinfo ffff880012498000, task ffff880012490000)
> [    3.915310] Stack:
> [    3.915310]  ffff880012490000 ffffffff81e6fd38 ffffffff00000000 0000000000000000
> [    3.915310]  0000000000000148 0000000012499c08 ffffffff00000000 000000000000002e
> [    3.915310]  0000000000000001 ffff880012499ce0 ffffffff8161620e 0000000000000000
> [    3.915310] Call Trace:
> [    3.915310]  [<ffffffff81e6fd38>] ? retint_restore_args+0x13/0x13
> [    3.915310]  [<ffffffff8161620e>] ? trace_hardirqs_on_thunk+0x3a/0x3f
> [    3.915310]  [<ffffffff81e6fd38>] ? retint_restore_args+0x13/0x13
> [    3.915310]  [<ffffffff81af8883>] ? iio_dummy_evgen_get_irq+0x33/0x8a
> [    3.915310]  [<ffffffff810b4255>] lock_acquire+0x8a/0xa7
> [    3.915310]  [<ffffffff81af8883>] ? iio_dummy_evgen_get_irq+0x33/0x8a
> [    3.915310]  [<ffffffff81e6db81>] __mutex_lock_common+0x63/0x491
> [    3.915310]  [<ffffffff81af8883>] ? iio_dummy_evgen_get_irq+0x33/0x8a
> [    3.915310]  [<ffffffff810b474d>] ? debug_check_no_locks_freed+0x135/0x14a
> [    3.915310]  [<ffffffff810b2c3a>] ? lock_is_held+0x92/0x9d
> [    3.915310]  [<ffffffff81e6dfe5>] mutex_lock_nested+0x36/0x3b
> [    3.915310]  [<ffffffff81af8883>] iio_dummy_evgen_get_irq+0x33/0x8a
> [    3.915310]  [<ffffffff81af8594>] iio_simple_dummy_events_register+0x1b/0x69
> [    3.915310]  [<ffffffff82ad4a91>] iio_dummy_init+0x105/0x18d
> [    3.915310]  [<ffffffff82ad498c>] ? iio_init+0x7d/0x7d
> [    3.915310]  [<ffffffff82a8dc02>] do_one_initcall+0x7a/0x135
> [    3.915310]  [<ffffffff82a8dda7>] kernel_init+0xea/0x16f
> [    3.915310]  [<ffffffff81e727c4>] kernel_thread_helper+0x4/0x10
> [    3.915310]  [<ffffffff81e6fd38>] ? retint_restore_args+0x13/0x13
> [    3.915310]  [<ffffffff82a8dcbd>] ? do_one_initcall+0x135/0x135
> [    3.915310]  [<ffffffff81e727c0>] ? gs_change+0x13/0x13
> [    3.915310] Code: 95 50 ff ff ff 74 24 e8 1f 3f 56 00 85 c0 0f 84 4e 0d 00 00 be cf 0b 00 00 83 3d 63 7c 58 02 00 0f 85 3c 0d 00 00 e9 c1 0c 00 00
> [    3.915310]  81 3a a0 17 ca 82 b8 01 00 00 00 44 0f 44 e8 83 fe 01 77 0c
> [    3.915310] RIP  [<ffffffff810b3008>] __lock_acquire+0xac/0xe50
> [    3.915310]  RSP <ffff880012499bc0>
> [    3.915310] CR2: 0000000000000148
> 
Thanks.  Dealing with the first one should make the second impossible to
hit (as one shouldn't be trying to free irq's if they weren't
successfully gotten in the first place.)

Just for clarity of code, I'd prefer without the release change.

Acked-by: Jonathan Cameron <jic23 at cam.ac.uk> for the get change.

Thanks,
> Cc: Jonathan Cameron <jic23 at cam.ac.uk>
> Cc: Greg Kroah-Hartman <gregkh at suse.de>
> Cc: linux-iio at vger.kernel.org
> Cc: devel at driverdev.osuosl.org
> Signed-off-by: Sasha Levin <levinsasha928 at gmail.com>
> ---
>  drivers/staging/iio/iio_dummy_evgen.c |    7 +++++++
>  1 files changed, 7 insertions(+), 0 deletions(-)
> 
> diff --git a/drivers/staging/iio/iio_dummy_evgen.c b/drivers/staging/iio/iio_dummy_evgen.c
> index da657d1..74d8d94 100644
> --- a/drivers/staging/iio/iio_dummy_evgen.c
> +++ b/drivers/staging/iio/iio_dummy_evgen.c
> @@ -102,6 +102,10 @@ static int iio_dummy_evgen_create(void)
>  int iio_dummy_evgen_get_irq(void)
>  {
>  	int i, ret = 0;
> +
> +	if (iio_evgen == NULL)
> +		return -ENODEV;
> +
>  	mutex_lock(&iio_evgen->lock);
>  	for (i = 0; i < IIO_EVENTGEN_NO; i++)
>  		if (iio_evgen->inuse[i] == false) {
> @@ -124,6 +128,9 @@ EXPORT_SYMBOL_GPL(iio_dummy_evgen_get_irq);
>   */
>  int iio_dummy_evgen_release_irq(int irq)
>  {
> +	if (iio_evgen == NULL)
> +		return -ENODEV;
> +
>  	mutex_lock(&iio_evgen->lock);
>  	iio_evgen->inuse[irq - iio_evgen->base] = false;
>  	mutex_unlock(&iio_evgen->lock);




More information about the devel mailing list