Received: by 2002:a05:6a10:8c0a:0:0:0:0 with SMTP id go10csp1536797pxb; Mon, 22 Feb 2021 04:46:32 -0800 (PST) X-Google-Smtp-Source: ABdhPJzwhaFzKthveVA5Jzar3j47/6EAXikaNbvg5PFYWqmehhJhHg1//AXH6nagB6JsJ6eWd3l+ X-Received: by 2002:a17:906:1944:: with SMTP id b4mr20599322eje.342.1613997992020; Mon, 22 Feb 2021 04:46:32 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1613997992; cv=none; d=google.com; s=arc-20160816; b=NoptE59KHxvDI6KMuTuU9HebUUZMTcxeJXZYnaRcefXvfSQywnzUkjNOjooHUxzhat WhbadmAHoAiscFZzpQAncfTS5L7q0BLH84UTzrKbOGieqxlTrPmr3dwVI+G9PhayIbtT g2vB+JKJypB++0+eY7D9akcA3tuNYdcwYHEJOZh3ymyP7KnCaXcSNBYOeY7oYHnZ3UGP bpTGlvTw5PFxz4yHPFaGVLupLvUfU9qLvkT/01Qy0iSpGAP8Kj0bGEJn52OUIg1WDHlu k/dI/lJqNPyf9Nr53TYbe7idOHHPPkf87G7Hi08UImLwiA+x5FzxOukAffAgo2ngY6le d9AQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=WViap2hOa22GL4bCVARaoNZpYMja9ogcVBRTQozYL3Q=; b=Jmed7b+OAxgcqFlilR2u7NS6PDCg3lfPKrUREzBZnUafum/qMIKRjNv09fhZalfcn+ lJWibM2No+qWdWYPCQx5Ir5sng9i4aC47zNjaIJnC3lQ83gngzdxVuBXyVDDJcHzwaoA YdFMQ8w8+KrbsO9lB1raIYlc8epY84nI9iq5ZzkwYPxipInhvM57Y5bWY7d1BM5K84V4 5z3OzCpj4Shb6U8J5J8Xhtjl222EAbHFQ4rRxBTVCQQxkX0z9620+Z1sIv9hIc1Dmhin 75TbX/upXC9hUB6zPTG/8Sib7iC/H9ggeyXTFnqmf2Qh78T5V58AP3hbuN+uhG/3uHfn Dmxg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=1aDYtFiG; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id gt36si11104865ejc.57.2021.02.22.04.46.08; Mon, 22 Feb 2021 04:46:32 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=1aDYtFiG; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231484AbhBVMnG (ORCPT + 99 others); Mon, 22 Feb 2021 07:43:06 -0500 Received: from mail.kernel.org ([198.145.29.99]:45330 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230512AbhBVMRn (ORCPT ); Mon, 22 Feb 2021 07:17:43 -0500 Received: by mail.kernel.org (Postfix) with ESMTPSA id D99E864EEF; Mon, 22 Feb 2021 12:17:14 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1613996235; bh=x1TDe9erTg54ZM3B6yYQ0q+JZrFVklgtnTGsQT92Pbs=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=1aDYtFiGYHU6PkAUNSpm3rFXBmMaEbpEiCka3LRRZXlFPR7Qr6abas3MQrqgZpQvc oFU8LrfWG9jXwqKfGqFBIt6iqBM/F7nfAQs33ZxW801PmFd6BY3WqsY+ot7Z8Aw694 q58rR1ZRXM/IXYQiNS21sD1fNzX+nkxAwfumDQRY= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Jan Beulich , Stefano Stabellini , Juergen Gross Subject: [PATCH 4.19 42/50] Xen/gntdev: correct dev_bus_addr handling in gntdev_map_grant_pages() Date: Mon, 22 Feb 2021 13:13:33 +0100 Message-Id: <20210222121026.761771047@linuxfoundation.org> X-Mailer: git-send-email 2.30.1 In-Reply-To: <20210222121019.925481519@linuxfoundation.org> References: <20210222121019.925481519@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Jan Beulich commit dbe5283605b3bc12ca45def09cc721a0a5c853a2 upstream. We may not skip setting the field in the unmap structure when GNTMAP_device_map is in use - such an unmap would fail to release the respective resources (a page ref in the hypervisor). Otoh the field doesn't need setting at all when GNTMAP_device_map is not in use. To record the value for unmapping, we also better don't use our local p2m: In particular after a subsequent change it may not have got updated for all the batch elements. Instead it can simply be taken from the respective map's results. We can additionally avoid playing this game altogether for the kernel part of the mappings in (x86) PV mode. This is part of XSA-361. Signed-off-by: Jan Beulich Cc: stable@vger.kernel.org Reviewed-by: Stefano Stabellini Signed-off-by: Juergen Gross Signed-off-by: Greg Kroah-Hartman --- drivers/xen/gntdev.c | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) --- a/drivers/xen/gntdev.c +++ b/drivers/xen/gntdev.c @@ -323,18 +323,25 @@ int gntdev_map_grant_pages(struct gntdev * to the kernel linear addresses of the struct pages. * These ptes are completely different from the user ptes dealt * with find_grant_ptes. + * Note that GNTMAP_device_map isn't needed here: The + * dev_bus_addr output field gets consumed only from ->map_ops, + * and by not requesting it when mapping we also avoid needing + * to mirror dev_bus_addr into ->unmap_ops (and holding an extra + * reference to the page in the hypervisor). */ + unsigned int flags = (map->flags & ~GNTMAP_device_map) | + GNTMAP_host_map; + for (i = 0; i < map->count; i++) { unsigned long address = (unsigned long) pfn_to_kaddr(page_to_pfn(map->pages[i])); BUG_ON(PageHighMem(map->pages[i])); - gnttab_set_map_op(&map->kmap_ops[i], address, - map->flags | GNTMAP_host_map, + gnttab_set_map_op(&map->kmap_ops[i], address, flags, map->grants[i].ref, map->grants[i].domid); gnttab_set_unmap_op(&map->kunmap_ops[i], address, - map->flags | GNTMAP_host_map, -1); + flags, -1); } } @@ -350,17 +357,12 @@ int gntdev_map_grant_pages(struct gntdev continue; } + if (map->flags & GNTMAP_device_map) + map->unmap_ops[i].dev_bus_addr = map->map_ops[i].dev_bus_addr; + map->unmap_ops[i].handle = map->map_ops[i].handle; if (use_ptemod) map->kunmap_ops[i].handle = map->kmap_ops[i].handle; -#ifdef CONFIG_XEN_GRANT_DMA_ALLOC - else if (map->dma_vaddr) { - unsigned long bfn; - - bfn = pfn_to_bfn(page_to_pfn(map->pages[i])); - map->unmap_ops[i].dev_bus_addr = __pfn_to_phys(bfn); - } -#endif } return err; }