drivers/gpu/drm/i915/gem/selftests/huge_pages.c
Source file repositories/reference/linux-study-clean/drivers/gpu/drm/i915/gem/selftests/huge_pages.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/gpu/drm/i915/gem/selftests/huge_pages.c- Extension
.c- Size
- 45863 bytes
- Lines
- 2026
- Domain
- Driver Families
- Bucket
- drivers/gpu
- Inferred role
- Driver Families: implementation source
- Status
- source implementation candidate
Why This File Exists
Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Allocates kernel memory; connect allocation flags and lifetime to context constraints.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/prime_numbers.hlinux/string_helpers.hlinux/swap.hi915_selftest.hgem/i915_gem_internal.hgem/i915_gem_lmem.hgem/i915_gem_pm.hgem/i915_gem_region.hgt/intel_gt.higt_gem_utils.hmock_context.hselftests/mock_drm.hselftests/mock_gem_device.hselftests/mock_region.hselftests/i915_random.h
Detected Declarations
function get_largest_page_sizefunction huge_pages_free_pagesfunction get_huge_pagesfunction put_huge_pagesfunction huge_pages_objectfunction fake_get_huge_pagesfunction fake_get_huge_pages_singlefunction fake_free_huge_pagesfunction fake_put_huge_pagesfunction fake_huge_pages_objectfunction igt_check_page_sizesfunction IS_ALIGNEDfunction igt_mock_exhaust_device_supported_pagesfunction igt_mock_memory_region_huge_pagesfunction for_each_set_bitfunction igt_mock_ppgtt_misaligned_dmafunction for_each_set_bit_fromfunction close_object_listfunction list_for_each_entry_safefunction igt_ppgtt_huge_fillfunction for_each_prime_number_fromfunction igt_ppgtt_64Kfunction gpu_writefunction __cpu_check_shmemfunction __cpu_check_vmapfunction cpu_checkfunction __igt_write_hugefunction igt_write_hugefunction igt_can_allocate_thpfunction igt_create_shmemfunction igt_create_internalfunction igt_create_systemfunction igt_create_localfunction igt_random_sizefunction igt_ppgtt_smoke_hugefunction igt_ppgtt_sanity_checkfunction igt_ppgtt_compactfunction igt_ppgtt_mixedfunction igt_tmpfs_fallbackfunction igt_shrink_thpfunction for_each_gem_enginefunction i915_gem_huge_page_mock_selftestsfunction i915_gem_huge_page_live_selftests
Annotated Snippet
if (!rem) {
sg_mark_end(sg);
break;
}
sg = __sg_next(sg);
} while ((rem - ((page_size-1) & page_mask)) >= page_size);
page_mask &= (page_size-1);
} while (page_mask);
if (i915_gem_gtt_prepare_pages(obj, st))
goto err;
GEM_BUG_ON(sg_page_sizes != obj->mm.page_mask);
__i915_gem_object_set_pages(obj, st);
return 0;
err:
sg_set_page(sg, NULL, 0, 0);
sg_mark_end(sg);
huge_pages_free_pages(st);
return -ENOMEM;
}
static void put_huge_pages(struct drm_i915_gem_object *obj,
struct sg_table *pages)
{
i915_gem_gtt_finish_pages(obj, pages);
huge_pages_free_pages(pages);
obj->mm.dirty = false;
__start_cpu_write(obj);
}
static const struct drm_i915_gem_object_ops huge_page_ops = {
.name = "huge-gem",
.flags = I915_GEM_OBJECT_IS_SHRINKABLE,
.get_pages = get_huge_pages,
.put_pages = put_huge_pages,
};
static struct drm_i915_gem_object *
huge_pages_object(struct drm_i915_private *i915,
u64 size,
unsigned int page_mask)
{
static struct lock_class_key lock_class;
struct drm_i915_gem_object *obj;
unsigned int cache_level;
GEM_BUG_ON(!size);
GEM_BUG_ON(!IS_ALIGNED(size, BIT(__ffs(page_mask))));
if (size >> PAGE_SHIFT > INT_MAX)
return ERR_PTR(-E2BIG);
if (overflows_type(size, obj->base.size))
return ERR_PTR(-E2BIG);
obj = i915_gem_object_alloc();
if (!obj)
return ERR_PTR(-ENOMEM);
drm_gem_private_object_init(&i915->drm, &obj->base, size);
i915_gem_object_init(obj, &huge_page_ops, &lock_class, 0);
obj->mem_flags |= I915_BO_FLAG_STRUCT_PAGE;
i915_gem_object_set_volatile(obj);
obj->write_domain = I915_GEM_DOMAIN_CPU;
obj->read_domains = I915_GEM_DOMAIN_CPU;
cache_level = HAS_LLC(i915) ? I915_CACHE_LLC : I915_CACHE_NONE;
i915_gem_object_set_cache_coherency(obj, cache_level);
obj->mm.page_mask = page_mask;
return obj;
}
static int fake_get_huge_pages(struct drm_i915_gem_object *obj)
{
struct drm_i915_private *i915 = to_i915(obj->base.dev);
const u64 max_len = rounddown_pow_of_two(UINT_MAX);
struct sg_table *st;
struct scatterlist *sg;
u64 rem;
Annotation
- Immediate include surface: `linux/prime_numbers.h`, `linux/string_helpers.h`, `linux/swap.h`, `i915_selftest.h`, `gem/i915_gem_internal.h`, `gem/i915_gem_lmem.h`, `gem/i915_gem_pm.h`, `gem/i915_gem_region.h`.
- Detected declarations: `function get_largest_page_size`, `function huge_pages_free_pages`, `function get_huge_pages`, `function put_huge_pages`, `function huge_pages_object`, `function fake_get_huge_pages`, `function fake_get_huge_pages_single`, `function fake_free_huge_pages`, `function fake_put_huge_pages`, `function fake_huge_pages_object`.
- Atlas domain: Driver Families / drivers/gpu.
- Implementation status: source implementation candidate.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.