Re: [patch 3/5] [PREEMPT_RT] Changing interrupt handlers fromrunning in thread to hardirq and back runtime.

From: Steven Rostedt
Date: Sat Jun 03 2006 - 16:52:48 EST


On Fri, 2006-06-02 at 23:23 +0100, Esben Nielsen wrote:
> Makes it possible for the e100 ethernet driver to have it's interrupt handler
> in both hard-irq and threaded context under PREEMPT_RT.
>
> Index: linux-2.6.16-rt23.spin_mutex/drivers/net/e100.c
> ===================================================================
> --- linux-2.6.16-rt23.spin_mutex.orig/drivers/net/e100.c
> +++ linux-2.6.16-rt23.spin_mutex/drivers/net/e100.c
> @@ -530,7 +530,7 @@ struct nic {
> enum ru_state ru_running;
>
> spinlock_t cb_lock ____cacheline_aligned;
> - spinlock_t cmd_lock;
> + spin_mutex_t cmd_lock;
> struct csr __iomem *csr;
> enum scb_cmd_lo cuc_cmd;
> unsigned int cbs_avail;
> @@ -1950,6 +1950,30 @@ static int e100_rx_alloc_list(struct nic
> return 0;
> }
>
> +static int e100_change_context(int irq, void *dev_id,
> + enum change_context_cmd cmd)
> +{
> + struct net_device *netdev = dev_id;
> + struct nic *nic = netdev_priv(netdev);
> +
> + switch(cmd)
> + {
> + case IRQ_TO_HARDIRQ:
> + if(!spin_mutexes_can_spin())
> + return -ENOSYS;
> +
> + spin_mutex_to_spin(&nic->cmd_lock);
> + break;
> + case IRQ_CAN_THREAD:
> + /* Ok - return 0 */
> + break;

Why even bother with the IRQ_CAN_THREAD. If this would be anything
other than OK, then we shouldn't be using that request_irq2 (yuck!) call
in the first place.

-- Steve

> + case IRQ_TO_THREADED:
> + spin_mutex_to_mutex(&nic->cmd_lock);
> + break;
> + }
> + return 0; /* Ok */
> +}
> +
> static irqreturn_t e100_intr(int irq, void *dev_id, struct pt_regs *regs)
> {
> struct net_device *netdev = dev_id;
> @@ -2064,9 +2088,12 @@ static int e100_up(struct nic *nic)
> e100_set_multicast_list(nic->netdev);
> e100_start_receiver(nic, NULL);
> mod_timer(&nic->watchdog, jiffies);
> - if((err = request_irq(nic->pdev->irq, e100_intr, SA_SHIRQ,
> - nic->netdev->name, nic->netdev)))
> + if((err = request_irq2(nic->pdev->irq, e100_intr,
> + SA_SHIRQ|SA_MUST_THREAD_RT,
> + nic->netdev->name, nic->netdev,
> + e100_change_context)))
> goto err_no_irq;
> +
> netif_wake_queue(nic->netdev);
> netif_poll_enable(nic->netdev);
> /* enable ints _after_ enabling poll, preventing a race between
>


-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/