• Stefano Stabellini's avatar
    xen/pvcalls: implement accept command · 9774c6cc
    Stefano Stabellini authored
    Introduce a waitqueue to allow only one outstanding accept command at
    any given time and to implement polling on the passive socket. Introduce
    a flags field to keep track of in-flight accept and poll commands.
    
    Send PVCALLS_ACCEPT to the backend. Allocate a new active socket. Make
    sure that only one accept command is executed at any given time by
    setting PVCALLS_FLAG_ACCEPT_INFLIGHT and waiting on the
    inflight_accept_req waitqueue.
    
    Convert the new struct sock_mapping pointer into an uintptr_t and use it
    as id for the new socket to pass to the backend.
    
    Check if the accept call is non-blocking: in that case after sending the
    ACCEPT command to the backend store the sock_mapping pointer of the new
    struct and the inflight req_id then return -EAGAIN (which will respond
    only when there is something to accept). Next time accept is called,
    we'll check if the ACCEPT command has been answered, if so we'll pick up
    where we left off, otherwise we return -EAGAIN again.
    
    Note that, differently from the other commands, we can use
    wait_event_interruptible (instead of wait_event) in the case of accept
    as we are able to track the req_id of the ACCEPT response that we are
    waiting.
    Signed-off-by: default avatarStefano Stabellini <stefano@aporeto.com>
    Reviewed-by: default avatarBoris Ostrovsky <boris.ostrovsky@oracle.com>
    CC: boris.ostrovsky@oracle.com
    CC: jgross@suse.com
    Signed-off-by: default avatarBoris Ostrovsky <boris.ostrovsky@oracle.com>
    9774c6cc
pvcalls-front.c 20.3 KB