Andrew Morton [Wed, 18 Feb 2004 12:47:29 +0000 (04:47 -0800)]
[PATCH] Minor workqueue.c cleanup
From: Rusty Russell <rusty@rustcorp.com.au>
Move duplicated code to __queue_work(), and don't set the CPU for
queue_delayed_work() until the timer goes off. The second one only has an
effect on CONFIG_HOTPLUG_CPU where the CPU goes down and the timer goes off
on a different CPU than it was scheduled on.
Andrew Morton [Wed, 18 Feb 2004 12:47:20 +0000 (04:47 -0800)]
[PATCH] Remove kstat cpu notifiers
From: Rusty Russell <rusty@rustcorp.com.au>
Some well-meaning person put a notifier in for CPUs to update the kstat
structures in sched.c. However, it does nothing, and even with the full
hotplug CPU patch, it still does nothing.
Simple counters very rarely need anything done when CPUs come up or go
down. If you have per-cpu caches, or per-cpu threads, you need to do
something. But very rarely for stats.
Andrew Morton [Wed, 18 Feb 2004 12:47:11 +0000 (04:47 -0800)]
[PATCH] kthread primitive
From: Rusty Russell <rusty@rustcorp.com.au>
These two patches provide the framework for stopping kernel threads to
allow hotplug CPU. This one just adds kthread.c and kthread.h, next
one uses it.
Most importantly, adds a Monty Python quote to the kernel.
Details:
The hotplug CPU code introduces two major problems:
1) Threads which previously never stopped (migration thread,
ksoftirqd, keventd) have to be stopped cleanly as CPUs go offline.
2) Threads which previously never had to be created now have
to be created when a CPU goes online.
Unfortunately, stopping a thread is fairly baroque, involving memory
barriers, a completion and spinning until the task is actually dead
(for example, complete_and_exit() must be used if inside a module).
There are also three problems in starting a thread:
1) Doing it from a random process context risks environment contamination:
better to do it from keventd to guarantee a clean environment, a-la
call_usermodehelper.
2) Getting the task struct without races is a hard: see kernel/sched.c
migration_call(), kernel/workqueue.c create_workqueue_thread().
3) There are races in starting a thread for a CPU which is not yet
online: migration thread does a complex dance at the moment for
a similar reason (there may be no migration thread to migrate us).
Place all this logic in some primitives to make life easier:
kthread_create() and kthread_stop(). These primitives require no
extra data-structures in the caller: they operate on normal "struct
task_struct"s.
Other changes:
- Expose keventd_up(), as keventd and migration threads will use kthread to
launch, and kthread normally uses workqueues and must recognize this case.
- Kthreads created at boot before "keventd" are spawned directly. However,
this means that they don't have all signals blocked, and hence can be
killed. The simplest solution is to always explicitly block all signals in
the kthread.
- Change over the migration threads, the workqueue threads and the
ksoftirqd threads to use kthread.
- module.c currently spawns threads directly to stop the machine, so a
module can be atomically tested for removal.
- Unfortunately, this means that the current task is manipulated (which
races with set_cpus_allowed, for example), and it can't set its priority
artificially high. Using a kernel thread can solve this cleanly, and with
kthread_run, it's simple.
- kthreads use keventd, so they inherit its cpus_allowed mask. Unset it.
All current users set it explicity anyway, but it's nice to fix.
- call_usermode_helper uses keventd, so the process created inherits its
cpus_allowed mask. Unset it.
- Prevent errors in boot when cpus_possible() contains a cpu which is not
online (ie. a cpu didn't come up). This doesn't happen on x86, since a
boot failure makes that CPU no longer possible (hacky, but it works).
- When the cpu fails to come up, some callbacks do kthread_stop(), which
doesn't work without keventd (which hasn't started yet). Call it directly,
and take care that it restores signal state (note: do_sigaction does a
flush on blocked signals, so we don't need to repeat it).
Andrew Morton [Wed, 18 Feb 2004 12:47:01 +0000 (04:47 -0800)]
[PATCH] ACPI PM timer
From: Dominik Brodowski <linux@dominikbrodowski.de>,
John Stultz <johnstul@us.ibm.com>,
Dmitry Torokhov
Add the ACPI Powermanagement Timer as x86 kernel timing source. Unlike the
Time Stamp Counter, it is a reliable timing source which does not get
affected by aggressive powermanagement features like CPU frequency scaling.
Some ideas and some code are based on Arjan van de Ven's implementation for
2.4, and on R. Byron Moore's drivers/acpi/hardware/hwtimer.c.
We also replace the loop based delay_pmtmr with a TSC based delay_pmtmr,
which resolves a number of issues caused by the loop based delay. Unsynced
TSCs as well frequency changing TSCs will effect the length of __delay(), but
it seems this method works best.
Andrew Morton [Wed, 18 Feb 2004 12:46:43 +0000 (04:46 -0800)]
[PATCH] loop.c doesn't fail init gracefully
From: BlaisorBlade <blaisorblade_spam@yahoo.it>
loop_init doesn't fail gracefully for two reasons:
1) If initialization of loop driver fails, we have an call to
devfs_add("loop") without any devfs_remove; I add that.
2) On lwn.net 2.6 kernel docs, Jonathan Corbet says: "If you are calling
add_disk() in your driver initialization routine, you should not fail
the initialization process after the first call."
So I make loop.c conform to this request by moving add_disk after all
memory allocations.
Andrew Morton [Wed, 18 Feb 2004 12:46:25 +0000 (04:46 -0800)]
[PATCH] remove useless highmem bounce from loop/cryptoloop
From: Ben Slusky <sluskyb@paranoiacs.org>
The attached patch changes the loop device transfer functions (including
cryptoloop transfers) to accept page/offset pairs instead of virtual
addresses, and removes the redundant kmaps in do_lo_send, do_lo_receive,
and loop_transfer_bio. Per Andrew Morton's request a while back.
Andrew Morton [Wed, 18 Feb 2004 12:46:08 +0000 (04:46 -0800)]
[PATCH] ppc64: iseries IRQ fix
From: Stephen Rothwell <sfr@canb.auug.org.au>
This patch lets 2.6.3-rc4 build and boot on an PPC64 iSeries box (at least
for my configuration). The veth.o bit in the networking Makefile got there
by accident and should be removed anyway ...
There is more to make it work properly (note the "Temporary hack"), but
this gets us closer.
Andrew Morton [Wed, 18 Feb 2004 12:45:41 +0000 (04:45 -0800)]
[PATCH] ppc64: Fix prom.c warnings
arch/ppc64/kernel/prom.c:200: warning: missing braces around initializer
arch/ppc64/kernel/prom.c:200: warning: (near initialization for `hmt_thread_data[0]')
arch/ppc64/kernel/prom.c: In function `prom_hold_cpus':
arch/ppc64/kernel/prom.c:1090: warning: implicit declaration of function `_get_PIR'
Andrew Morton [Wed, 18 Feb 2004 12:44:55 +0000 (04:44 -0800)]
[PATCH] Fix for PPP activ/passiv filter
From: Karsten Keil <kkeil@suse.de>
I found a bug in the PPPIOCSPASS PPPIOCSACTIVE IOCTL implementation in
kernel 2.5/2.6.
The current pppd code use a empty filter (uprog.len=0) to detach the filter
in the kernel, but this code was removed in 2.5.71 while fixing a compiler
warning.
Here the new patch, also with better limit checking.
The second patch check for flen == 0 in the filter check too, since later
in this code a filter[flen - 1] access is done, which is not so funny with
flen 0. Maybe it's not really needed anymore, since with the first patch
it would not longer called with flen=0.
paulus says:
It looks correct. Previously we had (and in 2.4 we still have)
if (uprog.len > 0 && uprog.len < 65536) {
...
which gave warnings since uprog.len is unsigned short. So someone
decided that both parts of the condition were redundant.
Andrew Morton [Wed, 18 Feb 2004 12:44:45 +0000 (04:44 -0800)]
[PATCH] i4l: hisax deadlock fix
From: Karsten Keil <kkeil@suse.de>
This patch fix a deadlock in HiSax (reported from David Woodhouse
<dwmw2@infradead.org>). upper layer was called back while holding the card
lock fix is to move the wakeup call into BH handler to avoid direct
callbacks.
Dave Jones [Thu, 19 Feb 2004 02:48:43 +0000 (02:48 +0000)]
[CPUFREQ] Add extra __init markers to longrun driver.
Caught by Randy Dunlap.
longrun_cpu_init() only gets called during startup, and calls
other __init routines.
Dave Jones [Thu, 19 Feb 2004 02:46:52 +0000 (02:46 +0000)]
[CPUFREQ] Add extra __init markers to longhaul driver.
Caught by Randy Dunlap.
longhaul_cpu_init only gets called during startup, and calls
other __init routines.
Assume tp->dirty_tx = NUM_TX_DESC/2, tp->cur_tx = NUM_TX_DESC - 1,
watch "entry" go beyond NUM_TX_DESC. Actually this is where the same
bug in r8169 driver comes from.
Randy Dunlap [Wed, 18 Feb 2004 14:29:38 +0000 (09:29 -0500)]
[PATCH] tr/3c359: handle kmalloc failures during init
From: Pablo Menichini <pablo@menichini.com.ar>
and maximilian attems <janitor@sternwelten.at>
while looking at kj mails from 200212 and 200301
this patch slept through
originally from: Pablo Menichini <pablo@menichini.com.ar>
rediffed and compile tested
patch applies on plain 2.6.0
Don Fry [Wed, 18 Feb 2004 14:29:31 +0000 (09:29 -0500)]
[PATCH] 2.6.3 pcnet32.c transmit hang fix
The transmit routine will stop interrupting and hang, causing the
tx_timeout routine to attempt to restart the device when the 32-bit
cur_tx counter wraps below dirty_tx. If the device had called
netif_stop_queue it will never call netif_wake_queue in the interrupt
routine (at least on an IA32 system) due to 32-bit wrap around arithmetic.
On my IA32 system 'dirty_tx > lp->cur_tx - TX_RING_SIZE + 2' would
always evaluate to false when dirty and cur_tx were less than 15,
preventing netif_wake_queue to be called.
By starting dirty_tx and cur_tx at 0xfffffff0 (to reduce test time) I
found that once cur_tx wrapped to zero, that transmitted buffers would
never be unmapped or freed because 'while (dirty_tx < lp->cur_tx) {'
was not true. cur_tx would keep incrementing (in start_xmit) but dirty_tx
would not (in pcnet32_interrupt), thus leaking skb's and pci map entries.
On PPC machines, the system would quickly run out of pci maps.
Shmulik Hen [Wed, 18 Feb 2004 13:59:35 +0000 (08:59 -0500)]
[PATCH] Add VLAN support in ALB mode
Add capability to tag self generated ARP packets that are required
for receive load balancing in bonding. VLAN Id's are saved and used
each time a new IP connection is established since 8021q currently
supports IP binding.
Shmulik Hen [Wed, 18 Feb 2004 13:59:27 +0000 (08:59 -0500)]
[PATCH] Add VLAN support in TLB mode
Add capability to tag self generated learning packets that are
required to speed up port selection in the switch after a fail
over in bonding since some switches will only update their MAC
tables from tagged packets when VLAN support is turned on. All
VLAN Id's that have been configured on top of the bond interface
will be used in cyclic order.
Shmulik Hen [Wed, 18 Feb 2004 13:59:20 +0000 (08:59 -0500)]
[PATCH] Add support for HW accel. slaves
Now that David Miller accepted the first half of this set into 2.6,
I'm resending the last half to you for inclusion in netdev-2.6.
Tested against latest netdev-2.6. Summary:
Change the bond interface to publish full VLAN hardware acceleration
offloading capabilities, and add capability in all xmit functions to
take special care for VLAN HW accel. tagged skb's that are going out
through a slave that is not offloading capable.
Add a mechanism to collect and save the VLAN Id's that have been
added on top of a bond interface, and propagate the register/add/kill
operations to the slaves.
Add blocking mechanism to prevent adding VLAN interfaces on top of a
bond that contains VLAN challenged slaves and to prevent adding VLAN
challenged slaves to a bond that already has VLAN interfaces on top
of it.
Add a section about VLAN to Documentation/networking/bonding.txt and
also correct some minor spelling/grammer errors.
Don Fry [Wed, 18 Feb 2004 13:48:55 +0000 (08:48 -0500)]
[PATCH] 2.6.3 pcnet32.c bus master arbitration failure fix
Here is the first of several individual patches to 2.6.3 for the pcnet32
driver.
The driver did not properly serialize accesses to chip registers, resulting
in reading/writing the wrong register. This patch eliminates this problem
and gets rid of the cause of the symptom of 'bus master arbitration failure'.
It was easier to use generic_mii_ioctl than modify the current pcnet32_ioctl
routine with the necessary locks. This has been re-tested on an IA32 system.
Andi Kleen [Wed, 18 Feb 2004 03:44:21 +0000 (19:44 -0800)]
[PATCH] Intel x86-64 support merge
This has all the x86-64 specific changes for Intel Prescott/Nocona
support.
It requires a few minor changes outside arch/x86_64, which I am sending
separately.
This patch is needed to boot an 64bit kernel on a 64-bit capable
Prescott machine.
The ugliest part is probably the swiotlb code. In fact the code for
that is not even included, but just reused from IA64. swiotlb
implements the PCI DMA API using bounce buffering. I don't like this at
all, but there was no other way to support non DAC capable hardware
(like IDE or USB) on machines with >3GB. Please redirect all flames for
that to the Intel chipset designers.
ChangeLog:
- Add Kconfig options for PSC
- Add support to reuse microcode driver from i386 (Suresh B Siddha)
- Try to optimize for the selected CPU
- Fix early CPUID check for Intel CPUs (Suresh B Siddha)
- Fix GDT to use the configured cache line size for padding
- Support monitor/mwait idle loop
- Support HyperThreading
- Support Intel CPUID flags
- Remove all 3dnow prefetches
- Add alternative() for the prefetchw prefetch inline.
- Include P4 driver in oprofile
- Support Intel NOPs in alternative
Andrew Morton [Tue, 17 Feb 2004 11:32:13 +0000 (03:32 -0800)]
[PATCH] Tuner bugfix
From: Neal Stephenson <neal@bakerst.org>
In 2.6.2, I noticed that my modprobe.conf line for tuner "options tuner
type=2" no longer worked. It even failed with insmod "insmod tuner.ko
type=2". dmesg reported
vmunix: tuner: chip found @ 0xc0
vmunix: tuner: type set to 19 (Temic PAL* auto (4006 FN5))
vmunix: tuner: type forced to 19 (Temic PAL* auto (4006 FN5)) [insmod]
I noticed that the a line had been removed from 2.6.1 and when it is added
everything works again.
Roman Zippel [Tue, 17 Feb 2004 08:52:46 +0000 (00:52 -0800)]
[PATCH] Avoid bogus warning about recursive dependencies
This allows us to do something like
config FB_RADEON
select I2C_ALGOBIT if FB_RADEON_I2C
where FB_RADEON_I2C itself depends on FB_RADEON without getting a bogus
warning about recursive dependencies.
This matters because the select takes the default minimum dependancy
from the parent menu, so we want to do this under FB_RADEON rather than
under FB_RADEON_I2C (so that the I2C_ALGOBIT config depends properly
on the state of FB_RADEON)
Alexander Viro [Tue, 17 Feb 2004 08:49:03 +0000 (00:49 -0800)]
[PATCH] blkdev_put() data corruption
We used to have sync_blockdev() on each normal (== non-raw)
blkdev_put() + kill_bdev() on the final blkdev_put(). That worked
fine until we'd moved sync_blockdev() to the final blkdev_put().
Now we have a nasty scenario:
open block device
open raw device
write on block device # data ends up in cache
close block device # no sync here, we still have the sucker opened
close raw device # no sync here either
# ... and cache is killed by kill_bdev()
IOW, if we postpone sync to final close, we must do it regardless of
kind of close. Otherwise we are in for data corruption and yes, it is easy
to trigger. Fix is obvious...
Jim Paradis [Tue, 17 Feb 2004 05:23:23 +0000 (21:23 -0800)]
[PATCH] Fix fencepost error in x86_64 IOMMU
There's a fencepost error in the GART IOMMU handling on x86_64
in the unmap path. When testing to see if the bus address is
within the IOMMU window and needs to be unmapped, the start of
the first page *beyond* the window also passes the test. This
can cause the first doubleword of the next page beyond the gatt
table to be smashed to zero, with unpredictable results depending
on what that page is used for.
Andrew Morton [Tue, 17 Feb 2004 02:32:47 +0000 (18:32 -0800)]
[PATCH] mremap NULL pointer dereference fix
This is a cleaned-up version of a mremap() fix for "move_one_page()"
by Rajesh Venkatasubramanian <vrajesh@umich.edu>. We could use a NULL
"src" pointer.
Because while we do hold the MM semaphore over the whole sequence, the
destination page table allocation will possibly drop the page table
spinlock. That in turn can cause a clean source page to be stolen by
page reclaim, causing the source-side "get_one_pte_map_nested()" to
return NULL the second time around even if it didn't on the first case.
So we just check "src" again, and get rid of the bogus TLB invalidate
while we're at it.