Linux-HyperV List
 help / color / mirror / Atom feed
From: "Petr Tesařík" <petr@tesarici.cz>
To: Dexuan Cui <decui@microsoft.com>
Cc: Dexuan-Linux Cui <dexuan.linux@gmail.com>,
	Petr Tesarik <petrtesarik@huaweicloud.com>,
	Christoph Hellwig <hch@lst.de>,
	Marek Szyprowski <m.szyprowski@samsung.com>,
	Robin Murphy <robin.murphy@arm.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	Jianxiong Gao <jxgao@google.com>,
	David Stevens <stevensd@chromium.org>,
	Joerg Roedel <jroedel@suse.de>,
	"open list:DMA MAPPING HELPERS" <iommu@lists.linux.dev>,
	open list <linux-kernel@vger.kernel.org>,
	Roberto Sassu <roberto.sassu@huawei.com>,
	"Michael Kelley (LINUX)" <mikelley@microsoft.com>,
	Tianyu Lan <Tianyu.Lan@microsoft.com>,
	"linux-hyperv@vger.kernel.org" <linux-hyperv@vger.kernel.org>
Subject: Re: [PATCH v1 2/2] swiotlb: Fix slot alignment checks
Date: Wed, 5 Apr 2023 07:50:34 +0200	[thread overview]
Message-ID: <20230405075034.3c36bb77@meshulam.tesarici.cz> (raw)
In-Reply-To: <20230405072801.05bb94ef@meshulam.tesarici.cz>

On Wed, 5 Apr 2023 07:32:06 +0200
Petr Tesařík <petr@tesarici.cz> wrote:

> On Wed, 5 Apr 2023 05:11:42 +0000
> Dexuan Cui <decui@microsoft.com> wrote:
> 
> > > From: Petr Tesařík <petr@tesarici.cz>
> > > Sent: Tuesday, April 4, 2023 9:40 PM    
> > > > > ...
> > > > > Hi Petr, this patch has gone into the mainline:
> > > > > 0eee5ae10256 ("swiotlb: fix slot alignment checks")
> > > > >
> > > > > Somehow it breaks Linux VMs on Hyper-V: a regular VM with
> > > > > swiotlb=force or a confidential VM (which uses swiotlb) fails to boot.
> > > > > If I revert this patch, everything works fine.  
> > > >
> > > > The log is pasted below. Looks like the SCSI driver hv_storvsc fails to
> > > > detect the disk capacity:    
> > > 
> > > The first thing I can imagine is that there are in fact no (free) slots
> > > in the SWIOTLB which match the alignment constraints, so the map
> > > operation fails. However, this would result in a "swiotlb buffer is
> > > full" message in the log, and I can see no such message in the log
> > > excerpt you have posted.
> > > 
> > > Please, can you check if there are any "swiotlb" messages preceding the
> > > first error message?
> > > 
> > > Petr T    
> > 
> > There is no "swiotlb buffer is full" error.
> > 
> > The hv_storvsc driver (drivers/scsi/storvsc_drv.c) calls scsi_dma_map(),
> > which doesn't return -ENOMEM when the failure happens.  
> 
> I see...
> 
> Argh, you're right. This is a braino. The alignment mask is in fact an
> INVERTED mask, i.e. it masks off bits that are not relevant for the
> alignment. The more strict alignment needed the more bits must be set,
> so the individual alignment constraints must be combined with an OR
> instead of an AND.
> 
> Can you apply the following change and check if it fixes the issue?

Actually, this will not work either. The mask is used to mask off both
high address bits and low address bits (below swiotlb slot granularity).

What should help is this:

diff --git a/kernel/dma/swiotlb.c b/kernel/dma/swiotlb.c
index 5b919ef832b6..c924e53d679e 100644
--- a/kernel/dma/swiotlb.c
+++ b/kernel/dma/swiotlb.c
@@ -622,8 +622,7 @@ static int swiotlb_do_find_slots(struct device *dev, int area_index,
 	dma_addr_t tbl_dma_addr =
 		phys_to_dma_unencrypted(dev, mem->start) & boundary_mask;
 	unsigned long max_slots = get_max_slots(boundary_mask);
-	unsigned int iotlb_align_mask =
-		dma_get_min_align_mask(dev) & ~(IO_TLB_SIZE - 1);
+	unsigned int iotlb_align_mask;
 	unsigned int nslots = nr_slots(alloc_size), stride;
 	unsigned int offset = swiotlb_align_offset(dev, orig_addr);
 	unsigned int index, slots_checked, count = 0, i;
@@ -639,8 +638,9 @@ static int swiotlb_do_find_slots(struct device *dev, int area_index,
 	 * allocations.
 	 */
 	if (alloc_size >= PAGE_SIZE)
-		iotlb_align_mask &= PAGE_MASK;
-	iotlb_align_mask &= alloc_align_mask;
+		iotlb_align_mask |= ~PAGE_MASK;
+	iotlb_align_mask |= alloc_align_mask | dma_get_min_align_mask(dev);
+	iotlb_align_mask &= ~(IO_TLB_SIZE - 1);
 
 	/*
 	 * For mappings with an alignment requirement don't bother looping to

Petr T

  reply	other threads:[~2023-04-05  5:50 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <cover.1679382779.git.petr.tesarik.ext@huawei.com>
     [not found] ` <c90887e4d75344abe219cc5e12f7c6dab980cfce.1679382779.git.petr.tesarik.ext@huawei.com>
2023-04-04 19:55   ` [PATCH v1 2/2] swiotlb: Fix slot alignment checks Dexuan-Linux Cui
2023-04-04 20:11     ` Dexuan Cui
2023-04-05  4:40       ` Petr Tesařík
2023-04-05  5:11         ` Dexuan Cui
2023-04-05  5:32           ` Petr Tesařík
2023-04-05  5:50             ` Petr Tesařík [this message]
2023-04-05  6:00               ` Dexuan Cui
2023-04-05  6:07                 ` Petr Tesařík
2023-04-05  6:34                   ` Dexuan Cui
2023-04-06  4:52               ` Kelsey Steele
2023-04-06 14:42                 ` Petr Tesarik
2023-04-07  4:13                   ` Kelsey Steele
2023-04-11 15:46                     ` Petr Tesarik
2023-04-05 12:24     ` Linux regression tracking #adding (Thorsten Leemhuis)

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20230405075034.3c36bb77@meshulam.tesarici.cz \
    --to=petr@tesarici.cz \
    --cc=Tianyu.Lan@microsoft.com \
    --cc=decui@microsoft.com \
    --cc=dexuan.linux@gmail.com \
    --cc=hch@lst.de \
    --cc=iommu@lists.linux.dev \
    --cc=jroedel@suse.de \
    --cc=jxgao@google.com \
    --cc=konrad.wilk@oracle.com \
    --cc=linux-hyperv@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=m.szyprowski@samsung.com \
    --cc=mikelley@microsoft.com \
    --cc=petrtesarik@huaweicloud.com \
    --cc=roberto.sassu@huawei.com \
    --cc=robin.murphy@arm.com \
    --cc=stevensd@chromium.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox