[PATCH xserver] edid: Prune duplicates after adding modes from DDC

Emil Velikov emil.l.velikov at gmail.com
Thu Feb 23 20:21:01 UTC 2017


On Wednesday, 22 February 2017, Michel Dänzer <michel at daenzer.net> wrote:

> From: Michel Dänzer <michel.daenzer at amd.com <javascript:;>>
>
> 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 <javascript:;>>
> ---
>
> Xiaogang / Jorge, does this fix the memory leak you're seeing?
>
>  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);
> +

Wouldn't it be better to add the mode only if it doesn't exist, or it
doesn't really matter ?


> +        /* Update pointer to last mode */
> +        for (Mode = Monitor->Modes; Mode && Mode->next; Mode =
> Mode->next);
> +        Monitor->Last = Mode;

Perhaps I'm just tired but this looks like this will overwrite
Monitor->Last multiple times, right?

A simple while loop like the original code should do it.

-Emil
P.s. Sending from my phone - pardon the html formatting.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.x.org/archives/xorg-devel/attachments/20170223/2f517ebc/attachment.html>


More information about the xorg-devel mailing list