Skip to content
Snippets Groups Projects
Commit 2c3b99bc authored by Xianzhong's avatar Xianzhong Committed by Gianfranco Mariotti
Browse files

LF-4436-2 [#imx-2664] allocate scatter list for cacheable pages only


sg_alloc_table_from_pages will consume system memory for gfp allocator,
scatter list is used for the addtional operation on cacheable memory,
check cacheable flag to allocate scatter list when necessary only.

[ 1704.740010] Chrome_InProcGp invoked oom-killer: gfp_mask=0xcc0(GFP_KERNEL), order=0, oom_score_adj=0
[ 1704.749265] CPU: 3 PID: 1251 Comm: Chrome_InProcGp Tainted: G         C        5.10.52-lts-5.10.y+g5788c4507376 #1
[ 1704.759618] Hardware name: NXP i.MX8MNano EVK board (DT)
[ 1704.764929] Call trace:
[ 1704.767385]  dump_backtrace+0x0/0x1a0
[ 1704.771051]  show_stack+0x18/0x70
[ 1704.774368]  dump_stack+0xd0/0x12c
[ 1704.777770]  dump_header+0x48/0x1f4
[ 1704.781259]  oom_kill_process+0x200/0x204
[ 1704.785268]  out_of_memory+0x178/0x560
[ 1704.789018]  __alloc_pages_nodemask+0xb34/0xc24
[ 1704.793549]  alloc_pages_current+0x80/0x13c
[ 1704.797752]  __get_free_pages+0x14/0x50
[ 1704.801595]  __sg_alloc_table_from_pages+0x22c/0x484
[ 1704.806559]  sg_alloc_table_from_pages+0x24/0x3c
[ 1704.811176]  _GFPAlloc+0x2b0/0x670
[ 1704.814579]  gckOS_AllocatePagedMemory+0xf4/0x1fc
[ 1704.819302]  gckVIDMEM_NODE_AllocateVirtual+0xc4/0x190
[ 1704.824446]  gckKERNEL_AllocateVideoMemory+0x2f8/0x380
[ 1704.829584]  _AllocateLinearMemory+0xb8/0x1b4
[ 1704.833943]  gckKERNEL_Dispatch+0x20c/0x13d4
[ 1704.838229]  gckDEVICE_Dispatch+0x80/0x1bc
[ 1704.842328]  drv_ioctl+0x1b4/0x270
[ 1704.845750]  __arm64_sys_ioctl+0xa8/0xf0
[ 1704.849677]  el0_svc_common.constprop.0+0x78/0x1a0
[ 1704.854469]  do_el0_svc+0x24/0x90
[ 1704.857803]  el0_svc+0x14/0x20
[ 1704.860860]  el0_sync_handler+0x1a4/0x1b0
[ 1704.864869]  el0_sync+0x180/0x1c0

Signed-off-by: default avatarXianzhong <xianzhong.li@nxp.com>
parent c2fd71ef
No related branches found
No related tags found
1 merge request!156Draft: [i.MX] mxc: gpu-viv: apply patches
......@@ -625,52 +625,56 @@ _GFPAlloc(
gcmkONERROR(_NonContiguousAlloc(mdlPriv, NumPages, gfp));
}
}
if (Flags & gcvALLOC_FLAG_CACHEABLE)
{
#if gcdUSE_Linux_SG_TABLE_API
result = sg_alloc_table_from_pages(&mdlPriv->sgt,
mdlPriv->nonContiguousPages, NumPages, 0,
NumPages << PAGE_SHIFT, GFP_KERNEL);
result = sg_alloc_table_from_pages(&mdlPriv->sgt,
mdlPriv->nonContiguousPages, NumPages, 0,
NumPages << PAGE_SHIFT, GFP_KERNEL);
#else
result = alloc_sg_list_from_pages(&mdlPriv->sgt.sgl,
mdlPriv->nonContiguousPages, NumPages, 0,
NumPages << PAGE_SHIFT, &mdlPriv->sgt.nents);
result = alloc_sg_list_from_pages(&mdlPriv->sgt.sgl,
mdlPriv->nonContiguousPages, NumPages, 0,
NumPages << PAGE_SHIFT, &mdlPriv->sgt.nents);
mdlPriv->sgt.orig_nents = mdlPriv->sgt.nents;
mdlPriv->sgt.orig_nents = mdlPriv->sgt.nents;
#endif
if (result < 0)
{
if (Mdl->pageUnit1M)
if (result < 0)
{
_NonContiguous1MPagesFree(mdlPriv, mdlPriv->numPages1M);
}
else
{
_NonContiguousFree(mdlPriv->nonContiguousPages, NumPages);
}
if (Mdl->pageUnit1M)
{
_NonContiguous1MPagesFree(mdlPriv, mdlPriv->numPages1M);
}
else
{
_NonContiguousFree(mdlPriv->nonContiguousPages, NumPages);
}
gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY);
}
gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY);
}
result = dma_map_sg(galcore_device,
mdlPriv->sgt.sgl, mdlPriv->sgt.nents, DMA_FROM_DEVICE);
result = dma_map_sg(galcore_device,
mdlPriv->sgt.sgl, mdlPriv->sgt.nents, DMA_FROM_DEVICE);
if (result != mdlPriv->sgt.nents)
{
if (Mdl->pageUnit1M)
if (result != mdlPriv->sgt.nents)
{
_NonContiguous1MPagesFree(mdlPriv, mdlPriv->numPages1M);
}
else
{
_NonContiguousFree(mdlPriv->nonContiguousPages, NumPages);
}
if (Mdl->pageUnit1M)
{
_NonContiguous1MPagesFree(mdlPriv, mdlPriv->numPages1M);
}
else
{
_NonContiguousFree(mdlPriv->nonContiguousPages, NumPages);
}
#if gcdUSE_Linux_SG_TABLE_API
sg_free_table(&mdlPriv->sgt);
sg_free_table(&mdlPriv->sgt);
#else
kfree(mdlPriv->sgt.sgl);
kfree(mdlPriv->sgt.sgl);
#endif
gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY);
gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY);
}
}
#if defined(CONFIG_X86)
......@@ -821,7 +825,7 @@ _GFPFree(
dma_unmap_page(galcore_device, mdlPriv->dma_addr,
Mdl->numPages << PAGE_SHIFT, DMA_FROM_DEVICE);
}
else
else if (mdlPriv->sgt.sgl)
{
dma_unmap_sg(galcore_device, mdlPriv->sgt.sgl, mdlPriv->sgt.nents,
DMA_FROM_DEVICE);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment