• Michael S. Tsirkin's avatar
    virtio_net: fix lockdep warning on 32 bit · 01c32598
    Michael S. Tsirkin authored
    When we fill up a receive VQ, try_fill_recv currently tries to count
    kicks using a 64 bit stats counter. Turns out, on a 32 bit kernel that
    uses a seqcount. sequence counts are "lock" constructs where you need to
    make sure that writers are serialized.
    
    In turn, this means that we mustn't run two try_fill_recv concurrently.
    Which of course we don't. We do run try_fill_recv sometimes from a
    softirq napi context, and sometimes from a fully preemptible context,
    but the later always runs with napi disabled.
    
    However, when it comes to the seqcount, lockdep is trying to enforce the
    rule that the same lock isn't accessed from preemptible and softirq
    context - it doesn't know about napi being enabled/disabled. This causes
    a false-positive warning:
    
    WARNING: inconsistent lock state
    ...
    inconsistent {SOFTIRQ-ON-W} -> {IN-SOFTIRQ-W} usage.
    
    As a work around, shut down the warning by switching
    to u64_stats_update_begin_irqsave - that works by disabling
    interrupts on 32 bit only, is a NOP on 64 bit.
    Reported-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Suggested-by: default avatarEric Dumazet <eric.dumazet@gmail.com>
    Signed-off-by: default avatarMichael S. Tsirkin <mst@redhat.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    01c32598
virtio_net.c 83.9 KB