• C
    virtiofs: split requests that exceed virtqueue size · a7f0d7aa
    Connor Kuehl 提交于
    If an incoming FUSE request can't fit on the virtqueue, the request is
    placed onto a workqueue so a worker can try to resubmit it later where
    there will (hopefully) be space for it next time.
    
    This is fine for requests that aren't larger than a virtqueue's maximum
    capacity.  However, if a request's size exceeds the maximum capacity of the
    virtqueue (even if the virtqueue is empty), it will be doomed to a life of
    being placed on the workqueue, removed, discovered it won't fit, and placed
    on the workqueue yet again.
    
    Furthermore, from section 2.6.5.3.1 (Driver Requirements: Indirect
    Descriptors) of the virtio spec:
    
      "A driver MUST NOT create a descriptor chain longer than the Queue
      Size of the device."
    
    To fix this, limit the number of pages FUSE will use for an overall
    request.  This way, each request can realistically fit on the virtqueue
    when it is decomposed into a scattergather list and avoid violating section
    2.6.5.3.1 of the virtio spec.
    Signed-off-by: NConnor Kuehl <ckuehl@redhat.com>
    Reviewed-by: NVivek Goyal <vgoyal@redhat.com>
    Signed-off-by: NMiklos Szeredi <mszeredi@redhat.com>
    a7f0d7aa
fuse_i.h 29.8 KB