From patchwork Fri May 7 16:59:01 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Greg Kurz X-Patchwork-Id: 12244959 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=-8.8 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE, SPF_PASS 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 86587C433B4 for ; Fri, 7 May 2021 17:01:16 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (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 9C15A61460 for ; Fri, 7 May 2021 17:01:15 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 9C15A61460 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=kaod.org Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Received: from localhost ([::1]:52386 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lf3qk-0008NM-DK for qemu-devel@archiver.kernel.org; Fri, 07 May 2021 13:01:14 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:41374) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lf3p1-0006rn-1V for qemu-devel@nongnu.org; Fri, 07 May 2021 12:59:28 -0400 Received: from us-smtp-delivery-44.mimecast.com ([207.211.30.44]:34624) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lf3oy-0005Bh-FB for qemu-devel@nongnu.org; Fri, 07 May 2021 12:59:26 -0400 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-327-CUGJQW_EOQyR9Z9M2ne9CQ-1; Fri, 07 May 2021 12:59:20 -0400 X-MC-Unique: CUGJQW_EOQyR9Z9M2ne9CQ-1 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 75E4D8015F5; Fri, 7 May 2021 16:59:19 +0000 (UTC) Received: from bahia.redhat.com (ovpn-112-195.ams2.redhat.com [10.36.112.195]) by smtp.corp.redhat.com (Postfix) with ESMTP id D2F9F10023AF; Fri, 7 May 2021 16:59:06 +0000 (UTC) From: Greg Kurz To: qemu-devel@nongnu.org Subject: [PATCH v2 0/4] virtio: Improve boot time of virtio-scsi-pci and virtio-blk-pci Date: Fri, 7 May 2021 18:59:01 +0200 Message-Id: <20210507165905.748196-1-groug@kaod.org> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=groug@kaod.org X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: kaod.org Received-SPF: softfail client-ip=207.211.30.44; envelope-from=groug@kaod.org; helo=us-smtp-delivery-44.mimecast.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_DNSWL_LOW=-0.7, SPF_HELO_NONE=0.001, SPF_SOFTFAIL=0.665 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Fam Zheng , Kevin Wolf , qemu-block@nongnu.org, "Michael S. Tsirkin" , Greg Kurz , Max Reitz , Stefan Hajnoczi , Paolo Bonzini , David Gibson Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" Now that virtio-scsi-pci and virtio-blk-pci map 1 virtqueue per vCPU, a serious slow down may be observed on setups with a big enough number of vCPUs. Exemple with a pseries guest on a bi-POWER9 socket system (128 HW threads): virtio-scsi virtio-blk 1 0m20.922s 0m21.346s 2 0m21.230s 0m20.350s 4 0m21.761s 0m20.997s 8 0m22.770s 0m20.051s 16 0m22.038s 0m19.994s 32 0m22.928s 0m20.803s 64 0m26.583s 0m22.953s 128 0m41.273s 0m32.333s 256 2m4.727s 1m16.924s 384 6m5.563s 3m26.186s Both perf and gprof indicate that QEMU is hogging CPUs when setting up the ioeventfds: 67.88% swapper [kernel.kallsyms] [k] power_pmu_enable 9.47% qemu-kvm [kernel.kallsyms] [k] smp_call_function_single 8.64% qemu-kvm [kernel.kallsyms] [k] power_pmu_enable =>2.79% qemu-kvm qemu-kvm [.] memory_region_ioeventfd_before =>2.12% qemu-kvm qemu-kvm [.] address_space_update_ioeventfds 0.56% kworker/8:0-mm [kernel.kallsyms] [k] smp_call_function_single address_space_update_ioeventfds() is called when committing an MR transaction, i.e. for each ioeventfd with the current code base, and it internally loops on all ioventfds: static void address_space_update_ioeventfds(AddressSpace *as) { [...] FOR_EACH_FLAT_RANGE(fr, view) { for (i = 0; i < fr->mr->ioeventfd_nb; ++i) { This means that the setup of ioeventfds for these devices has quadratic time complexity. This series simply changes the device models to extend the transaction to all virtqueueues, like already done in the past in the generic code with 710fccf80d78 ("virtio: improve virtio devices initialization time"). Only virtio-scsi and virtio-blk are covered here, but a similar change might also be beneficial to other device types such as host-scsi-pci, vhost-user-scsi-pci and vhost-user-blk-pci. virtio-scsi virtio-blk 1 0m21.271s 0m22.076s 2 0m20.912s 0m19.716s 4 0m20.508s 0m19.310s 8 0m21.374s 0m20.273s 16 0m21.559s 0m21.374s 32 0m22.532s 0m21.271s 64 0m26.550s 0m22.007s 128 0m29.115s 0m27.446s 256 0m44.752s 0m41.004s 384 1m2.884s 0m58.023s This should fix https://bugzilla.redhat.com/show_bug.cgi?id=1927108 which reported the issue for virtio-scsi-pci. Changes since v1: - Add some comments (Stefan) - Drop optimization on the error path in patch 2 (Stefan) Changes since RFC: As suggested by Stefan, splimplify the code by directly beginning and committing the memory transaction from the device model, without all the virtio specific proxying code and no changes needed in the memory subsystem. Greg Kurz (4): virtio-blk: Fix rollback path in virtio_blk_data_plane_start() virtio-blk: Configure all host notifiers in a single MR transaction virtio-scsi: Set host notifiers and callbacks separately virtio-scsi: Configure all host notifiers in a single MR transaction hw/block/dataplane/virtio-blk.c | 45 ++++++++++++++++++++- hw/scsi/virtio-scsi-dataplane.c | 72 ++++++++++++++++++++++++--------- 2 files changed, 97 insertions(+), 20 deletions(-)