/* Invoked by arch to handle an IPI for call function single. Must be called from the arch with interrupts disabled.  */
void generic_smp_call_function_single_interrupt(void)
/* Invoked by arch to handle an IPI for call function single. Must be called from the arch with interrupts disabled.  */
void generic_smp_call_function_single_interrupt(void)
{
	struct call_single_queue *q = &__get_cpu_var(call_single_queue);
	unsigned int data_flags;
	LIST_HEAD(list);
	WARN_ON_ONCE(!cpu_online(smp_processor_id()));
	raw_spin_lock(&q->lock);
	list_replace_init(&q->list, &list);
	raw_spin_unlock(&q->lock);
	while (!list_empty(&list)) {
		struct call_single_data *data;
		data = list_entry(list.next, struct call_single_data, list);
		list_del(&data->list);
		data_flags = data->flags;
		data->func(data->info);
		if (data_flags & CSD_FLAG_LOCK)
			csd_unlock(data);
	}
}