John Allen <jal...@linux.ibm.com> writes:

> While handling PRRN events, the time to handle the actual hotplug events
> dwarfs the time it takes to perform the device tree updates and queue the
> hotplug events. In the case that PRRN events are being queued continuously,
> hotplug events have been observed to be queued faster than the kernel can
> actually handle them. This patch avoids the problem by waiting for a
> hotplug request to complete before queueing more hotplug events.

So do we need the hotplug work queue at all? Can we just call
handle_dlpar_errorlog() directly?

Or are we using the work queue to serialise things? And if so would a
mutex be better?

It looks like prrn_update_node() is called via at least, prrn_work_fn()
and post_mobility_fixup().

The latter is called from migration_store(), which seems like it would
be harmless. But also from pseries_suspend_enable_irqs() which I'm less
clear on.

cheers

> diff --git a/arch/powerpc/platforms/pseries/mobility.c 
> b/arch/powerpc/platforms/pseries/mobility.c
> index 8a8033a249c7..49930848fa78 100644
> --- a/arch/powerpc/platforms/pseries/mobility.c
> +++ b/arch/powerpc/platforms/pseries/mobility.c
> @@ -242,6 +242,7 @@ static int add_dt_node(__be32 parent_phandle, __be32 
> drc_index)
>  static void prrn_update_node(__be32 phandle)
>  {
>       struct pseries_hp_errorlog *hp_elog;
> +     struct completion hotplug_done;
>       struct device_node *dn;
>  
>       /*
> @@ -263,7 +264,9 @@ static void prrn_update_node(__be32 phandle)
>       hp_elog->id_type = PSERIES_HP_ELOG_ID_DRC_INDEX;
>       hp_elog->_drc_u.drc_index = phandle;
>  
> -     queue_hotplug_event(hp_elog, NULL, NULL);
> +     init_completion(&hotplug_done);
> +     queue_hotplug_event(hp_elog, &hotplug_done, NULL);
> +     wait_for_completion(&hotplug_done);
>  
>       kfree(hp_elog);
>  }
> -- 
> 2.17.1

Reply via email to