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=-9.6 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED 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 87CD4C433E7 for ; Tue, 20 Oct 2020 10:52:30 +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 04FB0222C8 for ; Tue, 20 Oct 2020 10:52:29 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="pZ59wM4N" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 04FB0222C8 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.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.9085.24428 (Exim 4.92) (envelope-from ) id 1kUpFN-0008Ps-GN; Tue, 20 Oct 2020 10:52:05 +0000 X-Outflank-Mailman: Message body and most headers restored to incoming version Received: by outflank-mailman (output) from mailman id 9085.24428; Tue, 20 Oct 2020 10:52:05 +0000 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" Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1kUpFN-0008Pl-D7; Tue, 20 Oct 2020 10:52:05 +0000 Received: by outflank-mailman (input) for mailman id 9085; Tue, 20 Oct 2020 10:52:03 +0000 Received: from us1-rack-iad1.inumbo.com ([172.99.69.81]) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1kUpFL-0008Pg-L7 for xen-devel@lists.xenproject.org; Tue, 20 Oct 2020 10:52:03 +0000 Received: from mail-ej1-x643.google.com (unknown [2a00:1450:4864:20::643]) by us1-rack-iad1.inumbo.com (Halon) with ESMTPS id 3b3c36b7-642d-4890-9e05-dfde22723f77; Tue, 20 Oct 2020 10:52:02 +0000 (UTC) Received: by mail-ej1-x643.google.com with SMTP id x7so1972147eje.8 for ; Tue, 20 Oct 2020 03:52:02 -0700 (PDT) Received: from CBGR90WXYV0 (54-240-197-238.amazon.com. [54.240.197.238]) by smtp.gmail.com with ESMTPSA id yz15sm2130137ejb.9.2020.10.20.03.51.59 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Tue, 20 Oct 2020 03:52:00 -0700 (PDT) Received: from us1-rack-iad1.inumbo.com ([172.99.69.81]) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1kUpFL-0008Pg-L7 for xen-devel@lists.xenproject.org; Tue, 20 Oct 2020 10:52:03 +0000 X-Inumbo-ID: 3b3c36b7-642d-4890-9e05-dfde22723f77 Received: from mail-ej1-x643.google.com (unknown [2a00:1450:4864:20::643]) by us1-rack-iad1.inumbo.com (Halon) with ESMTPS id 3b3c36b7-642d-4890-9e05-dfde22723f77; Tue, 20 Oct 2020 10:52:02 +0000 (UTC) Received: by mail-ej1-x643.google.com with SMTP id x7so1972147eje.8 for ; Tue, 20 Oct 2020 03:52:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:reply-to:to:cc:references:in-reply-to:subject:date:message-id :mime-version:content-transfer-encoding:thread-index :content-language; bh=N9snk6wIxMy2vhViaLw1HdAzvnXDeCoIdpd888YMbN0=; b=pZ59wM4N3SxMPd4qf++rEbaom9ltWVJy55cGIrNG2eXy5MjNIkwvWfWpGQRq68c21B hH/ATinVvMCjuzh1nbfaUqL5aIHEZOoub3hwyRrRHyz8Bri7DYs83MiYLueOCwGYG6xD ir0ZRGDV9t3eAEO30MdZ88QBYVdFQC/TmKfa4naaaBmPaQqD/e1zypLLJCZIRp0hNhXZ cdvklksUdM9JocOQ86WUWXscR7B9FGA6Fk62xB6vvVQILUetstZ/8Jf/JCXRq35cyM3U E9erblTm6MlvooUHORpIzWw/7iRr09ldJn3EIaZDxuRfWYKjsu7dO19s2T6X3EL+6jz1 yO2A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:reply-to:to:cc:references:in-reply-to :subject:date:message-id:mime-version:content-transfer-encoding :thread-index:content-language; bh=N9snk6wIxMy2vhViaLw1HdAzvnXDeCoIdpd888YMbN0=; b=gO22N3KsWBFyuQjW/EWz5KGlSPkk3fYrqpuFwSP6wSuGLc1z7Be1Pe8v+GqIhWLwrb 0Ni0OdN+7ttRIcSyJo/O7S/niXgxmk55DfDZI5eayOJk56ZottAbFgaUE8tLSWE+O0el VWdcOdxK+PeZUx9ki09fHE2sjCWLi8F+cQ58VJJaII3cPO88UPWA3xezpz42WE/Gb72i D5hck6f2Iz0Myk9h908/BqEeCL857pF4+VNSdZXZAVlKUKafSnqn/lr9FM48KuJSQ6SC RbEgcnc8QnkNiFRE5Daq2yvOYT2AdDkkT6EP7KlZKtr/Jq1/jlj8IBxFac4SxSGOn8T4 5/IA== X-Gm-Message-State: AOAM531+Kegg47/bHYYvDdB/6njUDl1jjuDI3C+gB5wYXEopQBgvloyJ 05SsZfXdXjOJ/13cevJMaBs= X-Google-Smtp-Source: ABdhPJxQ1TijZUERYfNl3SFDtw1yyNsIxuQHXTZpxMfmqctzj3EFwVrzPaEEEEp3VZTEBU7a38+kgw== X-Received: by 2002:a17:906:364f:: with SMTP id r15mr2448472ejb.388.1603191121414; Tue, 20 Oct 2020 03:52:01 -0700 (PDT) Received: from CBGR90WXYV0 (54-240-197-238.amazon.com. [54.240.197.238]) by smtp.gmail.com with ESMTPSA id yz15sm2130137ejb.9.2020.10.20.03.51.59 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Tue, 20 Oct 2020 03:52:00 -0700 (PDT) From: Paul Durrant X-Google-Original-From: "Paul Durrant" Reply-To: To: "'Oleksandr Tyshchenko'" , Cc: "'Oleksandr Tyshchenko'" , "'Stefano Stabellini'" , "'Julien Grall'" , "'Volodymyr Babchuk'" , "'Andrew Cooper'" , "'George Dunlap'" , "'Ian Jackson'" , "'Jan Beulich'" , "'Wei Liu'" , "'Julien Grall'" References: <1602780274-29141-1-git-send-email-olekstysh@gmail.com> <1602780274-29141-18-git-send-email-olekstysh@gmail.com> In-Reply-To: <1602780274-29141-18-git-send-email-olekstysh@gmail.com> Subject: RE: [PATCH V2 17/23] xen/ioreq: Introduce domain_has_ioreq_server() Date: Tue, 20 Oct 2020 11:51:59 +0100 Message-ID: <004e01d6a6cf$09cd9f40$1d68ddc0$@xen.org> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit X-Mailer: Microsoft Outlook 16.0 Thread-Index: AQFqp5MaNUj6MKEiN9RM6S6pfA5bVAGr5WYaqmrtRJA= Content-Language: en-gb > -----Original Message----- > From: Oleksandr Tyshchenko > Sent: 15 October 2020 17:44 > To: xen-devel@lists.xenproject.org > Cc: Oleksandr Tyshchenko ; Stefano Stabellini ; > Julien Grall ; Volodymyr Babchuk ; Andrew Cooper > ; George Dunlap ; Ian Jackson > ; Jan Beulich ; Wei Liu ; Paul Durrant > ; Julien Grall > Subject: [PATCH V2 17/23] xen/ioreq: Introduce domain_has_ioreq_server() > > From: Oleksandr Tyshchenko > > This patch introduces a helper the main purpose of which is to check > if a domain is using IOREQ server(s). > > On Arm the current benefit is to avoid calling handle_io_completion() > (which implies iterating over all possible IOREQ servers anyway) > on every return in leave_hypervisor_to_guest() if there is no active > servers for the particular domain. > Also this helper will be used by one of the subsequent patches on Arm. > > This involves adding an extra per-domain variable to store the count > of servers in use. > > Signed-off-by: Oleksandr Tyshchenko > CC: Julien Grall > > --- > Please note, this is a split/cleanup/hardening of Julien's PoC: > "Add support for Guest IO forwarding to a device emulator" > > Changes RFC -> V1: > - new patch > > Changes V1 -> V2: > - update patch description > - guard helper with CONFIG_IOREQ_SERVER > - remove "hvm" prefix > - modify helper to just return d->arch.hvm.ioreq_server.nr_servers > - put suitable ASSERT()s > - use ASSERT(d->ioreq_server.server[id] ? !s : !!s) in set_ioreq_server() > - remove d->ioreq_server.nr_servers = 0 from hvm_ioreq_init() > --- > xen/arch/arm/traps.c | 15 +++++++++------ > xen/common/ioreq.c | 7 ++++++- > xen/include/xen/ioreq.h | 14 ++++++++++++++ > xen/include/xen/sched.h | 1 + > 4 files changed, 30 insertions(+), 7 deletions(-) > > diff --git a/xen/arch/arm/traps.c b/xen/arch/arm/traps.c > index 507c095..a8f5fdf 100644 > --- a/xen/arch/arm/traps.c > +++ b/xen/arch/arm/traps.c > @@ -2261,14 +2261,17 @@ static bool check_for_vcpu_work(void) > struct vcpu *v = current; > > #ifdef CONFIG_IOREQ_SERVER > - bool handled; > + if ( domain_has_ioreq_server(v->domain) ) > + { > + bool handled; > > - local_irq_enable(); > - handled = handle_io_completion(v); > - local_irq_disable(); > + local_irq_enable(); > + handled = handle_io_completion(v); > + local_irq_disable(); > > - if ( !handled ) > - return true; > + if ( !handled ) > + return true; > + } > #endif > > if ( likely(!v->arch.need_flush_to_ram) ) > diff --git a/xen/common/ioreq.c b/xen/common/ioreq.c > index bcd4961..a72bc0e 100644 > --- a/xen/common/ioreq.c > +++ b/xen/common/ioreq.c > @@ -39,9 +39,14 @@ static void set_ioreq_server(struct domain *d, unsigned int id, > struct ioreq_server *s) > { > ASSERT(id < MAX_NR_IOREQ_SERVERS); > - ASSERT(!s || !d->ioreq_server.server[id]); > + ASSERT(d->ioreq_server.server[id] ? !s : !!s); That looks odd. How about ASSERT(!s ^ !d->ioreq_server.server[id])? Paul > > d->ioreq_server.server[id] = s; > + > + if ( s ) > + d->ioreq_server.nr_servers++; > + else > + d->ioreq_server.nr_servers--; > } > > #define GET_IOREQ_SERVER(d, id) \ > diff --git a/xen/include/xen/ioreq.h b/xen/include/xen/ioreq.h > index 7b03ab5..0679fef 100644 > --- a/xen/include/xen/ioreq.h > +++ b/xen/include/xen/ioreq.h > @@ -55,6 +55,20 @@ struct ioreq_server { > uint8_t bufioreq_handling; > }; > > +#ifdef CONFIG_IOREQ_SERVER > +static inline bool domain_has_ioreq_server(const struct domain *d) > +{ > + ASSERT((current->domain == d) || atomic_read(&d->pause_count)); > + This seems like an odd place to put such an assertion. > + return d->ioreq_server.nr_servers; > +} > +#else > +static inline bool domain_has_ioreq_server(const struct domain *d) > +{ > + return false; > +} > +#endif > + Can this be any more compact? E.g. return IS_ENABLED(CONFIG_IOREQ_SERVER) && d->ioreq_server.nr_servers; ? > struct ioreq_server *get_ioreq_server(const struct domain *d, > unsigned int id); > > diff --git a/xen/include/xen/sched.h b/xen/include/xen/sched.h > index f9ce14c..290cddb 100644 > --- a/xen/include/xen/sched.h > +++ b/xen/include/xen/sched.h > @@ -553,6 +553,7 @@ struct domain > struct { > spinlock_t lock; > struct ioreq_server *server[MAX_NR_IOREQ_SERVERS]; > + unsigned int nr_servers; > } ioreq_server; > #endif > }; > -- > 2.7.4