• Edward Cree's avatar
    sfc: fix channel allocation with brute force · 8700aff0
    Edward Cree authored
    It was possible for channel allocation logic to get confused between what
     it had and what it wanted, and end up trying to use the same channel for
     both PTP and regular TX.  This led to a kernel panic:
        BUG: unable to handle page fault for address: 0000000000047635
        #PF: supervisor write access in kernel mode
        #PF: error_code(0x0002) - not-present page
        PGD 0 P4D 0
        Oops: 0002 [#1] SMP PTI
        CPU: 0 PID: 0 Comm: swapper/0 Tainted: G        W         5.4.0-rc3-ehc14+ #900
        Hardware name: Dell Inc. PowerEdge R710/0M233H, BIOS 6.4.0 07/23/2013
        RIP: 0010:native_queued_spin_lock_slowpath+0x188/0x1e0
        Code: f3 90 48 8b 32 48 85 f6 74 f6 eb e8 c1 ee 12 83 e0 03 83 ee 01 48 c1 e0 05 48 63 f6 48 05 c0 98 02 00 48 03 04 f5 a0 c6 ed 81 <48> 89 10 8b 42 08 85 c0 75 09 f3 90 8b 42 08 85 c0 74 f7 48 8b 32
        RSP: 0018:ffffc90000003d28 EFLAGS: 00010006
        RAX: 0000000000047635 RBX: 0000000000000246 RCX: 0000000000040000
        RDX: ffff888627a298c0 RSI: 0000000000003ffe RDI: ffff88861f6b8dd4
        RBP: ffff8886225c6e00 R08: 0000000000040000 R09: 0000000000000000
        R10: 0000000616f080c6 R11: 00000000000000c0 R12: ffff88861f6b8dd4
        R13: ffffc90000003dc8 R14: ffff88861942bf00 R15: ffff8886150f2000
        FS:  0000000000000000(0000) GS:ffff888627a00000(0000) knlGS:0000000000000000
        CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
        CR2: 0000000000047635 CR3: 000000000200a000 CR4: 00000000000006f0
        Call Trace:
         <IRQ>
         _raw_spin_lock_irqsave+0x22/0x30
         skb_queue_tail+0x1b/0x50
         sock_queue_err_skb+0x9d/0xf0
         __skb_complete_tx_timestamp+0x9d/0xc0
         efx_dequeue_buffer+0x126/0x180 [sfc]
         efx_xmit_done+0x73/0x1c0 [sfc]
         efx_ef10_ev_process+0x56a/0xfe0 [sfc]
         ? tick_sched_do_timer+0x60/0x60
         ? timerqueue_add+0x5d/0x70
         ? enqueue_hrtimer+0x39/0x90
         efx_poll+0x111/0x380 [sfc]
         ? rcu_accelerate_cbs+0x50/0x160
         net_rx_action+0x14a/0x400
         __do_softirq+0xdd/0x2d0
         irq_exit+0xa0/0xb0
         do_IRQ+0x53/0xe0
         common_interrupt+0xf/0xf
         </IRQ>
    
    In the long run we intend to rewrite the channel allocation code, but for
     'net' fix this by allocating extra_channels, and giving them TX queues,
     even if we do not in fact need them (e.g. on NICs without MAC TX
     timestamping), and thereby using simpler logic to assign the channels
     once they're allocated.
    
    Fixes: 3990a8ff ("sfc: allocate channels for XDP tx queues")
    Signed-off-by: default avatarEdward Cree <ecree@solarflare.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    8700aff0
efx.c 107 KB