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