lkml.org 
[lkml]   [1998]   [Apr]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
Date
From
SubjectLinux-2.1.95..

I just released 2.1.95 on ftp.kernel.org.

This is finally the kind of feature-freeze patch I like: it only contains
fixes for outright bugs. The fixes are:

- SMP-safe disk drivers (more on this below)
- various PCI fixes: /proc/bus/pci works again, and it should compile and
work on Alpha with TGA.
- parport interrupt detection uses the standard probe routines, and
doesn't leave bogus "probe" entries hanging around to confuse people
(and make other device registration fail)
- the ever-popular PCI ne netdriver fix
- the getcwd() system call works again.
- "mb()" does the right thing on x86 too. Few drivers use it, but more of
them should. Right now there are drivers that depend on luck making
sure that the memory accesses will be in the same order outside the CPU
as inside it.

The conceptually big one is the SMP-safe disk driver change: it's not a
very big patch, but it's fairly subtle. And it still requires help from
the disk drivers themselves, although all of them should be safe in UP,
and I made sure the BusLogic and the NCR driver are safe on SMP.

The change is really a change in locking defaults: we used to default to
no locking, and depended on the disk driver getting the locking right.
None of them did so on SMP, for understandable reasons (there really
wasn't any support for getting it right).

The new default is to do the locking for the driver, and the driver
actually has to do some work if it wants to do anything outside the lock.
This has the obvious advantage that it _defaults_ to being safe, and
people who know what they are doing can choose to thread the driver if
they want to.

The only change needed to drivers is to make sure they get the lock on an
interrupt, which usually involves just doing the following around the
low/level interrupt handler (the same handler that you register using
"request_irq()"):

void handle_irq(int irq, void *dev, struct pt_regs *regs)
{
+ unsigned long flags;
+ spin_lock_irqsave(&io_request_lock, flags);

... call to the proper action routines ...

+ spin_unlock_irqrestore(&io_request_lock, flags);
}

which guarantees that everything inside the driver is correctly locked
from the outside world (with the exception of ioctl's etc things that the
driver traps - they need to be protected too).

Linus


-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.rutgers.edu

\
 
 \ /
  Last update: 2005-03-22 13:42    [W:0.096 / U:1.316 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site