mirror of https://gitee.com/openkylin/linux.git
[AGPGART] Fix serverworks TLB flush.
Go back to what 2.4 kernels used to do here, as if this hits, the kernel just hangs indefinitly. Actually an improvement over 2.4 - we now break; out of the loop instead of just printing messages on timeouts. Signed-off-by: Dave Jones <davej@redhat.com>
This commit is contained in:
parent
32a3658533
commit
0ff541dafd
|
@ -242,13 +242,27 @@ static int serverworks_fetch_size(void)
|
||||||
*/
|
*/
|
||||||
static void serverworks_tlbflush(struct agp_memory *temp)
|
static void serverworks_tlbflush(struct agp_memory *temp)
|
||||||
{
|
{
|
||||||
|
unsigned long timeout;
|
||||||
|
|
||||||
writeb(1, serverworks_private.registers+SVWRKS_POSTFLUSH);
|
writeb(1, serverworks_private.registers+SVWRKS_POSTFLUSH);
|
||||||
while (readb(serverworks_private.registers+SVWRKS_POSTFLUSH) == 1)
|
timeout = jiffies + 3*HZ;
|
||||||
|
while (readb(serverworks_private.registers+SVWRKS_POSTFLUSH) == 1) {
|
||||||
cpu_relax();
|
cpu_relax();
|
||||||
|
if (time_after(jiffies, timeout)) {
|
||||||
|
printk(KERN_ERR PFX "TLB post flush took more than 3 seconds\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
writel(1, serverworks_private.registers+SVWRKS_DIRFLUSH);
|
writel(1, serverworks_private.registers+SVWRKS_DIRFLUSH);
|
||||||
while(readl(serverworks_private.registers+SVWRKS_DIRFLUSH) == 1)
|
timeout = jiffies + 3*HZ;
|
||||||
|
while (readl(serverworks_private.registers+SVWRKS_DIRFLUSH) == 1) {
|
||||||
cpu_relax();
|
cpu_relax();
|
||||||
|
if (time_after(jiffies, timeout)) {
|
||||||
|
printk(KERN_ERR PFX "TLB Dir flush took more than 3 seconds\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int serverworks_configure(void)
|
static int serverworks_configure(void)
|
||||||
|
|
Loading…
Reference in New Issue