Received: by 2002:a25:86ce:0:0:0:0:0 with SMTP id y14csp2186660ybm; Thu, 23 May 2019 12:47:36 -0700 (PDT) X-Google-Smtp-Source: APXvYqwwYv9Z+doPeX7DG8cYxqkgi5d7mjbQH2p6cf2Pwe6maBf9Bfeg0qdGcgrYTmG6aNOoLkpB X-Received: by 2002:a17:902:5989:: with SMTP id p9mr20064553pli.179.1558640856039; Thu, 23 May 2019 12:47:36 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1558640856; cv=none; d=google.com; s=arc-20160816; b=Z8CvI0j8IJLhminO09Q7DI6HeixnKWEafglOMjPwkDcZO0Kgj3bnq7AZrf7NaXejTg 9H8GcEYzkgceaxghX10682rXki4bVFVAyY/cUm8mo7wvWu4FwrNnkYi8hLqJQ/ypWWUl VivIyiyeNcgJYdwh+P8zgilF3O5ZbzIu3tETeXfsY7qa7rX9SDX1Aa59gKn1uHcjhg0e 5F40uWAxfeqejPyzUVz1IoHx7UcQdAs5vAzmzFqJIGX8vX98MRSN3y4SlDYU7tj2eXiN KvNhvKfyPjTCdmt7ta5HCPkfer0L+/txJDZJ8M6UVGiN8Tv7/HwlMx+YmaKg2n/fQan6 k/lg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=x/3tNAnusQeVPgj5I+7u4y2d96+N9FDe1eXN7BRW2Dc=; b=iPxbuEUk3en5PxSJdlPgEuKJbXoj4o8EwAL0zg4m0WJHOsOLGQiKp4vkfYtXYjM+zT BFf4xlyiGRXdqzH7fa/hMhPE81QGahku7YTgwxzzS/h2W6KzcScr7EzaiIIFFFwpBwxq 7bRCgaOLDvoEEo4xiAKvaYS6w8CUBb/QTuSjW9SYgvOroQ1nXzUAawRYnruJixMwocdC sdmI7eebjPtN9ijtQwEuIKU/yb0RuyukalMqoQEWOCWQ87sThWSPFt5lznTWat4NdhaR QbNGMu7Vw6F9W17pdVk9nCBKpv+M6HD56+Lxj1R8EaUdQnbzQihKNgllH6X1NibK79Z/ kHzQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=qwAh5nsu; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id k15si537988pgh.331.2019.05.23.12.47.20; Thu, 23 May 2019 12:47:36 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=qwAh5nsu; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2389216AbfEWTQg (ORCPT + 99 others); Thu, 23 May 2019 15:16:36 -0400 Received: from mail.kernel.org ([198.145.29.99]:51236 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2389204AbfEWTQc (ORCPT ); Thu, 23 May 2019 15:16:32 -0400 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 85EAA2133D; Thu, 23 May 2019 19:16:31 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1558638992; bh=RiW2IQDV7rzyoBS0G8Gn9wdxSFA5At/oRHCRjO2mdbA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=qwAh5nsuSqTePULHJ6lceVTiKJ5MMfV1FY6USDsQ1LL9IdpnKGgVedhhUCKAF7Hyd 4DdN++UthbtaEd3wRoDb6oRNbJ0BR0Kz8l7rz/uUhQ+DGdBJkYVouJ/noT9iKJE+dA b0BvEBS6mcY/mnfx499VcqFg/d282rycnI2yXREk= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Alexander Shishkin Subject: [PATCH 4.19 029/114] intel_th: msu: Fix single mode with IOMMU Date: Thu, 23 May 2019 21:05:28 +0200 Message-Id: <20190523181734.488829904@linuxfoundation.org> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190523181731.372074275@linuxfoundation.org> References: <20190523181731.372074275@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Alexander Shishkin commit 4e0eaf239fb33ebc671303e2b736fa043462e2f4 upstream. Currently, the pages that are allocated for the single mode of MSC are not mapped into the device's dma space and the code is incorrectly using *_to_phys() in place of a dma address. This fails with IOMMU enabled and is otherwise bad practice. Fix the single mode buffer allocation to map the pages into the device's DMA space. Signed-off-by: Alexander Shishkin Fixes: ba82664c134e ("intel_th: Add Memory Storage Unit driver") Cc: stable@vger.kernel.org # v4.4+ Signed-off-by: Greg Kroah-Hartman --- drivers/hwtracing/intel_th/msu.c | 35 ++++++++++++++++++++++++++++++++--- 1 file changed, 32 insertions(+), 3 deletions(-) --- a/drivers/hwtracing/intel_th/msu.c +++ b/drivers/hwtracing/intel_th/msu.c @@ -84,6 +84,7 @@ struct msc_iter { * @reg_base: register window base address * @thdev: intel_th_device pointer * @win_list: list of windows in multiblock mode + * @single_sgt: single mode buffer * @nr_pages: total number of pages allocated for this buffer * @single_sz: amount of data in single mode * @single_wrap: single mode wrap occurred @@ -104,6 +105,7 @@ struct msc { struct intel_th_device *thdev; struct list_head win_list; + struct sg_table single_sgt; unsigned long nr_pages; unsigned long single_sz; unsigned int single_wrap : 1; @@ -617,22 +619,45 @@ static void intel_th_msc_deactivate(stru */ static int msc_buffer_contig_alloc(struct msc *msc, unsigned long size) { + unsigned long nr_pages = size >> PAGE_SHIFT; unsigned int order = get_order(size); struct page *page; + int ret; if (!size) return 0; + ret = sg_alloc_table(&msc->single_sgt, 1, GFP_KERNEL); + if (ret) + goto err_out; + + ret = -ENOMEM; page = alloc_pages(GFP_KERNEL | __GFP_ZERO, order); if (!page) - return -ENOMEM; + goto err_free_sgt; split_page(page, order); - msc->nr_pages = size >> PAGE_SHIFT; + sg_set_buf(msc->single_sgt.sgl, page_address(page), size); + + ret = dma_map_sg(msc_dev(msc)->parent->parent, msc->single_sgt.sgl, 1, + DMA_FROM_DEVICE); + if (ret < 0) + goto err_free_pages; + + msc->nr_pages = nr_pages; msc->base = page_address(page); - msc->base_addr = page_to_phys(page); + msc->base_addr = sg_dma_address(msc->single_sgt.sgl); return 0; + +err_free_pages: + __free_pages(page, order); + +err_free_sgt: + sg_free_table(&msc->single_sgt); + +err_out: + return ret; } /** @@ -643,6 +668,10 @@ static void msc_buffer_contig_free(struc { unsigned long off; + dma_unmap_sg(msc_dev(msc)->parent->parent, msc->single_sgt.sgl, + 1, DMA_FROM_DEVICE); + sg_free_table(&msc->single_sgt); + for (off = 0; off < msc->nr_pages << PAGE_SHIFT; off += PAGE_SIZE) { struct page *page = virt_to_page(msc->base + off);