From patchwork Mon Mar 1 11:53:29 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= X-Patchwork-Id: 12109543 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=-16.6 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT 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 24E28C433DB for ; Mon, 1 Mar 2021 11:56:21 +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 BCC3064E07 for ; Mon, 1 Mar 2021 11:56:20 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org BCC3064E07 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Received: from localhost ([::1]:38434 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lGh9v-0001DV-PZ for qemu-devel@archiver.kernel.org; Mon, 01 Mar 2021 06:56:19 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:34790) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lGh7X-0005l3-6T for qemu-devel@nongnu.org; Mon, 01 Mar 2021 06:53:51 -0500 Received: from us-smtp-delivery-124.mimecast.com ([63.128.21.124]:48547) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1lGh7V-0007aF-IG for qemu-devel@nongnu.org; Mon, 01 Mar 2021 06:53:50 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1614599628; h=from:from:reply-to:subject:subject: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=YDEQgbWck1j5/yNbxcJrrrXZNKuh+ZlCvLLks2REe7U=; b=Uxm5DTqu5vZcABQgy/305nehWAoeQYA68U3kWpHMdRMuz4Tp98f9TLaql14WEqHiqOxvnl I6uToyMqe2NZ/Bv0w/mqDTDiWhWOAU8A74BrEc2/dP9yokmufoJWKdUztFz+5JdGd65sGv cFRNaKfMVyagXsTTNLWDgwHkdKenVGw= Received: from mail-wm1-f70.google.com (mail-wm1-f70.google.com [209.85.128.70]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-564-uBXNX-Y7PICC1uv213w1zA-1; Mon, 01 Mar 2021 06:53:47 -0500 X-MC-Unique: uBXNX-Y7PICC1uv213w1zA-1 Received: by mail-wm1-f70.google.com with SMTP id h16so5519635wmq.8 for ; Mon, 01 Mar 2021 03:53:47 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=YDEQgbWck1j5/yNbxcJrrrXZNKuh+ZlCvLLks2REe7U=; b=ICL6PTWlcPQe2OK86AtLy/wRYqRxBq4caHid2AjFkzVL2z+aEM/qn4yu+jwm1HIHA2 z1AXtfMvQSr+eGA0ig+XGJIO5loH/vocH18bMU97fML272ZDCqBY3DxbAVRVATDZ+YcR RoBvQZv2oTPE7JJ9fdA7eXz0wFeCGC212bgRXHWtdwmPdpRLGXyufAX/yimMCKvpl/Q0 oRU+zlB7XvvPrXKTgt1Hr6BDk/4lpqSOtnx6LZ+LZC9SN6MAxuY3Bd7qBZed9B3r4d1J KvxfD3iZ/Go3HdLV4QyfSuSAdygGxZyEyjRlU5fFsCOdO5+f4aGGDqVbSO2qnMJwtAQU CLVA== X-Gm-Message-State: AOAM532iVzYTlBIwKW+VC1kfk0UoqlyEmrpIw5F7JIwSunhc+N6ZRu1c AFb+NXFxOZ2JP/HtBSiyIGiZ45iNKaVqSZheHfPTGm8yBmKOTTCc4wPOiIUWXQoZ4cnHGhS4Au+ /H1eeUMH5rQOLFCBGNArLTsIUxRgS2MPcy675vOLA0LEnQIt7bPg00XS17xsdWvQ1 X-Received: by 2002:adf:dbc2:: with SMTP id e2mr15629748wrj.227.1614599626145; Mon, 01 Mar 2021 03:53:46 -0800 (PST) X-Google-Smtp-Source: ABdhPJyYt96kuiaD+I9OlJAtRoODtoD2cQgKW9T0gdObGflo+M2HoBYw/4GoXiI6mLOXJ//naYaVVQ== X-Received: by 2002:adf:dbc2:: with SMTP id e2mr15629719wrj.227.1614599625982; Mon, 01 Mar 2021 03:53:45 -0800 (PST) Received: from x1w.redhat.com (68.red-83-57-175.dynamicip.rima-tde.net. [83.57.175.68]) by smtp.gmail.com with ESMTPSA id z11sm22420878wmf.28.2021.03.01.03.53.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 01 Mar 2021 03:53:45 -0800 (PST) From: =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= To: qemu-devel@nongnu.org, David Edmondson Subject: [RFC PATCH v2 3/3] hw/block/pflash: use memory_region_init_rom_device_from_file() Date: Mon, 1 Mar 2021 12:53:29 +0100 Message-Id: <20210301115329.411762-4-philmd@redhat.com> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210301115329.411762-1-philmd@redhat.com> References: <20210301115329.411762-1-philmd@redhat.com> MIME-Version: 1.0 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=philmd@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Received-SPF: pass client-ip=63.128.21.124; envelope-from=philmd@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -30 X-Spam_score: -3.1 X-Spam_bar: --- X-Spam_report: (-3.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.248, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H4=-0.01, RCVD_IN_MSPIKE_WL=-0.01, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham 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: Kevin Wolf , qemu-block@nongnu.org, Xu Yandong , Markus Armbruster , Max Reitz , haibinzhang , Stefan Hajnoczi , Paolo Bonzini , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Stefano Garzarella Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" If the block drive is read-only we will model a "protected" flash device. We can thus use memory_region_init_rom_device_from_file() which mmap the backing file when creating the MemoryRegion. If the same backing file is used by multiple QEMU instances, this reduces the memory footprint (this is often the case with the CODE flash image from OVMF and AAVMF). Suggested-by: Stefan Hajnoczi Signed-off-by: Philippe Mathieu-Daudé --- hw/block/pflash_cfi01.c | 39 +++++++++++++++++++++++++++++++-------- 1 file changed, 31 insertions(+), 8 deletions(-) diff --git a/hw/block/pflash_cfi01.c b/hw/block/pflash_cfi01.c index a5fa8d8b74a..ec290636298 100644 --- a/hw/block/pflash_cfi01.c +++ b/hw/block/pflash_cfi01.c @@ -702,6 +702,7 @@ static void pflash_cfi01_realize(DeviceState *dev, Error **errp) int ret; uint64_t blocks_per_device, sector_len_per_device, device_len; int num_devices; + bool romd_mr_shared_mapped; if (pfl->sector_len == 0) { error_setg(errp, "attribute \"sector-length\" not specified or zero."); @@ -743,19 +744,41 @@ static void pflash_cfi01_realize(DeviceState *dev, Error **errp) pfl->ro = 0; } - memory_region_init_rom_device( - &pfl->mem, OBJECT(dev), - &pflash_cfi01_ops, - pfl, - pfl->name, total_len, errp); - if (*errp) { - return; + if (pfl->ro && pfl->blk) { + BlockDriverState *bs = blk_bs(pfl->blk); + + /* If "raw" driver used, try to mmap the backing file as RAM_SHARED */ + if (bs->drv == &bdrv_raw) { /* FIXME check offset=0 ? */ + Error *local_err = NULL; + + memory_region_init_rom_device_from_file(&pfl->mem, OBJECT(dev), + &pflash_cfi01_ops, pfl, + pfl->name, total_len, + qemu_real_host_page_size, + RAM_SHARED, + bs->exact_filename, + true, &local_err); + if (local_err) { + error_report_err(local_err); + /* fall back to memory_region_init_rom_device() */ + } else { + romd_mr_shared_mapped = true; + } + } + } + if (!romd_mr_shared_mapped) { + memory_region_init_rom_device(&pfl->mem, OBJECT(dev), + &pflash_cfi01_ops, pfl, + pfl->name, total_len, errp); + if (*errp) { + return; + } } pfl->storage = memory_region_get_ram_ptr(&pfl->mem); sysbus_init_mmio(SYS_BUS_DEVICE(dev), &pfl->mem); - if (pfl->blk) { + if (pfl->blk && !romd_mr_shared_mapped) { if (!blk_check_size_and_read_all(pfl->blk, pfl->storage, total_len, errp)) { vmstate_unregister_ram(&pfl->mem, DEVICE(pfl));