Received: by 2002:ab2:3350:0:b0:1f4:6588:b3a7 with SMTP id o16csp1360853lqe; Mon, 8 Apr 2024 06:59:52 -0700 (PDT) X-Forwarded-Encrypted: i=3; AJvYcCU04I2OeVtC1ckX8DoGCsK1PV8bs8qGsdEORjY1Dl5fxmHQqHHHqmmucwc5GG1DdGUF9Tf0M2kEvCx7XcDMKMzWhiUcZ7ScqC4zXPxhoQ== X-Google-Smtp-Source: AGHT+IEf60D+t2BXXUKoorSJPyxvzoXPsEKepXEuh9AszDSxEPQhAtkrBEeMGpRdGCnrR6a04F6V X-Received: by 2002:a54:4513:0:b0:3c5:fa56:df08 with SMTP id l19-20020a544513000000b003c5fa56df08mr940006oil.18.1712584792578; Mon, 08 Apr 2024 06:59:52 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1712584792; cv=pass; d=google.com; s=arc-20160816; b=EkRtuGohTfuk/RJoBMvXFxG5n3DKjqQ2Ay84wka5g86/5GfSgu9YPO9iQVAgvpKW8z 3l/ZU770UBHJuvGtH+FEOJduhjyOHZXUlcCCiZU1TNxVMZNcpBL5qFni6dlEP8ViXIjh DPHizr5BcOyd5bzH+JV56QQi0WMzznex1G8GhlD4KjP7YE3rLbClk3iH1XSkHovftjON wxVZ4w+Ai0pB6OT3gRPaWvYJkxBITUEEOzj5gTNz9+v/CwQMyRLB0UMpJbsz8nfRZOeE 4kKdtt0o4ZN/jb31bpHNp9D3DdDBLRNrtF6LeYyOd4CyK/Hvtk2pYseZsDjOI6ymc0K6 TAUg== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:list-unsubscribe:list-subscribe :list-id:precedence:dkim-signature; bh=exi1tZ25M8U9KJRZYlm9vl7tg5u6eSxfy3YOWCKZkMU=; fh=iVsZFvpPJwloEHjPASf+cENi2NEqbgoKZQ70TshAnto=; b=lYPy9gn28/kBcv6OaybxAwtawe/HZqOqTCJDEj4RSfpDaC/T53Z7KMr5KWp1BLao2b fi9RVGkfyQk1KGGDBwD5jVEZPdCItiHAvLmayjAcPU3viJt3N+OmBLGHEJ6KQQRpWNQG /b+MFILzZDhShcRYDznUMa/aj1vW/MTrhGgmSoefEFE32UPLjqF18fsjsE0fk6UEIrMy s8Fh9SxbkuyqzN8u2jS7A5+Zp6p48fYMKvT1CRDW4rW1LZWd2kiuc3qYQMqW4+/+7JRz AQxBbSenzlWJQIx4S79r8OPWrz2K6jSVTLHEHNv76R6XCZSMcWzd215WaHqu/3Y9naHt zkxg==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@bitbyteword.org header.s=google header.b=D9JTJa7f; arc=pass (i=1 spf=pass spfdomain=bitbyteword.org dkim=pass dkdomain=bitbyteword.org); spf=pass (google.com: domain of linux-kernel+bounces-135475-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.199.223 as permitted sender) smtp.mailfrom="linux-kernel+bounces-135475-linux.lists.archive=gmail.com@vger.kernel.org" Return-Path: Received: from ny.mirrors.kernel.org (ny.mirrors.kernel.org. [147.75.199.223]) by mx.google.com with ESMTPS id w17-20020a05620a095100b0078d65a3e820si2441788qkw.118.2024.04.08.06.59.52 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 08 Apr 2024 06:59:52 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel+bounces-135475-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.199.223 as permitted sender) client-ip=147.75.199.223; Authentication-Results: mx.google.com; dkim=pass header.i=@bitbyteword.org header.s=google header.b=D9JTJa7f; arc=pass (i=1 spf=pass spfdomain=bitbyteword.org dkim=pass dkdomain=bitbyteword.org); spf=pass (google.com: domain of linux-kernel+bounces-135475-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.199.223 as permitted sender) smtp.mailfrom="linux-kernel+bounces-135475-linux.lists.archive=gmail.com@vger.kernel.org" Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ny.mirrors.kernel.org (Postfix) with ESMTPS id 3D1DA1C2206F for ; Mon, 8 Apr 2024 13:59:52 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 7A24F7FBA9; Mon, 8 Apr 2024 13:58:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bitbyteword.org header.i=@bitbyteword.org header.b="D9JTJa7f" Received: from mail-yb1-f176.google.com (mail-yb1-f176.google.com [209.85.219.176]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 569957E112 for ; Mon, 8 Apr 2024 13:58:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.219.176 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712584726; cv=none; b=TH2vuG9fD3/svtYnMXUpIlgccStgre8Y6cJfzbpb7VvFVPAXaPD67Wsb1ctNn0z8YyZ5Vw3uDivrTqXjvbTVAjpYHn9i2Wz+1yjDZr8YjTq7vreiyRgNk1ReCDygkTcA6l6ml7NbwC0bT04BSggdph1xbFuz+4succzgZQeyub4= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712584726; c=relaxed/simple; bh=JwKbHyDdJqKkWIrXnGAqf8zmpkXLprKnjLhDbuicsmY=; h=MIME-Version:References:In-Reply-To:From:Date:Message-ID:Subject: To:Cc:Content-Type; b=rtz72OikQoPdqBJY+osuiw1RKZZbrtkfRf9hpi09+AYX/J10F8W0kuYyt5TIjh4NVfSawITB9bVKgSLMQLc46h8W0fTvgYwjygRxMB3ae0M+W52amAkDQAVFNJTcfr2Xg/sp3ycrQAub2ByW+E15WqE9NLiaEdB0Otpdb7kboa8= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=bitbyteword.org; spf=pass smtp.mailfrom=bitbyteword.org; dkim=pass (2048-bit key) header.d=bitbyteword.org header.i=@bitbyteword.org header.b=D9JTJa7f; arc=none smtp.client-ip=209.85.219.176 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=bitbyteword.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bitbyteword.org Received: by mail-yb1-f176.google.com with SMTP id 3f1490d57ef6-dbed0710c74so3876003276.1 for ; Mon, 08 Apr 2024 06:58:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bitbyteword.org; s=google; t=1712584723; x=1713189523; darn=vger.kernel.org; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:from:to:cc:subject:date :message-id:reply-to; bh=exi1tZ25M8U9KJRZYlm9vl7tg5u6eSxfy3YOWCKZkMU=; b=D9JTJa7fp33VftzKU0Ja2w2rioAQJcvY+SSfdjXoedKbvYIBel53p0aRyyRgfyIgpA Af6Fd7O5vAh8C3PXBjB0VRuqhYm+Ym8ZYopFsBsdOYMmJHgd6SNfNNo+IM4o2vpIwesK vZa7a/1X9DH2FsW9ISknam/kJ4gEvL4jmqOy2zfp2+WFEsNUoQZX53z0P4GwB36a5twW D63wJETKisafGXxocvrZquHeMPbprQv6dBbpDrWpBB8BLJYPKk8bZSHnOraQ0eglp3V5 dDGFnqoGUqrRb7GjuuscCwxxDt7fFO+kAoW2obC0jEco2z+ymyJzJ3HaW55I/vVZ8yc3 kmvg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1712584723; x=1713189523; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=exi1tZ25M8U9KJRZYlm9vl7tg5u6eSxfy3YOWCKZkMU=; b=e8D4awNP7N/zp34rUdMNb+hzK780vzFEPLWgCbJSUet5zpDbW606qgOzscxbSfYloD pnW9cGWkrx9gYXXjiU7TulG6X1AV9tXPwiQlaaQEyTRQtQCHkLq7v7EZIk3/Dy0ZG7eG rbOjlrjNwzmweB/yZ8B2yYWIg1W3cn2Y1roq8aONol63k394Toa6qCl/AjZJp3lKT1tg 8nVDKeVRXvrDWCFCLbqN/DN2QDOuY7/2791ugrd6txo7+3v3HcnHyA7UM5yRcP8wcpR0 KqlBTqEBpDhuKJqGyDiuMhNOqwKsx3g5o0F+Q6ZHvLB8F/Bf27tdcpjXRCX75KhcMYlf ufBg== X-Forwarded-Encrypted: i=1; AJvYcCUNr07An5JluZRPWQ3KzbZNwKr0hFn+eYvoDqIakzn3tuiq9bgoCU5S2FiMlQ8/8QVOAYFwBoTgWSi3RyCJ8weMAQXc4wLoA3M78TqL X-Gm-Message-State: AOJu0YxX+F0Yez2U6LkN/EqMzheZbbSKVDu+iR/mEa1M5NTxdNQFnAoP C7+xwg/dHHXiwssGWutFir4F5RwuiHOCbZlTcq+bKN0+jnwHgnKpF4uLWvQ2BGeyDzHNacwqQTl WqiiKeyFTEXuxhQVse7QzdgYDdSOgkaIQxtAH/w== X-Received: by 2002:a25:b107:0:b0:dc6:9ea9:8154 with SMTP id g7-20020a25b107000000b00dc69ea98154mr7557910ybj.13.1712584723316; Mon, 08 Apr 2024 06:58:43 -0700 (PDT) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 References: <20240403140116.3002809-1-vineeth@bitbyteword.org> <20240403140116.3002809-3-vineeth@bitbyteword.org> In-Reply-To: <20240403140116.3002809-3-vineeth@bitbyteword.org> From: Vineeth Remanan Pillai Date: Mon, 8 Apr 2024 09:58:32 -0400 Message-ID: Subject: Re: [RFC PATCH v2 2/5] kvm: Implement the paravirt sched framework for kvm To: Ben Segall , Borislav Petkov , Daniel Bristot de Oliveira , Dave Hansen , Dietmar Eggemann , "H . Peter Anvin" , Ingo Molnar , Juri Lelli , Mel Gorman , Paolo Bonzini , Andy Lutomirski , Peter Zijlstra , Sean Christopherson , Thomas Gleixner , Valentin Schneider , Vincent Guittot , Vitaly Kuznetsov , Wanpeng Li Cc: Steven Rostedt , Joel Fernandes , Suleiman Souhlal , Masami Hiramatsu , himadrics@inria.fr, kvm@vger.kernel.org, linux-kernel@vger.kernel.org, x86@kernel.org, Tejun Heo , Josh Don , Barret Rhoden , David Vernet Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Adding sched_ext folks On Wed, Apr 3, 2024 at 10:01=E2=80=AFAM Vineeth Pillai (Google) wrote: > > kvm uses the kernel's paravirt sched framework to assign an available > pvsched driver for a guest. guest vcpus registers with the pvsched > driver and calls into the driver callback to notify the events that the > driver is interested in. > > This PoC doesn't do the callback on interrupt injection yet. Will be > implemented in subsequent iterations. > > Signed-off-by: Vineeth Pillai (Google) > Signed-off-by: Joel Fernandes (Google) > --- > arch/x86/kvm/Kconfig | 13 ++++ > arch/x86/kvm/x86.c | 3 + > include/linux/kvm_host.h | 32 +++++++++ > virt/kvm/kvm_main.c | 148 +++++++++++++++++++++++++++++++++++++++ > 4 files changed, 196 insertions(+) > > diff --git a/arch/x86/kvm/Kconfig b/arch/x86/kvm/Kconfig > index 65ed14b6540b..c1776cdb5b65 100644 > --- a/arch/x86/kvm/Kconfig > +++ b/arch/x86/kvm/Kconfig > @@ -189,4 +189,17 @@ config KVM_MAX_NR_VCPUS > the memory footprint of each KVM guest, regardless of how many = vCPUs are > created for a given VM. > > +config PARAVIRT_SCHED_KVM > + bool "Enable paravirt scheduling capability for kvm" > + depends on KVM > + default n > + help > + Paravirtualized scheduling facilitates the exchange of scheduli= ng > + related information between the host and guest through shared m= emory, > + enhancing the efficiency of vCPU thread scheduling by the hyper= visor. > + An illustrative use case involves dynamically boosting the prio= rity of > + a vCPU thread when the guest is executing a latency-sensitive w= orkload > + on that specific vCPU. > + This config enables paravirt scheduling in the kvm hypervisor. > + > endif # VIRTUALIZATION > diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c > index ffe580169c93..d0abc2c64d47 100644 > --- a/arch/x86/kvm/x86.c > +++ b/arch/x86/kvm/x86.c > @@ -10896,6 +10896,8 @@ static int vcpu_enter_guest(struct kvm_vcpu *vcpu= ) > > preempt_disable(); > > + kvm_vcpu_pvsched_notify(vcpu, PVSCHED_VCPU_VMENTER); > + > static_call(kvm_x86_prepare_switch_to_guest)(vcpu); > > /* > @@ -11059,6 +11061,7 @@ static int vcpu_enter_guest(struct kvm_vcpu *vcpu= ) > guest_timing_exit_irqoff(); > > local_irq_enable(); > + kvm_vcpu_pvsched_notify(vcpu, PVSCHED_VCPU_VMEXIT); > preempt_enable(); > > kvm_vcpu_srcu_read_lock(vcpu); > diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h > index 179df96b20f8..6381569f3de8 100644 > --- a/include/linux/kvm_host.h > +++ b/include/linux/kvm_host.h > @@ -45,6 +45,8 @@ > #include > #include > > +#include > + > #ifndef KVM_MAX_VCPU_IDS > #define KVM_MAX_VCPU_IDS KVM_MAX_VCPUS > #endif > @@ -832,6 +834,11 @@ struct kvm { > bool vm_bugged; > bool vm_dead; > > +#ifdef CONFIG_PARAVIRT_SCHED_KVM > + spinlock_t pvsched_ops_lock; > + struct pvsched_vcpu_ops __rcu *pvsched_ops; > +#endif > + > #ifdef CONFIG_HAVE_KVM_PM_NOTIFIER > struct notifier_block pm_notifier; > #endif > @@ -2413,4 +2420,29 @@ static inline int kvm_gmem_get_pfn(struct kvm *kvm= , > } > #endif /* CONFIG_KVM_PRIVATE_MEM */ > > +#ifdef CONFIG_PARAVIRT_SCHED_KVM > +int kvm_vcpu_pvsched_notify(struct kvm_vcpu *vcpu, u32 events); > +int kvm_vcpu_pvsched_register(struct kvm_vcpu *vcpu); > +void kvm_vcpu_pvsched_unregister(struct kvm_vcpu *vcpu); > + > +int kvm_replace_pvsched_ops(struct kvm *kvm, char *name); > +#else > +static inline int kvm_vcpu_pvsched_notify(struct kvm_vcpu *vcpu, u32 eve= nts) > +{ > + return 0; > +} > +static inline int kvm_vcpu_pvsched_register(struct kvm_vcpu *vcpu) > +{ > + return 0; > +} > +static inline void kvm_vcpu_pvsched_unregister(struct kvm_vcpu *vcpu) > +{ > +} > + > +static inline int kvm_replace_pvsched_ops(struct kvm *kvm, char *name) > +{ > + return 0; > +} > +#endif > + > #endif > diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c > index 0f50960b0e3a..0546814e4db7 100644 > --- a/virt/kvm/kvm_main.c > +++ b/virt/kvm/kvm_main.c > @@ -170,6 +170,142 @@ bool kvm_is_zone_device_page(struct page *page) > return is_zone_device_page(page); > } > > +#ifdef CONFIG_PARAVIRT_SCHED_KVM > +typedef enum { > + PVSCHED_CB_REGISTER =3D 1, > + PVSCHED_CB_UNREGISTER =3D 2, > + PVSCHED_CB_NOTIFY =3D 3 > +} pvsched_vcpu_callback_t; > + > +/* > + * Helper function to invoke the pvsched driver callback. > + */ > +static int __vcpu_pvsched_callback(struct kvm_vcpu *vcpu, u32 events, > + pvsched_vcpu_callback_t action) > +{ > + int ret =3D 0; > + struct pid *pid; > + struct pvsched_vcpu_ops *ops; > + > + rcu_read_lock(); > + ops =3D rcu_dereference(vcpu->kvm->pvsched_ops); > + if (!ops) { > + ret =3D -ENOENT; > + goto out; > + } > + > + pid =3D rcu_dereference(vcpu->pid); > + if (WARN_ON_ONCE(!pid)) { > + ret =3D -EINVAL; > + goto out; > + } > + get_pid(pid); > + switch(action) { > + case PVSCHED_CB_REGISTER: > + ops->pvsched_vcpu_register(pid); > + break; > + case PVSCHED_CB_UNREGISTER: > + ops->pvsched_vcpu_unregister(pid); > + break; > + case PVSCHED_CB_NOTIFY: > + if (ops->events & events) { > + ops->pvsched_vcpu_notify_event( > + NULL, /* TODO: Pass guest allocat= ed sharedmem addr */ > + pid, > + ops->events & events); > + } > + break; > + default: > + WARN_ON_ONCE(1); > + } > + put_pid(pid); > + > +out: > + rcu_read_unlock(); > + return ret; > +} > + > +int kvm_vcpu_pvsched_notify(struct kvm_vcpu *vcpu, u32 events) > +{ > + return __vcpu_pvsched_callback(vcpu, events, PVSCHED_CB_NOTIFY); > +} > + > +int kvm_vcpu_pvsched_register(struct kvm_vcpu *vcpu) > +{ > + return __vcpu_pvsched_callback(vcpu, 0, PVSCHED_CB_REGISTER); > + /* > + * TODO: Action if the registration fails? > + */ > +} > + > +void kvm_vcpu_pvsched_unregister(struct kvm_vcpu *vcpu) > +{ > + __vcpu_pvsched_callback(vcpu, 0, PVSCHED_CB_UNREGISTER); > +} > + > +/* > + * Replaces the VM's current pvsched driver. > + * if name is NULL or empty string, unassign the > + * current driver. > + */ > +int kvm_replace_pvsched_ops(struct kvm *kvm, char *name) > +{ > + int ret =3D 0; > + unsigned long i; > + struct kvm_vcpu *vcpu =3D NULL; > + struct pvsched_vcpu_ops *ops =3D NULL, *prev_ops; > + > + > + spin_lock(&kvm->pvsched_ops_lock); > + > + prev_ops =3D rcu_dereference(kvm->pvsched_ops); > + > + /* > + * Unassign operation if the passed in value is > + * NULL or an empty string. > + */ > + if (name && *name) { > + ops =3D pvsched_get_vcpu_ops(name); > + if (!ops) { > + ret =3D -EINVAL; > + goto out; > + } > + } > + > + if (prev_ops) { > + /* > + * Unregister current pvsched driver. > + */ > + kvm_for_each_vcpu(i, vcpu, kvm) { > + kvm_vcpu_pvsched_unregister(vcpu); > + } > + > + pvsched_put_vcpu_ops(prev_ops); > + } > + > + > + rcu_assign_pointer(kvm->pvsched_ops, ops); > + if (ops) { > + /* > + * Register new pvsched driver. > + */ > + kvm_for_each_vcpu(i, vcpu, kvm) { > + WARN_ON_ONCE(kvm_vcpu_pvsched_register(vcpu)); > + } > + } > + > +out: > + spin_unlock(&kvm->pvsched_ops_lock); > + > + if (ret) > + return ret; > + > + synchronize_rcu(); > + > + return 0; > +} > +#endif > + > /* > * Returns a 'struct page' if the pfn is "valid" and backed by a refcoun= ted > * page, NULL otherwise. Note, the list of refcounted PG_reserved page = types > @@ -508,6 +644,8 @@ static void kvm_vcpu_destroy(struct kvm_vcpu *vcpu) > kvm_arch_vcpu_destroy(vcpu); > kvm_dirty_ring_free(&vcpu->dirty_ring); > > + kvm_vcpu_pvsched_unregister(vcpu); > + > /* > * No need for rcu_read_lock as VCPU_RUN is the only place that c= hanges > * the vcpu->pid pointer, and at destruction time all file descri= ptors > @@ -1221,6 +1359,10 @@ static struct kvm *kvm_create_vm(unsigned long typ= e, const char *fdname) > > BUILD_BUG_ON(KVM_MEM_SLOTS_NUM > SHRT_MAX); > > +#ifdef CONFIG_PARAVIRT_SCHED_KVM > + spin_lock_init(&kvm->pvsched_ops_lock); > +#endif > + > /* > * Force subsequent debugfs file creations to fail if the VM dire= ctory > * is not created (by kvm_create_vm_debugfs()). > @@ -1343,6 +1485,8 @@ static void kvm_destroy_vm(struct kvm *kvm) > int i; > struct mm_struct *mm =3D kvm->mm; > > + kvm_replace_pvsched_ops(kvm, NULL); > + > kvm_destroy_pm_notifier(kvm); > kvm_uevent_notify_change(KVM_EVENT_DESTROY_VM, kvm); > kvm_destroy_vm_debugfs(kvm); > @@ -3779,6 +3923,8 @@ bool kvm_vcpu_block(struct kvm_vcpu *vcpu) > if (kvm_vcpu_check_block(vcpu) < 0) > break; > > + kvm_vcpu_pvsched_notify(vcpu, PVSCHED_VCPU_HALT); > + > waited =3D true; > schedule(); > } > @@ -4434,6 +4580,7 @@ static long kvm_vcpu_ioctl(struct file *filp, > /* The thread running this VCPU changed. */ > struct pid *newpid; > > + kvm_vcpu_pvsched_unregister(vcpu); > r =3D kvm_arch_vcpu_run_pid_change(vcpu); > if (r) > break; > @@ -4442,6 +4589,7 @@ static long kvm_vcpu_ioctl(struct file *filp, > rcu_assign_pointer(vcpu->pid, newpid); > if (oldpid) > synchronize_rcu(); > + kvm_vcpu_pvsched_register(vcpu); > put_pid(oldpid); > } > r =3D kvm_arch_vcpu_ioctl_run(vcpu); > -- > 2.40.1 >