[prev in list] [next in list] [prev in thread] [next in thread] 

List:       hurd-bug
Subject:    Re: [PATCH] Move user_intr handling to mach side
From:       Samuel Thibault <samuel.thibault () gnu ! org>
Date:       2020-08-05 13:43:41
Message-ID: 20200805134341.wqjuwxmadn7x3wbz () function
[Download RAW message or body]

Junling Ma, le mar. 04 août 2020 18:21:21 -0700, a ecrit:
> >> +    __disable_irq (irqtab.irq[id]);
> > 
> > I'd say add a struct irqdev * in the user_intr_t, so you don't have to
> > hardcode irqtab. Also, no need to keep it inside splhigh.
> 
> Sure we can keep a pointer inside user_intr_t.

> But IO don't think we need to protect __disable_irq, as __disable_irq itself does a splhigh/splx.

That's what I wrote above, yes.

> >> +  PROTECT(dev->lock, queue_enter (&dev->intr_queue, e, user_intr_t *, chain));
> >> +  printf("irq handler [%d]: new delivery port %p entry %p\n", id, dst_port, e);
> >> +  return e;
> > 
> > 
> >> @@ -178,8 +156,11 @@ intr_thread (void)
> >>       simple_lock(&irqtab.lock);
> >>       queue_iterate (&main_intr_queue, e, user_intr_t *, chain)
> >> 	{
> >> -	  if ((!e->dst_port || e->dst_port->ip_references == 1) && e->n_unacked)
> >> +	  /* e cannot be NULL, as we check against it when installing the handler */
> >> +	  assert(e != NULL);
> > 
> > Errr, it can't be null because it's a member of the queue.
> 
> It is gone in the separated patch. In the original code there was a test against NULL,

? No there wasn't.

> >> +	  while (e->dst_port->ip_references == 1)
> > 
> > while?? belowe you ipc_port_release(), so the reference will necesarily
> > fall down to 0 anyway.
> 
> The pointer e moves to the next item in the queue, see e = next, below.

Ah ok. That would definitely deserves a comment.

> >> diff --git a/linux/dev/arch/i386/kernel/irq.c b/linux/dev/arch/i386/kernel/irq.c
> >> index 1e911f33..5879165f 100644
> >> --- a/linux/dev/arch/i386/kernel/irq.c
> >> +++ b/linux/dev/arch/i386/kernel/irq.c
> >> 
> >> -  if (!irq_action[irq])
> >> -    {
> >> -      /* No handler any more, disable interrupt */
> >> -      mask_irq (irq);
> >> -      ivect[irq] = intnull;
> >> -      iunit[irq] = irq;
> >> -    }
> >> -
> > 
> > I'd say we want to keep it?
> 
> This is already done in free_irq.

Ah, right, ok.

> If we do it in two places, we might have a race condition?

? No, since the free_irq is under cli.

Samuel

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic