How about if the same sequence occurred, but from two different drivers ?

We've had some bad experience with this stuff. Our driver, which acts as an
intermediate net driver, would call the hard_start_xmit in the base driver.
The base driver, wanting to block receive interrupts would issue a
'spin_lock_irqsave(a,b)' and process the packet. If the TX queue is full, it
could call an indication entry point in our intermediate driver to signal it
to stop sending more packets. Since our indication function handles many
types of indications but can process them only one at a time, we wanted to
block other indications while queuing the request.

The whole sequence would look like that:

[our driver]
        ans_send() {
                .
                .
                e100_hard_start_xmit(dev, skb);
                .
                .
        }

[e100.o]
        e100_hard_start_xmit() {
                .
                .
                spin_lock_irqsave(a,b);
                .
                .
                if(tx_queue_full)
                        ans_notify(TX_QUEUE_FULL);      <--
                .
                .
                spin_unlock_irqrestore(a,b);
        }
        
[our driver]
        ans_notify() {
                .
                .
                spin_lock_irqsave(c,d);
                queue_request(req_type);
                spin_unlock_irqrestore(c,d);    <--
                .
                .
        }

At that point, for some reason, interrupts were back and the e100.o would
hang in an infinite loop (we verified it on kernel 2.4.0-test10 +kdb that
the processor was enabling interrupts and that the e100_isr was called for
processing an Rx int.).

How is that possible that a 'spin_unlock_irqrestore(c,d)' would also restore
what should have been restored only with a 'spin_unlock_irqrestore(a,b)' ?


        Thanks in advance,
        Shmulik Hen      
      Software Engineer
        Linux Advanced Networking Services
        Intel Network Communications Group
        Jerusalem, Israel.

-----Original Message-----
From: Nigel Gamble [mailto:[EMAIL PROTECTED]]
Sent: Wednesday, March 07, 2001 1:54 AM
To: Manoj Sontakke
Cc: [EMAIL PROTECTED]
Subject: Re: spinlock help


On Tue, 6 Mar 2001, Manoj Sontakke wrote:
> 1. when spin_lock_irqsave() function is called the subsequent code is
> executed untill spin_unloc_irqrestore()is called. is this right?

Yes.  The protected code will not be interrupted, or simultaneously
executed by another CPU.

> 2. is this sequence valid?
>       spin_lock_irqsave(a,b);
>       spin_lock_irqsave(c,d);

Yes, as long as it is followed by:

        spin_unlock_irqrestore(c, d);
        spin_unlock_irqrestore(a, b);

Nigel Gamble                                    [EMAIL PROTECTED]
Mountain View, CA, USA.                         http://www.nrg.org/

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

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

Reply via email to