DPDK patches and discussions
 help / color / mirror / Atom feed
* [dpdk-dev] link_status_interrupt fails
@ 2013-06-14  5:14 Patrick Mahan
  2013-06-14 14:57 ` Stephen Hemminger
  0 siblings, 1 reply; 4+ messages in thread
From: Patrick Mahan @ 2013-06-14  5:14 UTC (permalink / raw)
  To: dev

All,

I am seeing the following issue with the link_status example.  This requires a
reboot on my testbox.

Ideas or suggestions?

Thanks,

Patrick

>From /var/log/messages:

Jun 12 11:08:22 dpdk-eval kernel: ixgbe 0000:03:00.0: removed PHC on p2p1
Jun 12 11:08:22 dpdk-eval kernel: ixgbe 0000:03:00.0: complete
Jun 12 11:08:22 dpdk-eval kernel: ixgbe 0000:03:00.0: PCI INT A disabled
Jun 12 11:08:22 dpdk-eval kernel: igb_uio 0000:03:00.0: PCI INT A -> GSI 48
(level, low) -> IRQ 48
Jun 12 11:08:22 dpdk-eval kernel: BUG: sleeping function called from invalid
context at drivers/pci/access.c:402
Jun 12 11:08:22 dpdk-eval kernel: in_atomic(): 0, irqs_disabled(): 1, pid: 3403,
name: work_for_cpu
Jun 12 11:08:22 dpdk-eval kernel: 1 lock held by work_for_cpu/3403:
Jun 12 11:08:22 dpdk-eval kernel: #0:  (&udev->lock){......}, at:
[<ffffffffa00331cd>] igbuio_pci_irqcontrol+0x3d/0x80 [igb_uio]
Jun 12 11:08:22 dpdk-eval kernel: irq event stamp: 176
Jun 12 11:08:22 dpdk-eval kernel: hardirqs last  enabled at (175):
[<ffffffff81542270>] _spin_unlock_irqrestore+0x40/0x80
Jun 12 11:08:22 dpdk-eval kernel: hardirqs last disabled at (176):
[<ffffffff81542602>] _spin_lock_irqsave+0x32/0xa0
Jun 12 11:08:22 dpdk-eval kernel: softirqs last  enabled at (0):
[<ffffffff8106f785>] copy_process+0x625/0x1660
Jun 12 11:08:22 dpdk-eval kernel: softirqs last disabled at (0): [<(null)>] (null)
Jun 12 11:08:22 dpdk-eval kernel: Pid: 3403, comm: work_for_cpu Tainted: G
 W  ---------------    2.6.32-358.6.2.el6.x86_64.debug #1
Jun 12 11:08:22 dpdk-eval kernel: Call Trace:
Jun 12 11:08:22 dpdk-eval kernel: [<ffffffff810b0fd0>] ?
print_irqtrace_events+0xd0/0xe0
Jun 12 11:08:22 dpdk-eval kernel: [<ffffffff8105af17>] ? __might_sleep+0xf7/0x130
Jun 12 11:08:22 dpdk-eval kernel: [<ffffffff812b84c4>] ?
pci_cfg_access_lock+0x24/0x70
Jun 12 11:08:22 dpdk-eval kernel: [<ffffffff812b851e>] ?
pci_block_user_cfg_access+0xe/0x10
Jun 12 11:08:22 dpdk-eval kernel: [<ffffffffa00331d8>] ?
igbuio_pci_irqcontrol+0x48/0x80 [igb_uio]
Jun 12 11:08:22 dpdk-eval kernel: [<ffffffffa0033526>] ?
igbuio_pci_probe+0x217/0x29e [igb_uio]
Jun 12 11:08:22 dpdk-eval kernel: [<ffffffff81095a30>] ? do_work_for_cpu+0x0/0x30
Jun 12 11:08:22 dpdk-eval kernel: [<ffffffff812c07d7>] ? local_pci_probe+0x17/0x20
Jun 12 11:08:22 dpdk-eval kernel: [<ffffffff81095a48>] ? do_work_for_cpu+0x18/0x30
Jun 12 11:08:22 dpdk-eval kernel: [<ffffffff8109b826>] ? kthread+0x96/0xa0
Jun 12 11:08:22 dpdk-eval kernel: [<ffffffff8100c1ca>] ? child_rip+0xa/0x20
Jun 12 11:08:22 dpdk-eval kernel: [<ffffffff8100bb10>] ? restore_args+0x0/0x30
Jun 12 11:08:22 dpdk-eval kernel: [<ffffffff8109b790>] ? kthread+0x0/0xa0
Jun 12 11:08:22 dpdk-eval kernel: [<ffffffff8100c1c0>] ? child_rip+0x0/0x20
Jun 12 11:08:22 dpdk-eval kernel: uio device registered with irq 4f
Jun 12 11:08:22 dpdk-eval rte[3386]: EAL: Mapping resources for '/dev/uio0'
starting at 0x00000000 for 524288 bytes
Jun 12 11:08:22 dpdk-eval kernel: ixgbe 0000:03:00.1: removed PHC on p2p2
Jun 12 11:08:23 dpdk-eval kernel: ixgbe 0000:03:00.1: complete
Jun 12 11:08:23 dpdk-eval kernel: ixgbe 0000:03:00.1: PCI INT B disabled
Jun 12 11:08:23 dpdk-eval kernel: igb_uio 0000:03:00.1: PCI INT B -> GSI 52
(level, low) -> IRQ 52
Jun 12 11:08:23 dpdk-eval kernel: uio device registered with irq 50
Jun 12 11:08:23 dpdk-eval rte[3386]: EAL: Mapping resources for '/dev/uio1'
starting at 0x00000000 for 524288 bytes
Jun 12 11:08:23 dpdk-eval kernel: igb 0000:06:00.0: removed PHC on em1
Jun 12 11:08:23 dpdk-eval dhclient[2227]: receive_packet failed on em1: Network
is down
Jun 12 11:08:24 dpdk-eval kernel: igb 0000:06:00.0: PCI INT A disabled
Jun 12 11:08:24 dpdk-eval kernel: igb_uio 0000:06:00.0: PCI INT A -> GSI 16
(level, low) -> IRQ 16
Jun 12 11:08:24 dpdk-eval kernel: BUG: sleeping function called from invalid
context at drivers/pci/access.c:402
Jun 12 11:08:24 dpdk-eval kernel: in_atomic(): 0, irqs_disabled(): 1, pid: 3509,
name: work_for_cpu
Jun 12 11:08:24 dpdk-eval kernel: 1 lock held by work_for_cpu/3509:
Jun 12 11:08:24 dpdk-eval kernel: #0:  (&udev->lock){+.+...}, at:
[<ffffffffa00331cd>] igbuio_pci_irqcontrol+0x3d/0x80 [igb_uio]
Jun 12 11:08:24 dpdk-eval kernel: irq event stamp: 234
Jun 12 11:08:24 dpdk-eval kernel: hardirqs last  enabled at (233):
[<ffffffff81542270>] _spin_unlock_irqrestore+0x40/0x80
Jun 12 11:08:24 dpdk-eval kernel: hardirqs last disabled at (234):
[<ffffffff81542602>] _spin_lock_irqsave+0x32/0xa0
Jun 12 11:08:24 dpdk-eval kernel: softirqs last  enabled at (64):
[<ffffffff8107a6a1>] __do_softirq+0x151/0x210
Jun 12 11:08:24 dpdk-eval kernel: softirqs last disabled at (49):
[<ffffffff8100c2cc>] call_softirq+0x1c/0x30
Jun 12 11:08:24 dpdk-eval kernel: Pid: 3509, comm: work_for_cpu Tainted: G
 W  ---------------    2.6.32-358.6.2.el6.x86_64.debug #1
Jun 12 11:08:24 dpdk-eval kernel: Call Trace:
Jun 12 11:08:24 dpdk-eval kernel: [<ffffffff810b0fd0>] ?
print_irqtrace_events+0xd0/0xe0
Jun 12 11:08:24 dpdk-eval kernel: [<ffffffff8105af17>] ? __might_sleep+0xf7/0x130
Jun 12 11:08:24 dpdk-eval kernel: [<ffffffff812b84c4>] ?
pci_cfg_access_lock+0x24/0x70
Jun 12 11:08:24 dpdk-eval kernel: [<ffffffff812b851e>] ?
pci_block_user_cfg_access+0xe/0x10
Jun 12 11:08:24 dpdk-eval kernel: [<ffffffffa00331d8>] ?
igbuio_pci_irqcontrol+0x48/0x80 [igb_uio]
Jun 12 11:08:24 dpdk-eval kernel: [<ffffffffa0033526>] ?
igbuio_pci_probe+0x217/0x29e [igb_uio]
Jun 12 11:08:24 dpdk-eval kernel: [<ffffffff81095a30>] ? do_work_for_cpu+0x0/0x30
Jun 12 11:08:24 dpdk-eval kernel: [<ffffffff812c07d7>] ? local_pci_probe+0x17/0x20
Jun 12 11:08:24 dpdk-eval kernel: [<ffffffff81095a48>] ? do_work_for_cpu+0x18/0x30
Jun 12 11:08:24 dpdk-eval kernel: [<ffffffff8109b826>] ? kthread+0x96/0xa0
Jun 12 11:08:24 dpdk-eval kernel: [<ffffffff8100c1ca>] ? child_rip+0xa/0x20
Jun 12 11:08:24 dpdk-eval kernel: [<ffffffff8100bb10>] ? restore_args+0x0/0x30
Jun 12 11:08:24 dpdk-eval kernel: [<ffffffff8109b790>] ? kthread+0x0/0xa0
Jun 12 11:08:24 dpdk-eval kernel: [<ffffffff8100c1c0>] ? child_rip+0x0/0x20
Jun 12 11:08:24 dpdk-eval kernel: uio device registered with irq 51
Jun 12 11:08:24 dpdk-eval rte[3386]: EAL: Mapping resources for '/dev/uio2'
starting at 0x00000000 for 1048576 bytes
Jun 12 11:08:24 dpdk-eval kernel: igb 0000:06:00.1: removed PHC on em2
Jun 12 11:08:24 dpdk-eval kernel: igb 0000:06:00.1: PCI INT B disabled
Jun 12 11:08:24 dpdk-eval kernel: igb_uio 0000:06:00.1: PCI INT B -> GSI 17
(level, low) -> IRQ 17
Jun 12 11:08:24 dpdk-eval kernel: uio device registered with irq 52
Jun 12 11:08:24 dpdk-eval rte[3386]: EAL: Mapping resources for '/dev/uio3'
starting at 0x00000000 for 1048576 bytes
Jun 12 11:08:24 dpdk-eval kernel:
Jun 12 11:08:24 dpdk-eval kernel: =================================
Jun 12 11:08:24 dpdk-eval kernel: [ INFO: inconsistent lock state ]
Jun 12 11:08:24 dpdk-eval kernel: 2.6.32-358.6.2.el6.x86_64.debug #1
Jun 12 11:08:24 dpdk-eval kernel: ---------------------------------
Jun 12 11:08:24 dpdk-eval kernel: inconsistent {HARDIRQ-ON-W} -> {IN-HARDIRQ-W}
usage.
Jun 12 11:08:24 dpdk-eval kernel: swapper/0 [HC1[1]:SC0[0]:HE0:SE1] takes:
Jun 12 11:08:24 dpdk-eval kernel: (&udev->lock){?.+...}, at: [<ffffffffa003324d>]
igbuio_pci_irqhandler+0x3d/0xe8 [igb_uio]
Jun 12 11:08:24 dpdk-eval kernel: {HARDIRQ-ON-W} state was registered at:
Jun 12 11:08:24 dpdk-eval kernel:  [<ffffffff810b4d13>] mark_held_locks+0x73/0xa0
Jun 12 11:08:24 dpdk-eval kernel:  [<ffffffff810b4f37>]
trace_hardirqs_on_caller+0x67/0x190
Jun 12 11:08:24 dpdk-eval kernel:  [<ffffffff810b506d>] trace_hardirqs_on+0xd/0x10
Jun 12 11:08:24 dpdk-eval kernel:  [<ffffffff81542220>] _spin_unlock_irq+0x30/0x40
Jun 12 11:08:24 dpdk-eval kernel:  [<ffffffff812b8504>] pci_cfg_access_lock+0x64/0x70
Jun 12 11:08:24 dpdk-eval kernel:  [<ffffffff812b851e>]
pci_block_user_cfg_access+0xe/0x10
Jun 12 11:08:24 dpdk-eval kernel:  [<ffffffffa00331d8>]
igbuio_pci_irqcontrol+0x48/0x80 [igb_uio]
Jun 12 11:08:24 dpdk-eval kernel:  [<ffffffffa0033526>]
igbuio_pci_probe+0x217/0x29e [igb_uio]
Jun 12 11:08:24 dpdk-eval kernel:  [<ffffffff812c07d7>] local_pci_probe+0x17/0x20
Jun 12 11:08:24 dpdk-eval kernel:  [<ffffffff81095a48>] do_work_for_cpu+0x18/0x30
Jun 12 11:08:24 dpdk-eval kernel:  [<ffffffff8109b826>] kthread+0x96/0xa0
Jun 12 11:08:24 dpdk-eval kernel:  [<ffffffff8100c1ca>] child_rip+0xa/0x20
Jun 12 11:08:24 dpdk-eval kernel: irq event stamp: 285500
Jun 12 11:08:24 dpdk-eval kernel: hardirqs last  enabled at (285497):
[<ffffffff812fbc11>] intel_idle+0xe1/0x170
Jun 12 11:08:24 dpdk-eval kernel: hardirqs last disabled at (285498):
[<ffffffff8100aeea>] save_args+0x6a/0x70
Jun 12 11:08:24 dpdk-eval kernel: softirqs last  enabled at (285500):
[<ffffffff8107a773>] _local_bh_enable+0x13/0x20
Jun 12 11:08:24 dpdk-eval kernel: softirqs last disabled at (285499):
[<ffffffff8107a7f5>] irq_enter+0x75/0x90
Jun 12 11:08:24 dpdk-eval kernel:
Jun 12 11:08:24 dpdk-eval kernel: other info that might help us debug this:
Jun 12 11:08:24 dpdk-eval kernel: no locks held by swapper/0.
Jun 12 11:08:24 dpdk-eval kernel:
Jun 12 11:08:24 dpdk-eval kernel: stack backtrace:
Jun 12 11:08:24 dpdk-eval kernel: Pid: 0, comm: swapper Tainted: G        W
---------------    2.6.32-358.6.2.el6.x86_64.debug #1
Jun 12 11:08:24 dpdk-eval kernel: Call Trace:
Jun 12 11:08:24 dpdk-eval kernel: <IRQ>  [<ffffffff810b3c27>] ?
print_usage_bug+0x177/0x180
Jun 12 11:08:24 dpdk-eval kernel: [<ffffffff810b4bcd>] ? mark_lock+0x35d/0x430
Jun 12 11:08:24 dpdk-eval kernel: [<ffffffff810b5eaa>] ? __lock_acquire+0x77a/0x1570
Jun 12 11:08:24 dpdk-eval kernel: [<ffffffff81013af3>] ? native_sched_clock+0x13/0x80
Jun 12 11:08:24 dpdk-eval kernel: [<ffffffff81012dc9>] ? sched_clock+0x9/0x10
Jun 12 11:08:24 dpdk-eval kernel: [<ffffffff81013af3>] ? native_sched_clock+0x13/0x80
Jun 12 11:08:24 dpdk-eval kernel: [<ffffffff81012dc9>] ? sched_clock+0x9/0x10
Jun 12 11:08:24 dpdk-eval kernel: [<ffffffff810a32dd>] ? sched_clock_cpu+0xcd/0x110
Jun 12 11:08:24 dpdk-eval kernel: [<ffffffff810b6d44>] ? lock_acquire+0xa4/0x120
Jun 12 11:08:24 dpdk-eval kernel: [<ffffffffa003324d>] ?
igbuio_pci_irqhandler+0x3d/0xe8 [igb_uio]
Jun 12 11:08:24 dpdk-eval kernel: [<ffffffff81542625>] ? _spin_lock_irqsave+0x55/0xa0
Jun 12 11:08:24 dpdk-eval kernel: [<ffffffffa003324d>] ?
igbuio_pci_irqhandler+0x3d/0xe8 [igb_uio]
Jun 12 11:08:24 dpdk-eval kernel: [<ffffffffa003324d>] ?
igbuio_pci_irqhandler+0x3d/0xe8 [igb_uio]
Jun 12 11:08:24 dpdk-eval kernel: [<ffffffff810a32dd>] ? sched_clock_cpu+0xcd/0x110
Jun 12 11:08:24 dpdk-eval kernel: [<ffffffffa02822ee>] ? uio_interrupt+0x1e/0x48
[uio]
Jun 12 11:08:24 dpdk-eval kernel: [<ffffffff810f3050>] ? handle_IRQ_event+0x50/0x160
Jun 12 11:08:24 dpdk-eval kernel: [<ffffffff810f5820>] ? handle_edge_irq+0xe0/0x170
Jun 12 11:08:24 dpdk-eval kernel: [<ffffffff8100e019>] ? handle_irq+0x49/0xa0
Jun 12 11:08:24 dpdk-eval kernel: [<ffffffff81549a0c>] ? do_IRQ+0x6c/0xf0
Jun 12 11:08:24 dpdk-eval kernel: [<ffffffff8100ba53>] ? ret_from_intr+0x0/0x16
Jun 12 11:08:24 dpdk-eval kernel: <EOI>  [<ffffffff812fbc18>] ? intel_idle+0xe8/0x170
Jun 12 11:08:24 dpdk-eval kernel: [<ffffffff812fbc11>] ? intel_idle+0xe1/0x170
Jun 12 11:08:24 dpdk-eval kernel: [<ffffffff81440d07>] ? cpuidle_idle_call+0xa7/0x150
Jun 12 11:08:24 dpdk-eval kernel: [<ffffffff81009fcb>] ? cpu_idle+0xbb/0x110
Jun 12 11:08:24 dpdk-eval kernel: [<ffffffff81537f37>] ? start_secondary+0x2bb/0x2fe
Jun 12 11:08:24 dpdk-eval kernel: irq 0x4f handled
Jun 12 11:08:25 dpdk-eval kernel: BUG: sleeping function called from invalid
context at drivers/pci/access.c:402
Jun 12 11:08:25 dpdk-eval kernel: in_atomic(): 0, irqs_disabled(): 1, pid: 3386,
name: link_status_int
Jun 12 11:08:25 dpdk-eval kernel: INFO: lockdep is turned off.
Jun 12 11:08:25 dpdk-eval kernel: irq event stamp: 240175
Jun 12 11:08:25 dpdk-eval kernel: hardirqs last  enabled at (240175):
[<ffffffff8100b0aa>] sysret_check+0x2e/0x69
Jun 12 11:08:25 dpdk-eval kernel: hardirqs last disabled at (240174):
[<ffffffff8100b09e>] sysret_check+0x22/0x69
Jun 12 11:08:25 dpdk-eval kernel: softirqs last  enabled at (240164):
[<ffffffff8107a6a1>] __do_softirq+0x151/0x210
Jun 12 11:08:25 dpdk-eval kernel: softirqs last disabled at (240151):
[<ffffffff8100c2cc>] call_softirq+0x1c/0x30
Jun 12 11:08:25 dpdk-eval kernel: Pid: 3386, comm: link_status_int Tainted: G
    W  ---------------    2.6.32-358.6.2.el6.x86_64.debug #1
Jun 12 11:08:25 dpdk-eval kernel: Call Trace:
Jun 12 11:08:25 dpdk-eval kernel: [<ffffffff810b0fd0>] ?
print_irqtrace_events+0xd0/0xe0
Jun 12 11:08:25 dpdk-eval kernel: [<ffffffff8105af17>] ? __might_sleep+0xf7/0x130
Jun 12 11:08:25 dpdk-eval kernel: [<ffffffff812b84c4>] ?
pci_cfg_access_lock+0x24/0x70
Jun 12 11:08:25 dpdk-eval kernel: [<ffffffff812b851e>] ?
pci_block_user_cfg_access+0xe/0x10
Jun 12 11:08:25 dpdk-eval kernel: [<ffffffffa00331d8>] ?
igbuio_pci_irqcontrol+0x48/0x80 [igb_uio]
Jun 12 11:08:25 dpdk-eval kernel: [<ffffffffa0281ae0>] ? uio_write+0x90/0xa0 [uio]
Jun 12 11:08:25 dpdk-eval kernel: [<ffffffff8119d448>] ? vfs_write+0xb8/0x1a0
Jun 12 11:08:25 dpdk-eval kernel: [<ffffffff8119e636>] ? fget_light+0x66/0x100
Jun 12 11:08:25 dpdk-eval kernel: [<ffffffff81541da8>] ?
lockdep_sys_exit_thunk+0x35/0x67
Jun 12 11:08:25 dpdk-eval kernel: [<ffffffff8119dd41>] ? sys_write+0x51/0x90
Jun 12 11:08:25 dpdk-eval kernel: [<ffffffff8100b072>] ?
system_call_fastpath+0x16/0x1b
Jun 12 11:08:25 dpdk-eval kernel: irq 0x50 handled
Jun 12 11:08:25 dpdk-eval rte[3386]: LSI: lcore 1 has nothing to do
Jun 12 11:08:25 dpdk-eval rte[3386]: LSI: lcore 2 has nothing to do
Jun 12 11:08:25 dpdk-eval rte[3386]: LSI: entering main loop on lcore 0
Jun 12 11:08:25 dpdk-eval rte[3386]: LSI:  -- lcoreid=0 portid=0
Jun 12 11:08:25 dpdk-eval rte[3386]: LSI:  -- lcoreid=0 portid=1
Jun 12 11:08:25 dpdk-eval rte[3386]: LSI: lcore 3 has nothing to do
Jun 12 11:08:26 dpdk-eval kernel: BUG: sleeping function called from invalid
context at drivers/pci/access.c:402
Jun 12 11:08:26 dpdk-eval kernel: in_atomic(): 0, irqs_disabled(): 1, pid: 3387,
name: link_status_int
Jun 12 11:08:26 dpdk-eval kernel: INFO: lockdep is turned off.
Jun 12 11:08:26 dpdk-eval kernel: irq event stamp: 806
Jun 12 11:08:26 dpdk-eval kernel: hardirqs last  enabled at (805):
[<ffffffff81542270>] _spin_unlock_irqrestore+0x40/0x80
Jun 12 11:08:26 dpdk-eval kernel: hardirqs last disabled at (806):
[<ffffffff8154256f>] _spin_lock_irq+0x1f/0x80
Jun 12 11:08:26 dpdk-eval kernel: softirqs last  enabled at (0):
[<ffffffff8106f785>] copy_process+0x625/0x1660
Jun 12 11:08:26 dpdk-eval kernel: softirqs last disabled at (0): [<(null)>] (null)
Jun 12 11:08:26 dpdk-eval kernel: Pid: 3387, comm: link_status_int Tainted: G
    W  ---------------    2.6.32-358.6.2.el6.x86_64.debug #1
Jun 12 11:08:26 dpdk-eval kernel: Call Trace:
Jun 12 11:08:26 dpdk-eval kernel: [<ffffffff810b0fd0>] ?
print_irqtrace_events+0xd0/0xe0
Jun 12 11:08:26 dpdk-eval kernel: [<ffffffff8105af17>] ? __might_sleep+0xf7/0x130
Jun 12 11:08:26 dpdk-eval kernel: [<ffffffff812b84c4>] ?
pci_cfg_access_lock+0x24/0x70
Jun 12 11:08:26 dpdk-eval kernel: [<ffffffff812b851e>] ?
pci_block_user_cfg_access+0xe/0x10
Jun 12 11:08:26 dpdk-eval kernel: [<ffffffffa00331d8>] ?
igbuio_pci_irqcontrol+0x48/0x80 [igb_uio]
Jun 12 11:08:26 dpdk-eval kernel: [<ffffffffa0281ae0>] ? uio_write+0x90/0xa0 [uio]
Jun 12 11:08:26 dpdk-eval kernel: [<ffffffff8119d448>] ? vfs_write+0xb8/0x1a0
Jun 12 11:08:26 dpdk-eval kernel: [<ffffffff8119e636>] ? fget_light+0x66/0x100
Jun 12 11:08:26 dpdk-eval kernel: [<ffffffff8119dd41>] ? sys_write+0x51/0x90
Jun 12 11:08:26 dpdk-eval kernel: [<ffffffff8100b072>] ?
system_call_fastpath+0x16/0x1b
Jun 12 11:08:40 dpdk-eval kernel: BUG: sleeping function called from invalid
context at drivers/pci/access.c:402
Jun 12 11:08:40 dpdk-eval kernel: in_atomic(): 1, irqs_disabled(): 1, pid: 0,
name: swapper
Jun 12 11:08:40 dpdk-eval kernel: INFO: lockdep is turned off.
Jun 12 11:08:40 dpdk-eval kernel: irq event stamp: 285500
Jun 12 11:08:40 dpdk-eval kernel: hardirqs last  enabled at (285497):
[<ffffffff812fbc11>] intel_idle+0xe1/0x170
Jun 12 11:08:40 dpdk-eval kernel: hardirqs last disabled at (285498):
[<ffffffff8100aeea>] save_args+0x6a/0x70
Jun 12 11:08:40 dpdk-eval kernel: softirqs last  enabled at (285500):
[<ffffffff8107a773>] _local_bh_enable+0x13/0x20
Jun 12 11:08:40 dpdk-eval kernel: softirqs last disabled at (285499):
[<ffffffff8107a7f5>] irq_enter+0x75/0x90
Jun 12 11:08:40 dpdk-eval kernel: Pid: 0, comm: swapper Tainted: G        W
---------------    2.6.32-358.6.2.el6.x86_64.debug #1
Jun 12 11:08:40 dpdk-eval kernel: Call Trace:
Jun 12 11:08:40 dpdk-eval kernel: <IRQ>  [<ffffffff810b0fd0>] ?
print_irqtrace_events+0xd0/0xe0
Jun 12 11:08:40 dpdk-eval kernel: [<ffffffff8105af17>] ? __might_sleep+0xf7/0x130
Jun 12 11:08:40 dpdk-eval kernel: [<ffffffff812b84c4>] ?
pci_cfg_access_lock+0x24/0x70
Jun 12 11:08:40 dpdk-eval kernel: [<ffffffff810b506d>] ? trace_hardirqs_on+0xd/0x10
Jun 12 11:08:40 dpdk-eval kernel: [<ffffffff812b851e>] ?
pci_block_user_cfg_access+0xe/0x10
Jun 12 11:08:40 dpdk-eval kernel: [<ffffffffa0033258>] ?
igbuio_pci_irqhandler+0x48/0xe8 [igb_uio]
Jun 12 11:08:40 dpdk-eval kernel: [<ffffffffa02822ee>] ? uio_interrupt+0x1e/0x48
[uio]
Jun 12 11:08:40 dpdk-eval kernel: [<ffffffff810f5762>] ? handle_edge_irq+0x22/0x170
Jun 12 11:08:40 dpdk-eval kernel: [<ffffffff810f3050>] ? handle_IRQ_event+0x50/0x160
Jun 12 11:08:40 dpdk-eval kernel: [<ffffffff810f5820>] ? handle_edge_irq+0xe0/0x170
Jun 12 11:08:40 dpdk-eval kernel: [<ffffffff8100e019>] ? handle_irq+0x49/0xa0
Jun 12 11:08:40 dpdk-eval kernel: [<ffffffff81549a0c>] ? do_IRQ+0x6c/0xf0
Jun 12 11:08:40 dpdk-eval kernel: [<ffffffff8100ba53>] ? ret_from_intr+0x0/0x16
Jun 12 11:08:40 dpdk-eval kernel: <EOI>  [<ffffffff812fbc11>] ? intel_idle+0xe1/0x170
Jun 12 11:08:40 dpdk-eval kernel: [<ffffffff812fbc18>] ? intel_idle+0xe8/0x170
Jun 12 11:08:40 dpdk-eval kernel: [<ffffffff812fbc11>] ? intel_idle+0xe1/0x170
Jun 12 11:08:40 dpdk-eval kernel: [<ffffffff81440d07>] ? cpuidle_idle_call+0xa7/0x150
Jun 12 11:08:40 dpdk-eval kernel: [<ffffffff81009fcb>] ? cpu_idle+0xbb/0x110
Jun 12 11:08:40 dpdk-eval kernel: [<ffffffff81537f37>] ? start_secondary+0x2bb/0x2fe
Jun 12 11:08:40 dpdk-eval kernel: irq 0x4f handled
Jun 12 11:08:44 dpdk-eval kernel: BUG: sleeping function called from invalid
context at drivers/pci/access.c:402
Jun 12 11:08:44 dpdk-eval kernel: in_atomic(): 0, irqs_disabled(): 1, pid: 3387,
name: link_status_int
Jun 12 11:08:44 dpdk-eval kernel: INFO: lockdep is turned off.
Jun 12 11:08:44 dpdk-eval kernel: irq event stamp: 806
Jun 12 11:08:44 dpdk-eval kernel: hardirqs last  enabled at (805):
[<ffffffff81542270>] _spin_unlock_irqrestore+0x40/0x80
Jun 12 11:08:44 dpdk-eval kernel: hardirqs last disabled at (806):
[<ffffffff8154256f>] _spin_lock_irq+0x1f/0x80
Jun 12 11:08:44 dpdk-eval kernel: softirqs last  enabled at (0):
[<ffffffff8106f785>] copy_process+0x625/0x1660
Jun 12 11:08:44 dpdk-eval kernel: softirqs last disabled at (0): [<(null)>] (null)
Jun 12 11:08:44 dpdk-eval kernel: Pid: 3387, comm: link_status_int Tainted: G
    W  ---------------    2.6.32-358.6.2.el6.x86_64.debug #1
Jun 12 11:08:44 dpdk-eval kernel: Call Trace:
Jun 12 11:08:44 dpdk-eval kernel: [<ffffffff810b0fd0>] ?
print_irqtrace_events+0xd0/0xe0
Jun 12 11:08:44 dpdk-eval kernel: [<ffffffff8105af17>] ? __might_sleep+0xf7/0x130
Jun 12 11:08:44 dpdk-eval kernel: [<ffffffff812b84c4>] ?
pci_cfg_access_lock+0x24/0x70
Jun 12 11:08:44 dpdk-eval kernel: [<ffffffff812b851e>] ?
pci_block_user_cfg_access+0xe/0x10
Jun 12 11:08:44 dpdk-eval kernel: [<ffffffffa00331d8>] ?
igbuio_pci_irqcontrol+0x48/0x80 [igb_uio]
Jun 12 11:08:44 dpdk-eval kernel: [<ffffffffa0281ae0>] ? uio_write+0x90/0xa0 [uio]
Jun 12 11:08:44 dpdk-eval kernel: [<ffffffff8119d448>] ? vfs_write+0xb8/0x1a0
Jun 12 11:08:44 dpdk-eval kernel: [<ffffffff8119e636>] ? fget_light+0x66/0x100
Jun 12 11:08:44 dpdk-eval kernel: [<ffffffff8119dd41>] ? sys_write+0x51/0x90
Jun 12 11:08:44 dpdk-eval kernel: [<ffffffff8100b072>] ?
system_call_fastpath+0x16/0x1b
Jun 12 11:08:46 dpdk-eval kernel: BUG: sleeping function called from invalid
context at drivers/pci/access.c:402
Jun 12 11:08:46 dpdk-eval kernel: in_atomic(): 1, irqs_disabled(): 1, pid: 0,
name: swapper
Jun 12 11:08:46 dpdk-eval kernel: INFO: lockdep is turned off.
Jun 12 11:08:46 dpdk-eval kernel: irq event stamp: 285500
Jun 12 11:08:46 dpdk-eval kernel: hardirqs last  enabled at (285497):
[<ffffffff812fbc11>] intel_idle+0xe1/0x170
Jun 12 11:08:46 dpdk-eval kernel: hardirqs last disabled at (285498):
[<ffffffff8100aeea>] save_args+0x6a/0x70
Jun 12 11:08:46 dpdk-eval kernel: softirqs last  enabled at (285500):
[<ffffffff8107a773>] _local_bh_enable+0x13/0x20
Jun 12 11:08:46 dpdk-eval kernel: softirqs last disabled at (285499):
[<ffffffff8107a7f5>] irq_enter+0x75/0x90
Jun 12 11:08:46 dpdk-eval kernel: Pid: 0, comm: swapper Tainted: G        W
---------------    2.6.32-358.6.2.el6.x86_64.debug #1
Jun 12 11:08:46 dpdk-eval kernel: Call Trace:
Jun 12 11:08:46 dpdk-eval kernel: <IRQ>  [<ffffffff810b0fd0>] ?
print_irqtrace_events+0xd0/0xe0
Jun 12 11:08:46 dpdk-eval kernel: [<ffffffff8105af17>] ? __might_sleep+0xf7/0x130
Jun 12 11:08:46 dpdk-eval kernel: [<ffffffff812b84c4>] ?
pci_cfg_access_lock+0x24/0x70
Jun 12 11:08:46 dpdk-eval kernel: [<ffffffff812b851e>] ?
pci_block_user_cfg_access+0xe/0x10
Jun 12 11:08:46 dpdk-eval kernel: [<ffffffffa0033258>] ?
igbuio_pci_irqhandler+0x48/0xe8 [igb_uio]
Jun 12 11:08:46 dpdk-eval kernel: [<ffffffffa02822ee>] ? uio_interrupt+0x1e/0x48
[uio]
Jun 12 11:08:46 dpdk-eval kernel: [<ffffffff810f5762>] ? handle_edge_irq+0x22/0x170
Jun 12 11:08:46 dpdk-eval kernel: [<ffffffff810f3050>] ? handle_IRQ_event+0x50/0x160
Jun 12 11:08:46 dpdk-eval kernel: [<ffffffff810f5820>] ? handle_edge_irq+0xe0/0x170
Jun 12 11:08:46 dpdk-eval kernel: [<ffffffff8100e019>] ? handle_irq+0x49/0xa0
Jun 12 11:08:46 dpdk-eval kernel: [<ffffffff81549a0c>] ? do_IRQ+0x6c/0xf0
Jun 12 11:08:46 dpdk-eval kernel: [<ffffffff8100ba53>] ? ret_from_intr+0x0/0x16
Jun 12 11:08:46 dpdk-eval kernel: <EOI>  [<ffffffff812fbc11>] ? intel_idle+0xe1/0x170
Jun 12 11:08:46 dpdk-eval kernel: [<ffffffff812fbc18>] ? intel_idle+0xe8/0x170
Jun 12 11:08:46 dpdk-eval kernel: [<ffffffff812fbc11>] ? intel_idle+0xe1/0x170
Jun 12 11:08:46 dpdk-eval kernel: [<ffffffff81440d07>] ? cpuidle_idle_call+0xa7/0x150
Jun 12 11:08:46 dpdk-eval kernel: [<ffffffff81009fcb>] ? cpu_idle+0xbb/0x110
Jun 12 11:08:46 dpdk-eval kernel: [<ffffffff81537f37>] ? start_secondary+0x2bb/0x2fe
Jun 12 11:08:46 dpdk-eval kernel: irq 0x4f handled
Jun 12 11:08:47 dpdk-eval kernel: BUG: sleeping function called from invalid
context at drivers/pci/access.c:402
Jun 12 11:08:47 dpdk-eval kernel: in_atomic(): 0, irqs_disabled(): 1, pid: 3387,
name: link_status_int
Jun 12 11:08:47 dpdk-eval kernel: INFO: lockdep is turned off.
Jun 12 11:08:47 dpdk-eval kernel: irq event stamp: 806
Jun 12 11:08:47 dpdk-eval kernel: hardirqs last  enabled at (805):
[<ffffffff81542270>] _spin_unlock_irqrestore+0x40/0x80
Jun 12 11:08:47 dpdk-eval kernel: hardirqs last disabled at (806):
[<ffffffff8154256f>] _spin_lock_irq+0x1f/0x80
Jun 12 11:08:47 dpdk-eval kernel: softirqs last  enabled at (0):
[<ffffffff8106f785>] copy_process+0x625/0x1660
Jun 12 11:08:47 dpdk-eval kernel: softirqs last disabled at (0): [<(null)>] (null)
Jun 12 11:08:47 dpdk-eval kernel: Pid: 3387, comm: link_status_int Tainted: G
    W  ---------------    2.6.32-358.6.2.el6.x86_64.debug #1
Jun 12 11:08:47 dpdk-eval kernel: Call Trace:
Jun 12 11:08:47 dpdk-eval kernel: [<ffffffff810b0fd0>] ?
print_irqtrace_events+0xd0/0xe0
Jun 12 11:08:47 dpdk-eval kernel: [<ffffffff8105af17>] ? __might_sleep+0xf7/0x130
Jun 12 11:08:47 dpdk-eval kernel: [<ffffffff812b84c4>] ?
pci_cfg_access_lock+0x24/0x70
Jun 12 11:08:47 dpdk-eval kernel: [<ffffffff812b851e>] ?
pci_block_user_cfg_access+0xe/0x10
Jun 12 11:08:47 dpdk-eval kernel: [<ffffffffa00331d8>] ?
igbuio_pci_irqcontrol+0x48/0x80 [igb_uio]
Jun 12 11:08:47 dpdk-eval kernel: [<ffffffffa0281ae0>] ? uio_write+0x90/0xa0 [uio]
Jun 12 11:08:47 dpdk-eval kernel: [<ffffffff8119d448>] ? vfs_write+0xb8/0x1a0
Jun 12 11:08:47 dpdk-eval kernel: [<ffffffff8119e636>] ? fget_light+0x66/0x100
Jun 12 11:08:47 dpdk-eval kernel: [<ffffffff8119dd41>] ? sys_write+0x51/0x90
Jun 12 11:08:47 dpdk-eval kernel: [<ffffffff8100b072>] ?
system_call_fastpath+0x16/0x1b
Jun 12 11:08:52 dpdk-eval kernel: BUG: sleeping function called from invalid
context at drivers/pci/access.c:402
Jun 12 11:08:52 dpdk-eval kernel: in_atomic(): 1, irqs_disabled(): 1, pid: 0,
name: swapper
Jun 12 11:08:52 dpdk-eval kernel: INFO: lockdep is turned off.
Jun 12 11:08:52 dpdk-eval kernel: irq event stamp: 285500
Jun 12 11:08:52 dpdk-eval kernel: hardirqs last  enabled at (285497):
[<ffffffff812fbc11>] intel_idle+0xe1/0x170
Jun 12 11:08:52 dpdk-eval kernel: hardirqs last disabled at (285498):
[<ffffffff8100aeea>] save_args+0x6a/0x70
Jun 12 11:08:52 dpdk-eval kernel: softirqs last  enabled at (285500):
[<ffffffff8107a773>] _local_bh_enable+0x13/0x20
Jun 12 11:08:52 dpdk-eval kernel: softirqs last disabled at (285499):
[<ffffffff8107a7f5>] irq_enter+0x75/0x90
Jun 12 11:08:52 dpdk-eval kernel: Pid: 0, comm: swapper Tainted: G        W
---------------    2.6.32-358.6.2.el6.x86_64.debug #1
Jun 12 11:08:52 dpdk-eval kernel: Call Trace:
Jun 12 11:08:52 dpdk-eval kernel: <IRQ>  [<ffffffff810b0fd0>] ?
print_irqtrace_events+0xd0/0xe0
Jun 12 11:08:52 dpdk-eval kernel: [<ffffffff8105af17>] ? __might_sleep+0xf7/0x130
Jun 12 11:08:52 dpdk-eval kernel: [<ffffffff812b84c4>] ?
pci_cfg_access_lock+0x24/0x70
Jun 12 11:08:52 dpdk-eval kernel: [<ffffffff812b851e>] ?
pci_block_user_cfg_access+0xe/0x10
Jun 12 11:08:52 dpdk-eval kernel: [<ffffffffa0033258>] ?
igbuio_pci_irqhandler+0x48/0xe8 [igb_uio]
Jun 12 11:08:52 dpdk-eval kernel: [<ffffffffa02822ee>] ? uio_interrupt+0x1e/0x48
[uio]
Jun 12 11:08:52 dpdk-eval kernel: [<ffffffff810f5762>] ? handle_edge_irq+0x22/0x170
Jun 12 11:08:52 dpdk-eval kernel: [<ffffffff810f3050>] ? handle_IRQ_event+0x50/0x160
Jun 12 11:08:52 dpdk-eval kernel: [<ffffffff810f5820>] ? handle_edge_irq+0xe0/0x170
Jun 12 11:08:52 dpdk-eval kernel: [<ffffffff8100e019>] ? handle_irq+0x49/0xa0
Jun 12 11:08:52 dpdk-eval kernel: [<ffffffff81549a0c>] ? do_IRQ+0x6c/0xf0
Jun 12 11:08:52 dpdk-eval kernel: [<ffffffff8100ba53>] ? ret_from_intr+0x0/0x16
Jun 12 11:08:52 dpdk-eval kernel: <EOI>  [<ffffffff812fbc11>] ? intel_idle+0xe1/0x170
Jun 12 11:08:52 dpdk-eval kernel: [<ffffffff812fbc18>] ? intel_idle+0xe8/0x170
Jun 12 11:08:52 dpdk-eval kernel: [<ffffffff812fbc11>] ? intel_idle+0xe1/0x170
Jun 12 11:08:52 dpdk-eval kernel: [<ffffffff81440d07>] ? cpuidle_idle_call+0xa7/0x150
Jun 12 11:08:52 dpdk-eval kernel: [<ffffffff81009fcb>] ? cpu_idle+0xbb/0x110
Jun 12 11:08:52 dpdk-eval kernel: [<ffffffff81537f37>] ? start_secondary+0x2bb/0x2fe
Jun 12 11:08:52 dpdk-eval kernel: irq 0x4f handled
Jun 12 11:08:53 dpdk-eval kernel: BUG: sleeping function called from invalid
context at drivers/pci/access.c:402
Jun 12 11:08:53 dpdk-eval kernel: in_atomic(): 0, irqs_disabled(): 1, pid: 3387,
name: link_status_int
Jun 12 11:08:53 dpdk-eval kernel: INFO: lockdep is turned off.
Jun 12 11:08:53 dpdk-eval kernel: irq event stamp: 806
Jun 12 11:08:53 dpdk-eval kernel: hardirqs last  enabled at (805):
[<ffffffff81542270>] _spin_unlock_irqrestore+0x40/0x80
Jun 12 11:08:53 dpdk-eval kernel: hardirqs last disabled at (806):
[<ffffffff8154256f>] _spin_lock_irq+0x1f/0x80
Jun 12 11:08:53 dpdk-eval kernel: softirqs last  enabled at (0):
[<ffffffff8106f785>] copy_process+0x625/0x1660
Jun 12 11:08:53 dpdk-eval kernel: softirqs last disabled at (0): [<(null)>] (null)
Jun 12 11:08:53 dpdk-eval kernel: Pid: 3387, comm: link_status_int Tainted: G
    W  ---------------    2.6.32-358.6.2.el6.x86_64.debug #1
Jun 12 11:08:53 dpdk-eval kernel: Call Trace:
Jun 12 11:08:53 dpdk-eval kernel: [<ffffffff810b0fd0>] ?
print_irqtrace_events+0xd0/0xe0
Jun 12 11:08:53 dpdk-eval kernel: [<ffffffff8105af17>] ? __might_sleep+0xf7/0x130
Jun 12 11:08:53 dpdk-eval kernel: [<ffffffff812b84c4>] ?
pci_cfg_access_lock+0x24/0x70
Jun 12 11:08:53 dpdk-eval kernel: [<ffffffff812b851e>] ?
pci_block_user_cfg_access+0xe/0x10
Jun 12 11:08:53 dpdk-eval kernel: [<ffffffffa00331d8>] ?
igbuio_pci_irqcontrol+0x48/0x80 [igb_uio]
Jun 12 11:08:53 dpdk-eval kernel: [<ffffffffa0281ae0>] ? uio_write+0x90/0xa0 [uio]
Jun 12 11:08:53 dpdk-eval kernel: [<ffffffff8119d448>] ? vfs_write+0xb8/0x1a0
Jun 12 11:08:53 dpdk-eval kernel: [<ffffffff8119e636>] ? fget_light+0x66/0x100
Jun 12 11:08:53 dpdk-eval kernel: [<ffffffff8119dd41>] ? sys_write+0x51/0x90
Jun 12 11:08:53 dpdk-eval kernel: [<ffffffff8100b072>] ?
system_call_fastpath+0x16/0x1b
Jun 12 11:09:12 dpdk-eval kernel: link_status_int used greatest stack depth: 2968
bytes left

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [dpdk-dev] link_status_interrupt fails
  2013-06-14  5:14 [dpdk-dev] link_status_interrupt fails Patrick Mahan
@ 2013-06-14 14:57 ` Stephen Hemminger
  2013-06-17  9:33   ` Thomas Monjalon
  0 siblings, 1 reply; 4+ messages in thread
From: Stephen Hemminger @ 2013-06-14 14:57 UTC (permalink / raw)
  To: Patrick Mahan; +Cc: dev

On Thu, 13 Jun 2013 22:14:35 -0700
Patrick Mahan <mahan@mahan.org> wrote:

> All,
> 
> I am seeing the following issue with the link_status example.  This requires a
> reboot on my testbox.
> 
> Ideas or suggestions?
> 
> Thanks,
> 
> Patrick
> 
> From /var/log/messages:

This is an example of why I posted the RFC patch to igb_uio to not use pci_lock.
-
Subject: igb_uio: rework interrupt usin intx_mask

The code to do interrupts in the igb_uio is broken on later kernel versions.
pci_cfg_access_lock must not be used from interrupt context. But there is
a much better way of doing all this now that a generic access to INTX
is avaialable. Use pci_intx routines in later kernels, and provide backwards
compatiable version for older kernels.

The driver was also broken for any mode other MSI-X. It did not do the
proper fallback to MSI then legacy mode if the platform does not support
MSI. This happens under virtualization enviromnents where MSI is not
available. And the unwind code needed to handle the case of what ever
interrupt mode is used.

This version of the code is backported from our kernel modules, and
compile tested only. The pci_intx compatablity code is new and someone
who runs with older kernel should test it.

--- a/lib/librte_eal/linuxapp/igb_uio/igb_uio.c	2013-06-05 14:41:46.588241089 -0700
+++ b/lib/librte_eal/linuxapp/igb_uio/igb_uio.c	2013-06-05 15:46:01.299710839 -0700
@@ -28,14 +28,6 @@
 #include <linux/msi.h>
 #include <linux/version.h>
 
-/* Some function names changes between 3.2.0 and 3.3.0... */
-#if LINUX_VERSION_CODE < KERNEL_VERSION(3,3,0)
-#define PCI_LOCK pci_block_user_cfg_access
-#define PCI_UNLOCK pci_unblock_user_cfg_access
-#else
-#define PCI_LOCK pci_cfg_access_lock
-#define PCI_UNLOCK pci_cfg_access_unlock
-#endif
 
 /**
  * MSI-X related macros, copy from linux/pci_regs.h in kernel 2.6.39,
@@ -56,8 +48,7 @@
 enum igbuio_intr_mode {
 	IGBUIO_LEGACY_INTR_MODE = 0,
 	IGBUIO_MSI_INTR_MODE,
-	IGBUIO_MSIX_INTR_MODE,
-	IGBUIO_INTR_MODE_MAX
+	IGBUIO_MSIX_INTR_MODE
 };
 
 /**
@@ -66,8 +57,9 @@ enum igbuio_intr_mode {
 struct rte_uio_pci_dev {
 	struct uio_info info;
 	struct pci_dev *pdev;
-	spinlock_t lock; /* spinlock for accessing PCI config space or msix data in multi tasks/isr */
+	spinlock_t lock;
 	enum igbuio_intr_mode mode;
+	unsigned long flags;
 	struct msix_entry \
 		msix_entries[IGBUIO_NUM_MSI_VECTORS]; /* pointer to the msix vectors to be allocated later */
 };
@@ -87,70 +79,35 @@ igbuio_get_uio_pci_dev(struct uio_info *
 	return container_of(info, struct rte_uio_pci_dev, info);
 }
 
-/**
- * It masks the msix on/off of generating MSI-X messages.
- */
-static int
-igbuio_msix_mask_irq(struct msi_desc *desc, int32_t state)
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,3,0)
+/* backport of intx mask support */
+static bool pci_intx_mask_supported(struct pci_dev *dev)
 {
-	uint32_t mask_bits = desc->masked;
-	unsigned offset = desc->msi_attrib.entry_nr * PCI_MSIX_ENTRY_SIZE +
-						PCI_MSIX_ENTRY_VECTOR_CTRL;
-
-	if (state != 0)
-		mask_bits &= ~PCI_MSIX_ENTRY_CTRL_MASKBIT;
-	else
-		mask_bits |= PCI_MSIX_ENTRY_CTRL_MASKBIT;
-
-	if (mask_bits != desc->masked) {
-		writel(mask_bits, desc->mask_base + offset);
-		readl(desc->mask_base);
-		desc->masked = mask_bits;
-	}
-
-	return 0;
+	/* assume since this is known HW, that intx works. */
+	return true;
 }
 
-/**
- * This function sets/clears the masks for generating LSC interrupts.
- *
- * @param info
- *   The pointer to struct uio_info.
- * @param on
- *   The on/off flag of masking LSC.
- * @return
- *   -On success, zero value.
- *   -On failure, a negative value.
- */
-static int
-igbuio_set_interrupt_mask(struct rte_uio_pci_dev *udev, int32_t state)
+static bool pci_check_and_mask_intx(struct pci_dev *pdev)
 {
-	struct pci_dev *pdev = udev->pdev;
-
-	if (udev->mode == IGBUIO_MSIX_INTR_MODE) {
-		struct msi_desc *desc;
-
-		list_for_each_entry(desc, &pdev->msi_list, list) {
-			igbuio_msix_mask_irq(desc, state);
-		}
-	}
-	else if (udev->mode == IGBUIO_LEGACY_INTR_MODE) {
-		uint32_t status;
-		uint16_t old, new;
-
-		pci_read_config_dword(pdev, PCI_COMMAND, &status);
+	u32 status;
+	u16 old, new;
+	bool ret = false;
+
+	pci_block_user_cfg_access(pdev);
+	pci_read_config_dword(pdev, PCI_COMMAND, &status);
+	if (status & PCI_STATUS_INTERRUPT) {
 		old = status;
-		if (state != 0)
-			new = old & (~PCI_COMMAND_INTX_DISABLE);
-		else
-			new = old | PCI_COMMAND_INTX_DISABLE;
+		new = old | PCI_COMMAND_INTX_DISABLE;
 
 		if (old != new)
 			pci_write_config_word(pdev, PCI_COMMAND, new);
+		ret = true;
 	}
+	pci_unblock_user_cfg_access(pdev);
 
-	return 0;
+	return ret;
 }
+#endif
 
 /**
  * This is the irqcontrol callback to be registered to uio_info.
@@ -173,11 +130,13 @@ igbuio_pci_irqcontrol(struct uio_info *i
 	struct pci_dev *pdev = udev->pdev;
 
 	spin_lock_irqsave(&udev->lock, flags);
-	PCI_LOCK(pdev);
-
-	igbuio_set_interrupt_mask(udev, irq_state);
-
-	PCI_UNLOCK(pdev);
+	if (irq_state) {
+		if (test_and_clear_bit(0, &udev->flags))
+			enable_irq(info->irq);
+	} else {
+		if (!test_and_set_bit(0, &udev->flags))
+			disable_irq(info->irq);
+	}
 	spin_unlock_irqrestore(&udev->lock, flags);
 
 	return 0;
@@ -190,35 +149,25 @@ igbuio_pci_irqcontrol(struct uio_info *i
 static irqreturn_t
 igbuio_pci_irqhandler(int irq, struct uio_info *info)
 {
-	irqreturn_t ret = IRQ_NONE;
-	unsigned long flags;
 	struct rte_uio_pci_dev *udev = igbuio_get_uio_pci_dev(info);
-	struct pci_dev *pdev = udev->pdev;
-	uint32_t cmd_status_dword;
-	uint16_t status;
 
-	spin_lock_irqsave(&udev->lock, flags);
-	/* block userspace PCI config reads/writes */
-	PCI_LOCK(pdev);
-
-	/* for legacy mode, interrupt maybe shared */
-	if (udev->mode == IGBUIO_LEGACY_INTR_MODE) {
-		pci_read_config_dword(pdev, PCI_COMMAND, &cmd_status_dword);
-		status = cmd_status_dword >> 16;
-		/* interrupt is not ours, goes to out */
-		if (!(status & PCI_STATUS_INTERRUPT))
-			goto done;
-	}
+	/* Legacy mode need to mask in hardware */
+	if (udev->mode == IGBUIO_LEGACY_INTR_MODE &&
+	    !pci_check_and_mask_intx(udev->pdev))
+		return IRQ_NONE;
 
-	igbuio_set_interrupt_mask(udev, 0);
-	ret = IRQ_HANDLED;
-done:
-	/* unblock userspace PCI config reads/writes */
-	PCI_UNLOCK(pdev);
-	spin_unlock_irqrestore(&udev->lock, flags);
-	printk(KERN_INFO "irq 0x%x %s\n", irq, (ret == IRQ_HANDLED) ? "handled" : "not handled");
+	/* Message signal mode, no share IRQ and automasked */
+	return IRQ_HANDLED;
+}
 
-	return ret;
+/* Unwind irq setup */
+static void
+igbuio_irq_release(struct rte_uio_pci_dev *udev)
+{
+	if (udev->mode == IGBUIO_MSIX_INTR_MODE)
+		pci_disable_msix(udev->pdev);
+	else if (udev->mode == IGBUIO_MSI_INTR_MODE)
+		pci_disable_msi(udev->pdev);
 }
 
 /* Remap pci resources described by bar #pci_bar in uio resource n. */
@@ -310,35 +259,42 @@ igbuio_pci_probe(struct pci_dev *dev, co
 	udev->mode = 0; /* set the default value for interrupt mode */
 	spin_lock_init(&udev->lock);
 
-	/* check if it need to try msix first */
-	if (igbuio_intr_mode_preferred == IGBUIO_MSIX_INTR_MODE) {
+	switch (igbuio_intr_mode_preferred) {
+	case IGBUIO_MSIX_INTR_MODE: {
 		int vector;
 
-		for (vector = 0; vector < IGBUIO_NUM_MSI_VECTORS; vector ++)
+		for (vector = 0; vector < IGBUIO_NUM_MSI_VECTORS; vector++)
 			udev->msix_entries[vector].entry = vector;
 
-		if (pci_enable_msix(udev->pdev, udev->msix_entries, IGBUIO_NUM_MSI_VECTORS) == 0) {
+		if (!pci_enable_msix(dev, udev->msix_entries,
+				     IGBUIO_NUM_MSI_VECTORS)) {
+			dev_dbg(&dev->dev, "using MSI-X\n");
 			udev->mode = IGBUIO_MSIX_INTR_MODE;
+			udev->info.irq_flags = 0;
+			udev->info.irq = udev->msix_entries[0].vector;
+			break;
 		}
-		else {
-			pci_disable_msix(udev->pdev);
-			printk(KERN_INFO "fail to enable pci msix, or not enough msix entries\n");
-		}
+		/* fall through */
+		dev_dbg(&dev->dev, "unable to enable pci msix\n");
 	}
-	switch (udev->mode) {
-	case IGBUIO_MSIX_INTR_MODE:
-		udev->info.irq_flags = 0;
-		udev->info.irq = udev->msix_entries[0].vector;
-		break;
 	case IGBUIO_MSI_INTR_MODE:
-		break;
+		if (!pci_enable_msi(dev)) {
+			dev_dbg(&dev->dev, "using MSI\n");
+			udev->mode = IGBUIO_MSI_INTR_MODE;
+			break;
+		}
+		/* fall through */
 	case IGBUIO_LEGACY_INTR_MODE:
+		dev_dbg(&dev->dev, "using legacy mode\n");
+		if (!pci_intx_mask_supported(dev)) {
+			dev_err(&dev->dev, "pci_intx mask not supported\n");
+			goto fail_release_iomem;
+		}
 		udev->info.irq_flags = IRQF_SHARED;
-		udev->info.irq = dev->irq;
-		break;
-	default:
+		udev->mode = IGBUIO_LEGACY_INTR_MODE;
 		break;
 	}
+	disable_irq(dev->irq);
 
 	pci_set_drvdata(dev, udev);
 	igbuio_pci_irqcontrol(&udev->info, 0);
@@ -353,8 +309,7 @@ igbuio_pci_probe(struct pci_dev *dev, co
 
 fail_release_iomem:
 	igbuio_pci_release_iomem(&udev->info);
-	if (udev->mode == IGBUIO_MSIX_INTR_MODE)
-		pci_disable_msix(udev->pdev);
+	igbuio_irq_release(udev);
 fail_release_regions:
 	pci_release_regions(dev);
 fail_disable:
@@ -371,8 +326,7 @@ igbuio_pci_remove(struct pci_dev *dev)
 	struct uio_info *info = pci_get_drvdata(dev);
 
 	uio_unregister_device(info);
-	if (((struct rte_uio_pci_dev *)info->priv)->mode == IGBUIO_MSIX_INTR_MODE)
-		pci_disable_msix(dev);
+	igbuio_irq_release(igbuio_get_uio_pci_dev(info));
 	pci_release_regions(dev);
 	pci_disable_device(dev);
 	pci_set_drvdata(dev, NULL);

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [dpdk-dev] link_status_interrupt fails
  2013-06-14 14:57 ` Stephen Hemminger
@ 2013-06-17  9:33   ` Thomas Monjalon
  2013-06-17 12:02     ` Patrick Mahan
  0 siblings, 1 reply; 4+ messages in thread
From: Thomas Monjalon @ 2013-06-17  9:33 UTC (permalink / raw)
  To: Patrick Mahan; +Cc: dev

14/06/2013 16:57, Stephen Hemminger :
> Patrick Mahan <mahan@mahan.org> wrote:
> > I am seeing the following issue with the link_status example.  This
> > requires a reboot on my testbox.
> 
> This is an example of why I posted the RFC patch to igb_uio to not use
> pci_lock. -
> Subject: igb_uio: rework interrupt usin intx_mask

Patrick,

Do you confirm that Stephen's patch is solving your problem ?

-- 
Thomas

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [dpdk-dev] link_status_interrupt fails
  2013-06-17  9:33   ` Thomas Monjalon
@ 2013-06-17 12:02     ` Patrick Mahan
  0 siblings, 0 replies; 4+ messages in thread
From: Patrick Mahan @ 2013-06-17 12:02 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: dev

Not yet, I am on vacation for the next two weeks and the equipment has been returned. I was going to try it with my 82576 in my Dell T110 when I get back. 

Sorry,

Patrick

Sent from my iPhone

On Jun 17, 2013, at 2:33 AM, Thomas Monjalon <thomas.monjalon@6wind.com> wrote:

> 14/06/2013 16:57, Stephen Hemminger :
>> Patrick Mahan <mahan@mahan.org> wrote:
>>> I am seeing the following issue with the link_status example.  This
>>> requires a reboot on my testbox.
>> 
>> This is an example of why I posted the RFC patch to igb_uio to not use
>> pci_lock. -
>> Subject: igb_uio: rework interrupt usin intx_mask
> 
> Patrick,
> 
> Do you confirm that Stephen's patch is solving your problem ?
> 
> -- 
> Thomas

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2013-06-17 12:02 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-06-14  5:14 [dpdk-dev] link_status_interrupt fails Patrick Mahan
2013-06-14 14:57 ` Stephen Hemminger
2013-06-17  9:33   ` Thomas Monjalon
2013-06-17 12:02     ` Patrick Mahan

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).