From nobody Sun Mar 9 22:23:48 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) client-ip=192.237.175.120; envelope-from=xen-devel-bounces@lists.xenproject.org; helo=lists.xenproject.org; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; dmarc=pass(p=quarantine dis=none) header.from=suse.com ARC-Seal: i=1; a=rsa-sha256; t=1741342352; cv=none; d=zohomail.com; s=zohoarc; b=jPzQdiF7I3YlgmUyxrg0Ppn/moZDhKLWRpCzq9AO6tWY3O7NfNenOaRqkYG8mor8rzhE+syYjiRBnq4uSjZJgyN0XCnyEfvSz12pFJbdFVGaC2yH9J0SHyVvss5dj/3vZ8U5y+wFMYHkTT+JUMtHyrnLHBUErhNZuzcU8rqFmnw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1741342352; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:List-Subscribe:List-Post:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=7ZSXVjc2miKUFoLiDEfoI9Vwsq/CSEqNaJnezPJXwc4=; b=YW4O3q8KbF3KwzCgfw+MgG47KsWru5QS1ihO01zp11m+aIqXARpU6h+RPc96zgt6812Q5qSjhJmHXzNlsdMekurB9mZR0sM2EBttovHMpJ7mHbrd1yKbwItXFRrDBOTylAvKFDpd4T/L44TMcZvpJnqWasrBSDUAekavH8D96Co= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) by mx.zohomail.com with SMTPS id 174134235198312.68643301382076; Fri, 7 Mar 2025 02:12:31 -0800 (PST) Received: from list by lists.xenproject.org with outflank-mailman.904831.1312644 (Exim 4.92) (envelope-from ) id 1tqUgD-0004lB-UO; Fri, 07 Mar 2025 10:11:45 +0000 Received: by outflank-mailman (output) from mailman id 904831.1312644; Fri, 07 Mar 2025 10:11:45 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1tqUgD-0004l4-Qx; Fri, 07 Mar 2025 10:11:45 +0000 Received: by outflank-mailman (input) for mailman id 904831; Fri, 07 Mar 2025 10:11:44 +0000 Received: from se1-gles-sth1-in.inumbo.com ([159.253.27.254] helo=se1-gles-sth1.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1tqUgC-0004ky-Eu for xen-devel@lists.xenproject.org; Fri, 07 Mar 2025 10:11:44 +0000 Received: from mail-wm1-x336.google.com (mail-wm1-x336.google.com [2a00:1450:4864:20::336]) by se1-gles-sth1.inumbo.com (Halon) with ESMTPS id 919f602c-fb3c-11ef-9ab5-95dc52dad729; Fri, 07 Mar 2025 11:11:43 +0100 (CET) Received: by mail-wm1-x336.google.com with SMTP id 5b1f17b1804b1-43bc48ff815so10167055e9.0 for ; Fri, 07 Mar 2025 02:11:43 -0800 (PST) Received: from [10.156.60.236] (ip-037-024-206-209.um08.pools.vodafone-ip.de. [37.24.206.209]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-43bdd8c3aa8sm46171535e9.14.2025.03.07.02.11.41 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Fri, 07 Mar 2025 02:11:42 -0800 (PST) X-Outflank-Mailman: Message body and most headers restored to incoming version X-BeenThere: xen-devel@lists.xenproject.org List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Precedence: list Sender: "Xen-devel" X-Inumbo-ID: 919f602c-fb3c-11ef-9ab5-95dc52dad729 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=google; t=1741342303; x=1741947103; darn=lists.xenproject.org; h=content-transfer-encoding:autocrypt:subject:from:cc:to :content-language:user-agent:mime-version:date:message-id:from:to:cc :subject:date:message-id:reply-to; bh=7ZSXVjc2miKUFoLiDEfoI9Vwsq/CSEqNaJnezPJXwc4=; b=DeCXxupKRXI1oFCfKT16YYeeuhIjFPpxkIRzqVJ1F2EiATNSJJOW/57lRr4qWZyq21 QSspd8WtJ8uKDzY+WfnsTq0n92cz9PfcZQvf2onGUxudg7DntUESde3gQv77blNOm9IW hf15yb926daiThsfXajJ6iYmZ1AXd86+VNGuFclpGga7LodsGMdms7Sl1bVFiscq31xw IPSU79W6V4XhfCGS7kBYIbGehulntpDdFaRKD57ZborhII8aP9KPAAo/ylOAIDbM2dxd VQe0EvOazYJ0T1aJ2B5LOI2hCAM4xH7AK4KUjcYiIjoHJHejqnSPmlXlSu+iWgE2hVff cgkQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741342303; x=1741947103; h=content-transfer-encoding:autocrypt:subject:from:cc:to :content-language:user-agent:mime-version:date:message-id :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=7ZSXVjc2miKUFoLiDEfoI9Vwsq/CSEqNaJnezPJXwc4=; b=DImvE/l3M+/yYPwFXTGObCRK3sA5Gmqx6qs8CkJh9TVmwYjRuoLR6hkjH3Y4sgJdaR C9MDRUX3QdrxzEpw39f0uC+xo10riC4ADsFjifFTDtkpz8CQtRXs1usqlHNm+MDebt9x 3Xl/xZRQqt9dn/HMsEgqyNRzmQ4XfcKZoSmOAtVHA/rg0sB/qAYGcOw+3gPTM0hyDXEI pGxq7aoUyL2x8Re6NZ+UisZyoy3GD6/w6TBK1H8QBUAnxr6r9Oj71veSLuXNa6BOHQh9 wyXVMEuPH6sJMF7sHPw+Z0mwK7lczWwfLJLyIcfGuRtlCq/CLl8kE3/18TQGE0vpvnF2 9voQ== X-Gm-Message-State: AOJu0YwrmrFBpqFvyK2U2A/1qfyznmpTEpWmYQHdIjyGCXtgZlTUWauz dgsGx138/zpmRMqiBd1xvYQv6YNfDGdSEyPss+SXhcBkb/9uSqcRpjN3JWWU8ZHk1MIYQ1TmfuY = X-Gm-Gg: ASbGnct18V+G8PKkrdTC7Mlem1s0nbuRBfn2pQwhf9hQuBAfBkhyMf8pnZ9lUP3op/L b/S78rdykvdGPX1c/eIGor8kXqF/J3RoOAqlszTwEoVXqgyw8/h4OuYx9m7iBzFQBMZpNrcMbB0 1/yWtLuyTISnx/vi1+6ugQDpPuVoGInRg7duIAxx1E13+Yvoc9CUaVgOxP06ppPVy8h4fyzBT2V FAT5/WCuv5YDJS1Rg2GsYRe8vdd1YWU26LEXKWO0pl3luJ1Rv/orj3X74YLeCJl+e2cTZTj2mX2 vYpGYnm7Lw45N4NFyf9+BQ5FqRbyMCKxSYUKM3MhwYmIFtGqpa53RS4VTRrXv6bHkSSYXayZItS b2cwzP3GTnjGEG0UqaFJ6WWtZHnXgKA== X-Google-Smtp-Source: AGHT+IFLSw4U5goXom44ORWdkvAJxaNSNigDPKxhLuUc5DDECCGXduXJmpXUQ2hZYN86LbLfZBy8jw== X-Received: by 2002:a7b:c053:0:b0:43b:c592:7e16 with SMTP id 5b1f17b1804b1-43bdb368dafmr49566775e9.3.1741342302667; Fri, 07 Mar 2025 02:11:42 -0800 (PST) Message-ID: <0315252d-0378-4699-bff7-ce745d753438@suse.com> Date: Fri, 7 Mar 2025 11:11:41 +0100 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Content-Language: en-US To: "xen-devel@lists.xenproject.org" Cc: Andrew Cooper , Julien Grall , Stefano Stabellini , Anthony PERARD , Michal Orzel , =?UTF-8?Q?Roger_Pau_Monn=C3=A9?= , Bertrand Marquis , Volodymyr Babchuk , Shawn Anastasio , Alistair Francis , Bobby Eshleman , Connor Davis , Oleksii Kurochko , Christopher Clark From: Jan Beulich Subject: [PATCH v2] xen/events: fix global virq handling Autocrypt: addr=jbeulich@suse.com; keydata= xsDiBFk3nEQRBADAEaSw6zC/EJkiwGPXbWtPxl2xCdSoeepS07jW8UgcHNurfHvUzogEq5xk hu507c3BarVjyWCJOylMNR98Yd8VqD9UfmX0Hb8/BrA+Hl6/DB/eqGptrf4BSRwcZQM32aZK 7Pj2XbGWIUrZrd70x1eAP9QE3P79Y2oLrsCgbZJfEwCgvz9JjGmQqQkRiTVzlZVCJYcyGGsD /0tbFCzD2h20ahe8rC1gbb3K3qk+LpBtvjBu1RY9drYk0NymiGbJWZgab6t1jM7sk2vuf0Py O9Hf9XBmK0uE9IgMaiCpc32XV9oASz6UJebwkX+zF2jG5I1BfnO9g7KlotcA/v5ClMjgo6Gl MDY4HxoSRu3i1cqqSDtVlt+AOVBJBACrZcnHAUSuCXBPy0jOlBhxPqRWv6ND4c9PH1xjQ3NP nxJuMBS8rnNg22uyfAgmBKNLpLgAGVRMZGaGoJObGf72s6TeIqKJo/LtggAS9qAUiuKVnygo 3wjfkS9A3DRO+SpU7JqWdsveeIQyeyEJ/8PTowmSQLakF+3fote9ybzd880fSmFuIEJldWxp Y2ggPGpiZXVsaWNoQHN1c2UuY29tPsJgBBMRAgAgBQJZN5xEAhsDBgsJCAcDAgQVAggDBBYC AwECHgECF4AACgkQoDSui/t3IH4J+wCfQ5jHdEjCRHj23O/5ttg9r9OIruwAn3103WUITZee e7Sbg12UgcQ5lv7SzsFNBFk3nEQQCACCuTjCjFOUdi5Nm244F+78kLghRcin/awv+IrTcIWF hUpSs1Y91iQQ7KItirz5uwCPlwejSJDQJLIS+QtJHaXDXeV6NI0Uef1hP20+y8qydDiVkv6l IreXjTb7DvksRgJNvCkWtYnlS3mYvQ9NzS9PhyALWbXnH6sIJd2O9lKS1Mrfq+y0IXCP10eS FFGg+Av3IQeFatkJAyju0PPthyTqxSI4lZYuJVPknzgaeuJv/2NccrPvmeDg6Coe7ZIeQ8Yj t0ARxu2xytAkkLCel1Lz1WLmwLstV30g80nkgZf/wr+/BXJW/oIvRlonUkxv+IbBM3dX2OV8 AmRv1ySWPTP7AAMFB/9PQK/VtlNUJvg8GXj9ootzrteGfVZVVT4XBJkfwBcpC/XcPzldjv+3 HYudvpdNK3lLujXeA5fLOH+Z/G9WBc5pFVSMocI71I8bT8lIAzreg0WvkWg5V2WZsUMlnDL9 mpwIGFhlbM3gfDMs7MPMu8YQRFVdUvtSpaAs8OFfGQ0ia3LGZcjA6Ik2+xcqscEJzNH+qh8V m5jjp28yZgaqTaRbg3M/+MTbMpicpZuqF4rnB0AQD12/3BNWDR6bmh+EkYSMcEIpQmBM51qM EKYTQGybRCjpnKHGOxG0rfFY1085mBDZCH5Kx0cl0HVJuQKC+dV2ZY5AqjcKwAxpE75MLFkr wkkEGBECAAkFAlk3nEQCGwwACgkQoDSui/t3IH7nnwCfcJWUDUFKdCsBH/E5d+0ZnMQi+G0A nAuWpQkjM1ASeQwSHEeAWPgskBQL Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @suse.com) X-ZM-MESSAGEID: 1741342354754019100 Content-Type: text/plain; charset="utf-8" VIRQs are split into "global" and "per vcpu" ones. Unfortunately in reality there are "per domain" ones, too. send_global_virq() and set_global_virq_handler() make only sense for the real "global" ones, so replace virq_is_global() with a new function get_virq_type() returning one of the 3 possible types (global, domain, vcpu VIRQ). To make its intended purpose more clear, also rename send_guest_global_virq() to send_guest_domain_virq(). Fixes: 980822c5edd1 ("xen/events: allow setting of global virq handler only= for unbound virqs") Signed-off-by: Juergen Gross Signed-off-by: Jan Beulich --- As I don't have much time today (I'm having a day off), only compile tested. Please try a CI run with this patch before applying! Whether the "domain" infix in send_guest_domain_virq() is really useful I don't know. Maybe we should go even father with renaming, to have {vcpu,domain}_send_virq()? --- v2: Also rename send_guest_global_virq(). --- a/xen/arch/arm/include/asm/event.h +++ b/xen/arch/arm/include/asm/event.h @@ -47,9 +47,9 @@ static inline void local_event_delivery_ } =20 /* No arch specific virq definition now. Default to global. */ -static inline bool arch_virq_is_global(unsigned int virq) +static inline enum virq_type arch_get_virq_type(unsigned int virq) { - return true; + return VIRQ_GLOBAL; } =20 #endif --- a/xen/arch/ppc/include/asm/event.h +++ b/xen/arch/ppc/include/asm/event.h @@ -17,9 +17,9 @@ static inline int vcpu_event_delivery_is } =20 /* No arch specific virq definition now. Default to global. */ -static inline bool arch_virq_is_global(unsigned int virq) +static inline enum virq_type arch_get_virq_type(unsigned int virq) { - return true; + return VIRQ_GLOBAL; } =20 static inline int local_events_need_delivery(void) --- a/xen/arch/riscv/include/asm/event.h +++ b/xen/arch/riscv/include/asm/event.h @@ -24,9 +24,9 @@ static inline void local_event_delivery_ } =20 /* No arch specific virq definition now. Default to global. */ -static inline bool arch_virq_is_global(unsigned int virq) +static inline enum virq_type arch_get_virq_type(unsigned int virq) { - return true; + return VIRQ_GLOBAL; } =20 #endif /* ASM__RISCV__EVENT_H */ --- a/xen/arch/x86/include/asm/event.h +++ b/xen/arch/x86/include/asm/event.h @@ -41,10 +41,10 @@ static inline void local_event_delivery_ vcpu_info(current, evtchn_upcall_mask) =3D 0; } =20 -/* No arch specific virq definition now. Default to global. */ -static inline bool arch_virq_is_global(unsigned int virq) +/* Only global arch specific virq definitions. */ +static inline enum virq_type arch_get_virq_type(unsigned int virq) { - return true; + return VIRQ_GLOBAL; } =20 #ifdef CONFIG_PV_SHIM --- a/xen/common/argo.c +++ b/xen/common/argo.c @@ -440,7 +440,7 @@ signal_domain(struct domain *d) { argo_dprintk("signalling domid:%u\n", d->domain_id); =20 - send_guest_global_virq(d, VIRQ_ARGO); + send_guest_domain_virq(d, VIRQ_ARGO); } =20 static void --- a/xen/common/event_channel.c +++ b/xen/common/event_channel.c @@ -127,7 +127,7 @@ static struct domain *get_global_virq_ha return global_virq_handlers[virq] ?: hardware_domain; } =20 -static bool virq_is_global(unsigned int virq) +static enum virq_type get_virq_type(unsigned int virq) { switch ( virq ) { @@ -135,14 +135,17 @@ static bool virq_is_global(unsigned int case VIRQ_DEBUG: case VIRQ_XENOPROF: case VIRQ_XENPMU: - return false; + return VIRQ_VCPU; + + case VIRQ_ARGO: + return VIRQ_DOMAIN; =20 case VIRQ_ARCH_0 ... VIRQ_ARCH_7: - return arch_virq_is_global(virq); + return arch_get_virq_type(virq); } =20 ASSERT(virq < NR_VIRQS); - return true; + return VIRQ_GLOBAL; } =20 static struct evtchn *_evtchn_from_port(const struct domain *d, @@ -476,7 +479,7 @@ int evtchn_bind_virq(evtchn_bind_virq_t struct domain *d =3D current->domain; int virq =3D bind->virq, vcpu =3D bind->vcpu; int rc =3D 0; - bool is_global; + enum virq_type type; =20 if ( (virq < 0) || (virq >=3D ARRAY_SIZE(v->virq_to_evtchn)) ) return -EINVAL; @@ -486,9 +489,9 @@ int evtchn_bind_virq(evtchn_bind_virq_t * speculative execution. */ virq =3D array_index_nospec(virq, ARRAY_SIZE(v->virq_to_evtchn)); - is_global =3D virq_is_global(virq); + type =3D get_virq_type(virq); =20 - if ( is_global && vcpu !=3D 0 ) + if ( type !=3D VIRQ_VCPU && vcpu !=3D 0 ) return -EINVAL; =20 if ( (v =3D domain_vcpu(d, vcpu)) =3D=3D NULL ) @@ -496,7 +499,7 @@ int evtchn_bind_virq(evtchn_bind_virq_t =20 write_lock(&d->event_lock); =20 - if ( is_global && get_global_virq_handler(virq) !=3D d ) + if ( type =3D=3D VIRQ_GLOBAL && get_global_virq_handler(virq) !=3D d ) { rc =3D -EBUSY; goto out; @@ -756,7 +759,8 @@ int evtchn_close(struct domain *d1, int if ( chn1->u.virq =3D=3D VIRQ_DOM_EXC ) domain_deinit_states(d1); =20 - v =3D d1->vcpu[virq_is_global(chn1->u.virq) ? 0 : chn1->notify_vcp= u_id]; + v =3D d1->vcpu[get_virq_type(chn1->u.virq) !=3D VIRQ_VCPU + ? 0 : chn1->notify_vcpu_id]; =20 write_lock_irqsave(&v->virq_lock, flags); ASSERT(read_atomic(&v->virq_to_evtchn[chn1->u.virq]) =3D=3D port1); @@ -900,7 +904,7 @@ bool evtchn_virq_enabled(const struct vc if ( !v ) return false; =20 - if ( virq_is_global(virq) && v->vcpu_id ) + if ( get_virq_type(virq) !=3D VIRQ_VCPU && v->vcpu_id ) v =3D domain_vcpu(v->domain, 0); =20 return read_atomic(&v->virq_to_evtchn[virq]); @@ -913,7 +917,7 @@ void send_guest_vcpu_virq(struct vcpu *v struct domain *d; struct evtchn *chn; =20 - ASSERT(!virq_is_global(virq)); + ASSERT(get_virq_type(virq) =3D=3D VIRQ_VCPU); =20 read_lock_irqsave(&v->virq_lock, flags); =20 @@ -933,14 +937,14 @@ void send_guest_vcpu_virq(struct vcpu *v read_unlock_irqrestore(&v->virq_lock, flags); } =20 -void send_guest_global_virq(struct domain *d, uint32_t virq) +void send_guest_domain_virq(struct domain *d, uint32_t virq) { unsigned long flags; int port; struct vcpu *v; struct evtchn *chn; =20 - ASSERT(virq_is_global(virq)); + ASSERT(get_virq_type(virq) !=3D VIRQ_VCPU); =20 if ( unlikely(d =3D=3D NULL) || unlikely(d->vcpu =3D=3D NULL) ) return; @@ -995,9 +999,9 @@ static DEFINE_SPINLOCK(global_virq_handl =20 void send_global_virq(uint32_t virq) { - ASSERT(virq_is_global(virq)); + ASSERT(get_virq_type(virq) =3D=3D VIRQ_GLOBAL); =20 - send_guest_global_virq(get_global_virq_handler(virq), virq); + send_guest_domain_virq(get_global_virq_handler(virq), virq); } =20 int set_global_virq_handler(struct domain *d, uint32_t virq) @@ -1008,7 +1012,7 @@ int set_global_virq_handler(struct domai =20 if (virq >=3D NR_VIRQS) return -EINVAL; - if (!virq_is_global(virq)) + if (get_virq_type(virq) !=3D VIRQ_GLOBAL) return -EINVAL; =20 if (global_virq_handlers[virq] =3D=3D d) @@ -1204,7 +1208,7 @@ int evtchn_bind_vcpu(evtchn_port_t port, switch ( chn->state ) { case ECS_VIRQ: - if ( virq_is_global(chn->u.virq) ) + if ( get_virq_type(chn->u.virq) !=3D VIRQ_VCPU ) chn->notify_vcpu_id =3D v->vcpu_id; else rc =3D -EINVAL; --- a/xen/include/xen/event.h +++ b/xen/include/xen/event.h @@ -24,17 +24,17 @@ void send_guest_vcpu_virq(struct vcpu *v, uint32_t virq); =20 /* - * send_global_virq: Notify the domain handling a global VIRQ. - * @virq: Virtual IRQ number (VIRQ_*) + * send_guest_domain_virq: + * @d: Domain to which VIRQ should be sent + * @virq: Virtual IRQ number (VIRQ_*), may not be per-vCPU */ -void send_global_virq(uint32_t virq); +void send_guest_domain_virq(struct domain *d, uint32_t virq); =20 /* - * send_guest_global_virq: - * @d: Domain to which VIRQ should be sent - * @virq: Virtual IRQ number (VIRQ_*), must be global + * send_global_virq: Notify the domain handling a global VIRQ. + * @virq: Virtual IRQ number (VIRQ_*) */ -void send_guest_global_virq(struct domain *d, uint32_t virq); +void send_global_virq(uint32_t virq); =20 /* * sent_global_virq_handler: Set a global VIRQ handler. --- a/xen/include/xen/sched.h +++ b/xen/include/xen/sched.h @@ -84,6 +84,12 @@ extern domid_t hardware_domid; #define XEN_CONSUMER_BITS 3 #define NR_XEN_CONSUMERS ((1 << XEN_CONSUMER_BITS) - 1) =20 +enum virq_type { + VIRQ_GLOBAL, + VIRQ_DOMAIN, + VIRQ_VCPU +}; + struct evtchn { rwlock_t lock;