• Daniel Wagner's avatar
    NFS: direct: use complete() instead of complete_all() · 024de8f1
    Daniel Wagner authored
    There is only one waiter for the completion, therefore there
    is no need to use complete_all(). Let's make that clear by
    using complete() instead of complete_all().
    
    nfs_file_direct_write() or nfs_file_direct_read() allocated a request
    object via nfs_direct_req_alloc(), which initializes the
    completion. The request object then is freed later in the exit path.
    Between the initialization and the release either
    nfs_direct_write_schedule_iovec() resp
    nfs_direct_read_schedule_iovec() are called which will asynchronously
    process the request. The calling function waits via nfs_direct_wait()
    till the async work has been done. Thus there is only one waiter on
    the completion.
    
    nfs_direct_pgio_init() and nfs_direct_read_completion() are passed via
    function pointers to nfs pageio. The first function does a ref
    counting (get_dreq() and put_dreq()) which ensures that
    nfs_direct_read_completion() and nfs_direct_read_schedule_iovec() only
    call the completion path once.
    
    The usage pattern of the completion is:
    
    waiter context                          waker context
    
    nfs_file_direct_write()
      dreq = nfs_direct_req_alloc()
        init_completion()
      nfs_direct_write_schedule_iovec()
      nfs_direct_wait()
        wait_for_completion_killable()
    
                                            nfs_direct_write_schedule_work()
                                              nfs_direct_complete()
                                                complete()
    
    nfs_file_direct_read()
      dreq = nfs_direct_req_all()
        init_completion()
      nfs_direct_read_schedule_iovec()
      nfs_direct_wait()
        wait_for_completion_killable()
                                            nfs_direct_read_schedule_iovec()
                                              nfs_direct_complete()
                                                complete()
    
                                            nfs_direct_read_completion()
                                              nfs_direct_complete()
                                                complete()
    Signed-off-by: default avatarDaniel Wagner <daniel.wagner@bmw-carit.de>
    Signed-off-by: default avatarAnna Schumaker <Anna.Schumaker@Netapp.com>
    024de8f1
direct.c 29 KB