From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pg1-f202.google.com (mail-pg1-f202.google.com [209.85.215.202]) (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 62343400E09 for ; Fri, 29 May 2026 16:51:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.202 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780073504; cv=none; b=BkpcFX8WwILEQFesJH0G3OPl9YSTgqi9a1ghJfOjXcxjJlpfjLQTt6CDM1qV/Pw69XsrsejdRsNEHEfwAJkpi8gHt/syvKEmut4a1e5tRB76lNopvv2OuXp4uMxeAiMsB5hnkZBeeeNWUOGoq2ZJAtiPpLlkO50SwM/vk1onxl4= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780073504; c=relaxed/simple; bh=awAqPvTjCGvtOfeH1l05uKfVpQ07Yx7AEqRp/zyuH+0=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=B9HNBOUc4ZpFL67Oihat/mWi2vlhgbOqbsAu0OQolhX8VPPPAKZqCRENvXqBQ9Zaz3e/PG9k/9vnlJo/6DmuWHOeR0qC/nrvojEfHRBMDWxDPN4P5Kdyn82ZBTrs9KrrTt199Hs0Ye5SyVi2EkiMVed/fBaheL+LrAXJ4Bn0w5M= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=Gq/PnM/u; arc=none smtp.client-ip=209.85.215.202 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="Gq/PnM/u" Received: by mail-pg1-f202.google.com with SMTP id 41be03b00d2f7-c857fa2706aso170230a12.2 for ; Fri, 29 May 2026 09:51:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1780073500; x=1780678300; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=L2n+V0FsqyljLxYaD1QETdWONVMaFI3jjVM3JkMpLz4=; b=Gq/PnM/uii80Y9krtJYYAvxTK/6GFJJdINFVpUv/gd8iUACCznnrZHcPB6Qd2gMN8R oKNCmSSKchadZIWIkrLY1sN3bWymkvVZhOEdGhtlnTIP0+DNAbs4odlHCYTk7tWYjgqu R6EBYqxXM3PRgWdapZwF3L0/HGpzNK9HQpmB4DkZ5aVIhBepTQAlZ9DUjgX+EZGDUgAG gu00JxTNKw68uTM96YldWcatkd25UcW36ZvlyrZz/GrK8XNaTTXPaIRfcLzRsTlgc60z slc5Qa3m64IzXLRZOwsfkTOe941jndEgWPPhKNnwMtlYddxTn4QskbLooRSkmpL2mPk0 p4qw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1780073500; x=1780678300; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=L2n+V0FsqyljLxYaD1QETdWONVMaFI3jjVM3JkMpLz4=; b=eYSBFc9TuHTDgq6Ot64+l/hALqmaIeRy1b7rMwCGiqJoHVFT3soTw8MwhnSzhse/mJ 4OUoPLw7XdNISjm+o8MCogJj961NwxW7pvkkUZW3CO7dWxM3/oHzj/yMLscEAts/aY6X rAoZFndP7qbjMg+MiYtZlcHtIdn2a+wXCwr8NKzs9JpEtyFQLUAnXvhnc2myxdjQJN2e 88k2oJBbuYWMDIhmg2YH+tq4QDo76ehwCTPN8kVwET308fJvNqCco4RwrJhFOKXaTebj 13dn3IyTtw08lO228TnolHRMMcLuRXs4ecG2WNfsD8Q9h7Hvr7ArDL/6A2napUQStDNE sC2Q== X-Forwarded-Encrypted: i=1; AFNElJ+5sWhuJceGuuqlEdHAtvfhBBU3R4sZami71CsnRjgg9uDcsZtff+I4nZMP1vRDZB/2z8kAoT6pqB29mYg=@vger.kernel.org X-Gm-Message-State: AOJu0Ywv+C021J68X+YiK2qoE2bBa5q+q+fQp2bSQkxLtOfUSl9bUQ6F NcSTzHTxd7aaxg28+dec6ilziVyURhVOu6tA1kIeG+676PHkLxjBYN8Ky8TfgkjOvEcPRXIRzEp AcIlOzg== X-Received: from pfki6.prod.google.com ([2002:a05:6a00:46:b0:82f:790c:3922]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:198f:b0:837:80a:5ab4 with SMTP id d2e1a72fcca58-8422571af4fmr275744b3a.44.1780073500104; Fri, 29 May 2026 09:51:40 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 29 May 2026 09:51:09 -0700 In-Reply-To: <20260529165114.748639-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260529165114.748639-1-seanjc@google.com> X-Mailer: git-send-email 2.54.0.823.g6e5bcc1fc9-goog Message-ID: <20260529165114.748639-16-seanjc@google.com> Subject: [PATCH v2 15/20] KVM: x86/xen: Convert kvm_xen_set_evtchn_fast() to gpc's CLASS() APIs From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini , David Woodhouse , Paul Durrant , Peter Zijlstra , Ingo Molnar , Will Deacon , Boqun Feng Cc: Waiman Long , kvm@vger.kernel.org, linux-kernel@vger.kernel.org, David Woodhouse , Sebastian Andrzej Siewior , syzbot+208f7f3e5f59c11aeb90@syzkaller.appspotmail.com, Carsten Stollmaier Content-Type: text/plain; charset="UTF-8" Convert the event channel fastpath to the "map local" CLASS() APIs, using the "try" variants as the faspath can't block. Note! The vcpu_info mapping is read/write, even though there is no existing call to mark the page dirty. Like Xen's shared info page, the vCPU info page is assumed to be dirty at all times, and so isn't marked dirty after every write. No functional change intended. Signed-off-by: Sean Christopherson --- arch/x86/kvm/xen.c | 42 ++++++++++++++++-------------------------- 1 file changed, 16 insertions(+), 26 deletions(-) diff --git a/arch/x86/kvm/xen.c b/arch/x86/kvm/xen.c index 8f822acb11a4..47750316f132 100644 --- a/arch/x86/kvm/xen.c +++ b/arch/x86/kvm/xen.c @@ -1774,29 +1774,28 @@ static void __kvm_xen_set_evtchn_fast(struct kvm_vcpu *vcpu, int port_word_bit) bool kick_vcpu = false; /* Now switch to the vCPU's vcpu_info to set the index and pending_sel */ - if (!read_trylock(&gpc->lock)) { - /* - * Could not access the vcpu_info. Set the bit in-kernel and - * prod the vCPU to deliver it for itself. - */ + CLASS(gpc_try_map_local, vcpu_info_map)(gpc, sizeof(struct vcpu_info)); + + /* + * If the vcpu_info is inaccessible, set the bit in-kernel and prod the + * vCPU to deliver it for itself. + */ + if (IS_ERR(vcpu_info_map)) { if (!test_and_set_bit(port_word_bit, &vcpu->arch.xen.evtchn_pending_sel)) kick_vcpu = true; goto out_kick; } - if (!kvm_gpc_check(gpc, sizeof(struct vcpu_info))) { - if (!test_and_set_bit(port_word_bit, &vcpu->arch.xen.evtchn_pending_sel)) - kick_vcpu = true; - goto out_unlock; - } if (IS_ENABLED(CONFIG_64BIT) && vcpu->kvm->arch.xen.long_mode) { - struct vcpu_info *vcpu_info = gpc->khva; + struct vcpu_info *vcpu_info = *vcpu_info_map; + if (!test_and_set_bit(port_word_bit, &vcpu_info->evtchn_pending_sel)) { WRITE_ONCE(vcpu_info->evtchn_upcall_pending, 1); kick_vcpu = true; } } else { - struct compat_vcpu_info *vcpu_info = gpc->khva; + struct compat_vcpu_info *vcpu_info = *vcpu_info_map; + if (!test_and_set_bit(port_word_bit, (unsigned long *)&vcpu_info->evtchn_pending_sel)) { WRITE_ONCE(vcpu_info->evtchn_upcall_pending, 1); @@ -1810,8 +1809,6 @@ static void __kvm_xen_set_evtchn_fast(struct kvm_vcpu *vcpu, int port_word_bit) kick_vcpu = false; } -out_unlock: - read_unlock(&gpc->lock); out_kick: if (kick_vcpu) { kvm_make_request(KVM_REQ_UNBLOCK, vcpu); @@ -1850,23 +1847,19 @@ int kvm_xen_set_evtchn_fast(struct kvm_xen_evtchn *xe, struct kvm *kvm) if (xe->port >= max_evtchn_port(kvm)) return -EINVAL; - rc = -EWOULDBLOCK; - guard(srcu)(&kvm->srcu); - if (!read_trylock(&gpc->lock)) - return rc; - - if (!kvm_gpc_check(gpc, PAGE_SIZE)) - goto out_unlock; + CLASS(gpc_try_map_local, shinfo_map)(gpc, PAGE_SIZE); + if (IS_ERR(shinfo_map)) + return -EWOULDBLOCK; if (IS_ENABLED(CONFIG_64BIT) && kvm->arch.xen.long_mode) { - struct shared_info *shinfo = gpc->khva; + struct shared_info *shinfo = *shinfo_map; pending_bits = (unsigned long *)&shinfo->evtchn_pending; mask_bits = (unsigned long *)&shinfo->evtchn_mask; port_word_bit = xe->port / 64; } else { - struct compat_shared_info *shinfo = gpc->khva; + struct compat_shared_info *shinfo = *shinfo_map; pending_bits = (unsigned long *)&shinfo->evtchn_pending; mask_bits = (unsigned long *)&shinfo->evtchn_mask; port_word_bit = xe->port / 32; @@ -1888,9 +1881,6 @@ int kvm_xen_set_evtchn_fast(struct kvm_xen_evtchn *xe, struct kvm *kvm) rc = 1; /* Delivered to the bitmap in shared_info. */ } -out_unlock: - read_unlock(&gpc->lock); - if (rc == 1) __kvm_xen_set_evtchn_fast(vcpu, port_word_bit); return rc; -- 2.54.0.823.g6e5bcc1fc9-goog