Merge pull request #2017 from devimc/2021-06-11/fixPmemCSI

memory_offset must be larger than 32 bit
This commit is contained in:
Julio Montes 2021-06-16 09:10:48 -05:00 committed by GitHub
commit 85bb5cffe1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 49 additions and 49 deletions

View File

@ -79,7 +79,7 @@ There are several kinds of Kata configurations and they are listed below.
| `io.katacontainers.config.hypervisor.kernel` | string | the kernel used to boot the container VM | | `io.katacontainers.config.hypervisor.kernel` | string | the kernel used to boot the container VM |
| `io.katacontainers.config.hypervisor.machine_accelerators` | string | machine specific accelerators for the hypervisor | | `io.katacontainers.config.hypervisor.machine_accelerators` | string | machine specific accelerators for the hypervisor |
| `io.katacontainers.config.hypervisor.machine_type` | string | the type of machine being emulated by the hypervisor | | `io.katacontainers.config.hypervisor.machine_type` | string | the type of machine being emulated by the hypervisor |
| `io.katacontainers.config.hypervisor.memory_offset` | uint32| the memory space used for `nvdimm` device by the hypervisor | | `io.katacontainers.config.hypervisor.memory_offset` | uint64| the memory space used for `nvdimm` device by the hypervisor |
| `io.katacontainers.config.hypervisor.memory_slots` | uint32| the memory slots assigned to the VM by the hypervisor | | `io.katacontainers.config.hypervisor.memory_slots` | uint32| the memory slots assigned to the VM by the hypervisor |
| `io.katacontainers.config.hypervisor.msize_9p` | uint32 | the `msize` for 9p shares | | `io.katacontainers.config.hypervisor.msize_9p` | uint32 | the `msize` for 9p shares |
| `io.katacontainers.config.hypervisor.path` | string | the hypervisor that will run the container VM | | `io.katacontainers.config.hypervisor.path` | string | the hypervisor that will run the container VM |

View File

@ -26,7 +26,7 @@ const defaultVCPUCount uint32 = 1
const defaultMaxVCPUCount uint32 = 0 const defaultMaxVCPUCount uint32 = 0
const defaultMemSize uint32 = 2048 // MiB const defaultMemSize uint32 = 2048 // MiB
const defaultMemSlots uint32 = 10 const defaultMemSlots uint32 = 10
const defaultMemOffset uint32 = 0 // MiB const defaultMemOffset uint64 = 0 // MiB
const defaultVirtioMem bool = false const defaultVirtioMem bool = false
const defaultBridgesCount uint32 = 1 const defaultBridgesCount uint32 = 1
const defaultInterNetworkingModel = "tcfilter" const defaultInterNetworkingModel = "tcfilter"

View File

@ -114,7 +114,7 @@ type hypervisor struct {
DefaultMaxVCPUs uint32 `toml:"default_maxvcpus"` DefaultMaxVCPUs uint32 `toml:"default_maxvcpus"`
MemorySize uint32 `toml:"default_memory"` MemorySize uint32 `toml:"default_memory"`
MemSlots uint32 `toml:"memory_slots"` MemSlots uint32 `toml:"memory_slots"`
MemOffset uint32 `toml:"memory_offset"` MemOffset uint64 `toml:"memory_offset"`
DefaultBridges uint32 `toml:"default_bridges"` DefaultBridges uint32 `toml:"default_bridges"`
Msize9p uint32 `toml:"msize_9p"` Msize9p uint32 `toml:"msize_9p"`
PCIeRootPort uint32 `toml:"pcie_root_port"` PCIeRootPort uint32 `toml:"pcie_root_port"`
@ -359,7 +359,7 @@ func (h hypervisor) defaultMemSlots() uint32 {
return slots return slots
} }
func (h hypervisor) defaultMemOffset() uint32 { func (h hypervisor) defaultMemOffset() uint64 {
offset := h.MemOffset offset := h.MemOffset
if offset == 0 { if offset == 0 {
offset = defaultMemOffset offset = defaultMemOffset

View File

@ -222,6 +222,10 @@ type Param struct {
// HypervisorConfig is the hypervisor configuration. // HypervisorConfig is the hypervisor configuration.
type HypervisorConfig struct { type HypervisorConfig struct {
// PCIeRootPort is used to indicate the number of PCIe Root Port devices
// The PCIe Root Port device is used to hot-plug the PCIe device
PCIeRootPort uint32
// NumVCPUs specifies default number of vCPUs for the VM. // NumVCPUs specifies default number of vCPUs for the VM.
NumVCPUs uint32 NumVCPUs uint32
@ -241,9 +245,6 @@ type HypervisorConfig struct {
// MemSlots specifies default memory slots the VM. // MemSlots specifies default memory slots the VM.
MemSlots uint32 MemSlots uint32
// MemOffset specifies memory space for nvdimm device
MemOffset uint32
// VirtioFSCacheSize is the DAX cache size in MiB // VirtioFSCacheSize is the DAX cache size in MiB
VirtioFSCacheSize uint32 VirtioFSCacheSize uint32
@ -310,9 +311,6 @@ type HypervisorConfig struct {
// entropy (/dev/random, /dev/urandom or real hardware RNG device) // entropy (/dev/random, /dev/urandom or real hardware RNG device)
EntropySource string EntropySource string
// EntropySourceList is the list of valid entropy sources
EntropySourceList []string
// Shared file system type: // Shared file system type:
// - virtio-9p (default) // - virtio-9p (default)
// - virtio-fs // - virtio-fs
@ -321,6 +319,12 @@ type HypervisorConfig struct {
// VirtioFSDaemon is the virtio-fs vhost-user daemon path // VirtioFSDaemon is the virtio-fs vhost-user daemon path
VirtioFSDaemon string VirtioFSDaemon string
// File based memory backend root directory
FileBackedMemRootDir string
// EntropySourceList is the list of valid entropy sources
EntropySourceList []string
// VirtioFSDaemonList is the list of valid virtiofs names for annotations // VirtioFSDaemonList is the list of valid virtiofs names for annotations
VirtioFSDaemonList []string VirtioFSDaemonList []string
@ -330,8 +334,8 @@ type HypervisorConfig struct {
// VirtioFSExtraArgs passes options to virtiofsd daemon // VirtioFSExtraArgs passes options to virtiofsd daemon
VirtioFSExtraArgs []string VirtioFSExtraArgs []string
// File based memory backend root directory // Enable annotations by name
FileBackedMemRootDir string EnableAnnotations []string
// FileBackedMemRootList is the list of valid root directories values for annotations // FileBackedMemRootList is the list of valid root directories values for annotations
FileBackedMemRootList []string FileBackedMemRootList []string
@ -339,6 +343,9 @@ type HypervisorConfig struct {
// PFlash image paths // PFlash image paths
PFlash []string PFlash []string
// VhostUserStorePathList is the list of valid values for vhost-user paths
VhostUserStorePathList []string
// customAssets is a map of assets. // customAssets is a map of assets.
// Each value in that map takes precedence over the configured assets. // Each value in that map takes precedence over the configured assets.
// For example, if there is a value for the "kernel" key in this map, // For example, if there is a value for the "kernel" key in this map,
@ -401,9 +408,14 @@ type HypervisorConfig struct {
// root bus instead of a bridge. // root bus instead of a bridge.
HotplugVFIOOnRootBus bool HotplugVFIOOnRootBus bool
// PCIeRootPort is used to indicate the number of PCIe Root Port devices // GuestMemoryDumpPaging is used to indicate if enable paging
// The PCIe Root Port device is used to hot-plug the PCIe device // for QEMU dump-guest-memory command
PCIeRootPort uint32 GuestMemoryDumpPaging bool
// Enable confidential guest support.
// Enable or disable different hardware features, ranging
// from memory encryption to both memory and CPU-state encryption and integrity.
ConfidentialGuest bool
// BootToBeTemplate used to indicate if the VM is created to be a template VM // BootToBeTemplate used to indicate if the VM is created to be a template VM
BootToBeTemplate bool BootToBeTemplate bool
@ -421,8 +433,8 @@ type HypervisorConfig struct {
// related folders, sockets and device nodes should be. // related folders, sockets and device nodes should be.
VhostUserStorePath string VhostUserStorePath string
// VhostUserStorePathList is the list of valid values for vhost-user paths // GuestCoredumpPath is the path in host for saving guest memory dump
VhostUserStorePathList []string GuestMemoryDumpPath string
// GuestHookPath is the path within the VM that will be used for 'drop-in' hooks // GuestHookPath is the path within the VM that will be used for 'drop-in' hooks
GuestHookPath string GuestHookPath string
@ -434,30 +446,18 @@ type HypervisorConfig struct {
// SELinux label for the VM // SELinux label for the VM
SELinuxProcessLabel string SELinuxProcessLabel string
// SGXEPCSize specifies the size in bytes for the EPC Section.
// Enable SGX. Hardware-based isolation and memory encryption.
SGXEPCSize int64
// RxRateLimiterMaxRate is used to control network I/O inbound bandwidth on VM level. // RxRateLimiterMaxRate is used to control network I/O inbound bandwidth on VM level.
RxRateLimiterMaxRate uint64 RxRateLimiterMaxRate uint64
// TxRateLimiterMaxRate is used to control network I/O outbound bandwidth on VM level. // TxRateLimiterMaxRate is used to control network I/O outbound bandwidth on VM level.
TxRateLimiterMaxRate uint64 TxRateLimiterMaxRate uint64
// SGXEPCSize specifies the size in bytes for the EPC Section. // MemOffset specifies memory space for nvdimm device
// Enable SGX. Hardware-based isolation and memory encryption. MemOffset uint64
SGXEPCSize int64
// Enable annotations by name
EnableAnnotations []string
// GuestCoredumpPath is the path in host for saving guest memory dump
GuestMemoryDumpPath string
// GuestMemoryDumpPaging is used to indicate if enable paging
// for QEMU dump-guest-memory command
GuestMemoryDumpPaging bool
// Enable confidential guest support.
// Enable or disable different hardware features, ranging
// from memory encryption to both memory and CPU-state encryption and integrity.
ConfidentialGuest bool
} }
// vcpu mapping from vcpu number to thread number // vcpu mapping from vcpu number to thread number

View File

@ -33,7 +33,7 @@ type HypervisorConfig struct {
MemSlots uint32 MemSlots uint32
// MemOffset specifies memory space for nvdimm device // MemOffset specifies memory space for nvdimm device
MemOffset uint32 MemOffset uint64
// VirtioFSCacheSize is the DAX cache size in MiB // VirtioFSCacheSize is the DAX cache size in MiB
VirtioFSCacheSize uint32 VirtioFSCacheSize uint32

View File

@ -576,13 +576,13 @@ func addHypervisorMemoryOverrides(ocispec specs.Spec, sbConfig *vc.SandboxConfig
} }
if value, ok := ocispec.Annotations[vcAnnotations.MemOffset]; ok { if value, ok := ocispec.Annotations[vcAnnotations.MemOffset]; ok {
moffset, err := strconv.ParseUint(value, 10, 32) moffset, err := strconv.ParseUint(value, 10, 64)
if err != nil { if err != nil {
return fmt.Errorf("Error parsing annotation for memory_offset: %v, please specify positive numeric value", err) return fmt.Errorf("Error parsing annotation for memory_offset: %v, please specify positive numeric value", err)
} }
if moffset > 0 { if moffset > 0 {
sbConfig.HypervisorConfig.MemOffset = uint32(moffset) sbConfig.HypervisorConfig.MemOffset = moffset
} }
} }

View File

@ -870,7 +870,7 @@ func TestAddHypervisorAnnotations(t *testing.T) {
assert.Equal(config.HypervisorConfig.DefaultMaxVCPUs, uint32(1)) assert.Equal(config.HypervisorConfig.DefaultMaxVCPUs, uint32(1))
assert.Equal(config.HypervisorConfig.MemorySize, uint32(1024)) assert.Equal(config.HypervisorConfig.MemorySize, uint32(1024))
assert.Equal(config.HypervisorConfig.MemSlots, uint32(20)) assert.Equal(config.HypervisorConfig.MemSlots, uint32(20))
assert.Equal(config.HypervisorConfig.MemOffset, uint32(512)) assert.Equal(config.HypervisorConfig.MemOffset, uint64(512))
assert.Equal(config.HypervisorConfig.VirtioMem, true) assert.Equal(config.HypervisorConfig.VirtioMem, true)
assert.Equal(config.HypervisorConfig.MemPrealloc, true) assert.Equal(config.HypervisorConfig.MemPrealloc, true)
assert.Equal(config.HypervisorConfig.Mlock, false) assert.Equal(config.HypervisorConfig.Mlock, false)

View File

@ -2116,12 +2116,12 @@ func genericBridges(number uint32, machineType string) []types.Bridge {
} }
// nolint: unused, deadcode // nolint: unused, deadcode
func genericMemoryTopology(memoryMb, hostMemoryMb uint64, slots uint8, memoryOffset uint32) govmmQemu.Memory { func genericMemoryTopology(memoryMb, hostMemoryMb uint64, slots uint8, memoryOffset uint64) govmmQemu.Memory {
// image NVDIMM device needs memory space 1024MB // image NVDIMM device needs memory space 1024MB
// See https://github.com/clearcontainers/runtime/issues/380 // See https://github.com/clearcontainers/runtime/issues/380
memoryOffset += 1024 memoryOffset += 1024
memMax := fmt.Sprintf("%dM", hostMemoryMb+uint64(memoryOffset)) memMax := fmt.Sprintf("%dM", hostMemoryMb+memoryOffset)
mem := fmt.Sprintf("%dM", memoryMb) mem := fmt.Sprintf("%dM", memoryMb)

View File

@ -109,7 +109,7 @@ func TestQemuAmd64CPUModel(t *testing.T) {
func TestQemuAmd64MemoryTopology(t *testing.T) { func TestQemuAmd64MemoryTopology(t *testing.T) {
assert := assert.New(t) assert := assert.New(t)
amd64 := newTestQemu(assert, QemuPC) amd64 := newTestQemu(assert, QemuPC)
memoryOffset := 1024 memoryOffset := uint64(1024)
hostMem := uint64(100) hostMem := uint64(100)
mem := uint64(120) mem := uint64(120)
@ -117,7 +117,7 @@ func TestQemuAmd64MemoryTopology(t *testing.T) {
expectedMemory := govmmQemu.Memory{ expectedMemory := govmmQemu.Memory{
Size: fmt.Sprintf("%dM", mem), Size: fmt.Sprintf("%dM", mem),
Slots: slots, Slots: slots,
MaxMem: fmt.Sprintf("%dM", hostMem+uint64(memoryOffset)), MaxMem: fmt.Sprintf("%dM", hostMem+memoryOffset),
} }
m := amd64.memoryTopology(mem, hostMem, slots) m := amd64.memoryTopology(mem, hostMem, slots)

View File

@ -175,20 +175,20 @@ const (
) )
type qemuArchBase struct { type qemuArchBase struct {
qemuMachine govmmQemu.Machine memoryOffset uint64
qemuExePath string networkIndex int
memoryOffset uint32
nestedRun bool nestedRun bool
vhost bool vhost bool
disableNvdimm bool disableNvdimm bool
dax bool dax bool
networkIndex int protection guestProtection
qemuMachine govmmQemu.Machine
qemuExePath string
PFlash []string
kernelParamsNonDebug []Param kernelParamsNonDebug []Param
kernelParamsDebug []Param kernelParamsDebug []Param
kernelParams []Param kernelParams []Param
Bridges []types.Bridge Bridges []types.Bridge
PFlash []string
protection guestProtection
} }
const ( const (