ANDROID: mm: shmem: add vendor hooks in shmem folio allocation path
Add vendor hooks in shmem folio allocation paths to tune the higher order folios. With vendor hook possibly overriding shmem_allowable_huge_orders() result, `order` inside shmem_get_folio_gfp() becomes variable when when CONFIG_TRANSPARENT_HUGEPAGE=n and the block that calls vma_thp_gfp_mask() is not compiled out anymore, leading to the following linker error: ld.lld: error: undefined symbol: vma_thp_gfp_mask >>> referenced by shmem.c Fix this by making the block dependent on CONFIG_TRANSPARENT_HUGEPAGE. Bug: 397599006 Change-Id: Ia0e126c674a9f08cb10fe5ee06f5efac7b5cbe7f Signed-off-by: Charan Teja Kalla <quic_charante@quicinc.com> Signed-off-by: Suren Baghdasaryan <surenb@google.com>
This commit is contained in:
committed by
Suren Baghdasaryan
parent
fac8fe3f78
commit
add2b5a560
@@ -286,6 +286,8 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_tune_swappiness);
|
|||||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_logbuf_pr_cont);
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_logbuf_pr_cont);
|
||||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_calc_alloc_flags);
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_calc_alloc_flags);
|
||||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_regmap_update);
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_regmap_update);
|
||||||
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_shmem_suitable_orders);
|
||||||
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_shmem_allowable_huge_orders);
|
||||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_shmem_get_folio);
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_shmem_get_folio);
|
||||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_slab_folio_alloced);
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_slab_folio_alloced);
|
||||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_kmalloc_large_alloced);
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_kmalloc_large_alloced);
|
||||||
|
|||||||
@@ -20,7 +20,14 @@ DECLARE_RESTRICTED_HOOK(android_rvh_try_alloc_pages_gfp,
|
|||||||
TP_PROTO(struct page **page, unsigned int order,
|
TP_PROTO(struct page **page, unsigned int order,
|
||||||
gfp_t gfp, enum zone_type highest_zoneidx),
|
gfp_t gfp, enum zone_type highest_zoneidx),
|
||||||
TP_ARGS(page, order, gfp, highest_zoneidx), 1);
|
TP_ARGS(page, order, gfp, highest_zoneidx), 1);
|
||||||
|
DECLARE_RESTRICTED_HOOK(android_rvh_shmem_suitable_orders,
|
||||||
|
TP_PROTO(struct inode *inode, pgoff_t index,
|
||||||
|
unsigned long orders, unsigned long *suitable_orders),
|
||||||
|
TP_ARGS(inode, index, orders, suitable_orders), 4);
|
||||||
|
DECLARE_RESTRICTED_HOOK(android_rvh_shmem_allowable_huge_orders,
|
||||||
|
TP_PROTO(struct inode *inode, pgoff_t index,
|
||||||
|
struct vm_area_struct *vma, unsigned long *orders),
|
||||||
|
TP_ARGS(inode, index, vma, orders), 4);
|
||||||
/*
|
/*
|
||||||
|
|
||||||
DECLARE_RESTRICTED_HOOK(android_rvh_set_skip_swapcache_flags,
|
DECLARE_RESTRICTED_HOOK(android_rvh_set_skip_swapcache_flags,
|
||||||
|
|||||||
+10
@@ -1804,6 +1804,8 @@ static struct folio *shmem_alloc_and_add_folio(struct vm_fault *vmf,
|
|||||||
suitable_orders = shmem_suitable_orders(inode, vmf,
|
suitable_orders = shmem_suitable_orders(inode, vmf,
|
||||||
mapping, index, orders);
|
mapping, index, orders);
|
||||||
|
|
||||||
|
trace_android_rvh_shmem_suitable_orders(inode, index,
|
||||||
|
orders, &suitable_orders);
|
||||||
order = highest_order(suitable_orders);
|
order = highest_order(suitable_orders);
|
||||||
while (suitable_orders) {
|
while (suitable_orders) {
|
||||||
pages = 1UL << order;
|
pages = 1UL << order;
|
||||||
@@ -2322,6 +2324,13 @@ repeat:
|
|||||||
|
|
||||||
/* Find hugepage orders that are allowed for anonymous shmem and tmpfs. */
|
/* Find hugepage orders that are allowed for anonymous shmem and tmpfs. */
|
||||||
orders = shmem_allowable_huge_orders(inode, vma, index, write_end, false);
|
orders = shmem_allowable_huge_orders(inode, vma, index, write_end, false);
|
||||||
|
trace_android_rvh_shmem_allowable_huge_orders(inode, index, vma, &orders);
|
||||||
|
/*
|
||||||
|
* With the above hook `order` is not always 0 anymore and the following
|
||||||
|
* if block does not get compiled out. With CONFIG_TRANSPARENT_HUGEPAGE=n
|
||||||
|
* vma_thp_gfp_mask() becomes undefined and linker fails.
|
||||||
|
*/
|
||||||
|
#ifdef CONFIG_TRANSPARENT_HUGEPAGE
|
||||||
if (orders > 0) {
|
if (orders > 0) {
|
||||||
gfp_t huge_gfp;
|
gfp_t huge_gfp;
|
||||||
|
|
||||||
@@ -2338,6 +2347,7 @@ repeat:
|
|||||||
if (PTR_ERR(folio) == -EEXIST)
|
if (PTR_ERR(folio) == -EEXIST)
|
||||||
goto repeat;
|
goto repeat;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
folio = shmem_alloc_and_add_folio(vmf, gfp, inode, index, fault_mm, 0);
|
folio = shmem_alloc_and_add_folio(vmf, gfp, inode, index, fault_mm, 0);
|
||||||
if (IS_ERR(folio)) {
|
if (IS_ERR(folio)) {
|
||||||
|
|||||||
Reference in New Issue
Block a user