• Jackie Liu's avatar
    io_uring: add support for link with drain · 4fe2c963
    Jackie Liu authored
    To support the link with drain, we need to do two parts.
    
    There is an sqes:
    
        0     1     2     3     4     5     6
     +-----+-----+-----+-----+-----+-----+-----+
     |  N  |  L  |  L  | L+D |  N  |  N  |  N  |
     +-----+-----+-----+-----+-----+-----+-----+
    
    First, we need to ensure that the io before the link is completed,
    there is a easy way is set drain flag to the link list's head, so
    all subsequent io will be inserted into the defer_list.
    
    	+-----+
        (0) |  N  |
    	+-----+
               |          (2)         (3)         (4)
    	+-----+     +-----+     +-----+     +-----+
        (1) | L+D | --> |  L  | --> | L+D | --> |  N  |
    	+-----+     +-----+     +-----+     +-----+
               |
    	+-----+
        (5) |  N  |
    	+-----+
               |
    	+-----+
        (6) |  N  |
    	+-----+
    
    Second, ensure that the following IO will not be completed first,
    an easy way is to create a mirror of drain io and insert it into
    defer_list, in this way, as long as drain io is not processed, the
    following io in the defer_list will not be actively process.
    
    	+-----+
        (0) |  N  |
    	+-----+
               |          (2)         (3)         (4)
    	+-----+     +-----+     +-----+     +-----+
        (1) | L+D | --> |  L  | --> | L+D | --> |  N  |
    	+-----+     +-----+     +-----+     +-----+
               |
    	+-----+
       ('3) |  D  |   <== This is a shadow of (3)
    	+-----+
               |
    	+-----+
        (5) |  N  |
    	+-----+
               |
    	+-----+
        (6) |  N  |
    	+-----+
    Signed-off-by: default avatarJackie Liu <liuyun01@kylinos.cn>
    Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
    4fe2c963
io_uring.c 86.1 KB