[PATCH xserver] edid: Prune duplicates after adding modes from DDC
Chen, Xiaogang
Xiaogang.Chen at amd.com
Wed Feb 22 21:46:32 UTC 2017
> -----Original Message-----
> From: Michel Dänzer [mailto:michel at daenzer.net]
> Sent: Wednesday, February 22, 2017 2:09 AM
> To: xorg-devel at lists.x.org
> Cc: Chen, Xiaogang <Xiaogang.Chen at amd.com>;
> jorge_monteagudo at hotmail.com
> Subject: [PATCH xserver] edid: Prune duplicates after adding modes from DDC
>
> From: Michel Dänzer <michel.daenzer at amd.com>
>
> Multiple calls to xf86EdidMonitorSet (which can be triggered e.g. by running
> xrandr) would potentially keep adding the same modes, causing the Monitor-
> >Modes list to keep growing larger and using up more memory.
>
> Fix this by calling xf86PruneDuplicateModes after adding the modes returned
> by xf86DDCGetModes. This removes any newly added modes which were
> already in the Monitor->Modes list before, but keeps new modes which weren't
> yet.
>
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=99521
> Signed-off-by: Michel Dänzer <michel.daenzer at amd.com>
> ---
>
> Xiaogang / Jorge, does this fix the memory leak you're seeing?
>
[XCHEN] Hi Michel: I tested your patch with same script I used before(while true; do xrandr --verbose; done), the memory leak is still there. Actually the xf86PruneDuplicateModes() is called before at xf86DDCGetModes() which is called by xf86EdidMonitorSet().
I think the point here is: why we need to have these "mode"? I do not find these "mode" got used afterword. Does anyone know the purpose that xf86DDCGetModes() generates these modes?
Jorge: did you test this patch or my patch?
Thanks
Xiaogang
> hw/xfree86/modes/xf86EdidModes.c | 14 ++++++--------
> 1 file changed, 6 insertions(+), 8 deletions(-)
>
> diff --git a/hw/xfree86/modes/xf86EdidModes.c
> b/hw/xfree86/modes/xf86EdidModes.c
> index f0e1e974b..55833f886 100644
> --- a/hw/xfree86/modes/xf86EdidModes.c
> +++ b/hw/xfree86/modes/xf86EdidModes.c
> @@ -1198,21 +1198,19 @@ xf86EdidMonitorSet(int scrnIndex, MonPtr
> Monitor, xf86MonPtr DDC)
> if (!Monitor->nHsync || !Monitor->nVrefresh)
> DDCGuessRangesFromModes(scrnIndex, Monitor, Modes);
>
> - /* look for last Mode */
> - Mode = Modes;
> -
> - while (Mode->next)
> - Mode = Mode->next;
> -
> /* add to MonPtr */
> if (Monitor->Modes) {
> Monitor->Last->next = Modes;
> Modes->prev = Monitor->Last;
> - Monitor->Last = Mode;
> }
> else {
> Monitor->Modes = Modes;
> - Monitor->Last = Mode;
> }
> +
> + xf86PruneDuplicateModes(Monitor->Modes);
> +
> + /* Update pointer to last mode */
> + for (Mode = Monitor->Modes; Mode && Mode->next; Mode = Mode-
> >next);
> + Monitor->Last = Mode;
> }
> }
> --
> 2.11.0
More information about the xorg-devel
mailing list