intel_th: avoid using deprecated page->mapping, index fields
[ Upstream commit 8e553520596bbd5ce832e26e9d721e6a0c797b8b ] The struct page->mapping, index fields are deprecated and soon to be only available as part of a folio. It is likely the intel_th code which sets page->mapping, index is was implemented out of concern that some aspect of the page fault logic may encounter unexpected problems should they not. However, the appropriate interface for inserting kernel-allocated memory is vm_insert_page() in a VM_MIXEDMAP. By using the helper function vmf_insert_mixed() we can do this with minimal churn in the existing fault handler. By doing so, we bypass the remainder of the faulting logic. The pages are still pinned so there is no possibility of anything unexpected being done with the pages once established. It would also be reasonable to pre-map everything on fault, however to minimise churn we retain the fault handler. We also eliminate all code which clears page->mapping on teardown as this has now become unnecessary. The MSU code relies on faulting to function correctly, so is by definition dependent on CONFIG_MMU. We avoid spurious reports about compilation failure for unsupported platforms by making this requirement explicit in Kconfig as part of this change too. Signed-off-by: Lorenzo Stoakes <lorenzo.stoakes@oracle.com> Acked-by: Alexander Shishkin <alexander.shishkin@linux.intel.com> Link: https://lore.kernel.org/r/20250331125608.60300-1-lorenzo.stoakes@oracle.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
b49b5132e4
commit
2cab5ea2f5
@@ -60,6 +60,7 @@ config INTEL_TH_STH
|
||||
|
||||
config INTEL_TH_MSU
|
||||
tristate "Intel(R) Trace Hub Memory Storage Unit"
|
||||
depends on MMU
|
||||
help
|
||||
Memory Storage Unit (MSU) trace output device enables
|
||||
storing STP traces to system memory. It supports single
|
||||
|
@@ -19,6 +19,7 @@
|
||||
#include <linux/io.h>
|
||||
#include <linux/workqueue.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/pfn_t.h>
|
||||
|
||||
#ifdef CONFIG_X86
|
||||
#include <asm/set_memory.h>
|
||||
@@ -965,7 +966,6 @@ static void msc_buffer_contig_free(struct msc *msc)
|
||||
for (off = 0; off < msc->nr_pages << PAGE_SHIFT; off += PAGE_SIZE) {
|
||||
struct page *page = virt_to_page(msc->base + off);
|
||||
|
||||
page->mapping = NULL;
|
||||
__free_page(page);
|
||||
}
|
||||
|
||||
@@ -1147,9 +1147,6 @@ static void __msc_buffer_win_free(struct msc *msc, struct msc_window *win)
|
||||
int i;
|
||||
|
||||
for_each_sg(win->sgt->sgl, sg, win->nr_segs, i) {
|
||||
struct page *page = msc_sg_page(sg);
|
||||
|
||||
page->mapping = NULL;
|
||||
dma_free_coherent(msc_dev(win->msc)->parent->parent, PAGE_SIZE,
|
||||
sg_virt(sg), sg_dma_address(sg));
|
||||
}
|
||||
@@ -1584,22 +1581,10 @@ static void msc_mmap_close(struct vm_area_struct *vma)
|
||||
{
|
||||
struct msc_iter *iter = vma->vm_file->private_data;
|
||||
struct msc *msc = iter->msc;
|
||||
unsigned long pg;
|
||||
|
||||
if (!atomic_dec_and_mutex_lock(&msc->mmap_count, &msc->buf_mutex))
|
||||
return;
|
||||
|
||||
/* drop page _refcounts */
|
||||
for (pg = 0; pg < msc->nr_pages; pg++) {
|
||||
struct page *page = msc_buffer_get_page(msc, pg);
|
||||
|
||||
if (WARN_ON_ONCE(!page))
|
||||
continue;
|
||||
|
||||
if (page->mapping)
|
||||
page->mapping = NULL;
|
||||
}
|
||||
|
||||
/* last mapping -- drop user_count */
|
||||
atomic_dec(&msc->user_count);
|
||||
mutex_unlock(&msc->buf_mutex);
|
||||
@@ -1609,16 +1594,14 @@ static vm_fault_t msc_mmap_fault(struct vm_fault *vmf)
|
||||
{
|
||||
struct msc_iter *iter = vmf->vma->vm_file->private_data;
|
||||
struct msc *msc = iter->msc;
|
||||
struct page *page;
|
||||
|
||||
vmf->page = msc_buffer_get_page(msc, vmf->pgoff);
|
||||
if (!vmf->page)
|
||||
page = msc_buffer_get_page(msc, vmf->pgoff);
|
||||
if (!page)
|
||||
return VM_FAULT_SIGBUS;
|
||||
|
||||
get_page(vmf->page);
|
||||
vmf->page->mapping = vmf->vma->vm_file->f_mapping;
|
||||
vmf->page->index = vmf->pgoff;
|
||||
|
||||
return 0;
|
||||
get_page(page);
|
||||
return vmf_insert_mixed(vmf->vma, vmf->address, page_to_pfn_t(page));
|
||||
}
|
||||
|
||||
static const struct vm_operations_struct msc_mmap_ops = {
|
||||
@@ -1659,7 +1642,7 @@ out:
|
||||
atomic_dec(&msc->user_count);
|
||||
|
||||
vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
|
||||
vm_flags_set(vma, VM_DONTEXPAND | VM_DONTCOPY);
|
||||
vm_flags_set(vma, VM_DONTEXPAND | VM_DONTCOPY | VM_MIXEDMAP);
|
||||
vma->vm_ops = &msc_mmap_ops;
|
||||
return ret;
|
||||
}
|
||||
|
Reference in New Issue
Block a user