bug-hurd
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [RFC PATCH v4 1/2 hurd] libirqhelp: Add library


From: Damien Zammit
Subject: Re: [RFC PATCH v4 1/2 hurd] libirqhelp: Add library
Date: Sat, 08 Jul 2023 00:40:07 +0000

Hi,

I realised that the guts of interrupt_register() needs to be done
in irqhelp_server_loop() to configure the interrupt thread.

This means we need a semaphore to wait until the server loop is ready
to execute, and a new api call irqhelp_wait_init() to allow the caller
to wait after registering the handler and kicking off the server loop,
to continue executing the main thread.

On 5/7/23 17:59, Damien Zammit wrote:
> +static struct irq *
> +interrupt_register(int gsi,
> +                int bus,
> +                int dev,
> +                int fun,
> +                void (*handler)(void *),
> +                void *context)
> +{
...

> +
> +  err = mach_port_allocate (mach_task_self (), MACH_PORT_RIGHT_RECEIVE,
> +                         &delivery_port);
> +  if (err)
> +    goto fail;
> +
> +  irq->port = delivery_port;
> +
> +  err = thread_get_assignment (mach_thread_self (), &pset);
> +  if (err)
> +    goto fail;
> +
> +  err = host_processor_set_priv (master_host, pset, &psetcntl);
> +  if (err)
> +    goto fail;
> +
> +  thread_max_priority (mach_thread_self (), psetcntl, 0);
> +  err = thread_priority (mach_thread_self (), IRQ_THREAD_PRIORITY, 0);
> +  if (err)
> +    goto fail;
> +
> +  err = device_intr_register(irqdev, irq->gsi,
> +                             0, irq->port,
> +                             MACH_MSG_TYPE_MAKE_SEND);
> +  if (err)
> +    goto fail;
> +
> +  return irq;
> +
> +fail:
> +  printf("irqhelp failed to register irq %d\n", gsi);
> +  pthread_cond_destroy(&irq->irqcond);
> +  pthread_mutex_destroy(&irq->irqlock);
> +  free(irq);
> +  return NULL;
> +}

Damien




reply via email to

[Prev in Thread] Current Thread [Next in Thread]