Re: sis190

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

 



> Message du 22/06/05 01:02
> De : "Francois Romieu" <[email protected]>
[...]
> I have copied the sis190 patches at http://www.zoreil.com/~romieu/sis190
> if someone wants to hack them in the meantime.

1) sis190 freezes the box when kernel PREEMPT is enabled :

I made many tries, but i could not solve it;
- it does not occur while receiving huge files.
- it does not occur when only a few packets are
  transmitted (remote connection, ls, find)
- it occurs only while transmiting huge files AND
  trying to do someting else (open a new term,...)
- I could transfer a huge file (700MB) several times
  as i was at the console (and i could switch to another
console to perform find, ls,... during the transfer).

I managed the system so the sis190 had its own IRQ, but it
made no difference.

As i suspected nvidia driver, i switched to nv driver : no result.

It seems to me that a task inside the sis190_tx_interrupt() is 
not protected against preemption (and it is probably the same
on a SMP not prempted).

I tried to play with spinlocks, but with no result :
@@ -621,6 +621,7 @@ static irqreturn_t sis190_interrupt(int
        void __iomem *ioaddr = tp->mmio_addr;
        int handled = 0;
        int boguscnt;
+       unsigned long flags;

        for (boguscnt = max_interrupt_work; boguscnt > 0; boguscnt--) {
                u32 status = SIS_R32(IntrStatus);
@@ -651,9 +652,9 @@ static irqreturn_t sis190_interrupt(int
                        sis190_rx_interrupt(dev, tp, ioaddr);

                if (status & TxQ0Int) {
-                       spin_lock(&tp->lock);
+                       spin_lock_irqsave(&tp->lock, flags);
                        sis190_tx_interrupt(dev, tp, ioaddr);
-                       spin_unlock(&tp->lock);
+                       spin_unlock_irqrestore(&tp->lock, flags);
                }
        }


or :



@@ -581,6 +581,7 @@ static void sis190_tx_interrupt(struct n
                                struct sis190_private *tp, void __iomem *ioaddr)
 {
        unsigned int tx_left, dirty_tx = tp->dirty_tx;
+       unsigned long flags;

        for (tx_left = tp->cur_tx - dirty_tx; tx_left > 0; tx_left--) {
                unsigned int entry = dirty_tx % NUM_TX_DESC;
@@ -604,10 +605,12 @@ static void sis190_tx_interrupt(struct n
                dirty_tx++;
        }

+       spin_lock_irqsave(&tp->lock, flags);
        if (tp->dirty_tx != dirty_tx) {
                tp->dirty_tx = dirty_tx;
                netif_wake_queue(dev);
        }
+       spin_unlock_irqrestore(&tp->lock, flags);
 }

 /*
@@ -651,9 +654,7 @@ static irqreturn_t sis190_interrupt(int
                        sis190_rx_interrupt(dev, tp, ioaddr);

                if (status & TxQ0Int) {
-                       spin_lock(&tp->lock);
                        sis190_tx_interrupt(dev, tp, ioaddr);
-                       spin_unlock(&tp->lock);
                }
        }




In fact, i don't know where are the critical sections...

2) sis190 freezes the box when the link partner is
a r8169 forced in 10 full autoneg off (preempted or not
preempted kernel) :

it is probably for the same reason, as it occurs only when 
transmitting a big file.

3) poor TX performances when link partner is forced to 
autoneg off (not preempted kernel):

Once again it seems that something goes wrong with TX tasks...


Regards
Pascal


-
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/

[Index of Archives]     [Kernel Newbies]     [Netfilter]     [Bugtraq]     [Photo]     [Stuff]     [Gimp]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Video 4 Linux]     [Linux for the blind]     [Linux Resources]
  Powered by Linux