| [Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
 Re: [PATCH 12/15] swiotlb: provide swiotlb_init variants that remap the buffer
 
To: Christoph Hellwig <hch@xxxxxx>, iommu@xxxxxxxxxxxxxxxxxxxxxxxxxxFrom: Boris Ostrovsky <boris.ostrovsky@xxxxxxxxxx>Date: Mon, 14 Mar 2022 18:39:21 -0400Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oracle.com; dmarc=pass action=none header.from=oracle.com; dkim=pass header.d=oracle.com; arc=noneArc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=YUB3eyOnJQjBJ29CUuL6JrbNLuLwNjWuywF7K5wFCzg=; b=O0+zzUGW9wpSqP6kbMqJ0x4bUcxLQX6e6tiExVq9iAAa2Rb0E37dlE24qNL5hxsqvS9O88dG6PMnzEmBp/yjBCwMoEfkYwm2SwwOHp3P+R9X3AaIRKK76eNSvun8ploaJybrAwRX62v3Zz2fIHxs+qu73BhB4A4l30cgHu4qocWJXOOEZH3VvK2WwoAq2WsYeDpA+KjLXi3Ek5f8pEuysRQ2bzJvRHdj7K9rDZWHCZUREjvQeo6Je1RQPurY15iArQA7Fch0Rtix2qEwUsNdKJaszIe7Va1wL4tjPMNVOcU6HrOb+9h0Rn9ftSjeF4G8r52iVRuG6jvuBhG6TFveZw==Arc-seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=lND4Kd5AF0MzEjgziIBmsPBR9ab6DWR+ODdTU9sJhmxd/aW+3lqhHgJlwEybqQcK5wvka/pgU4wQ8iLTjtkbcZLLlA3jSb0guuhALqD27c6Uqs6w4kNPkKlM9fYrrBWnKLARUKBwg7XYHZxCYmlODD1U4wv/scj41QqukCAzbH4T3UIvWBTLW3Zzql3PfWryzsPgGbGeri4NgFns2RgStoI4hPn9BR01crulKlhol52YRZzWnPodfnx8bJJDQrIrnrraHp0Lu0cSUmgoqiX7ZcQRl7ChOx9ZG3X44m8tVJX+ZrKsX/dRrHJ+Whxz/hSbulV3fBWgZBtgP7FB7gg2HA==Cc: x86@xxxxxxxxxx, Anshuman Khandual <anshuman.khandual@xxxxxxx>,        Tom Lendacky <thomas.lendacky@xxxxxxx>,        Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx>,        Stefano Stabellini <sstabellini@xxxxxxxxxx>,        Juergen Gross <jgross@xxxxxxxx>, Joerg Roedel <joro@xxxxxxxxxx>,        David Woodhouse <dwmw2@xxxxxxxxxxxxx>,        Lu Baolu <baolu.lu@xxxxxxxxxxxxxxx>,        Robin Murphy <robin.murphy@xxxxxxx>,        linux-arm-kernel@xxxxxxxxxxxxxxxxxxx, xen-devel@xxxxxxxxxxxxxxxxxxxx,        linux-ia64@xxxxxxxxxxxxxxx, linux-mips@xxxxxxxxxxxxxxx,        linuxppc-dev@xxxxxxxxxxxxxxxx, linux-riscv@xxxxxxxxxxxxxxxxxxx,        linux-s390@xxxxxxxxxxxxxxx, linux-hyperv@xxxxxxxxxxxxxxx,        tboot-devel@xxxxxxxxxxxxxxxxxxxxx, linux-pci@xxxxxxxxxxxxxxxDelivery-date: Mon, 14 Mar 2022 22:40:46 +0000List-id: Xen developer discussion <xen-devel.lists.xenproject.org> 
 
On 3/14/22 3:31 AM, Christoph Hellwig wrote:
 
-void __init swiotlb_init(bool addressing_limit, unsigned int flags)
+void __init swiotlb_init_remap(bool addressing_limit, unsigned int flags,
+               int (*remap)(void *tlb, unsigned long nslabs))
  {
-       size_t bytes = PAGE_ALIGN(default_nslabs << IO_TLB_SHIFT);
+       unsigned long nslabs = default_nslabs;
+       size_t bytes;
        void *tlb;
if (!addressing_limit && !swiotlb_force_bounce)
@@ -271,12 +273,24 @@ void __init swiotlb_init(bool addressing_limit, unsigned 
int flags)
         * allow to pick a location everywhere for hypervisors with guest
         * memory encryption.
         */
+retry:
+       bytes = PAGE_ALIGN(default_nslabs << IO_TLB_SHIFT);
        if (flags & SWIOTLB_ANY)
                tlb = memblock_alloc(bytes, PAGE_SIZE);
        else
                tlb = memblock_alloc_low(bytes, PAGE_SIZE);
        if (!tlb)
                goto fail;
+       if (remap && remap(tlb, nslabs) < 0) {
+               memblock_free(tlb, PAGE_ALIGN(bytes));
+
+               /* Min is 2MB */
+               if (nslabs <= 1024)
 
This is IO_TLB_MIN_SLABS, isn't it? (Xen code didn't say so but that's what it 
meant to say I believe)
 
+                       panic("%s: Failed to remap %zu bytes\n",
+                             __func__, bytes);
+               nslabs = max(1024UL, ALIGN(nslabs >> 1, IO_TLB_SEGSIZE));
+               goto retry;
+       }
@@ -303,6 +323,7 @@ int swiotlb_init_late(size_t size, gfp_t gfp_mask)
        if (swiotlb_force_disable)
                return 0;
+retry:
        order = get_order(nslabs << IO_TLB_SHIFT);
        nslabs = SLABS_PER_PAGE << order;
        bytes = nslabs << IO_TLB_SHIFT;
@@ -317,6 +338,17 @@ int swiotlb_init_late(size_t size, gfp_t gfp_mask)
if (!vstart)
                return -ENOMEM;
+       if (remap)
+               rc = remap(vstart, nslabs);
+       if (rc) {
+               free_pages((unsigned long)vstart, order);
+
+               /* Min is 2MB */
+               if (nslabs <= 1024)
 
Same here.
-boris
 
+                       return rc;
+               nslabs = max(1024UL, ALIGN(nslabs >> 1, IO_TLB_SEGSIZE));
+               goto retry;
+       }
if (order != get_order(bytes)) { 
                pr_warn("only able to allocate %ld MB\n",
 
 
 |