Skip to content

[shimV2] adds vpci device controller#2643

Open
rawahars wants to merge 4 commits intomicrosoft:mainfrom
rawahars:vpci-dev-ctrl
Open

[shimV2] adds vpci device controller#2643
rawahars wants to merge 4 commits intomicrosoft:mainfrom
rawahars:vpci-dev-ctrl

Conversation

@rawahars
Copy link
Copy Markdown
Contributor

Summary

This change adds the VPCI device controller which can be used to assign/unassign virtual PCI devices to the UVM. The same then can be assigned to the containers running in the UVM.

Changes

The package exposes a controller that handles the full lifecycle of vPCI device assignments on a UVM. When a device is assigned, the controller issues a host-side HCS call to attach the physical PCI device to the VM. For Linux guests (LCOW), it additionally notifies the GCS so the guest can wait for the required device paths to become available before any workload uses them. For Windows guests (WCOW), no guest-side notification is needed. When a device is removed, the controller tears down the host-side assignment and cleans up all associated state.

Key Design Decisions

  • Reference counting: If the same physical device is assigned multiple times, the controller reuses the existing VMBus channel and increments a reference count instead of issuing a duplicate HCS call. The device is only removed once the reference count reaches zero.
  • Invalid device state: If the host-side HCS assignment succeeds but the guest-side notification fails, the device is marked invalid. It remains tracked so the caller can still trigger host-side cleanup, preventing resource leaks.

This change adds the VPCI device controller which can be used to assign/unassign virtual PCI devices to the UVM. The same then can be assigned to the containers running in the UVM.

Signed-off-by: Harsh Rawat <harshrawat@microsoft.com>
@rawahars rawahars requested a review from a team as a code owner March 23, 2026 09:42
Signed-off-by: Harsh Rawat <harshrawat@microsoft.com>
rawahars added 2 commits April 1, 2026 04:32
Signed-off-by: Harsh Rawat <harshrawat@microsoft.com>
Signed-off-by: Harsh Rawat <harshrawat@microsoft.com>
guidStr := vmBusGUID.String()

// Host-side: add the vPCI device to the VM.
if err := c.vmVPCI.AddDevice(ctx, guidStr, settings); err != nil {
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why is this a guidstr? Its required to be a guid? If it needs to be a str do it in that AddDevice fn not before calling it.

}

// Update the ref count to indicate the device is now assigned to the VM.
dev.refCount++
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do you want a state machine here? Device is added but if wait ready fails what start are we in?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just invalid is good enough I guess?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If add fails maybe mark it invalid as well and then its fine ?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So state machine seemed excessive here. I added a field isInvalid which took care of the same. Should we consider state machine for consistency?

}

// Decrement the ref count for the device.
dev.refCount--
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You cant decrement until success

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just have it be that its a > 0 check for a simple -- otherwise its a do the things, and set to 0 for the last one.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants