2.6.34.6-stable review
Subsystems (54)
cover 2.6.34.6-stable review
This is the start of the stable review cycle for the 2.6.34.6 release. There are 91 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let us know. If anyone is a maintainer of the proper subsystem, and wants to add a Signed-off-by: line to the patch, please respond with it.
Responses should be made by Thursday, August 26, 2010 22:00:00 UTC Anything received after that time might be too late.
The whole patch series can be found in one patch at:
kernel.org/pub/linux/kernel/v2.6/stable-review/patch-2.6.34.6-rc1.gz
and the diffstat can be found below.
thanks,
greg k-h
Makefile | 2 +- arch/arm/include/asm/ptrace.h | 17 +++- arch/arm/mach-ixp4xx/ixdp425-setup.c | 1 + arch/arm/mach-mx3/mach-qong.c | 1 + arch/arm/mach-orion5x/ts78xx-setup.c | 1 + arch/blackfin/mach-bf537/boards/stamp.c | 1 + arch/blackfin/mach-bf561/boards/acvilon.c | 1 + arch/powerpc/Makefile | 2 +- arch/powerpc/kernel/head_64.S | 6 +- arch/sparc/include/asm/atomic_64.h | 10 +- arch/sparc/include/asm/parport.h | 4 + arch/sparc/include/asm/rwsem-const.h | 2 +- arch/x86/Kconfig | 5 + arch/x86/include/asm/cmpxchg_32.h | 67 +++++----------- arch/x86/include/asm/cmpxchg_64.h | 4 +- arch/x86/kernel/apic/apic.c | 41 ++++++++-- arch/x86/kernel/apic/io_apic.c | 2 + arch/x86/kernel/smpboot.c | 19 +++++ arch/x86/oprofile/nmi_int.c | 17 ++++- drivers/gpu/drm/drm_drv.c | 4 +- drivers/gpu/drm/i915/intel_display.c | 23 ++++-- drivers/gpu/drm/radeon/radeon_atombios.c | 16 +++- drivers/gpu/drm/radeon/radeon_device.c | 2 +- drivers/gpu/drm/radeon/radeon_i2c.c | 7 ++ drivers/gpu/drm/radeon/radeon_irq_kms.c | 5 +- drivers/gpu/drm/radeon/radeon_legacy_crtc.c | 2 +- drivers/hwmon/pc87360.c | 31 ++++--- drivers/isdn/gigaset/capi.c | 17 ++-- drivers/isdn/sc/ioctl.c | 10 +- drivers/md/dm-exception-store.c | 4 +- drivers/md/dm-exception-store.h | 3 +- drivers/md/dm-ioctl.c | 44 ++++++----- drivers/md/dm-mpath.c | 1 + drivers/md/dm-snap.c | 44 +++++++---- drivers/md/dm.c | 1 + drivers/memstick/core/mspro_block.c | 6 +- drivers/mtd/nand/pxa3xx_nand.c | 2 +- drivers/net/e1000e/82571.c | 31 ++++--- drivers/net/e1000e/defines.h | 4 + drivers/net/e1000e/lib.c | 10 +++ drivers/net/wireless/ath/ath5k/base.c | 21 +++++ drivers/net/wireless/wl12xx/wl1251_cmd.c | 2 +- drivers/pcmcia/pcmcia_resource.c | 5 +- drivers/platform/x86/compal-laptop.c | 9 ++ drivers/platform/x86/dell-laptop.c | 7 ++ drivers/regulator/wm8994-regulator.c | 5 +- drivers/usb/host/xhci-ring.c | 2 +- drivers/usb/serial/cp210x.c | 4 +- drivers/usb/serial/ftdi_sio.c | 5 +- drivers/usb/serial/ftdi_sio_ids.h | 9 ++ drivers/usb/serial/io_ti.c | 2 +- drivers/usb/serial/navman.c | 1 + drivers/usb/serial/option.c | 7 +- drivers/usb/serial/pl2303.c | 1 + drivers/usb/serial/pl2303.h | 4 + drivers/video/matrox/matroxfb_base.h | 4 +- firmware/Makefile | 2 +- fs/nfs/super.c | 7 ++ fs/nilfs2/super.c | 4 +- fs/ocfs2/acl.c | 33 +++++++- fs/ocfs2/dlm/dlmmaster.c | 9 +-- fs/ocfs2/dlm/dlmrecovery.c | 22 +++--- fs/ocfs2/dlm/dlmthread.c | 114 +++++++++++++-------------- fs/ocfs2/refcounttree.c | 20 ++++- include/linux/mm_types.h | 2 +- include/sound/emu10k1.h | 1 + include/trace/events/timer.h | 8 ++- kernel/fork.c | 7 +- kernel/trace/ring_buffer.c | 3 + kernel/trace/trace_functions_graph.c | 10 ++- mm/memory.c | 15 +++- mm/mlock.c | 21 ++++- mm/mmap.c | 21 ++++- mm/nommu.c | 7 +- mm/slab.c | 4 +- mm/vmscan.c | 53 +++++++++++-- net/bridge/br_device.c | 8 ++- net/bridge/br_fdb.c | 2 +- net/bridge/br_input.c | 6 +- net/bridge/br_stp_bpdu.c | 2 +- net/can/bcm.c | 41 ++++++--- net/core/dev.c | 8 +- net/ipv4/tcp.c | 7 +- net/netlink/af_netlink.c | 46 ++++------- net/sched/act_nat.c | 2 +- net/sched/sch_sfq.c | 13 +++ net/wireless/mlme.c | 8 ++- scripts/mkmakefile | 4 +- sound/core/pcm_native.c | 4 + sound/pci/emu10k1/emu10k1.c | 4 + sound/pci/emu10k1/emupcm.c | 30 ++++++- sound/pci/emu10k1/memory.c | 4 +- sound/pci/hda/patch_conexant.c | 1 + sound/pci/hda/patch_realtek.c | 1 + sound/pci/intel8x0.c | 6 ++ sound/pci/riptide/riptide.c | 11 +-- sound/soc/codecs/wm8580.c | 6 +- sound/soc/codecs/wm8776.c | 7 -- sound/soc/soc-cache.c | 4 +- 99 files changed, 757 insertions(+), 389 deletions(-)
PATCH 1/91 memstick: init sysfs attributes
2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: Maxim Levitsky <[email protected]>
commit 21fd0495ea61d53e0ebe575330e343ce4e6d2a61 upstream.
Otherwise lockdep complains.
--- drivers/memstick/core/mspro_block.c | 1 + 1 file changed, 1 insertion(+)
drivers/memstick/core/mspro_block.c +1 -0
@@ -1040,6 +1040,7 @@ static int mspro_block_read_attributes(ssnprintf (s_attr->name,sizeof (s_attr->name),"attr_x%02x" , attr->entries[cnt].id); +sysfs_attr_init (&s_attr->dev_attr.attr); s_attr->dev_attr.attr.name = s_attr->name; s_attr->dev_attr.attr.mode =S_IRUGO ; s_attr->dev_attr.show =mspro_block_attr_show (s_attr->id);
PATCH 2/91 memstick: fix hangs on unexpected device removal in mspro_blk
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: Maxim Levitsky <[email protected]>
commit d862b13bc8cbab9692fbe0ef44c40d0488b81af1 upstream.
mspro_block_remove() is called from detect thread that first calls the mspro_block_stop(), which stops the request queue. If we call del_gendisk() with the queue stopped we get a deadlock.
--- drivers/memstick/core/mspro_block.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/memstick/core/mspro_block.c +3 -2
@@ -1331,13 +1331,14 @@ static void mspro_block_remove(struct mestruct mspro_block_data *msb =memstick_get_drvdata (card);unsigned long flags; -del_gendisk (msb->disk); -dev_dbg (&card->dev,"mspro block remove\n" );spin_lock_irqsave (&msb->q_lock, flags); msb->eject =1 ;blk_start_queue (msb->queue);spin_unlock_irqrestore (&msb->q_lock, flags); +del_gendisk (msb->disk); +dev_dbg (&card->dev,"mspro block remove\n" ); +blk_cleanup_queue (msb->queue); msb->queue =NULL ;
PATCH 3/91 ASoC: Fix inverted mute controls for WM8580
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: Mark Brown <[email protected]>
commit 4f0ed9a51bc8ef16c2589112fdb110479e4b0df1 upstream.
--- sound/soc/codecs/wm8580.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
sound/soc/codecs/wm8580.c +3 -3
@@ -269,9 +269,9 @@ SOC_DOUBLE("DAC2 Invert Switch", WM8580_SOC_DOUBLE ("DAC3 Invert Switch" ,WM8580_DAC_CONTROL4 ,4 ,5 ,1 ,0 ),SOC_SINGLE ("DAC ZC Switch" ,WM8580_DAC_CONTROL5 ,5 ,1 ,0 ), -SOC_SINGLE ("DAC1 Switch" ,WM8580_DAC_CONTROL5 ,0 ,1 ,0 ), -SOC_SINGLE ("DAC2 Switch" ,WM8580_DAC_CONTROL5 ,1 ,1 ,0 ), -SOC_SINGLE ("DAC3 Switch" ,WM8580_DAC_CONTROL5 ,2 ,1 ,0 ), +SOC_SINGLE ("DAC1 Switch" ,WM8580_DAC_CONTROL5 ,0 ,1 ,1 ), +SOC_SINGLE ("DAC2 Switch" ,WM8580_DAC_CONTROL5 ,1 ,1 ,1 ), +SOC_SINGLE ("DAC3 Switch" ,WM8580_DAC_CONTROL5 ,2 ,1 ,1 ),SOC_DOUBLE ("ADC Mute Switch" ,WM8580_ADC_CONTROL1 ,0 ,1 ,1 ,0 ), SOC_SINGLE("ADC High-Pass Filter Switch", WM8580_ADC_CONTROL1, 4, 1, 0),
PATCH 4/91 ASoC: Remove DSP mode support for WM8776
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: Mark Brown <[email protected]>
commit b2c1e07b81a126e5846dfc3d36f559d861df59f4 upstream.
This is not supported by current hardware revisions.
--- sound/soc/codecs/wm8776.c | 7 ------- 1 file changed, 7 deletions(-)
sound/soc/codecs/wm8776.c +0 -7
@@ -178,13 +178,6 @@ static int wm8776_set_fmt(struct snd_soccase SND_SOC_DAIFMT_LEFT_J : iface |=0x0001 ;break ; -/* FIXME: CHECK A/B */ -case SND_SOC_DAIFMT_DSP_A : - iface |=0x0003 ; -break ; -case SND_SOC_DAIFMT_DSP_B : - iface |=0x0007 ; -break ;default :return -EINVAL ; }
PATCH 5/91 ASoC: register cache should be 1 byte aligned for 1 byte long register
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: Cliff Cai <[email protected]>
commit ac770267a7cd85a747b6111db46f66d1515e7cd7 upstream.
--- sound/soc/soc-cache.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
sound/soc/soc-cache.c +2 -2
@@ -296,7 +296,7 @@ static unsigned int snd_soc_16_8_read_i2static unsigned int snd_soc_16_8_read (struct snd_soc_codec *codec,unsigned int reg) { -u16 *cache = codec->reg_cache; +u8 *cache = codec->reg_cache; reg &=0xff ;if (reg >= codec->reg_cache_size)
@@ -307,7 +307,7 @@ static unsigned int snd_soc_16_8_read(ststatic int snd_soc_16_8_write (struct snd_soc_codec *codec,unsigned int reg,unsigned int value) { -u16 *cache = codec->reg_cache; +u8 *cache = codec->reg_cache;u8 data[3 ];int ret;
PATCH 6/91 regulator: Default GPIO controlled WM8994 regulators to disabled
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: Joonyoung Shim <[email protected]>
commit c4604e49c1a5832a58789a22eba7ca982933e1be upstream.
This ensures that if the GPIO was not enabled prior to the driver starting the regulator API will insert the required powerup ramp delay when it enables the regulator. The gpiolib API does not provide this information.
[Rewrote changelog to describe the actual change -- broonie.]
--- drivers/regulator/wm8994-regulator.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
drivers/regulator/wm8994-regulator.c +2 -3
@@ -219,8 +219,6 @@ static __devinit int wm8994_ldo_probe(st ldo->wm8994 = wm8994; - ldo->is_enabled = true; -if (pdata->ldo[id].enable &&gpio_is_valid (pdata->ldo[id].enable)) { ldo->enable = pdata->ldo[id].enable;
@@ -237,7 +235,8 @@ static __devinit int wm8994_ldo_probe(st ret); goto err_gpio; } - } + }else + ldo->is_enabled = true; ldo->regulator =regulator_register (&wm8994_ldo_desc[id], &pdev->dev, pdata->ldo[id].init_data, ldo);
PATCH 7/91 ALSA: riptide - Fix detection / load of firmware files
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: Takashi Iwai <[email protected]>
commit a5ba6beb839cfa288960c92cd2668a2601c24dda upstream.
The detection and loading of firmeware on riptide driver has been broken due to rewrite of some codes, checking the presense wrongly. This patch fixes the logic again.
Reference: kernel bug 16596
https://bugzilla.kernel.org/show_bug.cgi?id=16596
--- sound/pci/riptide/riptide.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-)
sound/pci/riptide/riptide.c +5 -6
@@ -1224,15 +1224,14 @@ static int try_to_load_firmware(struct c firmware.firmware.ASIC, firmware.firmware.CODEC, firmware.firmware.AUXDSP, firmware.firmware.PROG); +if (!chip) +return 1 ; +for (i =0 ; i <FIRMWARE_VERSIONS ; i++) {if (!memcmp (&firmware_versions[i], &firmware,sizeof (firmware))) -break ; - } -if (i >=FIRMWARE_VERSIONS ) -return 0 ;/* no match */ +return 1 ;/* OK */ -if (!chip) -return 1 ;/* OK */ + }snd_printdd ("Writing Firmware\n" );if (!chip->fw_entry) {
PATCH 8/91 ALSA: emu10k1 - delay the PCM interrupts (add pcm_irq_delay parameter)
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: Jaroslav Kysela <[email protected]>
commit 56385a12d9bb9e173751f74b6c430742018cafc0 upstream.
With some hardware combinations, the PCM interrupts are acknowledged before the period boundary from the emu10k1 chip. The midlevel PCM code gets confused and the playback stream is interrupted.
It seems that the interrupt processing shift by 2 samples is enough to fix this issue. This default value does not harm other, non-affected hardware.
More information: Kernel bugzilla bug#16300
[A copmile warning fixed by tiwai]
--- include/sound/emu10k1.h | 1 + sound/core/pcm_native.c | 4 ++++ sound/pci/emu10k1/emu10k1.c | 4 ++++ sound/pci/emu10k1/emupcm.c | 30 ++++++++++++++++++++++++++---- sound/pci/emu10k1/memory.c | 4 +++- 5 files changed, 38 insertions(+), 5 deletions(-)
include/sound/emu10k1.h +1 -0
@@ -1707,6 +1707,7 @@ struct snd_emu10k1 {unsigned int card_type;/* EMU10K1_CARD_* */ unsigned int ecard_ctrl;/* ecard control bits */ unsigned long dma_mask;/* PCI DMA mask */ +unsigned int delay_pcm_irq;/* in samples */ int max_cache_pages;/* max memory size / PAGE_SIZE */ struct snd_dma_buffer silent_page;/* silent page */ struct snd_dma_buffer ptb_pages;/* page table pages */
sound/core/pcm_native.c +4 -0
@@ -979,6 +979,10 @@ static int snd_pcm_do_pause(struct snd_p {if (substream->runtime->trigger_master != substream)return 0 ; +/* some drivers might use hw_ptr to recover from the pause - +update the hw_ptr now */ +if (push) +snd_pcm_update_hw_ptr (substream);/* The jiffies check in snd_pcm_update_hw_ptr*() is done by * a delta betwen the current jiffies, this gives a large enough * delta, effectively to skip the check once.
sound/pci/emu10k1/emu10k1.c +4 -0
@@ -52,6 +52,7 @@ static int max_synth_voices[SNDRV_CARDS]static int max_buffer_size[SNDRV_CARDS ] = {[0 ... (SNDRV_CARDS -1 )] =128 };static int enable_ir[SNDRV_CARDS ];static uint subsystem[SNDRV_CARDS ];/* Force card subsystem model */ +static uint delay_pcm_irq[SNDRV_CARDS ] = {[0 ... (SNDRV_CARDS -1 )] =2 };module_param_array (index, int,NULL ,0444 );MODULE_PARM_DESC (index,"Index value for the EMU10K1 soundcard." );
@@ -73,6 +74,8 @@ module_param_array(enable_ir, bool, NULLMODULE_PARM_DESC (enable_ir,"Enable IR." );module_param_array (subsystem, uint,NULL ,0444 );MODULE_PARM_DESC (subsystem,"Force card subsystem model." ); +module_param_array (delay_pcm_irq, uint,NULL ,0444 ); +MODULE_PARM_DESC (delay_pcm_irq,"Delay PCM interrupt by specified number of samples (default 0)." );/* * Class 0401: 1102:0008 (rev 00) Subsystem: 1102:1001 -> Audigy2 Value Model:SB0400 */
@@ -127,6 +130,7 @@ static int __devinit snd_card_emu10k1_pr &emu)) < 0) goto error; card->private_data = emu; + emu->delay_pcm_irq = delay_pcm_irq[dev] &0x1f ;if ((err =snd_emu10k1_pcm (emu,0 ,NULL )) <0 ) goto error;if ((err =snd_emu10k1_pcm_mic (emu,1 ,NULL )) <0 )
sound/pci/emu10k1/emupcm.c +26 -4
@@ -332,7 +332,7 @@ static void snd_emu10k1_pcm_init_voice(s evoice->epcm->ccca_start_addr = start_addr + ccis;if (extra) { start_addr += ccis; - end_addr += ccis; + end_addr += ccis + emu->delay_pcm_irq; }if (stereo && !extra) {snd_emu10k1_ptr_write (emu,CPF , voice,CPF_STEREO_MASK );
@@ -360,7 +360,9 @@ static void snd_emu10k1_pcm_init_voice(s/* Assumption that PT is already 0 so no harm overwriting */ snd_emu10k1_ptr_write (emu,PTRX , voice, (send_amount[0 ] <<8 ) | send_amount[1 ]);snd_emu10k1_ptr_write (emu,DSL , voice, end_addr | (send_amount[3 ] <<24 )); -snd_emu10k1_ptr_write (emu,PSST , voice, start_addr | (send_amount[2 ] <<24 )); +snd_emu10k1_ptr_write (emu,PSST , voice, + (start_addr + (extra ? emu->delay_pcm_irq :0 )) | + (send_amount[2 ] <<24 ));if (emu->card_capabilities->emu_model) pitch_target =PITCH_48000 ;/* Disable interpolators on emu1010 card */ else
@@ -732,6 +734,23 @@ static void snd_emu10k1_playback_stop_vosnd_emu10k1_ptr_write (emu,IP , voice,0 ); } +static inline void snd_emu10k1_playback_mangle_extra (struct snd_emu10k1 *emu, +struct snd_emu10k1_pcm *epcm, +struct snd_pcm_substream *substream, +struct snd_pcm_runtime *runtime) +{ +unsigned int ptr, period_pos; + +/* try to sychronize the current position for the interrupt +source voice */ + period_pos = runtime->status->hw_ptr - runtime->hw_ptr_interrupt; + period_pos %= runtime->period_size; + ptr =snd_emu10k1_ptr_read (emu,CCCA , epcm->extra->number); + ptr &= ~0x00ffffff ; + ptr |= epcm->ccca_start_addr + period_pos; +snd_emu10k1_ptr_write (emu,CCCA , epcm->extra->number, ptr); +} +static int snd_emu10k1_playback_trigger (struct snd_pcm_substream *substream,int cmd) {
@@ -753,6 +772,8 @@ static int snd_emu10k1_playback_trigger(/* follow thru */ case SNDRV_PCM_TRIGGER_PAUSE_RELEASE :case SNDRV_PCM_TRIGGER_RESUME : +if (cmd ==SNDRV_PCM_TRIGGER_PAUSE_RELEASE ) +snd_emu10k1_playback_mangle_extra (emu, epcm, substream, runtime); mix = &emu->pcm_mixer[substream->number];snd_emu10k1_playback_prepare_voice (emu, epcm->voices[0 ],1 ,0 , mix);snd_emu10k1_playback_prepare_voice (emu, epcm->voices[1 ],0 ,0 , mix);
@@ -869,8 +890,9 @@ static snd_pcm_uframes_t snd_emu10k1_pla#endif /* printk(KERN_DEBUG -"ptr = 0x%x, buffer_size = 0x%x, period_size = 0x%x\n", -ptr, runtime->buffer_size, runtime->period_size); +"ptr = 0x%lx, buffer_size = 0x%lx, period_size = 0x%lx\n", +(long)ptr, (long)runtime->buffer_size, +(long)runtime->period_size); */ return ptr; }
sound/pci/emu10k1/memory.c +3 -1
@@ -310,8 +310,10 @@ snd_emu10k1_alloc_pages(struct snd_emu10if (snd_BUG_ON (!hdr))return NULL ; + idx = runtime->period_size >= runtime->buffer_size ? + (emu->delay_pcm_irq *2 ) :0 ;mutex_lock (&hdr->block_mutex); - blk =search_empty (emu, runtime->dma_bytes); + blk =search_empty (emu, runtime->dma_bytes + idx);if (blk ==NULL ) {mutex_unlock (&hdr->block_mutex);return NULL ;
PATCH 9/91 ALSA: hda - Fix missing stream for second ADC on Realtek ALC260 HDA codec
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: Jonathan Woithe <[email protected]>
commit 53bacfbbb2ddd981287b58a511c8b8f5df179886 upstream.
I discovered tonight that ALSA no longer sets up a stream for the second ADC provided by the Realtek ALC260 HDA codec. At some point alc_build_pcms() started using stream_analog_alt_capture when constructing the second ADC stream, but patch_alc260() was never updated accordingly. I have no idea when this regression occurred. The trivial patch to patch_alc260() given below fixes the problem as far as I can tell. The patch is against 2.6.35.
--- sound/pci/hda/patch_realtek.c | 1 + 1 file changed, 1 insertion(+)
sound/pci/hda/patch_realtek.c +1 -0
@@ -6757,6 +6757,7 @@ static int patch_alc260(struct hda_codec spec->stream_analog_playback = &alc260_pcm_analog_playback; spec->stream_analog_capture = &alc260_pcm_analog_capture; + spec->stream_analog_alt_capture = &alc260_pcm_analog_capture; spec->stream_digital_playback = &alc260_pcm_digital_playback; spec->stream_digital_capture = &alc260_pcm_digital_capture;
PATCH 10/91 ALSA: hda - Add quirk for Dell Vostro 1220
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: Takashi Iwai <[email protected]>
commit c3e68fad88143fd1fe8fe640207fb19c0f087dbc upstream.
model=dell-vostro is needed for Dell Vostro 1220 with Coexnat 5067.
Reference: Novell bnc#631066
https://bugzilla.novell.com/show_bug.cgi?id=631066
--- sound/pci/hda/patch_conexant.c | 1 + 1 file changed, 1 insertion(+)
sound/pci/hda/patch_conexant.c +1 -0
@@ -2843,6 +2843,7 @@ static struct snd_pci_quirk cxt5066_cfg_SND_PCI_QUIRK (0x1028 ,0x02f5 ,"Dell" ,CXT5066_DELL_LAPTOP ),SND_PCI_QUIRK (0x152d ,0x0833 ,"OLPC XO-1.5" ,CXT5066_OLPC_XO_1_5 ), +SND_PCI_QUIRK (0x1028 ,0x02d8 ,"Dell Vostro" ,CXT5066_DELL_VOSTO ),SND_PCI_QUIRK (0x1028 ,0x0402 ,"Dell Vostro" ,CXT5066_DELL_VOSTO ),SND_PCI_QUIRK (0x1028 ,0x0408 ,"Dell Inspiron One 19T" ,CXT5066_IDEAPAD ), SND_PCI_QUIRK(0x1179, 0xff50, "Toshiba Satellite P500-PSPGSC-01800T", CXT5066_OLPC_XO_1_5),
PATCH 11/91 ocfs2: do not overwrite error codes in ocfs2_init_acl
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: Tiger Yang <[email protected]>
commit 6eda3dd33f8a0ce58ee56a11351758643a698db4 upstream.
Setting the acl while creating a new inode depends on the error codes of posix_acl_create_masq. This patch fix a issue of overwriting the error codes of it.
--- fs/ocfs2/acl.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-)
fs/ocfs2/acl.c +7 -2
@@ -344,7 +344,7 @@ int ocfs2_init_acl(handle_t *handle, {struct ocfs2_super *osb =OCFS2_SB (inode->i_sb);struct posix_acl *acl =NULL ; -int ret =0 ; +int ret =0 , ret2;mode_t mode;if (!S_ISLNK (inode->i_mode)) {
@@ -381,7 +381,12 @@ int ocfs2_init_acl(handle_t *handle, mode = inode->i_mode; ret =posix_acl_create_masq (clone, &mode);if (ret >=0 ) { - ret =ocfs2_acl_set_mode (inode, di_bh, handle, mode); + ret2 =ocfs2_acl_set_mode (inode, di_bh, handle, mode); +if (ret2) { +mlog_errno (ret2); + ret = ret2; + goto cleanup; + }if (ret >0 ) { ret = ocfs2_set_acl(handle, inode, di_bh, ACL_TYPE_ACCESS,
PATCH 12/91 ocfs2/dlm: fix a dead lock
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: Wengang Wang <[email protected]>
commit 6d98c3ccb52f692f1a60339dde7c700686a5568b upstream.
When we have to take both dlm->master_lock and lockres->spinlock, take them in order
lockres->spinlock and then dlm->master_lock.
The patch fixes a violation of the rule.
We can simply move taking dlm->master_lock to where we have dropped res->spinlock since when we access res->state and free mle memory we don't need master_lock's protection.
--- fs/ocfs2/dlm/dlmmaster.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
fs/ocfs2/dlm/dlmmaster.c +2 -3
@@ -3044,8 +3044,6 @@ int dlm_migrate_request_handler(struct o/* check for pre-existing lock */ spin_lock (&dlm->spinlock); res =__dlm_lookup_lockres (dlm, name, namelen, hash); -spin_lock (&dlm->master_lock); -if (res) {spin_lock (&res->spinlock);if (res->state &DLM_LOCK_RES_RECOVERING ) {
@@ -3063,14 +3061,15 @@ int dlm_migrate_request_handler(struct ospin_unlock (&res->spinlock); } +spin_lock (&dlm->master_lock);/* ignore status. only nonzero status would BUG. */ ret =dlm_add_migration_mle (dlm, res, mle, &oldmle, name, namelen, migrate->new_master, migrate->master); -unlock:spin_unlock (&dlm->master_lock); +unlock:spin_unlock (&dlm->spinlock);if (oldmle) {
PATCH 13/91 ocfs2 fix o2dlm dlm run purgelist (rev 3)
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: Srinivas Eeda <[email protected]>
commit 7beaf243787f85a2ef9213ccf13ab4a243283fde upstream.
This patch fixes two problems in dlm_run_purgelist
1. If a lockres is found to be in use, dlm_run_purgelist keeps trying to purge the same lockres instead of trying the next lockres.
2. When a lockres is found unused, dlm_run_purgelist releases lockres spinlock before setting DLM_LOCK_RES_DROPPING_REF and calls dlm_purge_lockres. spinlock is reacquired but in this window lockres can get reused. This leads to BUG.
This patch modifies dlm_run_purgelist to skip lockres if it's in use and purge
next lockres. It also sets DLM_LOCK_RES_DROPPING_REF before releasing the
lockres spinlock protecting it from getting reused.
--- fs/ocfs2/dlm/dlmthread.c | 80 +++++++++++++++++++---------------------------- 1 file changed, 34 insertions(+), 46 deletions(-)
fs/ocfs2/dlm/dlmthread.c +34 -46
@@ -152,45 +152,25 @@ void dlm_lockres_calc_usage(struct dlm_cspin_unlock (&dlm->spinlock); } -static int dlm_purge_lockres (struct dlm_ctxt *dlm, +static void dlm_purge_lockres (struct dlm_ctxt *dlm,struct dlm_lock_resource *res) {int master;int ret =0 ; -spin_lock (&res->spinlock); -if (!__dlm_lockres_unused (res)) { -mlog (0 ,"%s:%.*s: tried to purge but not unused\n" , - dlm->name, res->lockname.len, res->lockname.name); -__dlm_print_one_lock_resource (res); -spin_unlock (&res->spinlock); -BUG (); - } - -if (res->state &DLM_LOCK_RES_MIGRATING ) { -mlog (0 ,"%s:%.*s: Delay dropref as this lockres is " -"being remastered\n" , dlm->name, res->lockname.len, - res->lockname.name); -/* Re-add the lockres to the end of the purge list */ -if (!list_empty (&res->purge)) { -list_del_init (&res->purge); -list_add_tail (&res->purge, &dlm->purge_list); - } -spin_unlock (&res->spinlock); -return 0 ; - } +assert_spin_locked (&dlm->spinlock); +assert_spin_locked (&res->spinlock); master = (res->owner == dlm->node_num); -if (!master) - res->state |=DLM_LOCK_RES_DROPPING_REF ; -spin_unlock (&res->spinlock);mlog (0 ,"purging lockres %.*s, master = %d\n" , res->lockname.len, res->lockname.name, master);if (!master) { + res->state |=DLM_LOCK_RES_DROPPING_REF ;/* drop spinlock... retake below */ +spin_unlock (&res->spinlock);spin_unlock (&dlm->spinlock);spin_lock (&res->spinlock);
@@ -208,31 +188,35 @@ static int dlm_purge_lockres(struct dlm_mlog (0 ,"%s:%.*s: dlm_deref_lockres returned %d\n" , dlm->name, res->lockname.len, res->lockname.name, ret);spin_lock (&dlm->spinlock); +spin_lock (&res->spinlock); } -spin_lock (&res->spinlock);if (!list_empty (&res->purge)) {mlog (0 ,"removing lockres %.*s:%p from purgelist, " "master = %d\n" , res->lockname.len, res->lockname.name, res, master);list_del_init (&res->purge); -spin_unlock (&res->spinlock);dlm_lockres_put (res); dlm->purge_count--; - }else -spin_unlock (&res->spinlock); + } + +if (!__dlm_lockres_unused (res)) { +mlog (ML_ERROR ,"found lockres %s:%.*s: in use after deref\n" , + dlm->name, res->lockname.len, res->lockname.name); +__dlm_print_one_lock_resource (res); +BUG (); + }__dlm_unhash_lockres (res);/* lockres is not in the hash now. drop the flag and wake up * any processes waiting in dlm_get_lock_resource. */ if (!master) { -spin_lock (&res->spinlock); res->state &= ~DLM_LOCK_RES_DROPPING_REF ;spin_unlock (&res->spinlock);wake_up (&res->wq); - } -return 0 ; + }else +spin_unlock (&res->spinlock); } static void dlm_run_purge_list(struct dlm_ctxt *dlm,
@@ -251,17 +235,7 @@ static void dlm_run_purge_list(struct dl lockres =list_entry (dlm->purge_list.next, struct dlm_lock_resource, purge); -/* Status of the lockres *might* change so double -* check. If the lockres is unused, holding the dlm -* spinlock will prevent people from getting and more -* refs on it -- there's no need to keep the lockres -* spinlock. */ spin_lock (&lockres->spinlock); - unused =__dlm_lockres_unused (lockres); -spin_unlock (&lockres->spinlock); - -if (!unused) -continue ; purge_jiffies = lockres->last_used +msecs_to_jiffies (DLM_PURGE_INTERVAL_MS );
@@ -273,15 +247,29 @@ static void dlm_run_purge_list(struct dl* in tail order, we can stop at the first * unpurgable resource -- anyone added after * him will have a greater last_used value */ +spin_unlock (&lockres->spinlock);break ; } +/* Status of the lockres *might* change so double +* check. If the lockres is unused, holding the dlm +* spinlock will prevent people from getting and more +* refs on it. */ + unused =__dlm_lockres_unused (lockres); +if (!unused || + (lockres->state &DLM_LOCK_RES_MIGRATING )) { +mlog (0 ,"lockres %s:%.*s: is in use or " +"being remastered, used %d, state %d\n" , + dlm->name, lockres->lockname.len, + lockres->lockname.name, !unused, lockres->state); +list_move_tail (&dlm->purge_list, &lockres->purge); +spin_unlock (&lockres->spinlock); +continue ; + } +dlm_lockres_get (lockres); -/* This may drop and reacquire the dlm spinlock if it -* has to do migration. */ -if (dlm_purge_lockres (dlm, lockres)) -BUG (); +dlm_purge_lockres (dlm, lockres);dlm_lockres_put (lockres);
PATCH 14/91 ocfs2: Count more refcount records in file system fragmentation.
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: Tao Ma <[email protected]>
commit 8a2e70c40ff58f82dde67770e6623ca45f0cb0c8 upstream.
The refcount record calculation in ocfs2_calc_refcount_meta_credits is too optimistic that we can always allocate contiguous clusters and handle an already existed refcount rec as a whole. Actually because of file system fragmentation, we may have the chance to split a refcount record into 3 parts during the transaction. So consider the worst case in record calculation.
--- fs/ocfs2/refcounttree.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-)
fs/ocfs2/refcounttree.c +15 -5
@@ -2437,16 +2437,26 @@ static int ocfs2_calc_refcount_meta_cred len =min ((u64 )cpos + clusters,le64_to_cpu (rec.r_cpos) +le32_to_cpu (rec.r_clusters)) - cpos;/* -* If the refcount rec already exist, cool. We just need -* to check whether there is a split. Otherwise we just need -* to increase the refcount. -* If we will insert one, increases recs_add. -* * We record all the records which will be inserted to the * same refcount block, so that we can tell exactly whether * we need a new refcount block or not. +* +* If we will insert a new one, this is easy and only happens +* during adding refcounted flag to the extent, so we don't +* have a chance of spliting. We just need one record. +* +* If the refcount rec already exists, that would be a little +* complicated. we may have to: +* 1) split at the beginning if the start pos isn't aligned. +* we need 1 more record in this case. +* 2) split int the end if the end pos isn't aligned. +* we need 1 more record in this case. +* 3) split in the middle because of file system fragmentation. +* we need 2 more records in this case(we can't detect this +* beforehand, so always think of the worst case). */ if (rec.r_refcount) { + recs_add +=2 ;/* Check whether we need a split at the beginning. */ if (cpos == start_cpos && cpos !=le64_to_cpu (rec.r_cpos))
PATCH 15/91 ocfs2/dlm: avoid incorrect bit set in refmap on recovery master
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: Wengang Wang <[email protected]>
commit a524812b7eaa7783d7811198921100f079034e61 upstream.
In the following situation, there remains an incorrect bit in refmap on the recovery master. Finally the recovery master will fail at purging the lockres due to the incorrect bit in refmap.
1) node A has no interest on lockres A any longer, so it is purging it.
2) the owner of lockres A is node B, so node A is sending de-ref message to node B.
3) at this time, node B crashed. node C becomes the recovery master. it recovers lockres A(because the master is the dead node B).
4) node A migrated lockres A to node C with a refbit there.
5) node A failed to send de-ref message to node B because it crashed. The failure is ignored. no other action is done for lockres A any more.
For mormal, re-send the deref message to it to recovery master can fix it. Well, ignoring the failure of deref to the original master and not recovering the lockres to recovery master has the same effect. And the later is simpler.
--- fs/ocfs2/dlm/dlmrecovery.c | 22 ++++++++++------------ fs/ocfs2/dlm/dlmthread.c | 34 +++++++++++++++++++++------------- 2 files changed, 31 insertions(+), 25 deletions(-)
fs/ocfs2/dlm/dlmrecovery.c +10 -12
@@ -1991,6 +1991,8 @@ void dlm_move_lockres_to_recovery_list(sstruct list_head *queue;struct dlm_lock *lock, *next; +assert_spin_locked (&dlm->spinlock); +assert_spin_locked (&res->spinlock); res->state |=DLM_LOCK_RES_RECOVERING ;if (!list_empty (&res->recovering)) { mlog(0,
@@ -2320,19 +2322,15 @@ static void dlm_do_local_recovery_cleanu/* zero the lvb if necessary */ dlm_revalidate_lvb (dlm, res, dead_node);if (res->owner == dead_node) { -if (res->state &DLM_LOCK_RES_DROPPING_REF ) -mlog (0 ,"%s:%.*s: owned by " -"dead node %u, this node was " -"dropping its ref when it died. " -"continue, dropping the flag.\n" , - dlm->name, res->lockname.len, - res->lockname.name, dead_node); - -/* the wake_up for this will happen when the -* RECOVERING flag is dropped later */ - res->state &= ~DLM_LOCK_RES_DROPPING_REF ; +if (res->state &DLM_LOCK_RES_DROPPING_REF ) { +mlog (ML_NOTICE ,"Ignore %.*s for " +"recovery as it is being freed\n" , + res->lockname.len, + res->lockname.name); + }else +dlm_move_lockres_to_recovery_list (dlm, + res); -dlm_move_lockres_to_recovery_list (dlm, res); }else if (res->owner == dlm->node_num) {dlm_free_dead_locks (dlm, res, dead_node);__dlm_lockres_calc_usage (dlm, res);
fs/ocfs2/dlm/dlmthread.c +21 -13
@@ -92,19 +92,27 @@ int __dlm_lockres_has_locks(struct dlm_l* truly ready to be freed. */ int __dlm_lockres_unused (struct dlm_lock_resource *res) { -if (!__dlm_lockres_has_locks (res) && - (list_empty (&res->dirty) && !(res->state &DLM_LOCK_RES_DIRTY ))) { -/* try not to scan the bitmap unless the first two -* conditions are already true */ -int bit =find_next_bit (res->refmap,O2NM_MAX_NODES ,0 ); -if (bit >=O2NM_MAX_NODES ) { -/* since the bit for dlm->node_num is not -* set, inflight_locks better be zero */ -BUG_ON (res->inflight_locks !=0 ); -return 1 ; - } - } -return 0 ; +int bit; + +if (__dlm_lockres_has_locks (res)) +return 0 ; + +if (!list_empty (&res->dirty) || res->state &DLM_LOCK_RES_DIRTY ) +return 0 ; + +if (res->state &DLM_LOCK_RES_RECOVERING ) +return 0 ; + + bit =find_next_bit (res->refmap,O2NM_MAX_NODES ,0 ); +if (bit <O2NM_MAX_NODES ) +return 0 ; + +/* +* since the bit for dlm->node_num is not set, inflight_locks better +* be zero +*/ +BUG_ON (res->inflight_locks !=0 ); +return 1 ; }
PATCH 16/91 ocfs2/dlm: remove potential deadlock -V3
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: Wengang Wang <[email protected]>
commit b11f1f1ab73fd358b1b734a9427744802202ba68 upstream.
When we need to take both dlm_domain_lock and dlm->spinlock, we should take them in order of: dlm_domain_lock then dlm->spinlock.
There is pathes disobey this order. That is calling dlm_lockres_put() with dlm->spinlock held in dlm_run_purge_list. dlm_lockres_put() calls dlm_put() at the ref and dlm_put() locks on dlm_domain_lock.
Fix:
Don't grab/put the dlm when the initialising/releasing lockres. That grab is not required because we don't call dlm_unregister_domain() based on refcount.
--- fs/ocfs2/dlm/dlmmaster.c | 4 ---- 1 file changed, 4 deletions(-)
fs/ocfs2/dlm/dlmmaster.c +0 -4
@@ -511,8 +511,6 @@ static void dlm_lockres_release(struct katomic_dec (&dlm->res_cur_count); -dlm_put (dlm); - if (!hlist_unhashed(&res->hash_node) || !list_empty(&res->granted) || !list_empty(&res->converting) ||
@@ -585,8 +583,6 @@ static void dlm_init_lockres(struct dlm_ res->migration_pending =0 ; res->inflight_locks =0 ; -/* put in dlm_lockres_release */ -dlm_grab (dlm); res->dlm = dlm;kref_init (&res->refs);
PATCH 17/91 wl1251: fix trigger scan timeout usage
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: Yuri Kululin <[email protected]>
commit fe0dbcc9d2e941328b3269dab102b94ad697ade5 upstream.
Use appropriate command (CMD_TRIGGER_SCAN_TO) instead of scan command (CMD_SCAN) to configure trigger scan timeout.
This was broken in commit 3a98c30f3e8bb1f32b5bcb74a39647b3670de275.
This fix address the bug reported here:
https://bugzilla.kernel.org/show_bug.cgi?id=16554
--- drivers/net/wireless/wl12xx/wl1251_cmd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/wireless/wl12xx/wl1251_cmd.c +1 -1
@@ -484,7 +484,7 @@ int wl1251_cmd_trigger_scan_to(struct wl cmd->timeout = timeout; - ret =wl1251_cmd_send (wl,CMD_SCAN , cmd,sizeof (*cmd)); + ret =wl1251_cmd_send (wl,CMD_TRIGGER_SCAN_TO , cmd,sizeof (*cmd));if (ret <0 ) {wl1251_error ("cmd trigger scan to failed: %d" , ret); goto out;
PATCH 18/91 nilfs2: fix list corruption after ifile creation failure
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: Ryusuke Konishi <[email protected]>
commit af4e36318edb848fcc0a8d5f75000ca00cdc7595 upstream.
If nilfs_attach_checkpoint() gets a memory allocation failure during creation of ifile, it will return without removing nilfs_sb_info struct from ns_supers list. When a concurrently mounted snapshot is unmounted or another new snapshot is mounted after that, this causes kernel oops as below:
Quoted 4 lines
BUG: unable to handle kernel NULL pointer dereference at (null) IP: [<f83662ff>] nilfs_find_sbinfo+0x74/0xa4 [nilfs2] *pde = 00000000 Oops: 0000 [#1] SMP
<snip>
Quoted 5 lines
Call Trace: [<f835dc29>] ? nilfs_get_sb+0x165/0x532 [nilfs2] [<c1173c87>] ? ida_get_new_above+0x16d/0x187 [<c109a7f8>] ? alloc_vfsmnt+0x7e/0x10a [<c1070790>] ? kstrdup+0x2c/0x40
Quoted 8 lines
[<c1089041>] ? vfs_kern_mount+0x96/0x14e [<c108913d>] ? do_kern_mount+0x32/0xbd [<c109b331>] ? do_mount+0x642/0x6a1 [<c101a415>] ? do_page_fault+0x0/0x2d1 [<c1099c00>] ? copy_mount_options+0x80/0xe2 [<c10705d8>] ? strndup_user+0x48/0x67 [<c109b3f1>] ? sys_mount+0x61/0x90 [<c10027cc>] ? sysenter_do_call+0x12/0x22
This fixes the problem.
--- fs/nilfs2/super.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
fs/nilfs2/super.c +3 -1
@@ -360,9 +360,10 @@ int nilfs_attach_checkpoint(struct nilfslist_add (&sbi->s_list, &nilfs->ns_supers);up_write (&nilfs->ns_super_sem); + err = -ENOMEM ; sbi->s_ifile =nilfs_ifile_new (sbi, nilfs->ns_inode_size);if (!sbi->s_ifile) -return -ENOMEM ; + goto delist;down_read (&nilfs->ns_segctor_sem); err = nilfs_cpfile_get_checkpoint(nilfs->ns_cpfile, cno, 0, &raw_cp,
@@ -393,6 +394,7 @@ int nilfs_attach_checkpoint(struct nilfsnilfs_mdt_destroy (sbi->s_ifile); sbi->s_ifile =NULL ; + delist:down_write (&nilfs->ns_super_sem);list_del_init (&sbi->s_list);up_write (&nilfs->ns_super_sem);
PATCH 19/91 tracing: Fix an unallocated memory access in function_graph
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: Shaohua Li <[email protected]>
commit 575570f02761bd680ba5731c1dfd4701062e7fb2 upstream.
With CONFIG_DEBUG_PAGEALLOC, I observed an unallocated memory access in function_graph trace. It appears we find a small size entry in ring buffer, but we access it as a big size entry. The access overflows the page size and touches an unallocated page.
LKML-Reference: <[email protected]>
--- kernel/trace/trace_functions_graph.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-)
kernel/trace/trace_functions_graph.c +9 -1
@@ -506,7 +506,15 @@ get_return_for_leaf(struct trace_iterato* if the output fails. */ data->ent = *curr; - data->ret = *next; +/* +* If the next event is not a return type, then +* we only care about what type it is. Otherwise we can +* safely copy the entire event. +*/ +if (next->ent.type ==TRACE_GRAPH_RET ) + data->ret = *next; +else + data->ret.ent.type = next->ent.type; } }
PATCH 20/91 tracing: Fix ring_buffer_read_page reading out of page boundary
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: Huang Ying <[email protected]>
commit 18fab912d4fa70133df164d2dcf3310be0c38c34 upstream.
With the configuration: CONFIG_DEBUG_PAGEALLOC=y and Shaohua's patch:
[PATCH]x86: make spurious_fault check correct pte bit
Function call graph trace with the following will trigger a page fault.
# cd /sys/kernel/debug/tracing/ # echo function_graph > current_tracer # cat per_cpu/cpu1/trace_pipe_raw > /dev/null
BUG: unable to handle kernel paging request at ffff880006e99000 IP: [<ffffffff81085572>] rb_event_length+0x1/0x3f PGD 1b19063 PUD 1b1d063 PMD 3f067 PTE 6e99160 Oops: 0000 [#1] SMP DEBUG_PAGEALLOC last sysfs file: /sys/devices/virtual/net/lo/operstate CPU 1 Modules linked in:
Pid: 1982, comm: cat Not tainted 2.6.35-rc6-aes+ #300 /Bochs
RIP: 0010:[<ffffffff81085572>] [<ffffffff81085572>] rb_event_length+0x1/0x3f RSP: 0018:ffff880006475e38 EFLAGS: 00010006 RAX: 0000000000000ff0 RBX: ffff88000786c630 RCX: 000000000000001d RDX: ffff880006e98000 RSI: 0000000000000ff0 RDI: ffff880006e99000 RBP: ffff880006475eb8 R08: 000000145d7008bd R09: 0000000000000000 R10: 0000000000008000 R11: ffffffff815d9336 R12: ffff880006d08000 R13: ffff880006e605d8 R14: 0000000000000000 R15: 0000000000000018 FS: 00007f2b83e456f0(0000) GS:ffff880002100000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 000000008005003b CR2: ffff880006e99000 CR3: 00000000064a8000 CR4: 00000000000006e0 DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400 Process cat (pid: 1982, threadinfo ffff880006474000, task ffff880006e40770) Stack: ffff880006475eb8 ffffffff8108730f 0000000000000ff0 000000145d7008bd <0> ffff880006e98010 ffff880006d08010 0000000000000296 ffff88000786c640 <0> ffffffff81002956 0000000000000000 ffff8800071f4680 ffff8800071f4680 Call Trace: [<ffffffff8108730f>] ? ring_buffer_read_page+0x15a/0x24a [<ffffffff81002956>] ? return_to_handler+0x15/0x2f [<ffffffff8108a575>] tracing_buffers_read+0xb9/0x164 [<ffffffff810debfe>] vfs_read+0xaf/0x150 [<ffffffff81002941>] return_to_handler+0x0/0x2f [<ffffffff810248b0>] __bad_area_nosemaphore+0x17e/0x1a1 [<ffffffff81002941>] return_to_handler+0x0/0x2f [<ffffffff810248e6>] bad_area_nosemaphore+0x13/0x15 Code: 80 25 b2 16 b3 00 fe c9 c3 55 48 89 e5 f0 80 0d a4 16 b3 00 02 c9 c3 55 31 c0 48 89 e5 48 83 3d 94 16 b3 00 01 c9 0f 94 c0 c3 55 <8a> 0f 48 89 e5 83 e1 1f b8 08 00 00 00 0f b6 d1 83 fa 1e 74 27 RIP [<ffffffff81085572>] rb_event_length+0x1/0x3f RSP <ffff880006475e38> CR2: ffff880006e99000 ---[ end trace a6877bb92ccb36bb ]---
The root cause is that ring_buffer_read_page() may read out of page boundary, because the boundary checking is done after reading. This is fixed via doing boundary checking before reading.
LKML-Reference: <1280297641.2771.307.camel@yhuang-dev>
--- kernel/trace/ring_buffer.c | 3 +++ 1 file changed, 3 insertions(+)
kernel/trace/ring_buffer.c +3 -0
@@ -3757,6 +3757,9 @@ int ring_buffer_read_page(struct ring_bu rpos = reader->read; pos += size; +if (rpos >= commit) +break ; + event =rb_reader_event (cpu_buffer); size =rb_event_length (event); }while (len > size);
PATCH 21/91 cfg80211: fix locking in action frame TX
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: Johannes Berg <[email protected]>
commit fe100acddf438591ecf3582cb57241e560da70b7 upstream.
Accesses to "wdev->current_bss" must be
locked with the wdev lock, which action
frame transmission is missing.
--- net/wireless/mlme.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)
net/wireless/mlme.c +7 -1
@@ -825,12 +825,18 @@ int cfg80211_mlme_action(struct cfg80211return -EINVAL ;if (mgmt->u.action.category !=WLAN_CATEGORY_PUBLIC ) {/* Verify that we are associated with the destination AP */ +wdev_lock (wdev); +if (!wdev->current_bss ||memcmp (wdev->current_bss->pub.bssid, mgmt->bssid,ETH_ALEN ) !=0 ||memcmp (wdev->current_bss->pub.bssid, mgmt->da, -ETH_ALEN ) !=0 ) +ETH_ALEN ) !=0 ) { +wdev_unlock (wdev);return -ENOTCONN ; + } +wdev_unlock (wdev); + }if (memcmp (mgmt->sa, dev->dev_addr,ETH_ALEN ) !=0 )
PATCH 22/91 platform/x86: move rfkill for Dell Mini 1012 to compal-laptop
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: Victor van den Elzen <[email protected]>
commit c3f755e3842108c1cffe570fe9802239810352b6 upstream.
Like others in the Mini series, the Dell Mini 1012 does not support the smbios hook required by dell-laptop.
--- drivers/platform/x86/compal-laptop.c | 9 +++++++++ drivers/platform/x86/dell-laptop.c | 7 +++++++ 2 files changed, 16 insertions(+)
drivers/platform/x86/compal-laptop.c +9 -0
@@ -259,6 +259,14 @@ static struct dmi_system_id __initdata c .callback = dmi_check_cb }, { + .ident = "Dell Mini 1012", + .matches = { +DMI_MATCH (DMI_SYS_VENDOR ,"Dell Inc." ), + DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron 1012"), + }, + .callback = dmi_check_cb + }, + { .ident ="Dell Inspiron 11z" , .matches = { DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
@@ -375,5 +383,6 @@ MODULE_ALIAS("dmi:*:rnIFT00:rvrIFT00:*")MODULE_ALIAS ("dmi:*:svnDellInc.:pnInspiron910:*" );MODULE_ALIAS ("dmi:*:svnDellInc.:pnInspiron1010:*" );MODULE_ALIAS ("dmi:*:svnDellInc.:pnInspiron1011:*" ); +MODULE_ALIAS ("dmi:*:svnDellInc.:pnInspiron1012:*" );MODULE_ALIAS ("dmi:*:svnDellInc.:pnInspiron1110:*" );MODULE_ALIAS ("dmi:*:svnDellInc.:pnInspiron1210:*" );
drivers/platform/x86/dell-laptop.c +7 -0
@@ -116,6 +116,13 @@ static struct dmi_system_id __devinitdat }, }, { + .ident = "Dell Mini 1012", + .matches = { +DMI_MATCH (DMI_SYS_VENDOR ,"Dell Inc." ), + DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron 1012"), + }, + }, + { .ident ="Dell Inspiron 11z" , .matches = { DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
PATCH 23/91 x86, hotplug: Serialize CPU hotplug to avoid bringup concurrency issues
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: Borislav Petkov <[email protected]>
commit d7c53c9e822a4fefa13a0cae76f3190bfd0d5c11 upstream.
When testing cpu hotplug code on 32-bit we kept hitting the "CPU%d:
Stuck ??" message due to multiple cores concurrently accessing the cpu_callin_mask, among others.
Since these codepaths are not protected from concurrent access due to the fact that there's no sane reason for making an already complex code unnecessarily more complex - we hit the issue only when insanely switching cores off- and online - serialize hotplugging cores on the sysfs level and be done with it.
[ v2.1: fix !HOTPLUG_CPU build ]
LKML-Reference: <20100819181029.GC17171@aftab>
arch/x86/Kconfig +5 -0
@@ -245,6 +245,11 @@ config ARCH_HWEIGHT_CFLAGS config KTIME_SCALAR def_bool X86_32 + +config ARCH_CPU_PROBE_RELEASE + def_bool y + depends on HOTPLUG_CPU + source "init/Kconfig" source "kernel/Kconfig.freezer"
arch/x86/kernel/smpboot.c +19 -0
@@ -90,6 +90,25 @@ DEFINE_PER_CPU(int, cpu_state) = { 0 }; static DEFINE_PER_CPU(struct task_struct *, idle_thread_array);#define get_idle_for_cpu (x) (per_cpu(idle_thread_array, x))#define set_idle_for_cpu (x, p) (per_cpu(idle_thread_array, x) = (p)) + +/* +* We need this for trampoline_base protection from concurrent accesses when +* off- and onlining cores wildly. +*/ +static DEFINE_MUTEX (x86_cpu_hotplug_driver_mutex); + +void cpu_hotplug_driver_lock () +{ +mutex_lock (&x86_cpu_hotplug_driver_mutex); +} + +void cpu_hotplug_driver_unlock () +{ +mutex_unlock (&x86_cpu_hotplug_driver_mutex); +} + +ssize_t arch_cpu_probe (const char *buf,size_t count) {return -1 ; } +ssize_t arch_cpu_release (const char *buf,size_t count) {return -1 ; }#else static struct task_struct *idle_thread_array[NR_CPUS ]__cpuinitdata ;#define get_idle_for_cpu (x) (idle_thread_array[(x)])
PATCH 24/91 x86, apic: Fix apic=debug boot crash
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: Daniel Kiper <[email protected]>
commit 05e407603e527f9d808dd3866d3a17c2ce4dfcc5 upstream.
Fix a boot crash when apic=debug is used and the APIC is not properly initialized.
This issue appears during Xen Dom0 kernel boot but the fix is generic and the crash could occur on real hardware as well.
LKML-Reference: <[email protected]>
--- arch/x86/kernel/apic/io_apic.c | 2 ++ 1 file changed, 2 insertions(+)
arch/x86/kernel/apic/io_apic.c +2 -0
@@ -1732,6 +1732,8 @@ __apicdebuginit(void) print_IO_APIC(voidstruct irq_pin_list *entry; cfg = desc->chip_data; +if (!cfg) +continue ; entry = cfg->irq_2_pin;if (!entry)continue ;
PATCH 25/91 Fix the nested PR lock calling issue in ACL
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: Jiaju Zhang <[email protected]>
commit 845b6cf34150100deb5f58c8a37a372b111f2918 upstream.
Hi,
Thanks a lot for all the review and comments so far;) I'd like to send the improved (V4) version of this patch.
This patch fixes a deadlock in OCFS2 ACL. We found this bug in OCFS2 and Samba integration using scenario, the symptom is several smbd processes will be hung under heavy workload. Finally we found out it is the nested PR lock calling that leads to this deadlock:
node1 node2
gr PR
|
V
PR(EX)---> BAST:OCFS2_LOCK_BLOCKED
|
V
rq PR
|
V
wait=1After requesting the 2nd PR lock, the process "smbd" went into D state. It can only be woken up when the 1st PR lock's RO holder equals zero. There should be an ocfs2_inode_unlock in the calling path later on, which can decrement the RO holder. But since it has been in uninterruptible sleep, the unlock function has no chance to be called.
The related stack trace is:
smbd D ffff8800013d0600 0 9522 5608 0x00000000
ffff88002ca7fb18 0000000000000282 ffff88002f964500 ffff88002ca7fa98 ffff8800013d0600 ffff88002ca7fae0 ffff88002f964340 ffff88002f964340 ffff88002ca7ffd8 ffff88002ca7ffd8 ffff88002f964340 ffff88002f964340
Call Trace: [<ffffffff80350425>] schedule_timeout+0x175/0x210 [<ffffffff8034f580>] wait_for_common+0xf0/0x210 [<ffffffffa03e12b9>] __ocfs2_cluster_lock+0x3b9/0xa90 [ocfs2] [<ffffffffa03e7665>] ocfs2_inode_lock_full_nested+0x255/0xdb0 [ocfs2] [<ffffffffa0446019>] ocfs2_get_acl+0x69/0x120 [ocfs2] [<ffffffffa0446368>] ocfs2_check_acl+0x28/0x80 [ocfs2] [<ffffffff800e3507>] acl_permission_check+0x57/0xb0 [<ffffffff800e357d>] generic_permission+0x1d/0xc0 [<ffffffffa03eecea>] ocfs2_permission+0x10a/0x1d0 [ocfs2] [<ffffffff800e3f65>] inode_permission+0x45/0x100 [<ffffffff800d86b3>] sys_chdir+0x53/0x90 [<ffffffff80007458>] system_call_fastpath+0x16/0x1b
[<00007f34a4ef6927>] 0x7f34a4ef6927
For details, please see:
https://bugzilla.novell.com/show_bug.cgi?id=614332 and
http://oss.oracle.com/bugzilla/show_bug.cgi?id=1278
--- fs/ocfs2/acl.c | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-)
fs/ocfs2/acl.c +21 -3
@@ -290,12 +290,30 @@ static int ocfs2_set_acl(handle_t *handlint ocfs2_check_acl (struct inode *inode,int mask) { -struct posix_acl *acl =ocfs2_get_acl (inode,ACL_TYPE_ACCESS ); +struct ocfs2_super *osb =OCFS2_SB (inode->i_sb); +struct buffer_head *di_bh =NULL ; +struct posix_acl *acl; +int ret = -EAGAIN ; -if (IS_ERR (acl)) +if (!(osb->s_mount_opt &OCFS2_MOUNT_POSIX_ACL )) +return ret; + + ret =ocfs2_read_inode_block (inode, &di_bh); +if (ret <0 ) { +mlog_errno (ret); +return ret; + } + + acl =ocfs2_get_acl_nolock (inode,ACL_TYPE_ACCESS , di_bh); + +brelse (di_bh); + +if (IS_ERR (acl)) { +mlog_errno (PTR_ERR (acl));return PTR_ERR (acl); + }if (acl) { -int ret =posix_acl_permission (inode, acl, mask); + ret =posix_acl_permission (inode, acl, mask);posix_acl_release (acl);return ret; }
PATCH 26/91 drm/radeon/kms: add additional quirk for Acer rv620 laptop
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: Alex Deucher <[email protected]>
commit 9ea2c4be978d597076ddc6c550557de5d243cea8 upstream.
HPD pins are reversed
Fixes:
https://bugs.freedesktop.org/show_bug.cgi?id=29387
--- drivers/gpu/drm/radeon/radeon_atombios.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-)
drivers/gpu/drm/radeon/radeon_atombios.c +12 -2
@@ -206,6 +206,7 @@ static bool radeon_atom_apply_quirks(struint16_t *line_mux, struct radeon_hpd *hpd) { + struct radeon_device *rdev = dev->dev_private;/* Asus M2A-VM HDMI board lists the DVI port as HDMI */ if ((dev->pdev->device == 0x791e) &&
@@ -308,13 +309,22 @@ static bool radeon_atom_apply_quirks(str } } -/* Acer laptop reports DVI-D as DVI-I */ +/* Acer laptop reports DVI-D as DVI-I and hpd pins reversed */ if ((dev->pdev->device ==0x95c4 ) && (dev->pdev->subsystem_vendor ==0x1025 ) && (dev->pdev->subsystem_device ==0x013c )) { +struct radeon_gpio_rec gpio; +if ((*connector_type ==DRM_MODE_CONNECTOR_DVII ) && - (supported_device ==ATOM_DEVICE_DFP1_SUPPORT )) + (supported_device ==ATOM_DEVICE_DFP1_SUPPORT )) { + gpio =radeon_lookup_gpio (rdev,6 ); + *hpd =radeon_atom_get_hpd_info_from_gpio (rdev, &gpio); *connector_type =DRM_MODE_CONNECTOR_DVID ; + }else if ((*connector_type ==DRM_MODE_CONNECTOR_HDMIA ) && + (supported_device ==ATOM_DEVICE_DFP1_SUPPORT )) { + gpio =radeon_lookup_gpio (rdev,7 ); + *hpd =radeon_atom_get_hpd_info_from_gpio (rdev, &gpio); + } }/* XFX Pine Group device rv730 reports no VGA DDC lines
PATCH 27/91 hwmon: (pc87360) Fix device resource declaration
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: Jean Delvare <[email protected]>
commit b9783dcebe952bf73449fe70a19ee4814adc81a0 upstream.
It's not OK to call platform_device_add_resources() multiple times in a row. Despite its name, this functions sets the resources, it doesn't add them. So we have to prepare an array with all the resources, and then call platform_device_add_resources() once.
Before this fix, only the last I/O resource would be actually registered. The other I/O resources were leaked.
--- drivers/hwmon/pc87360.c | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-)
drivers/hwmon/pc87360.c +17 -14
@@ -1610,11 +1610,8 @@ static struct pc87360_data *pc87360_updastatic int __init pc87360_device_add (unsigned short address) { -struct resource res = { - .name ="pc87360" , - .flags =IORESOURCE_IO , - }; -int err, i; +struct resource res[3 ]; +int err, i, res_count; pdev =platform_device_alloc ("pc87360" , address);if (!pdev) {
@@ -1623,22 +1620,28 @@ static int __init pc87360_device_add(uns goto exit; } +memset (res,0 ,3 *sizeof (struct resource )); + res_count =0 ;for (i =0 ; i <3 ; i++) {if (!extra_isa[i])continue ; - res.start = extra_isa[i]; - res.end = extra_isa[i] +PC87360_EXTENT -1 ; + res[res_count].start = extra_isa[i]; + res[res_count].end = extra_isa[i] +PC87360_EXTENT -1 ; + res[res_count].name ="pc87360" , + res[res_count].flags =IORESOURCE_IO , - err =acpi_check_resource_conflict (&res); + err =acpi_check_resource_conflict (&res[res_count]);if (err) goto exit_device_put; - err =platform_device_add_resources (pdev, &res,1 ); -if (err) { -printk (KERN_ERR "pc87360: Device resource[%d] " -"addition failed (%d)\n" , i, err); - goto exit_device_put; - } + res_count++; + } + + err =platform_device_add_resources (pdev, res, res_count); +if (err) { +printk (KERN_ERR "pc87360: Device resources addition failed " +"(%d)\n" , err); + goto exit_device_put; } err =platform_device_add (pdev);
PATCH 28/91 ARM: Tighten check for allowable CPSR values
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: Russell King <[email protected]>
commit 41e2e8fd34fff909a0e40129f6ac4233ecfa67a9 upstream.
--- arch/arm/include/asm/ptrace.h | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-)
arch/arm/include/asm/ptrace.h +13 -4
@@ -158,15 +158,24 @@ struct pt_regs {*/ static inline int valid_user_regs (struct pt_regs *regs) { -if (user_mode (regs) && (regs->ARM_cpsr &PSR_I_BIT ) ==0 ) { - regs->ARM_cpsr &= ~(PSR_F_BIT |PSR_A_BIT ); -return 1 ; +unsigned long mode = regs->ARM_cpsr &MODE_MASK ; + +/* +* Always clear the F (FIQ) and A (delayed abort) bits +*/ + regs->ARM_cpsr &= ~(PSR_F_BIT |PSR_A_BIT ); + +if ((regs->ARM_cpsr &PSR_I_BIT ) ==0 ) { +if (mode ==USR_MODE ) +return 1 ; +if (elf_hwcap &HWCAP_26BIT && mode ==USR26_MODE ) +return 1 ; }/* * Force CPSR to something logical... */ - regs->ARM_cpsr &= PSR_f | PSR_s | (PSR_x & ~PSR_A_BIT ) |PSR_T_BIT |MODE32_BIT ; + regs->ARM_cpsr &= PSR_f | PSR_s | PSR_x |PSR_T_BIT |MODE32_BIT ;if (!(elf_hwcap &HWCAP_26BIT )) regs->ARM_cpsr |=USR_MODE ;
PATCH 29/91 ARM: Fix gen_nand probe structures contents
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: Marek Vasut <[email protected]>
commit ef077179a2909d3d0d3accf29ad1ea9ebb19019b upstream.
These three platforms didn't properly fill nr_chips in gen_nand registration and therefore depended on gen_nand bug fixed by commit 81cbb0b17796d81cbd92defe113cf2a7c7a21fbb ("mtd: gen_nand: fix support for multiple chips")
--- arch/arm/mach-ixp4xx/ixdp425-setup.c | 1 + arch/arm/mach-mx3/mach-qong.c | 1 + arch/arm/mach-orion5x/ts78xx-setup.c | 1 + 3 files changed, 3 insertions(+)
arch/arm/mach-ixp4xx/ixdp425-setup.c +1 -0
@@ -100,6 +100,7 @@ ixdp425_flash_nand_cmd_ctrl(struct mtd_istatic struct platform_nand_data ixdp425_flash_nand_data = { .chip = { + .nr_chips =1 , .chip_delay =30 , .options =NAND_NO_AUTOINCR , #ifdef CONFIG_MTD_PARTITIONS
arch/arm/mach-mx3/mach-qong.c +1 -0
@@ -169,6 +169,7 @@ static void qong_nand_select_chip(structstatic struct platform_nand_data qong_nand_data = { .chip = { + .nr_chips =1 , .chip_delay =20 , .options =0 , },
arch/arm/mach-orion5x/ts78xx-setup.c +1 -0
@@ -216,6 +216,7 @@ static struct mtd_partition ts78xx_ts_nastatic struct platform_nand_data ts78xx_ts_nand_data = { .chip = { + .nr_chips =1 , .part_probe_types = ts_nand_part_probes, .partitions = ts78xx_ts_nand_parts, .nr_partitions =ARRAY_SIZE (ts78xx_ts_nand_parts),
PATCH 30/91 BFIN: Fix gen_nand probe structures contents
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: Marek Vasut <[email protected]>
commit ef56609f9c7fdf5baa9d9f86f84a7bd8a717cd25 upstream.
These two platforms didn't properly fill nr_chips in gen_nand registration and therefore depended on gen_nand bug fixed by by commit 81cbb0b17796d81cbd92defe113cf2a7c7a21fbb ("mtd: gen_nand: fix support for multiple chips")
--- arch/blackfin/mach-bf537/boards/stamp.c | 1 + arch/blackfin/mach-bf561/boards/acvilon.c | 1 + 2 files changed, 2 insertions(+)
arch/blackfin/mach-bf537/boards/stamp.c +1 -0
@@ -400,6 +400,7 @@ static int bfin_plat_nand_dev_ready(strustatic struct platform_nand_data bfin_plat_nand_data = { .chip = { + .nr_chips =1 , .chip_delay =30 , #ifdef CONFIG_MTD_PARTITIONS .part_probe_types = part_probes,
arch/blackfin/mach-bf561/boards/acvilon.c +1 -0
@@ -283,6 +283,7 @@ static int bfin_plat_nand_dev_ready(strustatic struct platform_nand_data bfin_plat_nand_data = { .chip = { + .nr_chips =1 , .chip_delay =30 , #ifdef CONFIG_MTD_PARTITIONS .part_probe_types = part_probes,
PATCH 31/91 nfs: Add "lookupcache" to displayed mount options
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: Patrick J. LoPresti <[email protected]>
commit 9b00c64318cc337846a7a08a5678f5f19aeff188 upstream.
Running "cat /proc/mounts" fails to display the "lookupcache" option. This oversight cost me a bunch of wasted time recently.
The following simple patch fixes it.
--- fs/nfs/super.c | 7 +++++++ 1 file changed, 7 insertions(+)
fs/nfs/super.c +7 -0
@@ -648,6 +648,13 @@ static void nfs_show_mount_options(strucif (nfss->options &NFS_OPTION_FSCACHE )seq_printf (m,",fsc" ); + +if (nfss->flags &NFS_MOUNT_LOOKUP_CACHE_NONEG ) { +if (nfss->flags &NFS_MOUNT_LOOKUP_CACHE_NONE ) +seq_printf (m,",lookupcache=none" ); +else +seq_printf (m,",lookupcache=pos" ); + } }/*
PATCH 32/91 ath5k: disable ASPM L0s for all cards
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: Maxim Levitsky <[email protected]>
commit 6ccf15a1a76d2ff915cdef6ae4d12d0170087118 upstream.
Atheros PCIe wireless cards handled by ath5k do require L0s disabled. For distributions shipping with CONFIG_PCIEASPM (this will be enabled by default in the future in 2.6.36) this will also mean both L1 and L0s will be disabled when a pre 1.1 PCIe device is detected. We do know L1 works correctly even for all ath5k pre 1.1 PCIe devices though but cannot currently undue the effect of a blacklist, for details you can read pcie_aspm_sanity_check() and see how it adjusts the device link capability.
It may be possible in the future to implement some PCI API to allow drivers to override blacklists for pre 1.1 PCIe but for now it is best to accept that both L0s and L1 will be disabled completely for distributions shipping with CONFIG_PCIEASPM rather than having this issue present. Motivation for adding this new API will be to help with power consumption for some of these devices.
Example of issues you'd see:
- On the Acer Aspire One (AOA150, Atheros Communications Inc. AR5001 Wireless Network Adapter [168c:001c] (rev 01)) doesn't work well with ASPM enabled, the card will eventually stall on heavy traffic with often 'unsupported jumbo' warnings appearing. Disabling ASPM L0s in ath5k fixes these problems.
- On the same card you would see a storm of RXORN interrupts even though medium is idle.
Credit for root causing and fixing the bug goes to Jussi Kivilinna.
--- drivers/net/wireless/ath/ath5k/base.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+)
drivers/net/wireless/ath/ath5k/base.c +21 -0
@@ -48,6 +48,7 @@#include <linux/netdevice.h> #include <linux/cache.h> #include <linux/pci.h> +#include <linux/pci-aspm.h> #include <linux/ethtool.h> #include <linux/uaccess.h> #include <linux/slab.h>
@@ -469,6 +470,26 @@ ath5k_pci_probe(struct pci_dev *pdev,int ret;u8 csz; +/* +* L0s needs to be disabled on all ath5k cards. +* +* For distributions shipping with CONFIG_PCIEASPM (this will be enabled +* by default in the future in 2.6.36) this will also mean both L1 and +* L0s will be disabled when a pre 1.1 PCIe device is detected. We do +* know L1 works correctly even for all ath5k pre 1.1 PCIe devices +* though but cannot currently undue the effect of a blacklist, for +* details you can read pcie_aspm_sanity_check() and see how it adjusts +* the device link capability. +* +* It may be possible in the future to implement some PCI API to allow +* drivers to override blacklists for pre 1.1 PCIe but for now it is +* best to accept that both L0s and L1 will be disabled completely for +* distributions shipping with CONFIG_PCIEASPM rather than having this +* issue present. Motivation for adding this new API will be to help +* with power consumption for some of these devices. +*/ +pci_disable_link_state (pdev,PCIE_LINK_STATE_L0S ); + ret =pci_enable_device (pdev);if (ret) {dev_err (&pdev->dev,"can't enable device\n" );
PATCH 33/91 pxa3xx: fix ns2cycle equation
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: Axel Lin <[email protected]>
commit 93b352fce679945845664b56b0c3afbd655a7a12 upstream.
Test on a PXA310 platform with Samsung K9F2G08X0B NAND flash, with tCH=5 and clk is 156MHz, ns2cycle(5, 156000000) returns -1.
ns2cycle returns negtive value will break NDTR0_tXX macros.
After checking the commit log, I found the problem is introduced by commit 5b0d4d7c8a67c5ba3d35e6ceb0c5530cc6846db7
"[MTD] [NAND] pxa3xx: convert from ns to clock ticks more accurately"
To get num of clock cycles, we use below equation:
num of clock cycles = time (ns) / one clock cycle (ns) + 1
We need to add 1 cycle here because integer division will truncate the result. It is possible the developers set the Min values in SPEC for timing settings. Thus the truncate may cause problem, and it is safe to add an extra cycle here.
The various fields in NDTR{01} are in units of clock ticks minus one, thus we should subtract 1 cycle then.
Thus the correct equation should be:
num of clock cycles = time (ns) / one clock cycle (ns) + 1 - 1
= time (ns) / one clock cycle (ns)
--- drivers/mtd/nand/pxa3xx_nand.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/mtd/nand/pxa3xx_nand.c +1 -1
@@ -363,7 +363,7 @@ static struct pxa3xx_nand_flash *builtin#define tAR_NDTR1 (r) (((r) >> 0) & 0xf)/* convert nano-seconds to nand flash controller clock cycles */ -#define ns2cycle (ns, clk) (int)(((ns) * (clk / 1000000) / 1000) - 1) +#define ns2cycle (ns, clk) (int)((ns) * (clk / 1000000) / 1000)/* convert nand flash controller clock cycles to nano-seconds */ #define cycle2ns (c, clk) ((((c) + 1) * 1000000 + clk / 500) / (clk / 1000))
PATCH 34/91 matroxfb: fix incorrect use of memcpy_toio()
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: Ondrej Zary <[email protected]>
commit c81476df1b4241aefba4ff83a7701b3a926bd7ce upstream.
Screen is completely corrupted since 2.6.34. Bisection revealed that it's caused by commit 6175ddf06b61720 ("x86: Clean up mem*io functions.").
H. Peter Anvin explained that memcpy_toio() does not copy data in 32bit chunks anymore on x86.
--- drivers/video/matrox/matroxfb_base.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/video/matrox/matroxfb_base.h +2 -2
@@ -151,13 +151,13 @@ static inline void mga_writel(vaddr_t vastatic inline void mga_memcpy_toio (vaddr_t va,const void * src,int len) {#if defined(__alpha__) || defined(__i386__) || defined(__x86_64__)/* -* memcpy_toio works for us if: +* iowrite32_rep works for us if: * (1) Copies data as 32bit quantities, not byte after byte, * (2) Performs LE ordered stores, and * (3) It copes with unaligned source (destination is guaranteed to be page * aligned and length is guaranteed to be multiple of 4). */ -memcpy_toio (va.vaddr, src, len); +iowrite32_rep (va.vaddr, src, len >>2 );#else u_int32_t __iomem * addr = va.vaddr;
PATCH 35/91 drm/i915: fixup pageflip ringbuffer commands for i8xx
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: Daniel Vetter <[email protected]>
commit 69d0b96c095468526009cb3104eee561c9252a84 upstream.
Add a new path for 2nd gen chips that uses the commands for i81x chips (where public docs do exist) augmented with the plane bits from i915. It seems to work and doesn't result in a black screen like before.
--- drivers/gpu/drm/i915/intel_display.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)
drivers/gpu/drm/i915/intel_display.c +7 -1
@@ -4311,11 +4311,17 @@ static int intel_crtc_page_flip(struct dOUT_RING (offset | obj_priv->tiling_mode); pipesrc =I915_READ (pipesrc_reg);OUT_RING (pipesrc &0x0fff0fff ); - }else { + }else if (IS_GEN3 (dev)) {OUT_RING (MI_DISPLAY_FLIP_I915 |MI_DISPLAY_FLIP_PLANE (intel_crtc->plane));OUT_RING (fb->pitch);OUT_RING (offset); +OUT_RING (MI_NOOP ); + }else { +OUT_RING (MI_DISPLAY_FLIP | +MI_DISPLAY_FLIP_PLANE (intel_crtc->plane)); +OUT_RING (fb->pitch); +OUT_RING (offset);OUT_RING (MI_NOOP ); }ADVANCE_LP_RING ();
PATCH 36/91 drm/i915: i8xx also doesnt like multiple oustanding pageflips
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: Daniel Vetter <[email protected]>
commit 6146b3d61925116e3fecce36c2fd873665bd6614 upstream.
My i855GM suffers from a 80k/s interrupt storm without this. So add 2nd gen to the list of things that don't like more than one outstanding pageflip request.
Furthermore I've changed the busy loop into a ringbuffer wait. Busy-loops that don't check whether the chip died are simply evil. And performance should actually improve, because there's usually a decent amount of rendering queued on the gpu, hopefully rendering that MI_WAIT into a noop by the time it's executed.
The current code holds dev->struct_mutex while executing this loop, hence stalling all other gem activity anyway.
--- drivers/gpu/drm/i915/intel_display.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-)
drivers/gpu/drm/i915/intel_display.c +8 -6
@@ -4290,14 +4290,16 @@ static int intel_crtc_page_flip(struct d work->pending_flip_obj = obj;if (intel_crtc->plane) - flip_mask =I915_DISPLAY_PLANE_B_FLIP_PENDING_INTERRUPT ; + flip_mask =MI_WAIT_FOR_PLANE_B_FLIP ;else - flip_mask =I915_DISPLAY_PLANE_A_FLIP_PENDING_INTERRUPT ; + flip_mask =MI_WAIT_FOR_PLANE_A_FLIP ; -/* Wait for any previous flip to finish */ -if (IS_GEN3 (dev)) -while (I915_READ (ISR ) & flip_mask) - ; +if (IS_GEN3 (dev) ||IS_GEN2 (dev)) { +BEGIN_LP_RING (2 ); +OUT_RING (MI_WAIT_FOR_EVENT | flip_mask); +OUT_RING (0 ); +ADVANCE_LP_RING (); + }/* Offset into the new buffer for cases of shared fbs between CRTCs */ offset = obj_priv->gtt_offset;
PATCH 37/91 drm/i915/edp: Flush the write before waiting for PLLs
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: Chris Wilson <[email protected]>
commit 5ddb954b9ee50824977d2931e0ff58b3050b337d upstream.
--- drivers/gpu/drm/i915/intel_display.c | 1 + 1 file changed, 1 insertion(+)
drivers/gpu/drm/i915/intel_display.c +1 -0
@@ -1470,6 +1470,7 @@ static void ironlake_enable_pll_edp (str dpa_ctl =I915_READ (DP_A ); dpa_ctl |=DP_PLL_ENABLE ;I915_WRITE (DP_A , dpa_ctl); +POSTING_READ (DP_A );udelay (200 ); }
PATCH 38/91 dm mpath: fix NULL pointer dereference when path parameters missing
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: Alasdair G Kergon <[email protected]>
commit 6bbf79a14080a0c61212f53b4b87dc1a99fedf9c upstream.
multipath_ctr() forgets to return an error after detecting missing path parameters. Fix this.
--- drivers/md/dm-mpath.c | 1 + 1 file changed, 1 insertion(+)
drivers/md/dm-mpath.c +1 -0
@@ -706,6 +706,7 @@ static struct priority_group *parse_prioif (as->argc < nr_params) { ti->error ="not enough path parameters" ; + r = -EINVAL ; goto bad; }
PATCH 39/91 dm snapshot: iterate origin and cow devices
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: Mikulas Patocka <[email protected]>
commit 1e5554c8428bc7209a83e2d07ca724be4d981ce3 upstream.
Iterate both origin and snapshot devices
iterate_devices method should call the callback for all the devices where the bio may be remapped. Thus, snapshot_iterate_devices should call the callback for both snapshot and origin underlying devices because it remaps some bios to the snapshot and some to the origin.
snapshot_iterate_devices called the callback only for the origin device. This led to badly calculated device limits if snapshot and origin were placed on different types of disks.
--- drivers/md/dm-snap.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)
drivers/md/dm-snap.c +7 -1
@@ -1899,8 +1899,14 @@ static int snapshot_iterate_devices(stru iterate_devices_callout_fn fn, void *data) { struct dm_snapshot *snap = ti->private; +int r; -return fn (ti, snap->origin,0 , ti->len, data); + r =fn (ti, snap->origin,0 , ti->len, data); + +if (!r) + r =fn (ti, snap->cow,0 ,get_dev_size (snap->cow->bdev), data); + +return r; }
PATCH 40/91 dm snapshot: test chunk size against both origin and snapshot
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: Mikulas Patocka <[email protected]>
commit c24110450650f17f7d3ba4fbe01f01ac5a115456 upstream.
Validate chunk size against both origin and snapshot sector size
Don't allow chunk size smaller than either origin or snapshot logical sector size. Reading or writing data not aligned to sector size is not allowed and causes immediate errors.
This requires us to open the origin before initialising the exception store and to export dm_snap_origin.
--- drivers/md/dm-exception-store.c | 4 +++- drivers/md/dm-exception-store.h | 3 ++- drivers/md/dm-snap.c | 36 +++++++++++++++++++++--------------- 3 files changed, 26 insertions(+), 17 deletions(-)
drivers/md/dm-exception-store.c +3 -1
@@ -173,7 +173,9 @@ int dm_exception_store_set_chunk_size(st/* Validate the chunk size against the device block size */ if (chunk_size % - (bdev_logical_block_size (dm_snap_cow (store->snap)->bdev) >>9 )) { + (bdev_logical_block_size (dm_snap_cow (store->snap)->bdev) >>9 ) || + chunk_size % + (bdev_logical_block_size (dm_snap_origin (store->snap)->bdev) >>9 )) { *error ="Chunk size is not a multiple of device blocksize" ;return -EINVAL ; }
drivers/md/dm-exception-store.h +2 -1
@@ -126,8 +126,9 @@ struct dm_exception_store { };/* -* Obtain the cow device used by a given snapshot. +* Obtain the origin or cow device used by a given snapshot. */ +struct dm_dev *dm_snap_origin (struct dm_snapshot *snap);struct dm_dev *dm_snap_cow (struct dm_snapshot *snap);/*
drivers/md/dm-snap.c +21 -15
@@ -148,6 +148,12 @@ struct dm_snapshot {#define RUNNING_MERGE 0#define SHUTDOWN_MERGE 1 +struct dm_dev *dm_snap_origin (struct dm_snapshot *s) +{ +return s->origin; +} +EXPORT_SYMBOL (dm_snap_origin); +struct dm_dev *dm_snap_cow (struct dm_snapshot *s) {return s->cow;
@@ -1065,10 +1071,6 @@ static int snapshot_ctr(struct dm_target origin_mode =FMODE_WRITE ; } - origin_path = argv[0 ]; - argv++; - argc--; - s =kmalloc (sizeof (*s),GFP_KERNEL );if (!s) { ti->error ="Cannot allocate snapshot context private "
@@ -1077,6 +1079,16 @@ static int snapshot_ctr(struct dm_target goto bad; } + origin_path = argv[0 ]; + argv++; + argc--; + + r =dm_get_device (ti, origin_path, origin_mode, &s->origin); +if (r) { + ti->error ="Cannot get origin device" ; + goto bad_origin; + } + cow_path = argv[0 ]; argv++; argc--;
@@ -1097,12 +1109,6 @@ static int snapshot_ctr(struct dm_target argv += args_used; argc -= args_used; - r =dm_get_device (ti, origin_path, origin_mode, &s->origin); -if (r) { - ti->error ="Cannot get origin device" ; - goto bad_origin; - } - s->ti = ti; s->valid =1 ; s->active =0 ;
@@ -1212,15 +1218,15 @@ bad_kcopyd:dm_exception_table_exit (&s->complete, exception_cache); bad_hash_tables: -dm_put_device (ti, s->origin); - -bad_origin:dm_exception_store_destroy (s->store); bad_store:dm_put_device (ti, s->cow); bad_cow: +dm_put_device (ti, s->origin); + +bad_origin:kfree (s); bad:
@@ -1314,12 +1320,12 @@ static void snapshot_dtr(struct dm_targemempool_destroy (s->pending_pool); -dm_put_device (ti, s->origin); -dm_exception_store_destroy (s->store);dm_put_device (ti, s->cow); +dm_put_device (ti, s->origin); +kfree (s); }
PATCH 41/91 dm: prevent access to md being deleted
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: Kiyoshi Ueda <[email protected]>
commit abdc568b0540bec6d3e0afebac496adef1189b77 upstream.
This patch prevents access to mapped_device which is being deleted.
Currently, even after a mapped_device has been removed from the hash, it could be accessed through idr_find() using minor number. That could cause a race and NULL pointer reference below:
CPU0 CPU1
------------------------------------------------------------------
dev_remove(param)
down_write(_hash_lock)
dm_lock_for_deletion(md)
spin_lock(_minor_lock)
set_bit(DMF_DELETING)
spin_unlock(_minor_lock)
__hash_remove(hc)
up_write(_hash_lock)
dev_status(param)
md = find_device(param)
down_read(_hash_lock)
__find_device_hash_cell(param)
dm_get_md(param->dev)
md = dm_find_md(dev)
spin_lock(_minor_lock)
md = idr_find(MINOR(dev))
spin_unlock(_minor_lock)
dm_put(md)
free_dev(md)
dm_get(md)
up_read(_hash_lock)
__dev_status(md, param)
dm_put(md)This patch fixes such problems.
--- drivers/md/dm.c | 1 + 1 file changed, 1 insertion(+)
drivers/md/dm.c +1 -0
@@ -2141,6 +2141,7 @@ static struct mapped_device *dm_find_md( md =idr_find (&_minor_idr, minor);if (md && (md ==MINOR_ALLOCED || (MINOR (disk_devt (dm_disk (md))) != minor) || +dm_deleting_md (md) ||test_bit (DMF_FREEING , &md->flags))) { md =NULL ; goto out;
PATCH 42/91 dm ioctl: release _hash_lock between devices in remove_all
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: Kiyoshi Ueda <[email protected]>
commit 98f332855effef02aeb738e4d62e9a5b903c52fd upstream.
This patch changes dm_hash_remove_all() to release _hash_lock when removing a device. After removing the device, dm_hash_remove_all() takes _hash_lock and searches the hash from scratch again.
This patch is a preparation for the next patch, which changes device deletion code to wait for md reference to be 0. Without this patch, the wait in the next patch may cause AB-BA deadlock:
CPU0 CPU1
-----------------------------------------------------------------------
dm_hash_remove_all()
down_write(_hash_lock)
table_status()
md = find_device()
dm_get(md)
<increment md->holders>
dm_get_live_or_inactive_table()
dm_get_inactive_table()
down_write(_hash_lock)
<in the md deletion code>
<wait for md->holders to be 0>--- drivers/md/dm-ioctl.c | 44 +++++++++++++++++++++++++------------------- 1 file changed, 25 insertions(+), 19 deletions(-)
drivers/md/dm-ioctl.c +25 -19
@@ -249,40 +249,46 @@ static void __hash_remove(struct hash_cestatic void dm_hash_remove_all (int keep_open_devices) { -int i, dev_skipped, dev_removed; +int i, dev_skipped;struct hash_cell *hc; -struct list_head *tmp, *n; +struct mapped_device *md; + +retry: + dev_skipped =0 ;down_write (&_hash_lock); -retry: - dev_skipped = dev_removed =0 ;for (i =0 ; i <NUM_BUCKETS ; i++) { - list_for_each_safe (tmp, n, _name_buckets + i) { - hc = list_entry(tmp, struct hash_cell, name_list); +list_for_each_entry (hc, _name_buckets + i, name_list) { + md = hc->md; +dm_get (md); -if (keep_open_devices && -dm_lock_for_deletion (hc->md)) { +if (keep_open_devices &&dm_lock_for_deletion (md)) { +dm_put (md); dev_skipped++;continue ; } +__hash_remove (hc); - dev_removed =1 ; - } - } -/* -* Some mapped devices may be using other mapped devices, so if any -* still exist, repeat until we make no further progress. -*/ -if (dev_skipped) { -if (dev_removed) - goto retry; +up_write (&_hash_lock); -DMWARN ("remove_all left %d open device(s)" , dev_skipped); +dm_put (md); + +/* +* Some mapped devices may be using other mapped +* devices, so repeat until we make no further +* progress. If a new mapped device is created +* here it will also get removed. +*/ + goto retry; + } }up_write (&_hash_lock); + +if (dev_skipped) +DMWARN ("remove_all left %d open device(s)" , dev_skipped); } static int dm_hash_rename(uint32_t cookie, uint32_t *flags, const char *old,
PATCH 43/91 mm: make the vma list be doubly linked
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: Linus Torvalds <[email protected]>
commit 297c5eee372478fc32fec5fe8eed711eedb13f3d upstream.
It's a really simple list, and several of the users want to go backwards in it to find the previous vma. So rather than have to look up the previous entry with 'find_vma_prev()' or something similar, just make it doubly linked instead.
--- include/linux/mm_types.h | 2 +- kernel/fork.c | 7 +++++-- mm/mmap.c | 21 +++++++++++++++++---- mm/nommu.c | 7 +++++-- 4 files changed, 28 insertions(+), 9 deletions(-)
include/linux/mm_types.h +1 -1
@@ -134,7 +134,7 @@ struct vm_area_struct {within vm_mm. */ /* linked list of VM areas per task, sorted by address */ -struct vm_area_struct *vm_next; +struct vm_area_struct *vm_next, *vm_prev;pgprot_t vm_page_prot;/* Access permissions of this VMA. */ unsigned long vm_flags;/* Flags, see mm.h. */
kernel/fork.c +5 -2
@@ -287,7 +287,7 @@ out:#ifdef CONFIG_MMU static int dup_mmap (struct mm_struct *mm,struct mm_struct *oldmm) { -struct vm_area_struct *mpnt, *tmp, **pprev; +struct vm_area_struct *mpnt, *tmp, *prev, **pprev;struct rb_node **rb_link, *rb_parent;int retval;unsigned long charge;
@@ -315,6 +315,7 @@ static int dup_mmap(struct mm_struct *mmif (retval) goto out; + prev =NULL ;for (mpnt = oldmm->mmap; mpnt; mpnt = mpnt->vm_next) {struct file *file;
@@ -346,7 +347,7 @@ static int dup_mmap(struct mm_struct *mm goto fail_nomem_anon_vma_fork; tmp->vm_flags &= ~VM_LOCKED ; tmp->vm_mm = mm; - tmp->vm_next =NULL ; + tmp->vm_next = tmp->vm_prev =NULL ; file = tmp->vm_file;if (file) {struct inode *inode = file->f_path.dentry->d_inode;
@@ -379,6 +380,8 @@ static int dup_mmap(struct mm_struct *mm*/ *pprev = tmp; pprev = &tmp->vm_next; + tmp->vm_prev = prev; + prev = tmp;__vma_link_rb (mm, tmp, rb_link, rb_parent); rb_link = &tmp->vm_rb.rb_right;
mm/mmap.c +17 -4
@@ -388,17 +388,23 @@ static inline void __vma_link_list(struct mm_struct *mm, struct vm_area_struct *vma, struct vm_area_struct *prev, struct rb_node *rb_parent) { + struct vm_area_struct *next; + + vma->vm_prev = prev;if (prev) { - vma->vm_next = prev->vm_next; + next = prev->vm_next; prev->vm_next = vma; }else { mm->mmap = vma;if (rb_parent) - vma->vm_next =rb_entry (rb_parent, + next =rb_entry (rb_parent, struct vm_area_struct, vm_rb);else - vma->vm_next =NULL ; + next =NULL ; } + vma->vm_next = next; +if (next) + next->vm_prev = vma; } void __vma_link_rb(struct mm_struct *mm, struct vm_area_struct *vma,
@@ -485,7 +491,11 @@ static inline void __vma_unlink(struct mm_struct *mm, struct vm_area_struct *vma, struct vm_area_struct *prev) { - prev->vm_next = vma->vm_next; + struct vm_area_struct *next = vma->vm_next; + + prev->vm_next = next; +if (next) + next->vm_prev = prev;rb_erase (&vma->vm_rb, &mm->mm_rb);if (mm->mmap_cache == vma) mm->mmap_cache = prev;
@@ -1900,6 +1910,7 @@ detach_vmas_to_be_unmapped(struct mm_strunsigned long addr; insertion_point = (prev ? &prev->vm_next : &mm->mmap); + vma->vm_prev =NULL ; do { rb_erase(&vma->vm_rb, &mm->mm_rb); mm->map_count--;
@@ -1907,6 +1918,8 @@ detach_vmas_to_be_unmapped(struct mm_str vma = vma->vm_next; }while (vma && vma->vm_start < end); *insertion_point = vma; +if (vma) + vma->vm_prev = prev; tail_vma->vm_next =NULL ;if (mm->unmap_area == arch_unmap_area) addr = prev ? prev->vm_end : mm->mmap_base;
mm/nommu.c +5 -2
@@ -609,7 +609,7 @@ static void protect_vma(struct vm_area_s*/ static void add_vma_to_mm (struct mm_struct *mm,struct vm_area_struct *vma) { -struct vm_area_struct *pvma, **pp; +struct vm_area_struct *pvma, **pp, *next;struct address_space *mapping;struct rb_node **p, *parent;
@@ -669,8 +669,11 @@ static void add_vma_to_mm(struct mm_strubreak ; } - vma->vm_next = *pp; + next = *pp; *pp = vma; + vma->vm_next = next; +if (next) + next->vm_prev = vma; }/*
PATCH 44/91 mm: make the mlock() stack guard page checks stricter
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: Linus Torvalds <[email protected]>
commit 7798330ac8114c731cfab83e634c6ecedaa233d7 upstream.
If we've split the stack vma, only the lowest one has the guard page. Now that we have a doubly linked list of vma's, checking this is trivial.
--- mm/mlock.c | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-)
mm/mlock.c +16 -5
@@ -135,6 +135,19 @@ void munlock_vma_page(struct page *page) } } +/* Is the vma a continuation of the stack vma above it? */ +static inline int vma_stack_continue (struct vm_area_struct *vma,unsigned long addr) +{ +return vma && (vma->vm_end == addr) && (vma->vm_flags &VM_GROWSDOWN ); +} + +static inline int stack_guard_page (struct vm_area_struct *vma,unsigned long addr) +{ +return (vma->vm_flags &VM_GROWSDOWN ) && + (vma->vm_start == addr) && + !vma_stack_continue (vma->vm_prev, addr); +} +/** * __mlock_vma_pages_range() - mlock a range of pages in the vma. * @vma: target vma
@@ -168,11 +181,9 @@ static long __mlock_vma_pages_range(stru gup_flags |=FOLL_WRITE ;/* We don't try to access the guard page of a stack vma */ -if (vma->vm_flags &VM_GROWSDOWN ) { -if (start == vma->vm_start) { - start +=PAGE_SIZE ; - nr_pages--; - } +if (stack_guard_page (vma, start)) { + addr +=PAGE_SIZE ; + nr_pages--; }while (nr_pages >0 ) {
PATCH 45/91 mm: make stack guard page logic use vm_prev pointer
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: Linus Torvalds <[email protected]>
commit 0e8e50e20c837eeec8323bba7dcd25fe5479194c upstream.
Like the mlock() change previously, this makes the stack guard check code use vma->vm_prev to see what the mapping below the current stack is, rather than have to look it up with find_vma().
Also, accept an abutting stack segment, since that happens naturally if you split the stack with mlock or mprotect.
--- mm/memory.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-)
mm/memory.c +11 -4
@@ -2761,11 +2761,18 @@ static inline int check_stack_guard_page { address &=PAGE_MASK ;if ((vma->vm_flags &VM_GROWSDOWN ) && address == vma->vm_start) { - address -=PAGE_SIZE ; -if (find_vma (vma->vm_mm, address) != vma) -return -ENOMEM ; +struct vm_area_struct *prev = vma->vm_prev; -expand_stack (vma, address); +/* +* Is there a mapping abutting this one below? +* +* That's only ok if it's the same stack mapping +* that has gotten split.. +*/ +if (prev && prev->vm_end == address) +return prev->vm_flags &VM_GROWSDOWN ?0 : -ENOMEM ; + +expand_stack (vma, address -PAGE_SIZE ); }return 0 ; }
PATCH 46/91 x86, asm: Clean up and simplify set_64bit()
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: H. Peter Anvin <[email protected]>
commit 69309a05907546fb686b251d4ab041c26afe1e1d upstream.
Clean up and simplify set_64bit(). This code is quite old (1.3.11) and contains a fair bit of auxilliary machinery that current versions of gcc handle just fine automatically. Worse, the auxilliary machinery can actually cause an unnecessary spill to memory.
Furthermore, the loading of the old value inside the loop in the 32-bit case is unnecessary: if the value doesn't match, the CMPXCHG8B instruction will already have loaded the "new previous" value for us.
Clean up the comment, too, and remove page references to obsolete versions of the Intel SDM.
LKML-Reference: <tip-*@vger.kernel.org>
--- arch/x86/include/asm/cmpxchg_32.h | 67 +++++++++++--------------------------- arch/x86/include/asm/cmpxchg_64.h | 4 -- 2 files changed, 21 insertions(+), 50 deletions(-)
arch/x86/include/asm/cmpxchg_32.h +20 -47
@@ -53,60 +53,33 @@ struct __xchg_dummy {__xchg ((v), (ptr),sizeof (*ptr))/* -* The semantics of XCHGCMP8B are a bit strange, this is why -* there is a loop and the loading of %%eax and %%edx has to -* be inside. This inlines well in most cases, the cached -* cost is around ~38 cycles. (in the future we might want -* to do an SIMD/3DNOW!/MMX/FPU 64-bit store here, but that -* might have an implicit FPU-save as a cost, so it's not -* clear which path to go.) +* CMPXCHG8B only writes to the target if we had the previous +* value in registers, otherwise it acts as a read and gives us the +* "new previous" value. That is why there is a loop. Preloading +* EDX:EAX is a performance optimization: in the common case it means +* we need only one locked operation. * -* cmpxchg8b must be used with the lock prefix here to allow -* the instruction to be executed atomically, see page 3-102 -* of the instruction set reference 24319102.pdf. We need -* the reader side to see the coherent 64bit value. +* A SIMD/3DNOW!/MMX/FPU 64-bit store here would require at the very +* least an FPU save and/or %cr0.ts manipulation. +* +* cmpxchg8b must be used with the lock prefix here to allow the +* instruction to be executed atomically. We need to have the reader +* side to see the coherent 64bit value. */ -static inline void __set_64bit (unsigned long long *ptr, -unsigned int low,unsigned int high) +static inline void set_64bit (volatile u64 *ptr,u64 value) { +u32 low = value; +u32 high = value >>32 ; +u64 prev = *ptr; + asmvolatile ("\n1:\t" -"movl (%1), %%eax\n\t" -"movl 4(%1), %%edx\n\t" -LOCK_PREFIX "cmpxchg8b (%1)\n\t" +LOCK_PREFIX "cmpxchg8b %0\n\t" "jnz 1b" - :"=m" (*ptr) - :"D" (ptr), -"b" (low), -"c" (high) - :"ax" ,"dx" ,"memory" ); -} - -static inline void __set_64bit_constant (unsigned long long *ptr, -unsigned long long value) -{ -__set_64bit (ptr, (unsigned int )value, (unsigned int )(value >>32 )); + :"=m" (*ptr),"+A" (prev) + :"b" (low),"c" (high) + :"memory" ); } -#define ll_low (x) *(((unsigned int *)&(x)) + 0) -#define ll_high (x) *(((unsigned int *)&(x)) + 1) - -static inline void __set_64bit_var (unsigned long long *ptr, -unsigned long long value) -{ -__set_64bit (ptr,ll_low (value),ll_high (value)); -} - -#define set_64bit (ptr, value) \ - (__builtin_constant_p((value)) \ - ? __set_64bit_constant((ptr), (value)) \ - : __set_64bit_var((ptr), (value))) - -#define _set_64bit (ptr, value) \ - (__builtin_constant_p(value) \ - ? __set_64bit(ptr, (unsigned int)(value), \ - (unsigned int)((value) >> 32)) \ - : __set_64bit(ptr, ll_low((value)), ll_high((value)))) -extern void __cmpxchg_wrong_size (void );/*
arch/x86/include/asm/cmpxchg_64.h +1 -3
@@ -5,13 +5,11 @@#define __xg (x) ((volatile long *)(x)) -static inline void set_64bit (volatile unsigned long *ptr,unsigned long val) +static inline void set_64bit (volatile u64 *ptr,u64 val) { *ptr = val; } -#define _set_64bit set_64bit -extern void __xchg_wrong_size (void );extern void __cmpxchg_wrong_size (void );
PATCH 47/91 slab: fix object alignment
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: Carsten Otte <[email protected]>
commit 1ab335d8f85792e3b107ff8237d53cf64db714df upstream.
This patch fixes alignment of slab objects in case CONFIG_DEBUG_PAGEALLOC is active.
Before this spot in kmem_cache_create, we have this situation:
- align contains the required alignment of the object
- cachep->obj_offset is 0 or equals align in case of CONFIG_DEBUG_SLAB
- size equals the size of the object, or object plus trailing redzone in case of CONFIG_DEBUG_SLAB
This spot tries to fill one page per object if the object is in certain size limits, however setting obj_offset to PAGE_SIZE - size does break the object alignment since size may not be aligned with the required alignment. This patch simply adds an ALIGN(size, align) to the equation and fixes the object size detection accordingly.
This code in drivers/s390/cio/qdio_setup_init has lead to incorrectly aligned slab objects (sizeof(struct qdio_q) equals 1792):
qdio_q_cache = kmem_cache_create("qdio_q", sizeof(struct qdio_q),
256, 0, NULL);--- mm/slab.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
mm/slab.c +2 -2
@@ -2262,8 +2262,8 @@ kmem_cache_create (const char *name, siz }#if FORCED_DEBUG && defined(CONFIG_DEBUG_PAGEALLOC )if (size >= malloc_sizes[INDEX_L3 +1 ].cs_size - && cachep->obj_size >cache_line_size () && size <PAGE_SIZE ) { - cachep->obj_offset +=PAGE_SIZE - size; + && cachep->obj_size >cache_line_size () &&ALIGN (size, align) <PAGE_SIZE ) { + cachep->obj_offset +=PAGE_SIZE -ALIGN (size, align); size =PAGE_SIZE ; }#endif
PATCH 48/91 sparc64: Fix atomic64_t routine return values.
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: David S. Miller <[email protected]>
[ Upstream commits 86fa04b8742ac681d470786f55e2403ada0075b2
and b10f997bb0f4e5b34d447f498fb85834a40d3acb ]
Should return 'long' instead of 'int'.
Thanks to Dimitris Michailidis and Tony Luck.
--- arch/sparc/include/asm/atomic_64.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
arch/sparc/include/asm/atomic_64.h +5 -5
@@ -20,14 +20,14 @@#define atomic64_set (v, i) (((v)->counter) = i)extern void atomic_add (int ,atomic_t *); -extern void atomic64_add (int ,atomic64_t *); +extern void atomic64_add (long ,atomic64_t *);extern void atomic_sub (int ,atomic_t *); -extern void atomic64_sub (int ,atomic64_t *); +extern void atomic64_sub (long ,atomic64_t *);extern int atomic_add_ret (int ,atomic_t *); -extern int atomic64_add_ret (int ,atomic64_t *); +extern long atomic64_add_ret (long ,atomic64_t *);extern int atomic_sub_ret (int ,atomic_t *); -extern int atomic64_sub_ret (int ,atomic64_t *); +extern long atomic64_sub_ret (long ,atomic64_t *);#define atomic_dec_return (v) atomic_sub_ret(1, v)#define atomic64_dec_return (v) atomic64_sub_ret(1, v)
@@ -91,7 +91,7 @@ static inline int atomic_add_unless(atom ((__typeof__((v)->counter))cmpxchg(&((v)->counter), (o), (n)))#define atomic64_xchg (v, new) (xchg(&((v)->counter), new)) -static inline int atomic64_add_unless (atomic64_t *v,long a,long u) +static inline long atomic64_add_unless (atomic64_t *v,long a,long u) {long c, old; c =atomic64_read (v);
PATCH 49/91 sparc64: Add missing ID to parport probing code.
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: David S. Miller <[email protected]>
[ Upstream commit bf8253bf5e7cfe17dd53e3f6340a45b11d9fb51c ]
SunBlade-2500 has 'parallel' device node with compatible property "pnpALI,1533,3" so add that to the ID table.
--- arch/sparc/include/asm/parport.h | 4 ++++ 1 file changed, 4 insertions(+)
arch/sparc/include/asm/parport.h +4 -0
@@ -228,6 +228,10 @@ static const struct of_device_id ecpp_ma .name = "parallel", .compatible = "ns87317-ecpp", }, + { + .name = "parallel", + .compatible = "pnpALI,1533,3", + }, {}, };
PATCH 50/91 sparc64: Fix rwsem constant bug leading to hangs.
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: David S. Miller <[email protected]>
[ Upstream commit ef201bebe5afc91a2b99b45dacc8c6dd88ca9e58 ]
As noticed by Linus, it is critical that some of the rwsem constants be signed. Yet, hex constants are unsigned unless explicitly casted or negated.
The most critical one is RWSEM_WAITING_BIAS.
This bug was exacerbated by commit 424acaaeb3a3932d64a9b4bd59df6cf72c22d8f3 ("rwsem: wake queued readers when writer blocks on active read lock")
--- arch/sparc/include/asm/rwsem-const.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/sparc/include/asm/rwsem-const.h +1 -1
@@ -5,7 +5,7 @@#define RWSEM_UNLOCKED_VALUE 0x00000000#define RWSEM_ACTIVE_BIAS 0x00000001#define RWSEM_ACTIVE_MASK 0x0000ffff -#define RWSEM_WAITING_BIAS 0xffff0000 +#define RWSEM_WAITING_BIAS (-0x00010000)#define RWSEM_ACTIVE_READ_BIAS RWSEM_ACTIVE_BIAS#define RWSEM_ACTIVE_WRITE_BIAS (RWSEM_WAITING_BIAS + RWSEM_ACTIVE_BIAS)
PATCH 51/91 bridge: add rcu_read_lock on transmit
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: Stephen Hemminger <[email protected]>
[ Upstream commit eeaf61d8891f9c9ed12c1a667e72bf83f0857954 ]
Long ago, when bridge was converted to RCU, rcu lock was equivalent to having preempt disabled. RCU has changed a lot since then and bridge code was still assuming the since transmit was called with bottom half disabled, it was RCU safe.
--- net/bridge/br_device.c | 4 +++- net/bridge/br_fdb.c | 2 +- net/bridge/br_input.c | 6 +++--- net/bridge/br_stp_bpdu.c | 2 +- 4 files changed, 8 insertions(+), 6 deletions(-)
net/bridge/br_device.c +3 -1
@@ -19,7 +19,7 @@#include <asm/uaccess.h> #include "br_private.h" -/* net device transmit always called with no BH (preempt_disabled) */ +/* net device transmit always called with BH disabled */ netdev_tx_t br_dev_xmit (struct sk_buff *skb,struct net_device *dev) {struct net_bridge *br =netdev_priv (dev);
@@ -35,6 +35,7 @@ netdev_tx_t br_dev_xmit(struct sk_buff *skb_reset_mac_header (skb);skb_pull (skb,ETH_HLEN ); +rcu_read_lock ();if (dest[0 ] &1 ) {if (br_multicast_rcv (br,NULL , skb)) goto out;
@@ -50,6 +51,7 @@ netdev_tx_t br_dev_xmit(struct sk_buff *br_flood_deliver (br, skb); out: +rcu_read_unlock ();return NETDEV_TX_OK ; }
net/bridge/br_fdb.c +1 -1
@@ -214,7 +214,7 @@ void br_fdb_delete_by_port(struct net_brspin_unlock_bh (&br->hash_lock); } -/* No locking or refcounting, assumes caller has no preempt (rcu_read_lock) */ +/* No locking or refcounting, assumes caller has rcu_read_lock */ struct net_bridge_fdb_entry *__br_fdb_get (struct net_bridge *br,const unsigned char *addr) {
net/bridge/br_input.c +3 -3
@@ -35,7 +35,7 @@ static int br_pass_frame_up(struct sk_bu netif_receive_skb); } -/* note: already called with rcu_read_lock (preempt_disabled) */ +/* note: already called with rcu_read_lock */ int br_handle_frame_finish (struct sk_buff *skb) {const unsigned char *dest =eth_hdr (skb)->h_dest;
@@ -106,7 +106,7 @@ drop: goto out; } -/* note: already called with rcu_read_lock (preempt_disabled) */ +/* note: already called with rcu_read_lock */ static int br_handle_local_finish (struct sk_buff *skb) {struct net_bridge_port *p =rcu_dereference (skb->dev->br_port);
@@ -131,7 +131,7 @@ static inline int is_link_local(const un/* * Called via br_handle_frame_hook. * Return NULL if skb is handled -* note: already called with rcu_read_lock (preempt_disabled) +* note: already called with rcu_read_lock */ struct sk_buff *br_handle_frame (struct net_bridge_port *p,struct sk_buff *skb) {
net/bridge/br_stp_bpdu.c +1 -1
@@ -131,7 +131,7 @@ void br_send_tcn_bpdu(struct net_bridge_/* * Called from llc. * -* NO locks, but rcu_read_lock (preempt_disabled) +* NO locks, but rcu_read_lock */ void br_stp_rcv (const struct stp_proto *proto,struct sk_buff *skb,struct net_device *dev)
PATCH 52/91 tcp: cookie transactions setsockopt memory leak
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: Dmitry Popov <[email protected]>
[ Upstream commit a3bdb549e30e7a263f7a589747c40e9c50110315 ]
There is a bug in do_tcp_setsockopt(net/ipv4/tcp.c), TCP_COOKIE_TRANSACTIONS case.
In some cases (when tp->cookie_values == NULL) new tcp_cookie_values structure can be allocated (at cvp), but not bound to tp->cookie_values. So a memory leak occurs.
--- net/ipv4/tcp.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
net/ipv4/tcp.c +5 -2
@@ -2175,6 +2175,8 @@ static int do_tcp_setsockopt(struct sock GFP_KERNEL);if (cvp ==NULL )return -ENOMEM ; + +kref_init (&cvp->kref); }lock_sock (sk); tp->rx_opt.cookie_in_always =
@@ -2189,12 +2191,11 @@ static int do_tcp_setsockopt(struct sock*/ kref_put (&tp->cookie_values->kref, tcp_cookie_values_release); -kref_init (&cvp->kref); - tp->cookie_values = cvp; }else { cvp = tp->cookie_values; } } +if (cvp !=NULL ) { cvp->cookie_desired = ctd.tcpct_cookie_desired;
@@ -2208,6 +2209,8 @@ static int do_tcp_setsockopt(struct sock cvp->s_data_desired = ctd.tcpct_s_data_desired; cvp->s_data_constant =0 ;/* false */ } + + tp->cookie_values = cvp; }release_sock (sk);return err;
PATCH 53/91 bridge: Fix skb leak when multicast parsing fails on TX
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: Herbert Xu <[email protected]>
[ Upstream commit 6d1d1d398cb7db7a12c5d652d50f85355345234f ]
On the bridge TX path we're leaking an skb when br_multicast_rcv returns an error.
--- net/bridge/br_device.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
net/bridge/br_device.c +3 -1
@@ -37,8 +37,10 @@ netdev_tx_t br_dev_xmit(struct sk_buff *rcu_read_lock ();if (dest[0 ] &1 ) { -if (br_multicast_rcv (br,NULL , skb)) +if (br_multicast_rcv (br,NULL , skb)) { +kfree_skb (skb); goto out; + } mdst =br_mdb_get (br, skb);if (mdst ||BR_INPUT_SKB_CB_MROUTERS_ONLY (skb))
PATCH 54/91 act_nat: the checksum of ICMP doesnt have pseudo header
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: Changli Gao <[email protected]>
[ Upstream commit 3a3dfb062c2e086c202d34f09ce29634515ad256 ]
after updating the value of the ICMP payload, inet_proto_csum_replace4() should be called with zero pseudohdr.
--- net/sched/act_nat.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/sched/act_nat.c +1 -1
@@ -240,7 +240,7 @@ static int tcf_nat(struct sk_buff *skb, iph->saddr = new_addr;inet_proto_csum_replace4 (&icmph->checksum, skb, addr, new_addr, -1 ); +0 );break ; }default :
PATCH 55/91 can: add limit for nframes and clean up signed/unsigned variables
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: Oliver Hartkopp <[email protected]>
[ Upstream commit 5b75c4973ce779520b9d1e392483207d6f842cde ]
This patch adds a limit for nframes as the number of frames in TX_SETUP and RX_SETUP are derived from a single byte multiplex value by default. Use-cases that would require to send/filter more than 256 CAN frames should be implemented in userspace for complexity reasons anyway.
Additionally the assignments of unsigned values from userspace to signed values in kernelspace and vice versa are fixed by using unsigned values in kernelspace consistently.
--- net/can/bcm.c | 41 +++++++++++++++++++++++++++-------------- 1 file changed, 27 insertions(+), 14 deletions(-)
net/can/bcm.c +27 -14
@@ -60,6 +60,13 @@#include <net/sock.h> #include <net/net_namespace.h> +/* +* To send multiple CAN frame content within TX_SETUP or to filter +* CAN messages with multiplex index within RX_SETUP, the number of +* different filters is limited to 256 due to the one byte index value. +*/ +#define MAX_NFRAMES 256 +/* use of last_frames[index].can_dlc */ #define RX_RECV 0x40/* received data for this element */ #define RX_THR 0x80/* element not been sent due to throttle feature */
@@ -89,16 +96,16 @@ struct bcm_op {struct list_head list;int ifindex;canid_t can_id; -int flags; +u32 flags;unsigned long frames_abs, frames_filtered;struct timeval ival1, ival2;struct hrtimer timer, thrtimer;struct tasklet_struct tsklet, thrtsklet;ktime_t rx_stamp, kt_ival1, kt_ival2, kt_lastmsg;int rx_ifindex; -int count; -int nframes; -int currframe; +u32 count; +u32 nframes; +u32 currframe;struct can_frame *frames;struct can_frame *last_frames;struct can_frame sframe;
@@ -175,7 +182,7 @@ static int bcm_proc_show(struct seq_fileseq_printf (m,"rx_op: %03X %-5s " , op->can_id,bcm_proc_getifname (ifname, op->ifindex)); -seq_printf (m,"[%d]%c " , op->nframes, +seq_printf (m,"[%u]%c " , op->nframes, (op->flags &RX_CHECK_DLC )?'d' :' ' );if (op->kt_ival1.tv64) seq_printf(m, "timeo=%lld ",
@@ -198,7 +205,7 @@ static int bcm_proc_show(struct seq_filelist_for_each_entry (op, &bo->tx_ops, list) { -seq_printf (m,"tx_op: %03X %s [%d] " , +seq_printf (m,"tx_op: %03X %s [%u] " , op->can_id,bcm_proc_getifname (ifname, op->ifindex), op->nframes);
@@ -283,7 +290,7 @@ static void bcm_send_to_user(struct bcm_struct can_frame *firstframe;struct sockaddr_can *addr;struct sock *sk = op->sk; -int datalen = head->nframes *CFSIZ ; +unsigned int datalen = head->nframes *CFSIZ ;int err; skb =alloc_skb (sizeof (*head) + datalen,gfp_any ());
@@ -468,7 +475,7 @@ rx_changed_settime:* bcm_rx_cmp_to_index - (bit)compares the currently received data to formerly * received data stored in op->last_frames[] */ -static void bcm_rx_cmp_to_index (struct bcm_op *op,int index, +static void bcm_rx_cmp_to_index (struct bcm_op *op,unsigned int index,const struct can_frame *rxdata) {/*
@@ -554,7 +561,8 @@ static enum hrtimer_restart bcm_rx_timeo/* * bcm_rx_do_flush - helper for bcm_rx_thr_flush */ -static inline int bcm_rx_do_flush (struct bcm_op *op,int update,int index) +static inline int bcm_rx_do_flush (struct bcm_op *op,int update, +unsigned int index) {if ((op->last_frames) && (op->last_frames[index].can_dlc &RX_THR )) {if (update)
@@ -575,7 +583,7 @@ static int bcm_rx_thr_flush(struct bcm_oint updated =0 ;if (op->nframes >1 ) { -int i; +unsigned int i;/* for MUX filter we start at index 1 */ for (i =1 ; i < op->nframes; i++)
@@ -624,7 +632,7 @@ static void bcm_rx_handler(struct sk_buf {struct bcm_op *op = (struct bcm_op *)data;const struct can_frame *rxframe = (struct can_frame *)skb->data; -int i; +unsigned int i;/* disable timeout */ hrtimer_cancel (&op->timer);
@@ -824,14 +832,15 @@ static int bcm_tx_setup(struct bcm_msg_h {struct bcm_sock *bo =bcm_sk (sk);struct bcm_op *op; -int i, err; +unsigned int i; +int err;/* we need a real device to send frames */ if (!ifindex)return -ENODEV ; -/* we need at least one can_frame */ -if (msg_head->nframes <1 ) +/* check nframes boundaries - we need at least one can_frame */ +if (msg_head->nframes <1 || msg_head->nframes >MAX_NFRAMES )return -EINVAL ;/* check the given can_id */
@@ -995,6 +1004,10 @@ static int bcm_rx_setup(struct bcm_msg_h msg_head->nframes =0 ; } +/* the first element contains the mux-mask => MAX_NFRAMES + 1 */ +if (msg_head->nframes >MAX_NFRAMES +1 ) +return -EINVAL ; +if ((msg_head->flags &RX_RTR_FRAME ) && ((msg_head->nframes !=1 ) || (!(msg_head->can_id &CAN_RTR_FLAG ))))
PATCH 56/91 net: dev_forward_skb should call nf_reset
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: Ben Greear <[email protected]>
[ Upstream commit c736eefadb71a01a5e61e0de700f28f6952b4444 ]
With conn-track zones and probably with different network namespaces, the netfilter logic needs to be re-calculated on packet receive. If the netfilter logic is not reset, it will not be recalculated properly. This patch adds the nf_reset logic to dev_forward_skb.
--- net/core/dev.c | 1 + 1 file changed, 1 insertion(+)
net/core/dev.c +1 -0
@@ -1464,6 +1464,7 @@ static inline void net_timestamp(structint dev_forward_skb (struct net_device *dev,struct sk_buff *skb) {skb_orphan (skb); +nf_reset (skb);if (!(dev->flags &IFF_UP ) || (skb->len > (dev->mtu + dev->hard_header_len))) {
PATCH 57/91 isdn: fix information leak
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: Dan Carpenter <[email protected]>
[ Upstream commit 4b030d4288a569d6bdeca884d7f102d951f097f2 ]
The main motivation of this patch changing strcpy() to strlcpy(). We strcpy() to copy a 48 byte buffers into a 49 byte buffers. So at best the last byte has leaked information, or maybe there is an overflow? Anyway, this patch closes the information leaks by zeroing the memory and the calls to strlcpy() prevent overflows.
--- drivers/isdn/sc/ioctl.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
drivers/isdn/sc/ioctl.c +5 -5
@@ -174,7 +174,7 @@ int sc_ioctl(int card, scs_ioctl *data)pr_debug ("%s: SCIOGETSPID: ioctl received\n" , sc_adapter[card]->devicename); - spid =kmalloc (SCIOC_SPIDSIZE ,GFP_KERNEL ); + spid =kzalloc (SCIOC_SPIDSIZE ,GFP_KERNEL );if (!spid) {kfree (rcvmsg);return -ENOMEM ;
@@ -194,7 +194,7 @@ int sc_ioctl(int card, scs_ioctl *data)kfree (rcvmsg);return status; } -strcpy (spid, rcvmsg->msg_data.byte_array); +strlcpy (spid, rcvmsg->msg_data.byte_array,SCIOC_SPIDSIZE );/* * Package the switch type and send to user space
@@ -272,12 +272,12 @@ int sc_ioctl(int card, scs_ioctl *data)return status; } - dn =kmalloc (SCIOC_DNSIZE ,GFP_KERNEL ); + dn =kzalloc (SCIOC_DNSIZE ,GFP_KERNEL );if (!dn) {kfree (rcvmsg);return -ENOMEM ; } -strcpy (dn, rcvmsg->msg_data.byte_array); +strlcpy (dn, rcvmsg->msg_data.byte_array,SCIOC_DNSIZE );kfree (rcvmsg);/*
@@ -348,7 +348,7 @@ int sc_ioctl(int card, scs_ioctl *data)pr_debug ("%s: SCIOSTAT: ioctl received\n" , sc_adapter[card]->devicename); - bi =kmalloc (sizeof (boardInfo),GFP_KERNEL ); + bi =kzalloc (sizeof (boardInfo),GFP_KERNEL );if (!bi) {kfree (rcvmsg);return -ENOMEM ;
PATCH 58/91 net: Fix napi_gro_frags vs netpoll path
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: Jarek Poplawski <[email protected]>
[ Upstream commit ce9e76c8450fc248d3e1fc16ef05e6eb50c02fa5 ]
The netpoll_rx_on() check in __napi_gro_receive() skips part of the "common" GRO_NORMAL path, especially "pull:" in dev_gro_receive(), where at least eth header should be copied for entirely paged skbs.
--- net/core/dev.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-)
net/core/dev.c +1 -4
@@ -2666,7 +2666,7 @@ enum gro_result dev_gro_receive(struct nint mac_len;enum gro_result ret; -if (!(skb->dev->features &NETIF_F_GRO )) +if (!(skb->dev->features &NETIF_F_GRO ) ||netpoll_rx_on (skb)) goto normal;if (skb_is_gso (skb) ||skb_has_frags (skb))
@@ -2753,9 +2753,6 @@ __napi_gro_receive(struct napi_struct *n {struct sk_buff *p; -if (netpoll_rx_on (skb)) -return GRO_NORMAL ; -for (p = napi->gro_list; p; p = p->next) {NAPI_GRO_CB (p)->same_flow = (p->dev == skb->dev) &&
PATCH 59/91 net: Fix a memmove bug in dev_gro_receive()
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: Jarek Poplawski <[email protected]>
[ Upstream commit e5093aec2e6b60c3df2420057ffab9ed4a6d2792 ]
Quoted 8 lines
Xin Xiaohui wrote:
I looked into the codedev_gro_receive(), found the code here:
if the frags[0] is pulled to 0, then the page will be released, andmemmove()frags left.
Is that right? I'm not sure if memmove do right or not, but frags[0].size is never set after memove at least. what I think a simple way is not to do anything if we found frags[0].size == 0. The patch is as followed.
...
This version of the patch fixes the bug directly in memmove.
--- net/core/dev.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/core/dev.c +1 -1
@@ -2735,7 +2735,7 @@ pull:put_page (skb_shinfo (skb)->frags[0 ].page);memmove (skb_shinfo (skb)->frags,skb_shinfo (skb)->frags +1 , - --skb_shinfo (skb)->nr_frags); + --skb_shinfo (skb)->nr_frags *sizeof (skb_frag_t)); } }
PATCH 60/91 pkt_sched: Fix sch_sfq vs tcf_bind_filter oops
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: Jarek Poplawski <[email protected]>
[ Upstream commit eb4a5527b1f0d581ac217c80ef3278ed5e38693c ]
Since there was added ->tcf_chain() method without ->bind_tcf() to sch_sfq class options, there is oops when a filter is added with the classid parameter.
Fixes commit 7d2681a6ff4f9ab5e48d02550b4c6338f1638998 netdev thread: null pointer at cls_api.c
--- net/sched/sch_sfq.c | 7 +++++++ 1 file changed, 7 insertions(+)
net/sched/sch_sfq.c +7 -0
@@ -502,6 +502,12 @@ static unsigned long sfq_get(struct Qdisreturn 0 ; } +static unsigned long sfq_bind (struct Qdisc *sch,unsigned long parent, +u32 classid) +{ +return 0 ; +} +static struct tcf_proto **sfq_find_tcf (struct Qdisc *sch,unsigned long cl) {struct sfq_sched_data *q =qdisc_priv (sch);
@@ -556,6 +562,7 @@ static void sfq_walk(struct Qdisc *sch,static const struct Qdisc_class_ops sfq_class_ops = { .get = sfq_get, .tcf_chain = sfq_find_tcf, + .bind_tcf = sfq_bind, .dump = sfq_dump_class, .dump_stats = sfq_dump_class_stats, .walk = sfq_walk,
PATCH 61/91 pkt_sched: Fix sch_sfq vs tc_modify_qdisc oops
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: Jarek Poplawski <[email protected]>
[ Upstream commit 41065fba846e795b31b17e4dec01cb904d56c6cd ]
sch_sfq as a classful qdisc needs the .leaf handler. Otherwise, there is an oops possible in tc_modify_qdisc()/check_loop().
Fixes commit 7d2681a6ff4f9ab5e48d02550b4c6338f1638998
--- net/sched/sch_sfq.c | 6 ++++++ 1 file changed, 6 insertions(+)
net/sched/sch_sfq.c +6 -0
@@ -497,6 +497,11 @@ nla_put_failure:return -1 ; } +static struct Qdisc *sfq_leaf (struct Qdisc *sch,unsigned long arg) +{ +return NULL ; +} +static unsigned long sfq_get (struct Qdisc *sch,u32 classid) {return 0 ;
@@ -560,6 +565,7 @@ static void sfq_walk(struct Qdisc *sch, }static const struct Qdisc_class_ops sfq_class_ops = { + .leaf = sfq_leaf, .get = sfq_get, .tcf_chain = sfq_find_tcf, .bind_tcf = sfq_bind,
PATCH 62/91 vmscan: raise the bar to PAGEOUT_IO_SYNC stalls
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: Wu Fengguang <[email protected]>
commit e31f3698cd3499e676f6b0ea12e3528f569c4fa3 upstream.
Fix "system goes unresponsive under memory pressure and lots of dirty/writeback pages" bug.
http://lkml.org/lkml/2010/4/4/86
In the above thread, Andreas Mohr described that
Invoking any command locked up for minutes (note that I'm talking about attempted additional I/O to the _other_, _unaffected_ main system HDD - such as loading some shell binaries -, NOT the external SSD18M!!).
This happens when the two conditions are both meet:
- under memory pressure
- writing heavily to a slow device
OOM also happens in Andreas' system. The OOM trace shows that 3 processes are stuck in wait_on_page_writeback() in the direct reclaim path. One in do_fork() and the other two in unix_stream_sendmsg(). They are blocked on this condition:
(sc->order && priority < DEF_PRIORITY - 2)
which was introduced in commit 78dc583d (vmscan: low order lumpy reclaim also should use PAGEOUT_IO_SYNC) one year ago. That condition may be too permissive. In Andreas' case, 512MB/1024 = 512KB. If the direct reclaim for the order-1 fork() allocation runs into a range of 512KB hard-to-reclaim LRU pages, it will be stalled.
It's a severe problem in three ways.
Firstly, it can easily happen in daily desktop usage. vmscan priority can easily go below (DEF_PRIORITY - 2) on _local_ memory pressure. Even if the system has 50% globally reclaimable pages, it still has good opportunity to have 0.1% sized hard-to-reclaim ranges. For example, a simple dd can easily create a big range (up to 20%) of dirty pages in the LRU lists. And order-1 to order-3 allocations are more than common with SLUB. Try "grep -v '1 :' /proc/slabinfo" to get the list of high order slab caches. For example, the order-1 radix_tree_node slab cache may stall applications at swap-in time; the order-3 inode cache on most filesystems may stall applications when trying to read some file; the order-2 proc_inode_cache may stall applications when trying to open a /proc file.
Secondly, once triggered, it will stall unrelated processes (not doing IO at all) in the system. This "one slow USB device stalls the whole system" avalanching effect is very bad.
Thirdly, once stalled, the stall time could be intolerable long for the users. When there are 20MB queued writeback pages and USB 1.1 is writing them in 1MB/s, wait_on_page_writeback() will stuck for up to 20 seconds. Not to mention it may be called multiple times.
So raise the bar to only enable PAGEOUT_IO_SYNC when priority goes below DEF_PRIORITY/3, or 6.25% LRU size. As the default dirty throttle ratio is 20%, it will hardly be triggered by pure dirty pages. We'd better treat PAGEOUT_IO_SYNC as some last resort workaround -- its stall time is so uncomfortably long (easily goes beyond 1s).
The bar is only raised for (order < PAGE_ALLOC_COSTLY_ORDER) allocations, which are easy to satisfy in 1TB memory boxes. So, although 6.25% of memory could be an awful lot of pages to scan on a system with 1TB of memory, it won't really have to busy scan that much.
Andreas tested an older version of this patch and reported that it mostly fixed his problem. Mel Gorman helped improve it and KOSAKI Motohiro will fix it further in the next patch.
--- mm/vmscan.c | 53 +++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 45 insertions(+), 8 deletions(-)
mm/vmscan.c +45 -8
@@ -1118,6 +1118,48 @@ static int too_many_isolated(struct zone }/* +* Returns true if the caller should wait to clean dirty/writeback pages. +* +* If we are direct reclaiming for contiguous pages and we do not reclaim +* everything in the list, try again and wait for writeback IO to complete. +* This will stall high-order allocations noticeably. Only do that when really +* need to free the pages under high memory pressure. +*/ +static inline bool should_reclaim_stall (unsigned long nr_taken, +unsigned long nr_freed, +int priority, +int lumpy_reclaim, +struct scan_control *sc) +{ +int lumpy_stall_priority; + +/* kswapd should not stall on sync IO */ +if (current_is_kswapd ()) +return false; + +/* Only stall on lumpy reclaim */ +if (!lumpy_reclaim) +return false; + +/* If we have relaimed everything on the isolated list, no stall */ +if (nr_freed == nr_taken) +return false; + +/* +* For high-order allocations, there are two stall thresholds. +* High-cost allocations stall immediately where as lower +* order allocations such as stacks require the scanning +* priority to be much higher before stalling. +*/ +if (sc->order >PAGE_ALLOC_COSTLY_ORDER ) + lumpy_stall_priority =DEF_PRIORITY ; +else + lumpy_stall_priority =DEF_PRIORITY /3 ; + +return priority <= lumpy_stall_priority; +} + +/* * shrink_inactive_list() is a helper for shrink_zone(). It returns the number * of reclaimed pages */
@@ -1209,14 +1251,9 @@ static unsigned long shrink_inactive_lis nr_scanned += nr_scan; nr_freed =shrink_page_list (&page_list, sc,PAGEOUT_IO_ASYNC ); -/* -* If we are direct reclaiming for contiguous pages and we do -* not reclaim everything in the list, try again and wait -* for IO to complete. This will stall high-order allocations -* but that should be acceptable to the caller -*/ -if (nr_freed < nr_taken && !current_is_kswapd () && - lumpy_reclaim) { +/* Check if we should syncronously wait for writeback */ +if (should_reclaim_stall (nr_taken, nr_freed, priority, + lumpy_reclaim, sc)) {congestion_wait (BLK_RW_ASYNC ,HZ /10 );/*
PATCH 63/91 pcmcia: avoid buffer overflow in pcmcia_setup_isa_irq
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: Dominik Brodowski <[email protected]>
commit 127c03cdbad9bd5af5d7f33bd31a1015a90cb77f upstream.
NR_IRQS may be as low as 16, causing a (harmless?) buffer overflow in pcmcia_setup_isa_irq():
static u8 pcmcia_used_irq[NR_IRQS];
...
if ((try < 32) && pcmcia_used_irq[irq]) continue;
This is read-only, so if this address would be non-zero, it would just mean we would not attempt an IRQ >= NR_IRQS -- which would fail anyway! And as request_irq() fails for an irq >= NR_IRQS, the setting code path:
pcmcia_used_irq[irq]++;
is never reached as well.
--- drivers/pcmcia/pcmcia_resource.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/pcmcia/pcmcia_resource.c +4 -1
@@ -41,7 +41,7 @@ module_param(io_speed, int, 0444);#ifdef CONFIG_PCMCIA_PROBE #include <asm/irq.h> /* mask of IRQs already reserved by other cards, we should avoid using them */ -static u8 pcmcia_used_irq[NR_IRQS ]; +static u8 pcmcia_used_irq[32 ];#endif static int pcmcia_adjust_io_region(struct resource *res, unsigned long start,
@@ -768,6 +768,9 @@ int pcmcia_request_irq(struct pcmcia_devfor (try =0 ; try <64 ; try++) { irq = try %32 ; +if (irq >NR_IRQS ) +continue ; +/* marked as available by driver, and not blocked by userspace? */ if (!((mask >> irq) &1 ))continue ;
PATCH 64/91 isdn/gigaset: reduce syslog spam
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: Tilman Schmidt <[email protected]>
commit 7d060ed2877ff6d00e7238226edbaf91493d6d0b upstream.
Downgrade some error messages which occur frequently during normal operation to debug messages.
Impact: logging
--- drivers/isdn/gigaset/capi.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-)
drivers/isdn/gigaset/capi.c +8 -8
@@ -389,13 +389,13 @@ void gigaset_skb_sent(struct bc_state *b ++bcs->trans_up;if (!ap) { -dev_err (cs->dev,"%s: no application\n" , __func__); +gig_dbg (DEBUG_MCMD ,"%s: application gone" , __func__);return ; }/* don't send further B3 messages if disconnected */ if (bcs->apconnstate <APCONN_ACTIVE ) { -gig_dbg (DEBUG_LLDATA ,"disconnected, discarding ack" ); +gig_dbg (DEBUG_MCMD ,"%s: disconnected" , __func__);return ; }
@@ -433,13 +433,14 @@ void gigaset_skb_rcvd(struct bc_state *b bcs->trans_down++;if (!ap) { -dev_err (cs->dev,"%s: no application\n" , __func__); +gig_dbg (DEBUG_MCMD ,"%s: application gone" , __func__); +dev_kfree_skb_any (skb);return ; }/* don't send further B3 messages if disconnected */ if (bcs->apconnstate <APCONN_ACTIVE ) { -gig_dbg (DEBUG_LLDATA ,"disconnected, discarding data" ); +gig_dbg (DEBUG_MCMD ,"%s: disconnected" , __func__);dev_kfree_skb_any (skb);return ; }
@@ -758,7 +759,7 @@ void gigaset_isdn_connD(struct bc_state ap = bcs->ap;if (!ap) {spin_unlock_irqrestore (&bcs->aplock, flags); -dev_err (cs->dev,"%s: no application\n" , __func__); +gig_dbg (DEBUG_CMD ,"%s: application gone" , __func__);return ; }if (bcs->apconnstate ==APCONN_NONE ) {
@@ -854,7 +855,7 @@ void gigaset_isdn_connB(struct bc_state ap = bcs->ap;if (!ap) {spin_unlock_irqrestore (&bcs->aplock, flags); -dev_err (cs->dev,"%s: no application\n" , __func__); +gig_dbg (DEBUG_CMD ,"%s: application gone" , __func__);return ; }if (!bcs->apconnstate) {
@@ -912,13 +913,12 @@ void gigaset_isdn_connB(struct bc_state*/ void gigaset_isdn_hupB (struct bc_state *bcs) { -struct cardstate *cs = bcs->cs;struct gigaset_capi_appl *ap = bcs->ap;/* ToDo: assure order of DISCONNECT_B3_IND and DISCONNECT_IND ? */ if (!ap) { -dev_err (cs->dev,"%s: no application\n" , __func__); +gig_dbg (DEBUG_CMD ,"%s: application gone" , __func__);return ; }
PATCH 65/91 isdn: gigaset: add missing unlock
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: Dan Carpenter <[email protected]>
commit 7e27a0aeb98d53539bdc38384eee899d6db62617 upstream.
We should unlock here. This is the only place where we return from the function with the lock held. The caller isn't expecting it.
--- drivers/isdn/gigaset/capi.c | 1 + 1 file changed, 1 insertion(+)
drivers/isdn/gigaset/capi.c +1 -0
@@ -1055,6 +1055,7 @@ static inline void remove_appl_from_chan do { if (bcap->bcnext == ap) { bcap->bcnext = bcap->bcnext->bcnext; + spin_unlock_irqrestore(&bcs->aplock, flags); return; } bcap = bcap->bcnext;
PATCH 66/91 Oprofile: Change CPUIDS from decimal to hex, and add some comments
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: John Villalovos <[email protected]>
commit 45c34e05c4e3d36e7c44e790241ea11a1d90d54e upstream.
Back when the patch was submitted for "Add Xeon 7500 series support to oprofile", Robert Richter had asked for a followon patch that converted all the CPU ID values to hex.
I have done that here for the "i386/core_i7" and "i386/atom" class processors in the ppro_init() function and also added some comments on where to find documentation on the Intel processors.
--- arch/x86/oprofile/nmi_int.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-)
arch/x86/oprofile/nmi_int.c +14 -2
@@ -584,6 +584,18 @@ static int __init ppro_init(char **cpu_tif (force_arch_perfmon && cpu_has_arch_perfmon)return 0 ; +/* +* Documentation on identifying Intel processors by CPU family +* and model can be found in the Intel Software Developer's +* Manuals (SDM): +* +* http://www.intel.com/products/processor/manuals/ +* +* As of May 2010 the documentation for this was in the: +* "Intel 64 and IA-32 Architectures Software Developer's +* Manual Volume 3B: System Programming Guide", "Table B-1 +* CPUID Signature Values of DisplayFamily_DisplayModel". +*/ switch (cpu_model) { case 0 ... 2: *cpu_type ="i386/ppro" ;
@@ -605,12 +617,12 @@ static int __init ppro_init(char **cpu_tcase 15 :case 23 : *cpu_type ="i386/core_2" ;break ; +case 0x1a :case 0x2e : -case 26 : spec = &op_arch_perfmon_spec; *cpu_type ="i386/core_i7" ;break ; -case 28 : +case 0x1c : *cpu_type ="i386/atom" ;break ;default :
PATCH 67/91 oprofile: add support for Intel processor model 30
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: Josh Hunt <[email protected]>
commit a7c55cbee0c1bae9bf5a15a08300e91d88706e45 upstream.
Newer Intel processors identifying themselves as model 30 are not recognized by oprofile.
<cpuinfo snippet>
model : 30
model name : Intel(R) Xeon(R) CPU X3470 @ 2.93GHz
</cpuinfo snippet>
Running oprofile on these machines gives the following:
+ opcontrol --init
+ opcontrol --list-events
oprofile: available events for CPU type "Intel Architectural Perfmon"
See Intel 64 and IA-32 Architectures Software Developer's Manual Volume 3B (Document 253669) Chapter 18 for architectural perfmon events This is a limited set of fallback events because oprofile doesn't know your CPUCPU_CLK_UNHALTED: (counter: all)
Clock cycles when not halted (min count: 6000)INST_RETIRED: (counter: all)
number of instructions retired (min count: 6000)LLC_MISSES: (counter: all)
Last level cache demand requests from this core that missed the LLC
(min count: 6000)
Unit masks (default 0x41)
----------
0x41: No unit mask
LLC_REFS: (counter: all)
Last level cache demand requests from this core (min count: 6000)
Unit masks (default 0x4f)
----------
0x4f: No unit maskBR_MISS_PRED_RETIRED: (counter: all)
number of mispredicted branches retired (precise) (min count: 500)
+ opcontrol --shutdown
Tested using oprofile 0.9.6.
--- arch/x86/oprofile/nmi_int.c | 1 + 1 file changed, 1 insertion(+)
arch/x86/oprofile/nmi_int.c +1 -0
@@ -618,6 +618,7 @@ static int __init ppro_init(char **cpu_t *cpu_type ="i386/core_2" ;break ;case 0x1a : +case 0x1e :case 0x2e : spec = &op_arch_perfmon_spec; *cpu_type ="i386/core_i7" ;
PATCH 68/91 e1000e: disable ASPM L1 on 82573
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: Bruce Allan <[email protected]>
commit 19833b5dffe2f2e92a1b377f9aae9d5f32239512 upstream.
On the e1000-devel mailing list, Nils Faerber reported latency issues with the 82573 LOM on a ThinkPad X60. It was found to be caused by ASPM L1; disabling it resolves the latency. The issue is present in kernels back to 2.6.34 and possibly 2.6.33.
--- drivers/net/e1000e/82571.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/e1000e/82571.c +1 -0
@@ -1826,6 +1826,7 @@ struct e1000_info e1000_82573_info = { | FLAG_HAS_SMART_POWER_DOWN |FLAG_HAS_AMT | FLAG_HAS_SWSM_ON_LOAD, + .flags2 = FLAG2_DISABLE_ASPM_L1, .pba = 20, .max_hw_frame_size = ETH_FRAME_LEN + ETH_FCS_LEN, .get_variants = e1000_get_variants_82571,
PATCH 69/91 e1000e: dont check for alternate MAC addr on parts that dont support it
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: Bruce Allan <[email protected]>
commit 1aef70ef125165e0114a8e475636eff242a52030 upstream.
From: Bruce Allan <[email protected]>
The alternate MAC address feature is only supported by 80003ES2LAN and 82571 LOMs as well as a couple 82571 mezzanine cards. Checking for an alternate MAC address on other parts can fail leading to the driver not able to load. This patch limits the check for an alternate MAC address to be done only for parts that support the feature.
This issue has been around since support for the feature was introduced to the e1000e driver in 2.6.34.
--- drivers/net/e1000e/82571.c | 30 +++++++++++++++++------------- drivers/net/e1000e/defines.h | 4 ++++ drivers/net/e1000e/lib.c | 10 ++++++++++ 3 files changed, 31 insertions(+), 13 deletions(-)
drivers/net/e1000e/82571.c +17 -13
@@ -926,12 +926,14 @@ static s32 e1000_reset_hw_82571(struct eew32 (IMC ,0xffffffff ); icr =er32 (ICR ); -/* Install any alternate MAC address into RAR0 */ - ret_val =e1000_check_alt_mac_addr_generic (hw); -if (ret_val) -return ret_val; +if (hw->mac.type == e1000_82571) { +/* Install any alternate MAC address into RAR0 */ + ret_val =e1000_check_alt_mac_addr_generic (hw); +if (ret_val) +return ret_val; -e1000e_set_laa_state_82571 (hw, true); +e1000e_set_laa_state_82571 (hw, true); + }/* Reinitialize the 82571 serdes link state machine */ if (hw->phy.media_type == e1000_media_type_internal_serdes)
@@ -1609,14 +1611,16 @@ static s32 e1000_read_mac_addr_82571(str {s32 ret_val =0 ; -/* -* If there's an alternate MAC address place it in RAR0 -* so that it will override the Si installed default perm -* address. -*/ - ret_val =e1000_check_alt_mac_addr_generic (hw); -if (ret_val) - goto out; +if (hw->mac.type == e1000_82571) { +/* +* If there's an alternate MAC address place it in RAR0 +* so that it will override the Si installed default perm +* address. +*/ + ret_val =e1000_check_alt_mac_addr_generic (hw); +if (ret_val) + goto out; + } ret_val =e1000_read_mac_addr_generic (hw);
drivers/net/e1000e/defines.h +4 -0
@@ -613,6 +613,7 @@#define E1000_FLASH_UPDATES 2000/* NVM Word Offsets */ +#define NVM_COMPAT 0x0003#define NVM_ID_LED_SETTINGS 0x0004#define NVM_INIT_CONTROL2_REG 0x000F#define NVM_INIT_CONTROL3_PORT_B 0x0014
@@ -633,6 +634,9 @@/* Mask bits for fields in Word 0x1a of the NVM */ #define NVM_WORD1A_ASPM_MASK 0x000C +/* Mask bits for fields in Word 0x03 of the EEPROM */ +#define NVM_COMPAT_LOM 0x0800 +/* For checksumming, the sum of all words in the NVM should equal 0xBABA. */ #define NVM_SUM 0xBABA
drivers/net/e1000e/lib.c +10 -0
@@ -183,6 +183,16 @@ s32 e1000_check_alt_mac_addr_generic(stru16 offset, nvm_alt_mac_addr_offset, nvm_data;u8 alt_mac_addr[ETH_ALEN ]; + ret_val =e1000_read_nvm (hw,NVM_COMPAT ,1 , &nvm_data); +if (ret_val) + goto out; + +/* Check for LOM (vs. NIC) or one of two valid mezzanine cards */ +if (!((nvm_data &NVM_COMPAT_LOM ) || + (hw->adapter->pdev->device ==E1000_DEV_ID_82571EB_SERDES_DUAL ) || + (hw->adapter->pdev->device ==E1000_DEV_ID_82571EB_SERDES_QUAD ))) + goto out; + ret_val =e1000_read_nvm (hw,NVM_ALT_MAC_ADDR_PTR ,1 , &nvm_alt_mac_addr_offset);if (ret_val) {
PATCH 70/91 fixes for using make 3.82
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: Jan Beulich <[email protected]>
commit 3c955b407a084810f57260d61548cc92c14bc627 upstream.
It doesn't like pattern and explicit rules to be on the same line, and it seems to be more picky when matching file (or really directory) names with different numbers of trailing slashes.
Andrew Benton <[email protected]>
--- firmware/Makefile | 2 +- scripts/mkmakefile | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-)
firmware/Makefile +1 -1
@@ -141,7 +141,7 @@ fw-shipped-$(CONFIG_YAM) += yam/1200.bin fw-shipped-all := $(fw-shipped-y) $(fw-shipped-m) $(fw-shipped-) # Directories which we _might_ need to create, so we have a rule for them. -firmware-dirs := $(sort $(patsubst %,$(objtree)/$(obj)/%/,$(dir $(fw-external-y) $(fw-shipped-all)))) +firmware-dirs := $(sort $(addprefix $(objtree)/$(obj)/,$(dir $(fw-external-y) $(fw-shipped-all)))) quiet_cmd_mkdir = MKDIR $(patsubst $(objtree)/%,%,$@) cmd_mkdir = mkdir -p $@
scripts/mkmakefile +3 -1
@@ -44,7 +44,9 @@ all: Makefile:; -\$(all) %/: all +\$(all): all @: +%/: all + @: EOF
PATCH 71/91 ALSA: intel8x0: Mute External Amplifier by default for ThinkPad X31
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: Daniel T Chen <[email protected]>
commit 9c77b846ec8b4e0c7107dd7f820172462dc84a61 upstream.
This ThinkPad model needs External Amplifier muted for audible playback, so set the inv_eapd quirk for it.
--- sound/pci/intel8x0.c | 6 ++++++ 1 file changed, 6 insertions(+)
sound/pci/intel8x0.c +6 -0
@@ -1776,6 +1776,12 @@ static struct ac97_quirk ac97_quirks[] _ }, { .subvendor = 0x1014, + .subdevice = 0x0534, + .name = "ThinkPad X31", + .type =AC97_TUNE_INV_EAPD + }, + { + .subvendor = 0x1014, .subdevice = 0x1f00, .name ="MS-9128" , .type = AC97_TUNE_ALC_JACK
PATCH 72/91 netlink: fix compat recvmsg
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: Johannes Berg <[email protected]>
commit 68d6ac6d2740b6a55f3ae92a4e0be6d881904b32 upstream.
Since
commit 1dacc76d0014a034b8aca14237c127d7c19d7726
Author: Johannes Berg <[email protected]> Date: Wed Jul 1 11:26:02 2009 +0000
net/compat/wext: send different messages to compat tasks
we had a race condition when setting and then restoring frag_list. Eric attempted to fix it, but the fix created even worse problems.
However, the original motivation I had when I added the code that turned out to be racy is no longer clear to me, since we only copy up to skb->len to userspace, which doesn't include the frag_list length. As a result, not doing any frag_list clearing and restoring avoids the race condition, while not introducing any other problems.
Additionally, while preparing this patch I found that since none of the remaining netlink code is really aware of the frag_list, we need to use the original skb's information for packet information and credentials. This fixes, for example, the group information received by compat tasks.
--- net/netlink/af_netlink.c | 46 ++++++++++++++++------------------------------ 1 file changed, 16 insertions(+), 30 deletions(-)
net/netlink/af_netlink.c +16 -30
@@ -1383,7 +1383,7 @@ static int netlink_recvmsg(struct kiocbstruct netlink_sock *nlk =nlk_sk (sk);int noblock = flags&MSG_DONTWAIT ;size_t copied; -struct sk_buff *skb, *frag__maybe_unused =NULL ; +struct sk_buff *skb, *data_skb;int err;if (flags&MSG_OOB )
@@ -1395,45 +1395,35 @@ static int netlink_recvmsg(struct kiocbif (skb ==NULL ) goto out; + data_skb = skb; +#ifdef CONFIG_COMPAT_NETLINK_MESSAGES if (unlikely (skb_shinfo (skb)->frag_list)) { -bool need_compat = !!(flags &MSG_CMSG_COMPAT ); -/* -* If this skb has a frag_list, then here that means that -* we will have to use the frag_list skb for compat tasks -* and the regular skb for non-compat tasks. +* If this skb has a frag_list, then here that means that we +* will have to use the frag_list skb's data for compat tasks +* and the regular skb's data for normal (non-compat) tasks. * -* The skb might (and likely will) be cloned, so we can't -* just reset frag_list and go on with things -- we need to -* keep that. For the compat case that's easy -- simply get -* a reference to the compat skb and free the regular one -* including the frag. For the non-compat case, we need to -* avoid sending the frag to the user -- so assign NULL but -* restore it below before freeing the skb. +* If we need to send the compat skb, assign it to the +* 'data_skb' variable so that it will be used below for data +* copying. We keep 'skb' for everything else, including +* freeing both later. */ -if (need_compat) { -struct sk_buff *compskb =skb_shinfo (skb)->frag_list; -skb_get (compskb); -kfree_skb (skb); - skb = compskb; - }else { - frag =skb_shinfo (skb)->frag_list; -skb_shinfo (skb)->frag_list =NULL ; - } +if (flags &MSG_CMSG_COMPAT ) + data_skb =skb_shinfo (skb)->frag_list; }#endif msg->msg_namelen =0 ; - copied = skb->len; + copied = data_skb->len;if (len < copied) { msg->msg_flags |=MSG_TRUNC ; copied = len; } -skb_reset_transport_header (skb); - err =skb_copy_datagram_iovec (skb,0 , msg->msg_iov, copied); +skb_reset_transport_header (data_skb); + err =skb_copy_datagram_iovec (data_skb,0 , msg->msg_iov, copied);if (msg->msg_name) {struct sockaddr_nl *addr = (struct sockaddr_nl *)msg->msg_name;
@@ -1453,11 +1443,7 @@ static int netlink_recvmsg(struct kiocb } siocb->scm->creds = *NETLINK_CREDS (skb);if (flags &MSG_TRUNC ) - copied = skb->len; - -#ifdef CONFIG_COMPAT_NETLINK_MESSAGES -skb_shinfo (skb)->frag_list = frag; -#endif + copied = data_skb->len;skb_free_datagram (sk, skb);
PATCH 73/91 drm/radeon/kms: dont enable MSIs on AGP boards
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: Alex Deucher <[email protected]>
commit da7be684c55dbaeebfc1a048d5faf52d52cb3c1f upstream.
Fixes:
https://bugs.freedesktop.org/show_bug.cgi?id=29327
--- drivers/gpu/drm/radeon/radeon_irq_kms.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/gpu/drm/radeon/radeon_irq_kms.c +3 -2
@@ -118,11 +118,12 @@ int radeon_irq_kms_init(struct radeon_de* chips. Disable MSI on them for now. */ if ((rdev->family >=CHIP_RV380 ) && - (!(rdev->flags &RADEON_IS_IGP ))) { + (!(rdev->flags &RADEON_IS_IGP )) && + (!(rdev->flags &RADEON_IS_AGP ))) {int ret =pci_enable_msi (rdev->pdev);if (!ret) { rdev->msi_enabled =1 ; -DRM_INFO ("radeon: using MSI.\n" ); +dev_info (rdev->dev,"radeon: using MSI.\n" ); } } rdev->irq.installed = true;
PATCH 74/91 drm/radeon/kms: fix typo in radeon_compute_pll_gain
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: Alex Deucher <[email protected]>
commit 0537398b211b4f040564beec458e23571042d335 upstream.
Looks like this got copied from the ddx wrong.
--- drivers/gpu/drm/radeon/radeon_legacy_crtc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/radeon/radeon_legacy_crtc.c +1 -1
@@ -272,7 +272,7 @@ static uint8_t radeon_compute_pll_gain(uif (!ref_div)return 1 ; - vcoFreq = ((unsigned )ref_freq & fb_div) / ref_div; + vcoFreq = ((unsigned )ref_freq * fb_div) / ref_div;/* * This is horribly crude: the VCO frequency range is divided into
PATCH 75/91 drm/radeon/kms/DCE3+: switch pads to ddc mode when going i2c
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: Alex Deucher <[email protected]>
commit 5786e2c5a3f519647c50bbc276e45d36a704415a upstream.
The pins for ddc and aux are shared so you need to switch the mode when doing ddc. The ProcessAuxChannel table already sets the pin mode to DP. This should fix unreliable ddc issues on DP ports using non-DP monitors.
--- drivers/gpu/drm/radeon/radeon_i2c.c | 7 +++++++ 1 file changed, 7 insertions(+)
drivers/gpu/drm/radeon/radeon_i2c.c +7 -0
@@ -95,6 +95,13 @@ static void radeon_i2c_do_lock(struct ra } } +/* switch the pads to ddc mode */ +if (ASIC_IS_DCE3 (rdev) && rec->hw_capable) { + temp =RREG32 (rec->mask_clk_reg); + temp &= ~(1 <<16 ); +WREG32 (rec->mask_clk_reg, temp); + } +/* clear the output pin values */ temp =RREG32 (rec->a_clk_reg) & ~rec->a_clk_mask;WREG32 (rec->a_clk_reg, temp);
PATCH 76/91 drm/radeon/kms: fix sideport detection on newer rs880 boards
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: Alex Deucher <[email protected]>
commit 4b80d954a7e54c13a5063af18d01719ad6a0daf3 upstream.
The meaning of ucMemoryType changed on recent boards, however, ulBootUpSidePortClock should be set properly across all boards.
--- drivers/gpu/drm/radeon/radeon_atombios.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/radeon/radeon_atombios.c +1 -1
@@ -1048,7 +1048,7 @@ bool radeon_atombios_sideport_present(streturn true;break ;case 2 : -if (igp_info->info_2.ucMemoryType &0x0f ) +if (igp_info->info_2.ulBootUpSidePortClock)return true;break ;default :
PATCH 77/91 drm/radeon/kms: fix GTT/VRAM overlapping test
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: Jerome Glisse <[email protected]>
commit 2cbeb4efc2b9739fe6019b613ae658bd2119a3eb upstream.
GTT/VRAM overlapping test had a typo which leaded to not detecting case when vram_end > gtt_end. This patch fix the logic and should fix #16574
--- drivers/gpu/drm/radeon/radeon_device.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/radeon/radeon_device.c +1 -1
@@ -199,7 +199,7 @@ void radeon_vram_location(struct radeon_ mc->mc_vram_size = mc->aper_size; } mc->vram_end = mc->vram_start + mc->mc_vram_size -1 ; -if (rdev->flags &RADEON_IS_AGP && mc->vram_end > mc->gtt_start && mc->vram_end <= mc->gtt_end) { +if (rdev->flags &RADEON_IS_AGP && mc->vram_end > mc->gtt_start && mc->vram_start <= mc->gtt_end) {dev_warn (rdev->dev,"limiting VRAM to PCI aperture size\n" ); mc->real_vram_size = mc->aper_size; mc->mc_vram_size = mc->aper_size;
PATCH 78/91 drm: stop information leak of old kernel stack.
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: Dave Airlie <[email protected]>
commit b9f0aee83335db1f3915f4e42a5e21b351740afd upstream.
non-critical issue, CVE-2010-2803
Userspace controls the amount of memory to be allocate, so it can get the ioctl to allocate more memory than the kernel uses, and get access to kernel stack. This can only be done for processes authenticated to the X server for DRI access, and if the user has DRI access.
Fix is to just memset the data to 0 if the user doesn't copy into it in the first place.
--- drivers/gpu/drm/drm_drv.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/gpu/drm/drm_drv.c +3 -1
@@ -502,7 +502,9 @@ long drm_ioctl(struct file *filp, retcode = -EFAULT ; goto err_i1; } - } + }else +memset (kdata,0 ,_IOC_SIZE (cmd)); +if (ioctl->flags &DRM_UNLOCKED ) retcode =func (dev, kdata, file_priv);else {
PATCH 79/91 powerpc: Fix typo in uImage target
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: Anatolij Gustschin <[email protected]>
commit c686ecf5040d287a68d4fca7f1948472f556a6d3 upstream.
Commit e32e78c5ee8aadef020fbaecbe6fb741ed9029fd
(powerpc: fix build with make 3.82) introduced a
typo in uImage target and broke building uImage:
make: *** No rule to make target `uImage'. Stop.
--- arch/powerpc/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/powerpc/Makefile +1 -1
@@ -159,7 +159,7 @@ drivers-$(CONFIG_OPROFILE) += arch/power all: zImage # With make 3.82 we cannot mix normal and wildcard targets -BOOT_TARGETS1 := zImage zImage.initrd uImaged +BOOT_TARGETS1 := zImage zImage.initrd uImage BOOT_TARGETS2 := zImage% dtbImage% treeImage.% cuImage.% simpleImage.% PHONY += $(BOOT_TARGETS1) $(BOOT_TARGETS2)
PATCH 80/91 powerpc: Initialise paca->kstack before early_setup_secondary
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: Matt Evans <[email protected]>
commit f761622e59433130bc33ad086ce219feee9eb961 upstream.
As early setup calls down to slb_initialize(), we must have kstack initialised before checking "should we add a bolted SLB entry for our kstack?"
Failing to do so means stack access requires an SLB miss exception to refill an entry dynamically, if the stack isn't accessible via SLB(0) (kernel text & static data). It's not always allowable to take such a miss, and intermittent crashes will result.
Primary CPUs don't have this issue; an SLB entry is not bolted for their stack anyway (as that lives within SLB(0)). This patch therefore only affects the init of secondaries.
--- arch/powerpc/kernel/head_64.S | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
arch/powerpc/kernel/head_64.S +3 -3
@@ -572,9 +572,6 @@ __secondary_start: /* Set thread priority to MEDIUM */ HMT_MEDIUM - /* Do early setup for that CPU (stab, slb, hash table pointer) */ - bl .early_setup_secondary - /* Initialize the kernel stack. Just a repeat for iSeries. */ LOAD_REG_ADDR(r3, current_set) sldi r28,r24,3 /* get current_set[cpu#] */
@@ -582,6 +579,9 @@ __secondary_start: addi r1,r1,THREAD_SIZE-STACK_FRAME_OVERHEAD std r1,PACAKSAVE(r13) + /* Do early setup for that CPU (stab, slb, hash table pointer) */ + bl .early_setup_secondary + /* Clear backchain so we get nice backtraces */ li r7,0 mtlr r7
PATCH 81/91 USB: option: add Celot CT-650
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: Michael Tokarev <[email protected]>
commit 76078dc4fc389185fe467d33428f259ea9e69807 upstream.
--- drivers/usb/serial/option.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
drivers/usb/serial/option.c +5 -2
@@ -389,6 +389,10 @@ static int option_resume(struct usb_ser#define OLIVETTI_VENDOR_ID 0x0b3c#define OLIVETTI_PRODUCT_OLICARD100 0xc000 +/* Celot products */ +#define CELOT_VENDOR_ID 0x211f +#define CELOT_PRODUCT_CT680M 0x6801 +/* some devices interfaces need special handling due to a number of reasons */ enum option_blacklist_reason {OPTION_BLACKLIST_NONE =0 ,
@@ -912,10 +916,9 @@ static const struct usb_device_id option { USB_DEVICE(PIRELLI_VENDOR_ID, PIRELLI_PRODUCT_100F) }, { USB_DEVICE(PIRELLI_VENDOR_ID, PIRELLI_PRODUCT_1011)}, { USB_DEVICE(PIRELLI_VENDOR_ID, PIRELLI_PRODUCT_1012)}, - { USB_DEVICE(CINTERION_VENDOR_ID, 0x0047) }, - { USB_DEVICE(OLIVETTI_VENDOR_ID, OLIVETTI_PRODUCT_OLICARD100) }, + { USB_DEVICE(CELOT_VENDOR_ID, CELOT_PRODUCT_CT680M) }, /* CT-650 CDMA 450 1xEVDO modem */ { } /* Terminating entry */ };MODULE_DEVICE_TABLE (usb, option_ids);
PATCH 82/91 USB: add device IDs for igotu to navman
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: Ross Burton <[email protected]>
commit 0eee6a2b2a52e17066a572d30ad2805d3ebc7508 upstream.
I recently bought a i-gotU USB GPS, and whilst hunting around for linux support discovered this post by you back in 2009:
http://kerneltrap.org/mailarchive/linux-usb/2009/3/12/5148644
Quoted 6 lines
Try the navman driver instead. You can either add the device id to the driver and rebuild it, or do this before you plug the device in:
modprobe navman echo -n "0x0df7 0x0900" > /sys/bus/usb-serial/drivers/navman/new_idand then plug your device in and see if that works.
I can confirm that the navman driver works with the right device IDs on my i-gotU GT-600, which has the same device IDs. Attached is a patch adding the IDs.
From: Ross Burton <[email protected]>
--- drivers/usb/serial/navman.c | 1 + 1 file changed, 1 insertion(+)
drivers/usb/serial/navman.c +1 -0
@@ -25,6 +25,7 @@ static int debug;static const struct usb_device_id id_table[] = { {USB_DEVICE (0x0a99 ,0x0001 ) },/* Talon Technology device */ + {USB_DEVICE (0x0df7 ,0x0900 ) },/* Mobile Action i-gotU */ { }, };MODULE_DEVICE_TABLE (usb, id_table);
PATCH 83/91 USB: pl2303: New vendor and product id
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: Jef Driesen <[email protected]>
commit f36ecd5de93e4c85a9e3d25100c6e233155b12e5 upstream.
Add support for the Zeagle N2iTiON3 dive computer interface. Since Zeagle devices are actually manufactured by Seiko, this patch will support other Seiko based models as well.
--- drivers/usb/serial/pl2303.c | 1 + drivers/usb/serial/pl2303.h | 4 ++++ 2 files changed, 5 insertions(+)
drivers/usb/serial/pl2303.c +1 -0
@@ -96,6 +96,7 @@ static const struct usb_device_id id_tab { USB_DEVICE(SUPERIAL_VENDOR_ID, SUPERIAL_PRODUCT_ID) }, { USB_DEVICE(HP_VENDOR_ID, HP_LD220_PRODUCT_ID) }, { USB_DEVICE(CRESSI_VENDOR_ID, CRESSI_EDY_PRODUCT_ID) }, + { USB_DEVICE(ZEAGLE_VENDOR_ID, ZEAGLE_N2ITION3_PRODUCT_ID) }, { USB_DEVICE(SONY_VENDOR_ID, SONY_QN3USB_PRODUCT_ID) }, { USB_DEVICE(SANWA_VENDOR_ID, SANWA_PRODUCT_ID) }, { USB_DEVICE(ADLINK_VENDOR_ID, ADLINK_ND6530_PRODUCT_ID) },
drivers/usb/serial/pl2303.h +4 -0
@@ -128,6 +128,10 @@#define CRESSI_VENDOR_ID 0x04b8#define CRESSI_EDY_PRODUCT_ID 0x0521 +/* Zeagle dive computer interface */ +#define ZEAGLE_VENDOR_ID 0x04b8 +#define ZEAGLE_N2ITION3_PRODUCT_ID 0x0522 +/* Sony, USB data cable for CMD-Jxx mobile phones */ #define SONY_VENDOR_ID 0x054c#define SONY_QN3USB_PRODUCT_ID 0x0437
PATCH 84/91 USB: CP210x Fix Break On/Off
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: Craig Shelley <[email protected]>
commit 72916791cbeb9cc607ae620cfba207dea481cd76 upstream.
The definitions for BREAK_ON and BREAK_OFF are inverted, causing break requests to fail. This patch sets BREAK_ON and BREAK_OFF to the correct values.
--- drivers/usb/serial/cp210x.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/usb/serial/cp210x.c +2 -2
@@ -223,8 +223,8 @@ static struct usb_serial_driver cp210x_d#define BITS_STOP_2 0x0002/* CP210X_SET_BREAK */ -#define BREAK_ON 0x0000 -#define BREAK_OFF 0x0001 +#define BREAK_ON 0x0001 +#define BREAK_OFF 0x0000/* CP210X_(SET_MHS|GET_MDMSTS) */ #define CONTROL_DTR 0x0001
PATCH 85/91 USB: ftdi_sio: fix endianess of max packet size
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: Michael Wileczka <[email protected]>
commit d1ab903d2552b2362339b19203c7f01c797cb316 upstream.
The USB max packet size (always little-endian) was not being byte swapped on big-endian systems.
Applicable since [USB: ftdi_sio: fix hi-speed device packet size calculation] approx 2.6.31
--- drivers/usb/serial/ftdi_sio.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/usb/serial/ftdi_sio.c +1 -1
@@ -1399,7 +1399,7 @@ static void ftdi_set_max_packet_size(str }/* set max packet size based on descriptor */ - priv->max_packet_size = ep_desc->wMaxPacketSize; + priv->max_packet_size =le16_to_cpu (ep_desc->wMaxPacketSize);dev_info (&udev->dev,"Setting MaxPacketSize %d\n" , priv->max_packet_size); }
PATCH 86/91 USB: io_ti: check firmware version before updating
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: Greg Kroah-Hartman <[email protected]>
commit 0827a9ff2bbcbb03c33f1a6eb283fe051059482c upstream.
If we can't read the firmware for a device from the disk, and yet the device already has a valid firmware image in it, we don't want to replace the firmware with something invalid. So check the version number to be less than the current one to verify this is the correct thing to do.
--- drivers/usb/serial/io_ti.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/usb/serial/io_ti.c +1 -1
@@ -1174,7 +1174,7 @@ static int download_fw(struct edgeport_s/* Check if we have an old version in the I2C and update if necessary */ -if (download_cur_ver != download_new_ver) { +if (download_cur_ver < download_new_ver) { dbg("%s - Update I2C dld from %d.%d to %d.%d", __func__, firmware_version->Ver_Major,
PATCH 87/91 USB: xhci: Remove buggy assignment in next_trb()
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: John Youn <[email protected]>
commit a1669b2c64a9c8b031e0ac5cbf2692337a577f7c upstream.
The code to increment the TRB pointer has a slight ambiguity that could lead to a bug on different compilers. The ANSI C specification does not specify the precedence of the assignment operator over the postfix operator. gcc 4.4 produced the correct code (increment the pointer and assign the value), but a MIPS compiler that one of John's clients used assigned the old (unincremented) value.
Remove the unnecessary assignment to make all compilers produce the correct assembly.
--- drivers/usb/host/xhci-ring.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/usb/host/xhci-ring.c +1 -1
@@ -125,7 +125,7 @@ static void next_trb(struct xhci_hcd *xh *seg = (*seg)->next; *trb = ((*seg)->trbs); }else { - *trb = (*trb)++; + (*trb)++; } }
PATCH 88/91 USB: ftdi_sio: Add ID for Ionics PlugComputer
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: Martin Michlmayr <[email protected]>
commit 666cc076d284e32d11bfc5ea2fbfc50434cff051 upstream.
Add the ID for the Ionics PlugComputer (<http://ionicsplug.com/>).
--- drivers/usb/serial/ftdi_sio.c | 2 ++ drivers/usb/serial/ftdi_sio_ids.h | 6 ++++++ 2 files changed, 8 insertions(+)
drivers/usb/serial/ftdi_sio.c +2 -0
@@ -756,6 +756,8 @@ static struct usb_device_id id_table_com { USB_DEVICE(FTDI_VID, XVERVE_SIGNALYZER_SH4_PID), .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, { USB_DEVICE(FTDI_VID, SEGWAY_RMP200_PID) }, + { USB_DEVICE(IONICS_VID, IONICS_PLUGCOMPUTER_PID), + .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, { }, /* Optional parameter entry */ { }/* Terminating entry */ };
drivers/usb/serial/ftdi_sio_ids.h +6 -0
@@ -996,6 +996,12 @@#define ALTI2_N3_PID 0x6001/* Neptune 3 */ /* +* Ionics PlugComputer +*/ +#define IONICS_VID 0x1c0c +#define IONICS_PLUGCOMPUTER_PID 0x0102 + +/* * Dresden Elektronik Sensor Terminal Board */ #define DE_VID 0x1cf1/* Vendor ID */
PATCH 89/91 USB: ftdi_sio: add product ID for Lenz LI-USB
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: Galen Seitz <[email protected]>
commit ea233f805537f5da16c2b34d85b6c5cf88a0f9aa upstream.
Add ftdi product ID for Lenz LI-USB, a model train interface. This was NOT tested against 2.6.35, but a similar patch was tested with the CentOS 2.6.18-194.11.1.el5 kernel. It wasn't clear to me what ordering is being used in ftdi_sio.c, so I inserted the ID after another model train entry(SPROG_II).
--- drivers/usb/serial/ftdi_sio.c | 1 + drivers/usb/serial/ftdi_sio_ids.h | 3 +++ 2 files changed, 4 insertions(+)
drivers/usb/serial/ftdi_sio.c +1 -0
@@ -185,6 +185,7 @@ static struct usb_device_id id_table_com { USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_IOBOARD_PID) }, { USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_MINI_IOBOARD_PID) }, { USB_DEVICE(FTDI_VID, FTDI_SPROG_II) }, + { USB_DEVICE(FTDI_VID, FTDI_LENZ_LIUSB_PID) }, { USB_DEVICE(FTDI_VID, FTDI_XF_632_PID) }, { USB_DEVICE(FTDI_VID, FTDI_XF_634_PID) }, { USB_DEVICE(FTDI_VID, FTDI_XF_547_PID) },
drivers/usb/serial/ftdi_sio_ids.h +3 -0
@@ -110,6 +110,9 @@/* Propox devices */ #define FTDI_PROPOX_JTAGCABLEII_PID 0xD738 +/* Lenz LI-USB Computer Interface. */ +#define FTDI_LENZ_LIUSB_PID 0xD780 +/* * Xsens Technologies BV products (http://www.xsens.com). */
PATCH 90/91 tracing: Fix timer tracing
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: Arjan van de Ven <[email protected]>
commit ede1b4290781ae82ccf0f2ecc6dada8d3dd35779 upstream.
PowerTOP would like to be able to trace timers.
Unfortunately, the current timer tracing is not very useful: the actual timer function is not recorded in the trace at the start of timer execution.
Although this is recorded for timer "start" time (when it gets armed), this is not useful; most timers get started early, and a tracer like PowerTOP will never see this event, but will only see the actual running of the timer.
This patch just adds the function to the timer tracing; I've verified with PowerTOP that now it can get useful information about timers.
LKML-Reference: <[email protected]>
--- include/trace/events/timer.h | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
include/trace/events/timer.h +6 -2
@@ -74,14 +74,16 @@ TRACE_EVENT(timer_expire_entry,TP_STRUCT__entry (__field (void *,timer ) __field( unsigned long, now ) + __field( void *, function) ),TP_fast_assign ( __entry->timer = timer; __entry->now = jiffies; + __entry->function = timer->function; ), -TP_printk ("timer=%p now=%lu" , __entry->timer, __entry->now) +TP_printk ("timer=%p function=%pf now=%lu" , __entry->timer, __entry->function,__entry->now) );/**
@@ -213,14 +215,16 @@ TRACE_EVENT(hrtimer_expire_entry,TP_STRUCT__entry (__field (void *,hrtimer )__field ( s64, now ) + __field( void *, function) ),TP_fast_assign ( __entry->hrtimer = hrtimer; __entry->now = now->tv64; + __entry->function = hrtimer->function; ), -TP_printk ("hrtimer=%p now=%llu" , __entry->hrtimer, +TP_printk ("hrtimer=%p function=%pf now=%llu" , __entry->hrtimer, __entry->function, (unsigned long long )ktime_to_ns ((ktime_t ) { .tv64 = __entry->now })) );
PATCH 91/91 x86, apic: ack all pending irqs when crashed/on kexec
In reply to Greg KH2.6.34-stable review patch. If anyone has any objections, please let us know.
------------------
From: Kerstin Jonsson <[email protected]>
commit 8c3ba8d049247dc06b6dcee1711a11b26647aa44 upstream.
When the SMP kernel decides to crash_kexec() the local APICs may have pending interrupts in their vector tables.
The setup routine for the local APIC has a deficient mechanism for clearing these interrupts, it only handles interrupts that has already been dispatched to the local core for servicing (the ISR register) safely, it doesn't consider lower prioritized queued interrupts stored in the IRR register.
If you have more than one pending interrupt within the same 32 bit word in the LAPIC vector table registers you may find yourself entering the IO APIC setup with pending interrupts left in the LAPIC. This is a situation for wich the IO APIC setup is not prepared. Depending of what/which interrupt vector/vectors are stuck in the APIC tables your system may show various degrees of malfunctioning. That was the reason why the check_timer() failed in our system, the timer interrupts was blocked by pending interrupts from the old kernel when routed trough the IO APIC.
Additional comment from Jiri Bohac:
==============
If this should go into stable release,
I'd add some kind of limit on the number of iterations, just to be safe from hard to debug lock-ups:
+if (loops++ > MAX_LOOPS) {
+ printk("LAPIC pending clean-up")
+ break;
+}
while (queued);
with MAX_LOOPS something like 1E9 this would leave plenty of time for the pending IRQs to be cleared and would and still cause at most a second of delay if the loop were to lock-up for whatever reason.
V2: Use tsc if avail to bail out after 1 sec due to possible virtual
apic_read calls which may take rather long (suggested by: Avi Kivity <[email protected]>) If no tsc is available bail out quickly after cpu_khz, if we broke out too early and still have irqs pending (which should never happen?) we still get a WARN_ON...
V3: - Fixed indentation -> checkpatch clean
- max_loops must be signed
V4: - Fix typo, mixed up tsc and ntsc in first rdtscll() call
V5: Adjust WARN_ON() condition to also catch error in cpu_has_tsc case]
LKML-Reference: <[email protected]>
--- arch/x86/kernel/apic/apic.c | 41 +++++++++++++++++++++++++++++++++-------- 1 file changed, 33 insertions(+), 8 deletions(-)
arch/x86/kernel/apic/apic.c +33 -8
@@ -51,6 +51,7 @@#include <asm/smp.h> #include <asm/mce.h> #include <asm/kvm_para.h> +#include <asm/tsc.h> unsigned int num_processors;
@@ -1151,8 +1152,13 @@ static void __cpuinit lapic_setup_esr(vo*/ void __cpuinit setup_local_APIC (void ) { -unsigned int value; -int i, j; +unsigned int value, queued; +int i, j, acked =0 ; +unsigned long long tsc =0 , ntsc; +long long max_loops = cpu_khz; + +if (cpu_has_tsc) +rdtscll (tsc);if (disable_apic) {arch_disable_smp_support ();
@@ -1204,13 +1210,32 @@ void __cpuinit setup_local_APIC(void)* the interrupt. Hence a vector might get locked. It was noticed * for timer irq (vector 0x31). Issue an extra EOI to clear ISR. */ -for (i =APIC_ISR_NR -1 ; i >=0 ; i--) { - value =apic_read (APIC_ISR + i*0x10 ); -for (j =31 ; j >=0 ; j--) { -if (value & (1 <<j)) -ack_APIC_irq (); +do { + queued =0 ; +for (i =APIC_ISR_NR -1 ; i >=0 ; i--) + queued |=apic_read (APIC_IRR + i*0x10 ); + +for (i =APIC_ISR_NR -1 ; i >=0 ; i--) { + value =apic_read (APIC_ISR + i*0x10 ); +for (j =31 ; j >=0 ; j--) { +if (value & (1 <<j)) { +ack_APIC_irq (); + acked++; + } + } } - } +if (acked >256 ) { +printk (KERN_ERR "LAPIC pending interrupts after %d EOI\n" , + acked); +break ; + } +if (cpu_has_tsc) { +rdtscll (ntsc); + max_loops = (cpu_khz <<10 ) - (ntsc - tsc); + }else + max_loops--; + }while (queued && max_loops >0 ); +WARN_ON (max_loops <=0 );/* * Now that we are all set up, enable the APIC