From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-12.3 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH, MAILING_LIST_MULTI,NICE_REPLY_A,SPF_HELO_NONE,SPF_PASS,USER_AGENT_SANE_1 autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 3D490C433B4 for ; Wed, 7 Apr 2021 15:19:38 +0000 (UTC) Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id F384361222 for ; Wed, 7 Apr 2021 15:19:37 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org F384361222 Authentication-Results: mail.kernel.org; dmarc=fail (p=quarantine dis=none) header.from=suse.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=xen-devel-bounces@lists.xenproject.org Received: from list by lists.xenproject.org with outflank-mailman.106757.204122 (Exim 4.92) (envelope-from ) id 1lU9xW-0004ZD-MU; Wed, 07 Apr 2021 15:19:10 +0000 X-Outflank-Mailman: Message body and most headers restored to incoming version Received: by outflank-mailman (output) from mailman id 106757.204122; Wed, 07 Apr 2021 15:19:10 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1lU9xW-0004Z6-Hx; Wed, 07 Apr 2021 15:19:10 +0000 Received: by outflank-mailman (input) for mailman id 106757; Wed, 07 Apr 2021 15:19:09 +0000 Received: from all-amaz-eas1.inumbo.com ([34.197.232.57] helo=us1-amaz-eas2.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1lU9xV-0004Z1-Ev for xen-devel@lists.xenproject.org; Wed, 07 Apr 2021 15:19:09 +0000 Received: from mx2.suse.de (unknown [195.135.220.15]) by us1-amaz-eas2.inumbo.com (Halon) with ESMTPS id 087ffc5a-fb8d-4dda-b637-5da2f28a23cb; Wed, 07 Apr 2021 15:19:08 +0000 (UTC) Received: from relay2.suse.de (unknown [195.135.221.27]) by mx2.suse.de (Postfix) with ESMTP id 54740B166; Wed, 7 Apr 2021 15:19:07 +0000 (UTC) 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: 087ffc5a-fb8d-4dda-b637-5da2f28a23cb X-Virus-Scanned: by amavisd-new at test-mx.suse.de DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=susede1; t=1617808747; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=smC/S1KIKYAb/PZDexjTRT4X2DWdjUvdDeqpVkTO6kI=; b=fViEUPZbM6QgII2QIOfrEogKaUJ49q5AiFD80Y+ewT7u7SqB46Ye/n7EjQYVy1SjPM6Y1X QoMpxsicaIqRAN1FwEqNLf2Y1rmf+iJY/GRieJIAb3hYJvStVDRMRB2xANU9CNzwzUkZvx BGy71IhFNyOJ79pr8+qEZs1FBvQBxmQ= Subject: Re: [PATCH v3 05/11] x86/vioapic: switch to use the EOI callback mechanism To: Roger Pau Monne Cc: Andrew Cooper , Wei Liu , xen-devel@lists.xenproject.org References: <20210331103303.79705-1-roger.pau@citrix.com> <20210331103303.79705-6-roger.pau@citrix.com> From: Jan Beulich Message-ID: Date: Wed, 7 Apr 2021 17:19:06 +0200 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Thunderbird/78.9.0 MIME-Version: 1.0 In-Reply-To: <20210331103303.79705-6-roger.pau@citrix.com> Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 7bit On 31.03.2021 12:32, Roger Pau Monne wrote: > --- a/xen/arch/x86/hvm/vioapic.c > +++ b/xen/arch/x86/hvm/vioapic.c > @@ -394,6 +394,50 @@ static const struct hvm_mmio_ops vioapic_mmio_ops = { > .write = vioapic_write > }; > > +static void eoi_callback(unsigned int vector, void *data) > +{ > + struct domain *d = current->domain; > + struct hvm_irq *hvm_irq = hvm_domain_irq(d); > + unsigned int i; > + > + ASSERT(has_vioapic(d)); On the same grounds on which you dropped checks from hvm_dpci_msi_eoi() in the previous patch you could imo now drop this assertion. > @@ -621,7 +624,43 @@ static int ioapic_load(struct domain *d, hvm_domain_context_t *h) > d->arch.hvm.nr_vioapics != 1 ) > return -EOPNOTSUPP; > > - return hvm_load_entry(IOAPIC, h, &s->domU); > + rc = hvm_load_entry(IOAPIC, h, &s->domU); > + if ( rc ) > + return rc; > + > + for ( i = 0; i < ARRAY_SIZE(s->domU.redirtbl); i++ ) > + { > + const union vioapic_redir_entry *ent = &s->domU.redirtbl[i]; > + unsigned int vector = ent->fields.vector; > + unsigned int delivery_mode = ent->fields.delivery_mode; > + struct vcpu *v; > + > + /* > + * Add a callback for each possible vector injected by a redirection > + * entry. > + */ > + if ( vector < 16 || !ent->fields.remote_irr || > + (delivery_mode != dest_LowestPrio && delivery_mode != dest_Fixed) ) > + continue; > + > + for_each_vcpu ( d, v ) > + { > + struct vlapic *vlapic = vcpu_vlapic(v); > + > + /* > + * NB: if the vlapic registers were restored before the vio-apic > + * ones we could test whether the vector is set in the vlapic IRR > + * or ISR registers before unconditionally setting the callback. > + * This is harmless as eoi_callback is capable of dealing with > + * spurious callbacks. > + */ > + if ( vlapic_match_dest(vlapic, NULL, 0, ent->fields.dest_id, > + ent->fields.dest_mode) ) > + vlapic_set_callback(vlapic, vector, eoi_callback, NULL); eoi_callback()'s behavior is only one of the aspects to consider here. The other is vlapic_set_callback()'s complaining if it finds a callback already set. What guarantees that a mistakenly set callback here won't get in conflict with some future use of the same vector by the guest? And btw - like in the earlier patch you could again pass d instead of NULL here, avoiding the need to establish it from current in the callback. > --- a/xen/arch/x86/hvm/vlapic.c > +++ b/xen/arch/x86/hvm/vlapic.c > @@ -192,7 +192,13 @@ void vlapic_set_irq_callback(struct vlapic *vlapic, uint8_t vec, uint8_t trig, > > if ( hvm_funcs.update_eoi_exit_bitmap ) > alternative_vcall(hvm_funcs.update_eoi_exit_bitmap, target, vec, > - trig || callback); > + /* > + * NB: need to explicitly convert to boolean to avoid > + * truncation wrongly result in false begin reported > + * for example when the pointer sits on a page > + * boundary. > + */ > + !!callback); I've had quite a bit of difficulty with the comment. Once I realized that you likely mean "being" instead of "begin" it got a bit better. I'd like to suggest also s/result/resulting/, a comma after "reported", and maybe then s/being reported/getting passed/. As to explicitly converting to bool, wouldn't a cast to bool do? That's more explicitly an "explicit conversion" than using !!. Jan