Messages in this thread Patches in this message | | | From | Pascal CHAPPERON <> | Subject | Re: sis190 | Date | Sun, 26 Jun 2005 14:39:54 +0200 (CEST) |
| |
> Message du 22/06/05 01:02 > De : "Francois Romieu" <romieu@fr.zoreil.com> [...] > 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 majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |