[Intel-xe] [PATCH 1/4] drm/xe: Fix MTL+ stolen memory mapping

Lucas De Marchi lucas.demarchi at intel.com
Wed Jul 26 15:34:42 UTC 2023


On Wed, Jul 26, 2023 at 04:19:43PM +0100, Matthew Auld wrote:
>On 26/07/2023 16:13, Lucas De Marchi wrote:
>>On Tue, Jul 25, 2023 at 03:47:18PM -0700, Matt Roper wrote:
>>>On Tue, Jul 25, 2023 at 01:28:33PM -0700, Lucas De Marchi wrote:
>>>>Based on commit 8d8d062be6b9 ("drm/i915/mtl: Fix MTL stolen memory GGTT
>>>>mapping"). For stolen on MTL and beyond, the address in the PTE is the
>>>>offset from DSM base. While at it, update the comments explaining each
>>>>part of the calculation.
>>>>
>>>>v2: Also change resource_is_stolen_vram() so the right PTE bit is set
>>>
>>>With a bit more testing locally I noticed that I'm seeing some warnings
>>>and crashes on driver unload when display is enabled.  I'm not 100% sure
>>>they're tied to this, but it seems like they could be.
>>>
>>>The first warning is
>>>
>>>   WARNING: CPU: 10 PID: 4710 at 
>>>drivers/gpu/drm/xe/xe_ttm_vram_mgr.c:324 
>>>ttm_vram_mgr_fini+0x15e/0x170 [xe]
>>>
>>>which is
>>>
>>>       WARN_ON_ONCE(mgr->visible_avail != mgr->visible_size);
>>>
>>>From there things go downhill --- circular locking detected, slab cache
>>>problems, and KASAN use-after-free reports.
>>
>>I can only reproduce the warnings above, not the crashes, circular
>>lockings etc. They don't seem related to this patch. More below.
>>
>>>
>>>Without digging through the code in depth, my worry is that by just
>>>marking this stolen memory as vram everywhere in the driver, we try to
>>>return the framebuffer to the otherwise empty/uninitialized VRAM pool,
>>>even though it isn't truly VRAM.
>>>
>>>Maybe it would be better to make a change with less side effects
>>>elsewhere in the code.  E.g., add a "resource_is_stolen_devmem" that
>>>only gets called from the pagetable encoding functions to set the DM=1
>>>bit and not anywhere else?
>>
>>I think it would make it clearer about the intent since the stolen
>>memory is not actually vram, it's just accessed through the PCI BAR. I
>>did typed this all into new patches for this series, but it I still
>>reproduce the warnings above. They seem related to the small BAR
>>addition that added the tracking for the visible portion of the BAR.
>>
>>For stolen, it's always 100% visible. Loading the driver without
>>display (no warning on module removal):
>>
>>root at mtl: ~# cat  /sys/kernel/debug/dri/0/stolen_mm
>>   use_type: 1
>>   use_tt: 0
>>   size: 62914560
>>   usage: 0
>>default_page_size: 4KiB
>>visible_avail: 60MiB
>>visible_size: 60MiB
>>chunk_size: 4KiB, total: 60MiB, free: 60MiB
>>...
>>
>>vs loading it with display:
>>
>>root at mtl # cat  /sys/kernel/debug/dri/0/stolen_mm
>>   use_type: 1
>>   use_tt: 0
>>   size: 62914560
>>   usage: 25165824
>>default_page_size: 4KiB
>>visible_avail: 36MiB
>>visible_size: 60MiB
>>chunk_size: 4KiB, total: 60MiB, free: 36MiB
>>
>> From dmesg:
>>[ 3026.756075] xe 0000:00:02.0: [drm:xe_ttm_stolen_mgr_init [xe]] 
>>Initialized stolen memory support with 62914560 bytes
>>[ 3029.670666] xe 0000:00:02.0: [drm] Allocated fbdev into stolen
>>[ 3030.009260] xe 0000:00:02.0: [drm:intel_fbc_update [xe]] reserved 
>>16777216 bytes of contiguous stolen space for FBC, limit: 1
>>
>>So the allocations that remain on stolen seem to be the fbdev + FBC.
>>I wonder if the fini order is correct wrt display and we are returning
>>those before destroying the ttm mananger. Cc'ing Matt Auld and Maarten
>>to check if they have additional clues. I will send the next version
>>since I believe the approach without overriding is_vram is clearer and I
>>have several other fixes/cleanups piling there.
>
>Sounds like maybe:
>https://patchwork.freedesktop.org/series/120310/
>
>I have been cherry picking that on my local branches, otherwise module 
>unload is quite broken.

Great, that indeed fixes the module unload issue.  I will add that patch
as a proper fixup in my next series. I think that is the only thing
blocking that patch.

thanks
Lucas De Marchi

>
>>
>>I will try it on TGL or ADL-P to see if I can reproduce there too.
>>
>>Lucas De Marchi
>>
>>>
>>>Or maybe these warnings are unrelated; I haven't tried unloading with
>>>display on any other platforms recently, so maybe it's a pre-existing
>>>problem.
>>>
>>>
>>>Matt
>>>
>>>>
>>>>Signed-off-by: Lucas De Marchi <lucas.demarchi at intel.com>
>>>>---
>>>> drivers/gpu/drm/xe/xe_bo.c             |  3 ++-
>>>> drivers/gpu/drm/xe/xe_ttm_stolen_mgr.c | 15 +++++++++++++--
>>>> 2 files changed, 15 insertions(+), 3 deletions(-)
>>>>
>>>>diff --git a/drivers/gpu/drm/xe/xe_bo.c b/drivers/gpu/drm/xe/xe_bo.c
>>>>index 10858fcf4f62..5379d8e5affb 100644
>>>>--- a/drivers/gpu/drm/xe/xe_bo.c
>>>>+++ b/drivers/gpu/drm/xe/xe_bo.c
>>>>@@ -61,7 +61,8 @@ bool mem_type_is_vram(u32 mem_type)
>>>>
>>>> static bool resource_is_stolen_vram(struct xe_device *xe, 
>>>>struct ttm_resource *res)
>>>> {
>>>>-    return res->mem_type == XE_PL_STOLEN && IS_DGFX(xe);
>>>>+    return res->mem_type == XE_PL_STOLEN &&
>>>>+        (IS_DGFX(xe) || GRAPHICS_VERx100(xe) >= 1270);
>>>> }
>>>>
>>>> static bool resource_is_vram(struct ttm_resource *res)
>>>>diff --git a/drivers/gpu/drm/xe/xe_ttm_stolen_mgr.c 
>>>>b/drivers/gpu/drm/xe/xe_ttm_stolen_mgr.c
>>>>index 21ecc734f10a..271b3fba4129 100644
>>>>--- a/drivers/gpu/drm/xe/xe_ttm_stolen_mgr.c
>>>>+++ b/drivers/gpu/drm/xe/xe_ttm_stolen_mgr.c
>>>>@@ -94,11 +94,22 @@ static u32 detect_bar2_integrated(struct 
>>>>xe_device *xe, struct xe_ttm_stolen_mgr
>>>>
>>>>     ggc = xe_mmio_read32(xe_root_mmio_gt(xe), GGC);
>>>>
>>>>-    /* check GGMS, should be fixed 0x3 (8MB) */
>>>>+    /*
>>>>+     * Check GGMS: it should be fixed 0x3 (8MB), which 
>>>>corresponds to the
>>>>+     * GTT size
>>>>+     */
>>>>     if (drm_WARN_ON(&xe->drm, (ggc & GGMS_MASK) != GGMS_MASK))
>>>>         return 0;
>>>>
>>>>-    mgr->stolen_base = mgr->io_base = pci_resource_start(pdev, 
>>>>2) + SZ_8M;
>>>>+    /*
>>>>+     * Graphics >= 1270 uses the offset to the GSMBASE as 
>>>>address in the
>>>>+     * PTEs, together with the DM flag being set. Previously 
>>>>there was no
>>>>+     * such flag so the address was the io_base.
>>>>+     *
>>>>+     * DSMBASE = GSMBASE + 8MB
>>>>+     */
>>>>+    mgr->stolen_base = SZ_8M;
>>>>+    mgr->io_base = pci_resource_start(pdev, 2) + mgr->stolen_base;
>>>>
>>>>     /* return valid GMS value, -EIO if invalid */
>>>>     gms = REG_FIELD_GET(GMS_MASK, ggc);
>>>>-- 
>>>>2.40.1
>>>>
>>>
>>>-- 
>>>Matt Roper
>>>Graphics Software Engineer
>>>Linux GPU Platform Enablement
>>>Intel Corporation


More information about the Intel-xe mailing list