From patchwork Thu Jun 16 21:00:35 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Fabio M. De Francesco" X-Patchwork-Id: 12884824 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id EB2B5C43334 for ; Thu, 16 Jun 2022 21:01:05 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1378864AbiFPVBE (ORCPT ); Thu, 16 Jun 2022 17:01:04 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:48880 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1378853AbiFPVA6 (ORCPT ); Thu, 16 Jun 2022 17:00:58 -0400 Received: from mail-wr1-x434.google.com (mail-wr1-x434.google.com [IPv6:2a00:1450:4864:20::434]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 858486006D; Thu, 16 Jun 2022 14:00:57 -0700 (PDT) Received: by mail-wr1-x434.google.com with SMTP id q9so3334345wrd.8; Thu, 16 Jun 2022 14:00:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=+ctsqZuUzxRCwxqBgZBzx2nceNY0pnJin6UVVoxtwPI=; b=TFuAhc2wHssi4VbHmuNIWACAc6PVJKDke0ZcB0HlJda2s/NWstByXVggMXwaI5IVmV sfej9qCWbl3PTsOyuqBq5KptYREndUjusqNjcGnd5UQ5wm5Hz4ltVKzYp4yoVh1S2Q6k eEZYk15Km6mjLRUVQVP60zQ7X0ch78qpfwAYqFA1nsL74H5a3OPwYdqHePwBIHokP5RK p+9/zhmZIVHiYxFWVhcZ7ETF3omadMgrc+HZzrtIEGUxRWVBY0VbzNQ4jy+iBsvTm2Uz Wp4aqpraCnVKn673HDw3NfAPf1PAULTOGEkmiMwFJuYeM1RR6RpI08WaKNBOdBUsb25f +vBw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=+ctsqZuUzxRCwxqBgZBzx2nceNY0pnJin6UVVoxtwPI=; b=j2l1o3OD6bu2cG/1/WouFQ2X0AYJDzTxrDhgTKCtptkSoUsr9yl3R6n2bQKPUPJNDt 8T8FN2/oRDqCWRzzLHGVTCFKPn4nKBLT1AIvve0m+Oad00wilcvfCp/zGtgnaS8X5e2I oHeowayAOUSWTwTwtPb3Dl2HuPYb+k3bvqmDZLpEBbYODi82Vc68LhkeA5qXnmow1uFN 3Wq0dXJM4fF+/fBQAzs9L/cA9JclzBFAe0SD0OZTNqqCBMHqxOi7D/UFUSDv3qrY3LPH eloUbfJBE0XqChd+NqdCloaQofbZLpqA+coaz9fZjGT43vzq4jSlDBtbo2wMWlvSXGnH Ac6A== X-Gm-Message-State: AJIora8KDMkRzGAizZpC7lSx72ccyUEN4ARmIY1IbqdpuLv2r1kKlcKq Mujll19OHVMAziAPurVuKz4= X-Google-Smtp-Source: AGRyM1ta7Ymwb82cxivEWtpT2Hev3g1A0ZThnWm4Ak6ZqFxCeL5reYDpWA0FAOhadFTQ3DYORM5niQ== X-Received: by 2002:a05:6000:1110:b0:210:3e7f:6776 with SMTP id z16-20020a056000111000b002103e7f6776mr6077806wrw.597.1655413256024; Thu, 16 Jun 2022 14:00:56 -0700 (PDT) Received: from localhost.localdomain (host-87-6-98-182.retail.telecomitalia.it. [87.6.98.182]) by smtp.gmail.com with ESMTPSA id bt28-20020a056000081c00b0020fcc655e4asm2658043wrb.5.2022.06.16.14.00.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 16 Jun 2022 14:00:54 -0700 (PDT) From: "Fabio M. De Francesco" To: David Sterba Cc: Chris Mason , Josef Bacik , Nick Terrell , linux-btrfs@vger.kernel.org, linux-kernel@vger.kernel.org, Ira Weiny , Andrew Morton , Matthew Wilcox , Kees Cook , Sebastian Andrzej Siewior , "James E . J . Bottomley" , Helge Deller , John David Anglin , linux-parisc@vger.kernel.org, "Fabio M. De Francesco" , David Sterba Subject: [RESEND PATCH v4 1/2] highmem: Make __kunmap_{local,atomic}() take "const void *" Date: Thu, 16 Jun 2022 23:00:35 +0200 Message-Id: <20220616210037.7060-2-fmdefrancesco@gmail.com> X-Mailer: git-send-email 2.36.1 In-Reply-To: <20220616210037.7060-1-fmdefrancesco@gmail.com> References: <20220616210037.7060-1-fmdefrancesco@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-parisc@vger.kernel.org __kunmap_ {local,atomic}() currently take pointers to void. However, this is semantically incorrect, since these functions do not change the memory their arguments point to. Therefore, make this semantics explicit by modifying the prototypes of __kunmap_{local,atomic}() to take pointers to const void. As a side effect, compilers will likely produce more efficient code. Cc: Andrew Morton Suggested-by: David Sterba Suggested-by: Ira Weiny Signed-off-by: Fabio M. De Francesco --- v3->v4: Cc Maintainers and mailing lists I had overlooked when I sent v3. v2->v3: Fix compilation errors for ARCH=parisc. Reported-by: kernel test robot v1->v2: Change the commit message to clearly explain why these functions should require pointers to const void. The fundamental argument behind the commit message changes is semantic correctness. Obviously, there are no changes to the code. Many thanks to David Sterba and Ira Weiny for suggestions and reviews. arch/parisc/include/asm/cacheflush.h | 6 +++--- arch/parisc/kernel/cache.c | 2 +- include/linux/highmem-internal.h | 10 +++++----- mm/highmem.c | 2 +- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/arch/parisc/include/asm/cacheflush.h b/arch/parisc/include/asm/cacheflush.h index 8d03b3b26229..0bdee6724132 100644 --- a/arch/parisc/include/asm/cacheflush.h +++ b/arch/parisc/include/asm/cacheflush.h @@ -22,7 +22,7 @@ void flush_kernel_icache_range_asm(unsigned long, unsigned long); void flush_user_dcache_range_asm(unsigned long, unsigned long); void flush_kernel_dcache_range_asm(unsigned long, unsigned long); void purge_kernel_dcache_range_asm(unsigned long, unsigned long); -void flush_kernel_dcache_page_asm(void *); +void flush_kernel_dcache_page_asm(const void *addr); void flush_kernel_icache_page(void *); /* Cache flush operations */ @@ -31,7 +31,7 @@ void flush_cache_all_local(void); void flush_cache_all(void); void flush_cache_mm(struct mm_struct *mm); -void flush_kernel_dcache_page_addr(void *addr); +void flush_kernel_dcache_page_addr(const void *addr); #define flush_kernel_dcache_range(start,size) \ flush_kernel_dcache_range_asm((start), (start)+(size)); @@ -75,7 +75,7 @@ void flush_dcache_page_asm(unsigned long phys_addr, unsigned long vaddr); void flush_anon_page(struct vm_area_struct *vma, struct page *page, unsigned long vmaddr); #define ARCH_HAS_FLUSH_ON_KUNMAP -static inline void kunmap_flush_on_unmap(void *addr) +static inline void kunmap_flush_on_unmap(const void *addr) { flush_kernel_dcache_page_addr(addr); } diff --git a/arch/parisc/kernel/cache.c b/arch/parisc/kernel/cache.c index c8a11fcecf4c..824064cafd61 100644 --- a/arch/parisc/kernel/cache.c +++ b/arch/parisc/kernel/cache.c @@ -549,7 +549,7 @@ extern void purge_kernel_dcache_page_asm(unsigned long); extern void clear_user_page_asm(void *, unsigned long); extern void copy_user_page_asm(void *, void *, unsigned long); -void flush_kernel_dcache_page_addr(void *addr) +void flush_kernel_dcache_page_addr(const void *addr) { unsigned long flags; diff --git a/include/linux/highmem-internal.h b/include/linux/highmem-internal.h index cddb42ff0473..034b1106d022 100644 --- a/include/linux/highmem-internal.h +++ b/include/linux/highmem-internal.h @@ -8,7 +8,7 @@ #ifdef CONFIG_KMAP_LOCAL void *__kmap_local_pfn_prot(unsigned long pfn, pgprot_t prot); void *__kmap_local_page_prot(struct page *page, pgprot_t prot); -void kunmap_local_indexed(void *vaddr); +void kunmap_local_indexed(const void *vaddr); void kmap_local_fork(struct task_struct *tsk); void __kmap_local_sched_out(void); void __kmap_local_sched_in(void); @@ -89,7 +89,7 @@ static inline void *kmap_local_pfn(unsigned long pfn) return __kmap_local_pfn_prot(pfn, kmap_prot); } -static inline void __kunmap_local(void *vaddr) +static inline void __kunmap_local(const void *vaddr) { kunmap_local_indexed(vaddr); } @@ -121,7 +121,7 @@ static inline void *kmap_atomic_pfn(unsigned long pfn) return __kmap_local_pfn_prot(pfn, kmap_prot); } -static inline void __kunmap_atomic(void *addr) +static inline void __kunmap_atomic(const void *addr) { kunmap_local_indexed(addr); pagefault_enable(); @@ -197,7 +197,7 @@ static inline void *kmap_local_pfn(unsigned long pfn) return kmap_local_page(pfn_to_page(pfn)); } -static inline void __kunmap_local(void *addr) +static inline void __kunmap_local(const void *addr) { #ifdef ARCH_HAS_FLUSH_ON_KUNMAP kunmap_flush_on_unmap(addr); @@ -224,7 +224,7 @@ static inline void *kmap_atomic_pfn(unsigned long pfn) return kmap_atomic(pfn_to_page(pfn)); } -static inline void __kunmap_atomic(void *addr) +static inline void __kunmap_atomic(const void *addr) { #ifdef ARCH_HAS_FLUSH_ON_KUNMAP kunmap_flush_on_unmap(addr); diff --git a/mm/highmem.c b/mm/highmem.c index 1a692997fac4..e32083e4ce0d 100644 --- a/mm/highmem.c +++ b/mm/highmem.c @@ -561,7 +561,7 @@ void *__kmap_local_page_prot(struct page *page, pgprot_t prot) } EXPORT_SYMBOL(__kmap_local_page_prot); -void kunmap_local_indexed(void *vaddr) +void kunmap_local_indexed(const void *vaddr) { unsigned long addr = (unsigned long) vaddr & PAGE_MASK; pte_t *kmap_pte; From patchwork Thu Jun 16 21:00:36 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Fabio M. De Francesco" X-Patchwork-Id: 12884825 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 217A8CCA47F for ; Thu, 16 Jun 2022 21:01:07 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1378880AbiFPVBF (ORCPT ); Thu, 16 Jun 2022 17:01:05 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:48920 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1378863AbiFPVBB (ORCPT ); Thu, 16 Jun 2022 17:01:01 -0400 Received: from mail-wr1-x430.google.com (mail-wr1-x430.google.com [IPv6:2a00:1450:4864:20::430]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 4ED15606C8; Thu, 16 Jun 2022 14:01:00 -0700 (PDT) Received: by mail-wr1-x430.google.com with SMTP id v14so3340227wra.5; Thu, 16 Jun 2022 14:01:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=364eJGZAeI1cRA8JXwU4sJjDIDVJUPfDbdXoZnkoANE=; b=VqkYb3sb1DZpO6dVMZm9TYrgtESC5UK47LxmeDkHv8Q0u5ObCvwnxmQYufGwDP98NV N/S/XtjucuwUe5w9cS0KuVe88BHuL8fld3oavcBoMT91mvhkAfu3gX/t8jtuKchtqES+ uX1gFc8S4BcHG8tpd9eJRN2lSALeWpX4wznjNibAwceaU2M3bi7geikdUmNXl+1akfd1 3yo9ySwxbOmUe9OGMqwOCOXuxdoEEcxbHAzM+Cy1shDcJGmwrn38pbJbd45w4/kuDuCc 6cTKrIFkjbvdwL4YLgcv0QnsAXPFx7wa8qnH4zOkORG4VW+E7fS1RvepxRm+gmq1vi1W omPQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=364eJGZAeI1cRA8JXwU4sJjDIDVJUPfDbdXoZnkoANE=; b=q2/b9Uc8Ro5dASn3Z5MzyzgcEv/Trz7fZYESf8SDnCr0w262oXCYdlmVWobyYVi/Zs Dv60PEgl7SHANwi5fhOucQ4hJg3WRxjJYzRd0SkB5L6w6QYEa4uwRYfnrbmPOO8UW5oH cOOMLNP+c4ywM5d39nQVOkV99XvHLugOvAXsXyIn44Rc7mh28cB768Paz3Ev9O3XlwqW o5ybTbcGxKfm1Gdp8ZpMOBciKtyLG/ZR8+t8RH7f/Iwv2AeezjdH+F085M6pWG6ODChR l2CjAZWQ/nScfH1YRX7PNAJ0dL8169LUPoKMV51zumFfLwHiUMpDo6IYdKLOzxSsK+Lf O+ug== X-Gm-Message-State: AJIora/6j+prtEukdmO8apAMQoZgCRVyfBA276wNQ3kmoyRsv27hyF4X azezgA7gwPqOJz9wF186bAsFzB7KiBk= X-Google-Smtp-Source: AGRyM1un7BqyqmV3WWYpMeGlY/tzlMoJ2xE3t4UOEmA3fi6QCxA5OYfrbVCKDo1T14F6VU72j6dZiw== X-Received: by 2002:a5d:68d2:0:b0:210:31cc:64a6 with SMTP id p18-20020a5d68d2000000b0021031cc64a6mr6281474wrw.679.1655413258767; Thu, 16 Jun 2022 14:00:58 -0700 (PDT) Received: from localhost.localdomain (host-87-6-98-182.retail.telecomitalia.it. [87.6.98.182]) by smtp.gmail.com with ESMTPSA id bt28-20020a056000081c00b0020fcc655e4asm2658043wrb.5.2022.06.16.14.00.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 16 Jun 2022 14:00:57 -0700 (PDT) From: "Fabio M. De Francesco" To: David Sterba Cc: Chris Mason , Josef Bacik , Nick Terrell , linux-btrfs@vger.kernel.org, linux-kernel@vger.kernel.org, Ira Weiny , Andrew Morton , Matthew Wilcox , Kees Cook , Sebastian Andrzej Siewior , "James E . J . Bottomley" , Helge Deller , John David Anglin , linux-parisc@vger.kernel.org, "Fabio M. De Francesco" , Filipe Manana Subject: [RESEND PATCH v4 2/2] btrfs: Replace kmap() with kmap_local_page() in zstd.c Date: Thu, 16 Jun 2022 23:00:36 +0200 Message-Id: <20220616210037.7060-3-fmdefrancesco@gmail.com> X-Mailer: git-send-email 2.36.1 In-Reply-To: <20220616210037.7060-1-fmdefrancesco@gmail.com> References: <20220616210037.7060-1-fmdefrancesco@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-parisc@vger.kernel.org The use of kmap() is being deprecated in favor of kmap_local_page(). With kmap_local_page(), the mapping is per thread, CPU local and not globally visible. Therefore, use kmap_local_page() / kunmap_local() in zstd.c because in this file the mappings are per thread and are not visible in other contexts; meanwhile refactor zstd_compress_pages() to comply with the ordering rules about nested local mapping / unmapping. Tested with xfstests on QEMU + KVM 32 bits VM with 4GB of RAM and HIGHMEM64G enabled. These changes passed all the tests of the group "compress". Cc: Filipe Manana Suggested-by: Ira Weiny Signed-off-by: Fabio M. De Francesco --- v3->v4: Cc Maintainers and lists that had been overlooked when v3 was sent (mostly regarding patch 1/2). v2->v3: Remove unnecessary casts to arguments of kunmap_local() now that this API can take pointers to const void. v1->v2: No changes. Thanks to Ira Weiny for his invaluable help and persevering support. Thanks also to Filipe Manana for identifying a fundamental detail I had overlooked in RFC: https://lore.kernel.org/lkml/20220611093411.GA3779054@falcondesktop/ fs/btrfs/zstd.c | 42 +++++++++++++++++++++++------------------- 1 file changed, 23 insertions(+), 19 deletions(-) diff --git a/fs/btrfs/zstd.c b/fs/btrfs/zstd.c index 0fe31a6f6e68..5d2ab0bac9d2 100644 --- a/fs/btrfs/zstd.c +++ b/fs/btrfs/zstd.c @@ -391,6 +391,8 @@ int zstd_compress_pages(struct list_head *ws, struct address_space *mapping, *out_pages = 0; *total_out = 0; *total_in = 0; + workspace->in_buf.src = NULL; + workspace->out_buf.dst = NULL; /* Initialize the stream */ stream = zstd_init_cstream(¶ms, len, workspace->mem, @@ -403,7 +405,7 @@ int zstd_compress_pages(struct list_head *ws, struct address_space *mapping, /* map in the first page of input data */ in_page = find_get_page(mapping, start >> PAGE_SHIFT); - workspace->in_buf.src = kmap(in_page); + workspace->in_buf.src = kmap_local_page(in_page); workspace->in_buf.pos = 0; workspace->in_buf.size = min_t(size_t, len, PAGE_SIZE); @@ -415,7 +417,7 @@ int zstd_compress_pages(struct list_head *ws, struct address_space *mapping, goto out; } pages[nr_pages++] = out_page; - workspace->out_buf.dst = kmap(out_page); + workspace->out_buf.dst = kmap_local_page(out_page); workspace->out_buf.pos = 0; workspace->out_buf.size = min_t(size_t, max_out, PAGE_SIZE); @@ -450,9 +452,9 @@ int zstd_compress_pages(struct list_head *ws, struct address_space *mapping, if (workspace->out_buf.pos == workspace->out_buf.size) { tot_out += PAGE_SIZE; max_out -= PAGE_SIZE; - kunmap(out_page); + kunmap_local(workspace->out_buf.dst); if (nr_pages == nr_dest_pages) { - out_page = NULL; + workspace->out_buf.dst = NULL; ret = -E2BIG; goto out; } @@ -462,7 +464,7 @@ int zstd_compress_pages(struct list_head *ws, struct address_space *mapping, goto out; } pages[nr_pages++] = out_page; - workspace->out_buf.dst = kmap(out_page); + workspace->out_buf.dst = kmap_local_page(out_page); workspace->out_buf.pos = 0; workspace->out_buf.size = min_t(size_t, max_out, PAGE_SIZE); @@ -477,15 +479,16 @@ int zstd_compress_pages(struct list_head *ws, struct address_space *mapping, /* Check if we need more input */ if (workspace->in_buf.pos == workspace->in_buf.size) { tot_in += PAGE_SIZE; - kunmap(in_page); + kunmap_local(workspace->out_buf.dst); + kunmap_local(workspace->in_buf.src); put_page(in_page); - start += PAGE_SIZE; len -= PAGE_SIZE; in_page = find_get_page(mapping, start >> PAGE_SHIFT); - workspace->in_buf.src = kmap(in_page); + workspace->in_buf.src = kmap_local_page(in_page); workspace->in_buf.pos = 0; workspace->in_buf.size = min_t(size_t, len, PAGE_SIZE); + workspace->out_buf.dst = kmap_local_page(out_page); } } while (1) { @@ -510,9 +513,9 @@ int zstd_compress_pages(struct list_head *ws, struct address_space *mapping, tot_out += PAGE_SIZE; max_out -= PAGE_SIZE; - kunmap(out_page); + kunmap_local(workspace->out_buf.dst); if (nr_pages == nr_dest_pages) { - out_page = NULL; + workspace->out_buf.dst = NULL; ret = -E2BIG; goto out; } @@ -522,7 +525,7 @@ int zstd_compress_pages(struct list_head *ws, struct address_space *mapping, goto out; } pages[nr_pages++] = out_page; - workspace->out_buf.dst = kmap(out_page); + workspace->out_buf.dst = kmap_local_page(out_page); workspace->out_buf.pos = 0; workspace->out_buf.size = min_t(size_t, max_out, PAGE_SIZE); } @@ -538,12 +541,12 @@ int zstd_compress_pages(struct list_head *ws, struct address_space *mapping, out: *out_pages = nr_pages; /* Cleanup */ - if (in_page) { - kunmap(in_page); + if (workspace->out_buf.dst) + kunmap_local(workspace->out_buf.dst); + if (workspace->in_buf.src) { + kunmap_local(workspace->in_buf.src); put_page(in_page); } - if (out_page) - kunmap(out_page); return ret; } @@ -567,7 +570,7 @@ int zstd_decompress_bio(struct list_head *ws, struct compressed_bio *cb) goto done; } - workspace->in_buf.src = kmap(pages_in[page_in_index]); + workspace->in_buf.src = kmap_local_page(pages_in[page_in_index]); workspace->in_buf.pos = 0; workspace->in_buf.size = min_t(size_t, srclen, PAGE_SIZE); @@ -603,14 +606,15 @@ int zstd_decompress_bio(struct list_head *ws, struct compressed_bio *cb) break; if (workspace->in_buf.pos == workspace->in_buf.size) { - kunmap(pages_in[page_in_index++]); + kunmap_local(workspace->in_buf.src); + page_in_index++; if (page_in_index >= total_pages_in) { workspace->in_buf.src = NULL; ret = -EIO; goto done; } srclen -= PAGE_SIZE; - workspace->in_buf.src = kmap(pages_in[page_in_index]); + workspace->in_buf.src = kmap_local_page(pages_in[page_in_index]); workspace->in_buf.pos = 0; workspace->in_buf.size = min_t(size_t, srclen, PAGE_SIZE); } @@ -619,7 +623,7 @@ int zstd_decompress_bio(struct list_head *ws, struct compressed_bio *cb) zero_fill_bio(cb->orig_bio); done: if (workspace->in_buf.src) - kunmap(pages_in[page_in_index]); + kunmap_local(workspace->in_buf.src); return ret; }