Andrew Morton [Thu, 3 Apr 2003 00:29:28 +0000 (16:29 -0800)]
[PATCH] ext3_commit_write speedup
For an appending write, ext3_commit_write() will call the expensive
ext3_mark_inode_dirty() twice. Once in generic_commit_write()'s extension of
i_size and once in ext3_commit_write() itself where i_disksize is updated.
But by updating i_disksize _before_ calling generic_commit_write() these can
be piggybacked.
The patch takes the overhead of a write() from 1.96 microseconds down to
1.63.
Andrew Morton [Thu, 3 Apr 2003 00:29:21 +0000 (16:29 -0800)]
[PATCH] ext3_mark_inode_dirty() speedup
ext3_mark_inode_dirty() (and several other callers) use the
ext3_reserve_inode_write() and ext3_mark_ioc_dirty() pair for journalling an
inode's backing block.
Because ext3_reserve_inode_write() gets journalling access to the block there
is no need for ext3_mark_iloc_dirty() to do it as well.
This change reduces the overhead of a write() from 2.7 microseconds to 1.95
on a 2.7G P4.
Andrew Morton [Thu, 3 Apr 2003 00:29:13 +0000 (16:29 -0800)]
[PATCH] Fix jbd assert failure on IO error.
From: Stephen Tweedie <sct@redhat.com>
The buffer_uptodate flag gets cleared on IO failure, and this can panic jbd
when it tries to write such a buffer. Relax the panic to be just a warning.
Andrew Morton [Thu, 3 Apr 2003 00:29:06 +0000 (16:29 -0800)]
[PATCH] Add less-severe assert-failure form for ext3.
From: Stephen Tweedie <sct@redhat.com>
Add a new form of assert failure in ext3 which allows us to flag events which
are *usually* bugs, but which can be legally triggered in the presence of IO
failures. Don't panic the kernel on such errors unless we've defined
#JBD_PARANOID_IOFAIL, which will normally be set only for testing purposes.
Andrew Morton [Thu, 3 Apr 2003 00:28:58 +0000 (16:28 -0800)]
[PATCH] remove dparent_lock
The big SMP machines are seeing quite some contention in dnotify_parent()
(via vfs_write). This function is hammering the global dparent_lock.
However we don't actually need a global dparent_lock for pinning down
dentry->d_parent. We can use dentry->d_lock for this. That is already being
held across d_move.
This patch speeds up SDET on the 16-way by 5% and wipes dnotify_parent() off
the profiles.
It also uninlines dnofity_parent().
It also uses spin_lock(), which is faster than read_lock().
I'm not sure that we need to take both the source and target dentry's d_lock
in d_move.
The patch also does lots of s/__inline__/inline/ in dcache.h
Andrew Morton [Thu, 3 Apr 2003 00:28:49 +0000 (16:28 -0800)]
[PATCH] real_lookup race fix
From: Maneesh Soni <maneesh@in.ibm.com>
Here is a patch to use seqlock for real_lookup race with d_lookup as suggested
by Linus. The race condition can result in duplicate dentry when d_lookup
fails due concurrent d_move in some unrelated directory.
Apart from real_lookup, lookup_hash()->cached_lookup() can also fail due
to same reason. So, for that I am doing the d_lookup again.
Now we have __d_lookup (called from do_lookup() during pathwalk) and
d_lookup which uses seqlock to protect againt rename race.
dcachebench numbers (lower is better) don't have much difference on a 4-way
PIII xeon SMP box.
base-2565
Average usec/iteration 19059.4
Standard Deviation 503.07
base-2565 + seq_lock
Average usec/iteration 18843.2
Standard Deviation 450.57
Andrew Morton [Thu, 3 Apr 2003 00:28:27 +0000 (16:28 -0800)]
[PATCH] Fix devfs' partition handling
From: Andre Landwehr <andre.landwehr@gmx.net>
with / on an IDE harddisk the disks partitions do not appear in
devfs, only the disc device. This is due to rescan_partitions
being called twice and deleting but not re-creating the entries
during the second call.
Andrew Morton [Thu, 3 Apr 2003 00:28:18 +0000 (16:28 -0800)]
[PATCH] add vt console scrollback ioctl
From: Samuel Thibault <Samuel.Thibault@ens-lyon.fr>
There is no way for a braille device driven by brltty (userland root-owned
daemon) to scrollback the virtual console, the only way is to use the pc
keyboard. A very simple TIOCLINUX ioctl meets this need (tested).
Also add a command for bringing the last console to the top, as keyboard.c's
lastcons() does when pressing alt - down arrow.
Andrew Morton [Thu, 3 Apr 2003 00:28:11 +0000 (16:28 -0800)]
[PATCH] sync dirty pages in fadvise(FADV_DONTNEED)
This changes the fadvise(FADV_DONTNEED) operation to start async writeout of
any dirty pages in the file.
The thinking is that if the application doesn't want to use those pages in
the future, we may as well get IO underway against them so they can be freed
up on the next call to fadvise().
The POSIX spec does not go into any detail as to whether this is the right or
wrong behaviour.
This provides a nice way for applications whihc are writing streaming data
(the main users of fadvise) to keep the amount of dirty pagecache under
control without having to resort to system-wide VM tuning.
It also provides an "async fsync()". If the application passes in a length
of zero, fadvise will start async writeout of the pages, but will not
invalidate any of the file's pagecache.
Andrew Morton [Thu, 3 Apr 2003 00:27:56 +0000 (16:27 -0800)]
[PATCH] aic7xxx timer deletion fix
From: Zwane Mwaikambo <zwane@linuxpower.ca>
ahc_linux_free_device() needs to use del_timer_sync(). slab corruption has
been observed due to the timer handler running after the containing object
was freed.
Andrew Morton [Thu, 3 Apr 2003 00:27:40 +0000 (16:27 -0800)]
[PATCH] struct stat - support larger dev_t
From: Andries.Brouwer@cwi.nl
Below a patch that changes struct stat for a number of
architectures. Maintainers, please watch carefully.
Struct stat is used to transfer information from kernel
to user space on a stat() system call.
It has fields st_dev, st_rdev.
The size of these fields is in principle unrelated to
the size of a dev_t in user space or the size of a
dev_t or kdev_t in kernel space.
It is just the "capacity" of the channel.
The actual amount of useful information is the minimum
of the four sizes (kernel dev_t, kernel kdev_t,
user dev_t, width of stat st_dev, st_rdev fields).
The goal of this patch is to make sure that the stat() and stat64()
system calls transmit at least 32 and 64 bits, respectively.
This is achieved by using the padding that was present already.
We fail when no padding was present, or when the padding is on
the wrong side (after the field, while the machine is big-endian).
alpha: stat: uses unsigned int, 32 bits
arm: stat: uses unsigned short - bad.
The padding is on one side, which means that this can
be made into unsigned long only on little endian systems.
FIXED - unless __ARMEB__.
stat64: used unsigned short - FIXED, now unsigned long long.
cris: stat: used unsigned short - FIXED, now unsigned long
stat64: used unsigned short - FIXED, now unsigned long long.
i386: stat: used unsigned short - FIXED, now unsigned long
stat64: used unsigned short - FIXED, now unsigned long long.
ia64: stat: uses unsigned long, 64 bits
m68k: stat: used unsigned short - bad, but this cannot be fixed
since m68k is big-endian, and the available padding is on
the wrong side. NOT FIXED.
stat64: used unsigned short - FIXED, now unsigned long long.
mips: stat: uses dev_t which is unsigned int, 32 bits
stat64: used unsigned long, 32 bits. NOT FIXED.
(There is padding on one side, so this can be fixed if __MIPSEL__.)
mips64: stat: uses dev_t which is unsigned int, 32 bits
parisc: stat: uses dev_t, 32 bits
stat64: uses unsigned long long, 64 bits
ppc: stat: uses dev_t which is unsigned int, 32 bits
stat64: unsigned long long, 64 bits
ppc64: stat: uses dev_t which is unsigned long, 64 bits
stat64: uses unsigned long, 64 bits
sparc: stat: uses unsigned short, no padding. NOT FIXED.
stat64: used unsigned short - FIXED, now unsigned long long.
sparc64:stat: uses dev_t which is unsigned int, 32 bits
stat64: used unsigned short - FIXED, now unsigned long long.
s390: stat: used unsigned short, big-endian, padding on the wrong side,
NOT FIXED.
stat64: used unsigned short - FIXED, now unsigned long long.
s390x: stat: uses unsigned long, 64 bits
sh: stat: used unsigned short, but padding maybe on wrong side.
NOT FIXED.
stat64: used unsigned short - FIXED, now unsigned long long.
v850: stat: used __kernel_dev_t.
BUG: NEVER use __kernel types in a user space interface.
Replaced the types. FIXED - now unsigned int - 32 bits.
stat64: FIXED - now unsigned long long - 64 bits.
x86_64: stat: uses unsigned long, 64 bits
So, on most architectures we achieve the aim of 32 bits for stat,
64 bits for stat64. On all architectures we achieve at least
16 bits for stat, 32 bits for stat64.
Andrew Morton [Thu, 3 Apr 2003 00:27:33 +0000 (16:27 -0800)]
[PATCH] tmpfs 6/6: percentile sizing of tmpfs
From: CaT <cat@zip.com.au>
What this patch does is allow you to specify the max amount of memory tmpfs
can use as a percentage of available real ram. This (in my eyes) is useful
so that you do not have to remember to change the setting if you want
something other then 50% and some of your ram goes.
Hugh redid the arithmetic to not overflow at 4GB; the particular order of
lines helps RH's gcc-2.96-110 not to get confused in the do_div. 2.5 can use
totalram_pages. Update mount options in tmpfs Doc.
There's an argument that the percentage should be of ram+swap, that's what
Christoph originally intended. But we set the default at 50% of ram only, so
I believe it's more consistent to follow that precedent.
Andrew Morton [Thu, 3 Apr 2003 00:27:19 +0000 (16:27 -0800)]
[PATCH] tmpfs 4/6: use mark_page_accessed
From: Hugh Dickins <hugh@veritas.com>
tmpfs pages should be surfing the LRUs in the company of their filemap
friends: I was expecting the rules to change, but they've been stable so
long, let's sprinkle mark_page_accessed in the equivalent places here; but
(don't ask me why) SetPageReferenced in shmem_file_write. Ooh, and
shmem_populate was missing a flush_page_to_ram.
Andrew Morton [Thu, 3 Apr 2003 00:26:51 +0000 (16:26 -0800)]
[PATCH] file limit checking simplification
From: Hugh Dickins <hugh@veritas.com>
When handling rlimit != RLIM_INFINITY, generic_write_checks tests file
position against 0xFFFFFFFFULL, and casts it to a u32. This code is
carried forward from 2.4.4, and the 2.4-ac tree contains an apparently
obvious fix to one part of it (should set count to 0 not to a negative).
But when you think it through, it all turns out to be bogus.
On a 32-bit architecture: limit is a 32-bit unsigned long, we've
already handled *pos < 0 and *pos >= limit, so *pos here has no way
of being > 0xFFFFFFFFULL, and thus casting it to u32 won't truncate it.
And on a 64-bit architecture: limit is a 64-bit unsigned long, but this
code is disallowing file position beyond the 32 bits; or if there's some
userspace compatibility issue, with limit having to fit into 32 bits,
the 32-bit architecture argument applies and they're still irrelevant.
So just remove the 0xFFFFFFFFULL test; and in place of the u32, cast to
typeof(limit) so it's right even if rlimits get wider. And there's no
way we'd want to send SIGXFSZ below the limit: remove send_sig comment.
There's a similarly suspicious u32 cast a little further down, when
checking MAX_NON_LFS. Given its definition, that does no harm on any
arch: but it's better changed to unsigned long, the type of MAX_NON_LFS.
Andrew Morton [Thu, 3 Apr 2003 00:26:43 +0000 (16:26 -0800)]
[PATCH] bio kmapping changes
RAID5 is calling copy_data() under sh->lock. But copy_data() does kmap(),
which can sleep.
The best fix is to use kmap_atomic() in there. It is faster than kmap() and
does not block.
The patch removes the unused bio_kmap() and replaces __bio_kmap() with
__bio_kmap_atomic(). I think it's best to withdraw the sleeping-and-slow
bio_kmap() from the kernel API before someone else tries to use it.
Also, I notice that bio_kmap_irq() was using local_save_flags(). This is a
bug - local_save_flags() does not disable interrupts. Converted that to
local_irq_save(). These names are terribly chosen.
Andrew Morton [Thu, 3 Apr 2003 00:26:28 +0000 (16:26 -0800)]
[PATCH] monotonic clock source for hangcheck timer
From: john stultz <johnstul@us.ibm.com>
This patch, written with the advice of Joel Becker, addresses a problem with
the hangcheck-timer.
The basic problem is that the hangcheck-timer code (Required for Oracle)
needs a accurate hard clock which can be used to detect OS stalls (due to
udelay() or pci bus hangs) that would cause system time to skew (its sort of
a sanity check that insures the system's notion of time is accurate).
However, currently they are using get_cycles() to fetch the cpu's TSC
register, thus this does not work on systems w/o a synced TSC.
As suggested by Andi Kleen (see thread here:
http://www.uwsg.iu.edu/hypermail/linux/kernel/0302.0/1234.html ) I've worked
with Joel and others to implement the monotonic_clock() interface. Some of
the major considerations made when writing this patch were
o Needs to be able to return accurate time in the absence of multiple timer
interrupts
o Needs to be abstracted out from the hardware
o Avoids impacting gettimeofday() performance
This interface returns a unsigned long long representing the number of
nanoseconds that has passed since time_init().
Andrew Morton [Thu, 3 Apr 2003 00:26:20 +0000 (16:26 -0800)]
[PATCH] handle bad inodes in put_inode
From: "J. Bruce Fields" <bfields@fieldses.org>
If the NFS daemon is presented with a filehandle for a file that has
been deleted, it does an iget() in fs/exportfs/expfs.c:export_iget() and
gets a bad inode back. When it subsequently iput()s the inode, the
result is:
Mar 27 12:53:40 snoopy kernel: EXT2-fs error (device ide0(3,3)): ext2_free_blocks: Freeing blocks not in datazone - block = 1802201963, count = 27499
Mar 27 12:53:40 snoopy kernel: Remounting filesystem read-only
The same can happen if ext2_get_inode() returns an error - ext2_read_inode()
will return an uninitialised inode and ext2_put_inode() is not allowed to go
looking inside the bad inode.
Andrew Morton [Thu, 3 Apr 2003 00:26:13 +0000 (16:26 -0800)]
[PATCH] tmpfs blk_congestion_wait fix
From: Hugh Dickins <hugh@veritas.com>
The blk_congestion_waits in shmem_getpage are appropriate when the error is
-ENOMEM, but not when the error is -EEXIST. So add that test in the first
instance, but omit it all in the second instance.
kbuild: Fix dependencies for generated .mod.o files
For some reason which I cannot remember, we didn't use the automatic
dependency generation for the generated .mod.[co] files. However, we do
of course need dependency information for those, too, they need to be updated
when e.g. the kernel version number changes.
This patch fixes two issues:
o The CONFIG_MODVERSIONING=y case broke at compile time since some
functions were not updated with the latest module changes
o Exporting symbols from modules stopped working due to confusion of
mod->num_syms and mod->num_ksyms. Rename mod->num_ksyms to mod->num_syms,
which is more logical since the associated array is called ->syms, and
for the kallsyms member use "num_symtab", since the associated array is
->symtab.
This should have a working w83781d driver updated for 2.5.66-bk4.
Currently sysfs support is working, and are according to the spec
(sensors-sysfs) in the 'lm sensors sysfs file structure' thread.
Thus I used 'temp_input[1-3]', as there was not final decision
on having them temp_input[0-2] as well, for example.
i2c: remove sysctl and proc functions from via686a.c driver
This still needs to be converted to use sysfs files, but due to
lack of hardware, I can not do this. This change is necessary as
the sysctl and proc interface is about to go away.
Fix naming confusion: number of symbol kallsyms is "num_kallsyms",
while number of symbols is "num_syms". It used to be "num_syms" and
"num_ksyms" respectively (ie the "k" was the wrong way around).
The previous naming was not just confusing, it had caused one actual
bug (ie the normal symbol code had used "num_syms", which was wrong
in the old confusing naming scheme).
Dave Jones [Tue, 1 Apr 2003 13:03:30 +0000 (05:03 -0800)]
[PATCH] fix up newer x86 cpuinfo flags.
According to Intel document 24161823.pdf[*] page 18, 'tm2' is misdefined.
Its bit 7 not, bit 8. Also add the missing 'EST' (Enhanced Speedstep Technology)
bit, and use the correct Intel terminology for the context ID bit.
Randy Dunlap [Tue, 1 Apr 2003 12:54:02 +0000 (04:54 -0800)]
[PATCH] reduce stack usage in cdrom/optcd.c
This changes/fixes the optcd.c stack reduction patch from last week.
Alan and Jens objected to the kmalloc() in cdromread(), suggesting that
the read buffer should be allocated one time and held onto, so this
patch does that.
Paul Mackerras [Tue, 1 Apr 2003 12:53:32 +0000 (04:53 -0800)]
[PATCH] update adb driver
This updates the ADB (Apple desktop bus) driver used on macs and
powermacs. The main change, from Ben Herrenschmidt, is that handlers
are called without a lock held now. It also adds a way for userland to
obtain some information about individual ADB devices from the driver.
Rusty Russell [Tue, 1 Apr 2003 12:42:38 +0000 (04:42 -0800)]
[PATCH] Subdivide PCI class for aliases
The previous handling of PCI class masks was too primitive: the
class field is not "all or nothing" but has base class, subclass
and interface fields. This patch changes the alias form from:
pci:vNdNsvNsdNcN to pci:vNdNsvNsdNbcNscNiN.
Rusty Russell [Tue, 1 Apr 2003 12:42:30 +0000 (04:42 -0800)]
[PATCH] Extable list removal
This removes the extable list, and the struct exception_table, in
favour of just iterating through the modules. Now all iteration is
within kernel/module.c, this is a fairly trivial cleanup.
Rusty Russell [Tue, 1 Apr 2003 12:42:22 +0000 (04:42 -0800)]
[PATCH] Symbol list removal
This removes the symbol list, and the concept of kernel symbol groups,
in favour of just iterating through the modules. Now all iteration is
within kernel/module.c, this is a fairly trivial cleanup.
Rusty Russell [Tue, 1 Apr 2003 11:47:14 +0000 (03:47 -0800)]
[PATCH] rio_linux.c misc_register patch
From: Chris Wilson <chris@qwirx.com>
This function did check misc_register's return code, but made no effort to
clean up if it failed, leaving a large amount of potential crud lying
around. I moved the registration to the start of the function, so that the
cleanup is trivial, and made sure the device gets unregistered in the
cases where it would not have been registered at all before.