forked from Minki/linux
drm: Remove the drm_get_unmapped_area() helper
This has been only used by the vmwgfx driver and vmwgfx over the last year removed support for transparent hugepages on vram leaving drm_get_unmapped_area completely unused. There's no point in keeping unused code in core drm. Signed-off-by: Zack Rusin <zackr@vmware.com> Reviewed-by: Thomas Hellström <thomas.hellstrom@linux.intel.com> Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com> Cc: Maxime Ripard <mripard@kernel.org> Cc: Thomas Zimmermann <tzimmermann@suse.de> Cc: David Airlie <airlied@linux.ie> Cc: Daniel Vetter <daniel@ffwll.ch> Cc: dri-devel@lists.freedesktop.org Link: https://patchwork.freedesktop.org/patch/msgid/20220425203152.1314211-2-zack@kde.org
This commit is contained in:
parent
7fbee3eb9a
commit
01224faa36
@ -48,11 +48,6 @@
|
||||
#include "drm_internal.h"
|
||||
#include "drm_legacy.h"
|
||||
|
||||
#if defined(CONFIG_MMU) && defined(CONFIG_TRANSPARENT_HUGEPAGE)
|
||||
#include <uapi/asm/mman.h>
|
||||
#include <drm/drm_vma_manager.h>
|
||||
#endif
|
||||
|
||||
/* from BKL pushdown */
|
||||
DEFINE_MUTEX(drm_global_mutex);
|
||||
|
||||
@ -913,139 +908,3 @@ struct file *mock_drm_getfile(struct drm_minor *minor, unsigned int flags)
|
||||
return file;
|
||||
}
|
||||
EXPORT_SYMBOL_FOR_TESTS_ONLY(mock_drm_getfile);
|
||||
|
||||
#ifdef CONFIG_MMU
|
||||
#ifdef CONFIG_TRANSPARENT_HUGEPAGE
|
||||
/*
|
||||
* drm_addr_inflate() attempts to construct an aligned area by inflating
|
||||
* the area size and skipping the unaligned start of the area.
|
||||
* adapted from shmem_get_unmapped_area()
|
||||
*/
|
||||
static unsigned long drm_addr_inflate(unsigned long addr,
|
||||
unsigned long len,
|
||||
unsigned long pgoff,
|
||||
unsigned long flags,
|
||||
unsigned long huge_size)
|
||||
{
|
||||
unsigned long offset, inflated_len;
|
||||
unsigned long inflated_addr;
|
||||
unsigned long inflated_offset;
|
||||
|
||||
offset = (pgoff << PAGE_SHIFT) & (huge_size - 1);
|
||||
if (offset && offset + len < 2 * huge_size)
|
||||
return addr;
|
||||
if ((addr & (huge_size - 1)) == offset)
|
||||
return addr;
|
||||
|
||||
inflated_len = len + huge_size - PAGE_SIZE;
|
||||
if (inflated_len > TASK_SIZE)
|
||||
return addr;
|
||||
if (inflated_len < len)
|
||||
return addr;
|
||||
|
||||
inflated_addr = current->mm->get_unmapped_area(NULL, 0, inflated_len,
|
||||
0, flags);
|
||||
if (IS_ERR_VALUE(inflated_addr))
|
||||
return addr;
|
||||
if (inflated_addr & ~PAGE_MASK)
|
||||
return addr;
|
||||
|
||||
inflated_offset = inflated_addr & (huge_size - 1);
|
||||
inflated_addr += offset - inflated_offset;
|
||||
if (inflated_offset > offset)
|
||||
inflated_addr += huge_size;
|
||||
|
||||
if (inflated_addr > TASK_SIZE - len)
|
||||
return addr;
|
||||
|
||||
return inflated_addr;
|
||||
}
|
||||
|
||||
/**
|
||||
* drm_get_unmapped_area() - Get an unused user-space virtual memory area
|
||||
* suitable for huge page table entries.
|
||||
* @file: The struct file representing the address space being mmap()'d.
|
||||
* @uaddr: Start address suggested by user-space.
|
||||
* @len: Length of the area.
|
||||
* @pgoff: The page offset into the address space.
|
||||
* @flags: mmap flags
|
||||
* @mgr: The address space manager used by the drm driver. This argument can
|
||||
* probably be removed at some point when all drivers use the same
|
||||
* address space manager.
|
||||
*
|
||||
* This function attempts to find an unused user-space virtual memory area
|
||||
* that can accommodate the size we want to map, and that is properly
|
||||
* aligned to facilitate huge page table entries matching actual
|
||||
* huge pages or huge page aligned memory in buffer objects. Buffer objects
|
||||
* are assumed to start at huge page boundary pfns (io memory) or be
|
||||
* populated by huge pages aligned to the start of the buffer object
|
||||
* (system- or coherent memory). Adapted from shmem_get_unmapped_area.
|
||||
*
|
||||
* Return: aligned user-space address.
|
||||
*/
|
||||
unsigned long drm_get_unmapped_area(struct file *file,
|
||||
unsigned long uaddr, unsigned long len,
|
||||
unsigned long pgoff, unsigned long flags,
|
||||
struct drm_vma_offset_manager *mgr)
|
||||
{
|
||||
unsigned long addr;
|
||||
unsigned long inflated_addr;
|
||||
struct drm_vma_offset_node *node;
|
||||
|
||||
if (len > TASK_SIZE)
|
||||
return -ENOMEM;
|
||||
|
||||
/*
|
||||
* @pgoff is the file page-offset the huge page boundaries of
|
||||
* which typically aligns to physical address huge page boundaries.
|
||||
* That's not true for DRM, however, where physical address huge
|
||||
* page boundaries instead are aligned with the offset from
|
||||
* buffer object start. So adjust @pgoff to be the offset from
|
||||
* buffer object start.
|
||||
*/
|
||||
drm_vma_offset_lock_lookup(mgr);
|
||||
node = drm_vma_offset_lookup_locked(mgr, pgoff, 1);
|
||||
if (node)
|
||||
pgoff -= node->vm_node.start;
|
||||
drm_vma_offset_unlock_lookup(mgr);
|
||||
|
||||
addr = current->mm->get_unmapped_area(file, uaddr, len, pgoff, flags);
|
||||
if (IS_ERR_VALUE(addr))
|
||||
return addr;
|
||||
if (addr & ~PAGE_MASK)
|
||||
return addr;
|
||||
if (addr > TASK_SIZE - len)
|
||||
return addr;
|
||||
|
||||
if (len < HPAGE_PMD_SIZE)
|
||||
return addr;
|
||||
if (flags & MAP_FIXED)
|
||||
return addr;
|
||||
/*
|
||||
* Our priority is to support MAP_SHARED mapped hugely;
|
||||
* and support MAP_PRIVATE mapped hugely too, until it is COWed.
|
||||
* But if caller specified an address hint, respect that as before.
|
||||
*/
|
||||
if (uaddr)
|
||||
return addr;
|
||||
|
||||
inflated_addr = drm_addr_inflate(addr, len, pgoff, flags,
|
||||
HPAGE_PMD_SIZE);
|
||||
|
||||
if (IS_ENABLED(CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD) &&
|
||||
len >= HPAGE_PUD_SIZE)
|
||||
inflated_addr = drm_addr_inflate(inflated_addr, len, pgoff,
|
||||
flags, HPAGE_PUD_SIZE);
|
||||
return inflated_addr;
|
||||
}
|
||||
#else /* CONFIG_TRANSPARENT_HUGEPAGE */
|
||||
unsigned long drm_get_unmapped_area(struct file *file,
|
||||
unsigned long uaddr, unsigned long len,
|
||||
unsigned long pgoff, unsigned long flags,
|
||||
struct drm_vma_offset_manager *mgr)
|
||||
{
|
||||
return current->mm->get_unmapped_area(file, uaddr, len, pgoff, flags);
|
||||
}
|
||||
#endif /* CONFIG_TRANSPARENT_HUGEPAGE */
|
||||
EXPORT_SYMBOL_GPL(drm_get_unmapped_area);
|
||||
#endif /* CONFIG_MMU */
|
||||
|
@ -421,13 +421,4 @@ void drm_send_event_timestamp_locked(struct drm_device *dev,
|
||||
|
||||
struct file *mock_drm_getfile(struct drm_minor *minor, unsigned int flags);
|
||||
|
||||
#ifdef CONFIG_MMU
|
||||
struct drm_vma_offset_manager;
|
||||
unsigned long drm_get_unmapped_area(struct file *file,
|
||||
unsigned long uaddr, unsigned long len,
|
||||
unsigned long pgoff, unsigned long flags,
|
||||
struct drm_vma_offset_manager *mgr);
|
||||
#endif /* CONFIG_MMU */
|
||||
|
||||
|
||||
#endif /* _DRM_FILE_H_ */
|
||||
|
Loading…
Reference in New Issue
Block a user