mirror of
https://github.com/aljazceru/kata-containers.git
synced 2026-01-04 15:04:25 +01:00
devices: use device manager to manage all devices
Fixes #50 Previously the devices are created with device manager and laterly attached to hypervisor with "device.Attach()", this could work, but there's no way to remember the reference count for every device, which means if we plug one device to hypervisor twice, it's truly inserted twice, but actually we only need to insert once but use it in many places. Use device manager as a consolidated entrypoint of device management can give us a way to handle many "references" to single device, because it can save all devices and remember it's use count. Signed-off-by: Wei Zhang <zhangwei555@huawei.com>
This commit is contained in:
@@ -27,6 +27,7 @@ func DeviceLogger() *logrus.Entry {
|
||||
// DeviceReceiver is an interface used for accepting devices
|
||||
// a device should be attached/added/plugged to a DeviceReceiver
|
||||
type DeviceReceiver interface {
|
||||
// these are for hotplug/hot-unplug devices to/from hypervisor
|
||||
HotplugAddDevice(Device, config.DeviceType) error
|
||||
HotplugRemoveDevice(Device, config.DeviceType) error
|
||||
|
||||
@@ -51,11 +52,29 @@ type VhostUserDevice interface {
|
||||
type Device interface {
|
||||
Attach(DeviceReceiver) error
|
||||
Detach(DeviceReceiver) error
|
||||
// ID returns device identifier
|
||||
DeviceID() string
|
||||
// DeviceType indicates which kind of device it is
|
||||
// e.g. block, vfio or vhost user
|
||||
DeviceType() config.DeviceType
|
||||
// GetDeviceInfo returns device information that the device is created based on
|
||||
GetDeviceInfo() *config.DeviceInfo
|
||||
// GetDeviceDrive returns device specific data used for hotplugging by hypervisor
|
||||
// Caller could cast the return value to device specific struct
|
||||
// e.g. Block device returns *config.BlockDrive and
|
||||
// vfio device returns *config.VFIODrive
|
||||
GetDeviceDrive() interface{}
|
||||
// IsAttached checks if the device is attached
|
||||
IsAttached() bool
|
||||
}
|
||||
|
||||
// DeviceManager can be used to create a new device, this can be used as single
|
||||
// device management object.
|
||||
type DeviceManager interface {
|
||||
NewDevices(devInfos []config.DeviceInfo) ([]Device, error)
|
||||
NewDevice(config.DeviceInfo) (Device, error)
|
||||
AttachDevice(string, DeviceReceiver) error
|
||||
DetachDevice(string, DeviceReceiver) error
|
||||
IsDeviceAttached(string) bool
|
||||
GetDeviceByID(string) Device
|
||||
GetAllDevices() []Device
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user