@@ -29,6 +29,7 @@ struct kvm {
};
struct kvm *kvm__init(const char *kvm_dev, unsigned long ram_size);
+int kvm__max_cpus(struct kvm *self);
void kvm__init_ram(struct kvm *self);
void kvm__delete(struct kvm *self);
bool kvm__load_kernel(struct kvm *kvm, const char *kernel_filename,
@@ -311,11 +311,12 @@ static char *host_image(char *cmd_line, size_t size)
int kvm_cmd_run(int argc, const char **argv, const char *prefix)
{
static char real_cmdline[2048];
+ unsigned int nr_online_cpus;
+ int max_cpus;
int exit_code = 0;
int i;
struct virtio_net_parameters net_params;
char *hi;
- unsigned int nr_online_cpus;
signal(SIGALRM, handle_sigalrm);
signal(SIGQUIT, handle_sigquit);
@@ -383,6 +384,13 @@ int kvm_cmd_run(int argc, const char **argv, const char *prefix)
kvm = kvm__init(kvm_dev, ram_size);
+ max_cpus = kvm__max_cpus(kvm);
+
+ if (nrcpus > max_cpus) {
+ printf(" # Limit the number of CPUs to %d\n", max_cpus);
+ kvm->nrcpus = max_cpus;
+ }
+
kvm->nrcpus = nrcpus;
memset(real_cmdline, 0, sizeof(real_cmdline));
@@ -170,6 +170,17 @@ void kvm__init_ram(struct kvm *self)
die_perror("KVM_SET_USER_MEMORY_REGION ioctl");
}
+int kvm__max_cpus(struct kvm *self)
+{
+ int ret;
+
+ ret = ioctl(self->sys_fd, KVM_CHECK_EXTENSION, KVM_CAP_NR_VCPUS);
+ if (ret < 0)
+ die_perror("KVM_CAP_NR_VCPUS");
+
+ return ret;
+}
+
struct kvm *kvm__init(const char *kvm_dev, unsigned long ram_size)
{
struct kvm_pit_config pit_config = { .flags = 0, };
This patch limits the number of CPUs to KVM_CAP_NR_VCPUS when user specifies more CPUs with the "--cpus=N" command line option than what the in-kernel KVM is able to handle. Cc: Asias He <asias.hejun@gmail.com> Cc: Cyrill Gorcunov <gorcunov@gmail.com> Cc: Ingo Molnar <mingo@elte.hu> Cc: Prasad Joshi <prasadjoshi124@gmail.com> Cc: Sasha Levin <levinsasha928@gmail.com> Signed-off-by: Pekka Enberg <penberg@kernel.org> --- tools/kvm/include/kvm/kvm.h | 1 + tools/kvm/kvm-run.c | 10 +++++++++- tools/kvm/kvm.c | 11 +++++++++++ 3 files changed, 21 insertions(+), 1 deletions(-)