>  
> +struct task_struct *fault_handler;
> +
> +void vas_wakeup_fault_handler(int virq, void *arg)
> +{
> +     struct vas_instance *vinst = arg;
> +
> +     atomic_inc(&vinst->pending_fault);
> +     wake_up(&vinst->fault_wq);
> +}
> +
> +/*
> + * Fault handler thread for each VAS instance and process fault CRBs.
> + */
> +static int fault_handler_func(void *arg)
> +{
> +     struct vas_instance *vinst = (struct vas_instance *)arg;
> +
> +     do {
> +             if (signal_pending(current))
> +                     flush_signals(current);
> +
> +             wait_event_interruptible(vinst->fault_wq,
> +                                     atomic_read(&vinst->pending_fault) ||
> +                                     kthread_should_stop());
> +
> +             if (kthread_should_stop())
> +                     break;
> +
> +             atomic_dec(&vinst->pending_fault);
> +     } while (!kthread_should_stop());
> +
> +     return 0;
> +}

Pleae use threaded interrupts instead of reinventing them badly.

Reply via email to