• L
    qemu: allocate network connections sooner during domain startup · 8cd40e7e
    Laine Stump 提交于
    VFIO device assignment requires a cgroup ACL to be setup for access to
    the /dev/vfio/nn "group" device for any devices that will be assigned
    to a guest. In the case of a host device that is allocated from a
    pool, it was being allocated during qemuBuildCommandLine(), which is
    called by qemuProcessStart() *after* the all-encompassing
    qemuSetupCgroup() was called, meaning that the standard Cgroup ACL
    setup wasn't creating ACLs for these devices allocated from pools.
    
    One possible solution was to manually add a single ACL down inside
    qemuBuildCommandLine() when networkAllocateActualDevice() is called,
    but that has two problems: 1) the function that adds the cgroup ACL
    requires a virDomainObjPtr, which isn't available in
    qemuBuildCommandLine(), and 2) we really shouldn't be doing network
    device setup inside qemuBuildCommandLine() anyway.
    
    Instead, I've created a new function called
    qemuNetworkPrepareDevices() which is called just before
    qemuPrepareHostDevices() during qemuProcessStart() (explanation of
    ordering in the comments), i.e. well before the call to
    qemuSetupCgroup(). To minimize code churn in a patch that will be
    backported to 1.0.5-maint, qemuNetworkPrepareDevices only does
    networkAllocateActualDevice() and the bare amount of setup required
    for type='hostdev network devices, but it eventually should do *all*
    device setup for guest network devices.
    
    Note that some of the code that was previously needed in
    qemuBuildCommandLine() is no longer required when
    networkAllocateActualDevice() is called earlier:
    
     * qemuAssignDeviceHostdevAlias() is already done further down in
       qemuProcessStart().
    
     * qemuPrepareHostdevPCIDevices() is called by
       qemuPrepareHostDevices() which is called after
       qemuNetworkPrepareDevices() in qemuProcessStart().
    
    As hinted above, this new function should be moved into a separate
    qemu_network.c (or similarly named) file along with
    qemuPhysIfaceConnect(), qemuNetworkIfaceConnect(), and
    qemuOpenVhostNet(), and expanded to call those functions as well, then
    the nnets loop in qemuBuildCommandLine() should be reduced to only
    build the commandline string (which itself can be in a separate
    qemuInterfaceBuilldCommandLine() function as suggested by
    Michal). However, this will require storing away an array of tapfd and
    vhostfd that are needed for the commandline, so I would rather do that
    in a separate patch and leave this patch at the minimum to fix the
    bug.
    8cd40e7e
qemu_command.c 359.1 KB