xen/events: fix delayed eoi list handling
authorJuergen Gross <jgross@suse.com>
Mon, 25 Sep 2023 15:54:13 +0000 (17:54 +0200)
committerJuergen Gross <jgross@suse.com>
Mon, 13 Nov 2023 14:21:08 +0000 (15:21 +0100)
When delaying eoi handling of events, the related elements are queued
into the percpu lateeoi list. In case the list isn't empty, the
elements should be sorted by the time when eoi handling is to happen.

Unfortunately a new element will never be queued at the start of the
list, even if it has a handling time lower than all other list
elements.

Fix that by handling that case the same way as for an empty list.

Fixes: e99502f76271 ("xen/events: defer eoi in case of excessive number of events")
Reported-by: Jan Beulich <jbeulich@suse.com>
Signed-off-by: Juergen Gross <jgross@suse.com>
Reviewed-by: Oleksandr Tyshchenko <oleksandr_tyshchenko@epam.com>
Signed-off-by: Juergen Gross <jgross@suse.com>
drivers/xen/events/events_base.c

index 237e6b884f722c1114f2d7703b71ed59925e9fba..cd33a418344a8caa0c2a39ad4f239e93d8a2e9bf 100644 (file)
@@ -604,7 +604,9 @@ static void lateeoi_list_add(struct irq_info *info)
 
        spin_lock_irqsave(&eoi->eoi_list_lock, flags);
 
-       if (list_empty(&eoi->eoi_list)) {
+       elem = list_first_entry_or_null(&eoi->eoi_list, struct irq_info,
+                                       eoi_list);
+       if (!elem || info->eoi_time < elem->eoi_time) {
                list_add(&info->eoi_list, &eoi->eoi_list);
                mod_delayed_work_on(info->eoi_cpu, system_wq,
                                    &eoi->delayed, delay);