• Jens Axboe's avatar
    io_uring: allow events and user_data update of running poll requests · b69de288
    Jens Axboe authored
    This adds two new POLL_ADD flags, IORING_POLL_UPDATE_EVENTS and
    IORING_POLL_UPDATE_USER_DATA. As with the other POLL_ADD flag, these are
    masked into sqe->len. If set, the POLL_ADD will have the following
    behavior:
    
    - sqe->addr must contain the the user_data of the poll request that
      needs to be modified. This field is otherwise invalid for a POLL_ADD
      command.
    
    - If IORING_POLL_UPDATE_EVENTS is set, sqe->poll_events must contain the
      new mask for the existing poll request. There are no checks for whether
      these are identical or not, if a matching poll request is found, then it
      is re-armed with the new mask.
    
    - If IORING_POLL_UPDATE_USER_DATA is set, sqe->off must contain the new
      user_data for the existing poll request.
    
    A POLL_ADD with any of these flags set may complete with any of the
    following results:
    
    1) 0, which means that we successfully found the existing poll request
       specified, and performed the re-arm procedure. Any error from that
       re-arm will be exposed as a completion event for that original poll
       request, not for the update request.
    2) -ENOENT, if no existing poll request was found with the given
       user_data.
    3) -EALREADY, if the existing poll request was already in the process of
       being removed/canceled/completing.
    4) -EACCES, if an attempt was made to modify an internal poll request
       (eg not one originally issued ass IORING_OP_POLL_ADD).
    
    The usual -EINVAL cases apply as well, if any invalid fields are set
    in the sqe for this command type.
    Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
    b69de288
io_uring.c 245 KB