• M
    ptr_ring: fix race conditions when resizing · e7169530
    Michael S. Tsirkin 提交于
    Resizing currently drops consumer lock.  This can cause entries to be
    reordered, which isn't good in itself.  More importantly, consumer can
    detect a false ring empty condition and block forever.
    
    Further, nesting of consumer within producer lock is problematic for
    tun, since it produces entries in a BH, which causes a lock order
    reversal:
    
           CPU0                    CPU1
           ----                    ----
      consume:
      lock(&(&r->consumer_lock)->rlock);
                                   resize:
                                   local_irq_disable();
                                   lock(&(&r->producer_lock)->rlock);
                                   lock(&(&r->consumer_lock)->rlock);
      <Interrupt>
      produce:
      lock(&(&r->producer_lock)->rlock);
    
    To fix, nest producer lock within consumer lock during resize,
    and keep consumer lock during the whole swap operation.
    Reported-by: NDmitry Vyukov <dvyukov@google.com>
    Cc: stable@vger.kernel.org
    Cc: "David S. Miller" <davem@davemloft.net>
    Acked-by: NJason Wang <jasowang@redhat.com>
    Signed-off-by: NMichael S. Tsirkin <mst@redhat.com>
    Signed-off-by: NDavid S. Miller <davem@davemloft.net>
    e7169530
ptr_ring.h 10.8 KB