3.6.11.5-stable review
Subsystems (56)
Steven Rostedt
maintainercover 3.6.11.5-stable review
This is the start of the stable review cycle for 3.6.11.5 release. There are 65 patches in this series, which will be posted as responses to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Thu Jun 18:08:30. Anything received after that time might be too late.
Aaro Koskinen (1):
ARM: OMAP: RX-51: change probe order of touchscreen and panel SPI devices
[e65f131a14726e5f1b880a528271a52428e5b3a5]
Amitkumar Karwar (1):
mwifiex: fix memory leak issue when driver unload
[f16fdc9d2dc1e5b270e9a08377587e831e0d36ac]
Anton Blanchard (2):
powerpc/kexec: Fix kexec when using VMX optimised memcpy
[79c66ce8f6448a3295a32efeac88c9debd7f7094]
audit: Syscall rules are not applied to existing processes on non-x86
[cdee3904b4ce7c03d1013ed6dd704b43ae7fc2e9]
Ben Hutchings (1):
sfc: Fix naming of MTD partitions for FPGA bitfiles
[89cc80a44b7c320e08599cb86f6aef0ead8986a1]
Benjamin LaHaise (1):
ipmi: ipmi_devintf: compat_ioctl method fails to take ipmi_mutex
[6368087e851e697679af059b4247aca33a69cef3]
Bing Zhao (1):
mwifiex: clear is_suspended flag when interrupt is received early
[48795424acff7215d5eac0b52793a2c1eb3a6283]
Bjørn Mork (1):
net: vlan,ethtool: netdev_features_t is more than 32 bit
[b29d3145183da4e07d4b570fa8acdd3ac4a5c572]
Bob Moore (1):
ACPICA: Fix possible buffer overflow during a field unit read operation
[61388f9e5d93053cf399a356414f31f9b4814c6d]
Chen Gang (2):
drivers/char/ipmi: memcpy, need additional 2 bytes to avoid memory overflow
[a5f2b3d6a738e7d4180012fe7b541172f8c8dcea]
net: mac802154: comparision issue of type cast, finding by EXTRA_CFLAGS=-W
[2c1bbbffa0b644fab4f91878cde0c2e8f52e2dcc]
Chris Metcalf (1):
tile: support new Tilera hypervisor
[c539914dcd9a68c63305e055b14115a6a19578a8]
Christopher Harvey (2):
drm/mgag200: Fix framebuffer base address programming
[9f1d036648c1c5ed81b0e98d7a06d55df972701e]
drm/mgag200: Fix writes into MGA1064_PIX_CLK_CTL register
[fb70a6690875315a3a1454e52fa339441ee7612b]
Cong Wang (1):
xfrm6: release dev before returning error
[84c4a9dfbf430861e7588d95ae3ff61535dca351]
Dan Carpenter (1):
ASoC: wm8994: missing break in wm8994_aif3_hw_params()
[4495e46fe18f198366961bb2b324a694ef8a9b44]Daniel Borkmann (1):
packet: tpacket_v3: do not trigger bug() on wrong header status
[8da3056c04bfc5f69f840ab038a38389e2de8189]
Daniel Drake (1):
mwifiex: fix setting of multicast filter
[ccd384b10420ac81ba3fb9b0a7d18272c7173552]
Eric Dumazet (2):
ipv6: do not clear pinet6 field
[f77d602124d865c38705df7fa25c03de9c284ad2]
tcp: force a dst refcount when prequeue packet
[093162553c33e9479283e107b4431378271c735d]
Felix Fietkau (1):
ath9k: fix key allocation error handling for powersave keys
[4ef69d0394cba8caa9f75d3f2e53429bfb8b3045]
Frederic Weisbecker (1):
math64: New div64_u64_rem helper
[f792685006274a850e6cc0ea9ade275ccdfc90bc]Gabriel de Perthuis (1):
btrfs: don't stop searching after encountering the wrong item
[03b71c6ca6286625d8f1ed44aabab9b5bf5dac10]
Gleb Natapov (1):
KVM: VMX: fix halt emulation while emulating invalid guest sate
[8d76c49e9ffeee839bc0b7a3278a23f99101263e]
Guenter Roeck (1):
watchdog: Fix race condition in registration code
[60403f7a4d9368d187f79cba5e4672d01df37574]
Helge Deller (1):
parisc: make default cross compiler search more robust (v3)
[6880b0150a7c25fd75c5ece80abc49ebf53c38c1]
Inderpal Singh (1):
ARM: EXYNOS5: Fix kernel dump in AFTR idle mode
[088584618836b159947bc4ab5011a5cf1f081a62]
Jaccon Bastiaansen (1):
ARM: 7720/1: ARM v6/v7 cmpxchg64 shouldn't clear upper 32 bits of the old/new value
[6eabb3301b1facee669d9938f7c5a0295c21d71d]
Jamal Hadi Salim (1):
net_sched: act_ipt forward compat with xtables
[0dcffd09641f3abb21ac5cabc61542ab289d1a3c]
James Bottomley (1):
sd: fix array cache flushing bug causing performance problems
[39c60a0948cc06139e2fbfe084f83cb7e7deae3b]
Jiri Pirko (1):
macvlan: fix passthru mode race between dev removal and rx path
[233c7df0821c4190e2d3f4be0f2ca0ab40a5ed8c]
Joern Engel (1):
target: close target_put_sess_cmd() vs. core_tmr_abort_task() race
[ccf5ae83a6cf3d9cfe9a7038bfe7cd38ab03d5e1]
John David Anglin (2):
parisc: fix SMP races when updating PTE and TLB entries in entry.S
[f0a18819e261afc5fdbd8c5c6f9943123c5461ba]
parisc: only re-enable interrupts if we need to schedule or deliver signals when returning to userspace
[c207a76bf155cb5cf24cf849c08f6555e9180594]
Josef Ahmad (1):
i2c: designware: fix RX FIFO overrun
[e6f34cea56f5b95498070eaa9f4aa3ba4a9e4f62]
Josh Boyer (1):
if_cablemodem.h: Add parenthesis around ioctl macros
[4f924b2aa4d3cb30f07e57d6b608838edcbc0d88]
Kees Cook (1):
drm/radeon: check incoming cliprects pointer
[fefaedcfb82d2e57c2320acf60604ab03b750cc0]
Konrad Rzeszutek Wilk (1):
xen/vcpu/pvhvm: Fix vcpu hotplugging hanging.
[7f1fc268c47491fd5e63548f6415fc8604e13003]
Lachlan McIlroy (1):
ext4: limit group search loop for non-extent files
[e6155736ad76b2070652745f9e54cdea3f0d8567]
Lan Tianyu (1):
ACPI / EC: Restart transaction even when the IBF flag set
[28fe5c825f8e15744d04c7c1b8df197950923ecd]
Matthew Whitehead (1):
3c509.c: call SET_NETDEV_DEV for all device types (ISA/ISAPnP/EISA)
[3b54912f9cd167641b91d4a697bd742f70e534fe]
Michael S. Tsirkin (1):
virtio_console: fix uapi header
[6407d75afd08545f2252bb39806ffd3f10c7faac]
Mika Westerberg (1):
i2c: designware: always clear interrupts before enabling them
[2a2d95e9d6d29e726cc294b65391917ed2e32bf4]
Mike Frysinger (1):
parisc: fix NATIVE set up in build
[93782eba49e23c3f311a6b05a19ba15927ec4e8b]
Mike Snitzer (1):
dm stripe: fix regression in stripe_width calculation
[d793e684277124d55c5d2444007e224635821346]
Mikulas Patocka (1):
dm bufio: avoid a possible __vmalloc deadlock
[502624bdad3dba45dfaacaf36b7d83e39e74b2d2]
Niels Ole Salscheider (1):
drm/radeon: Fix VRAM size calculation for VRAM >= 4GB
[fc986034540102cd090237bf3f70262e1ae80d9c]
Oleg Nesterov (1):
usermodehelper: check subprocess_info->path != NULL
[264b83c07a84223f0efd0d1db9ccc66d6f88288f]Patrick McHardy (1):
net: use netdev_features_t in skb_needs_linearize()
[6708c9e5cc9bfc7c9a00ce9c0fdd0b1d4952b3d1]
Philipp Reisner (1):
drbd: fix for deadlock when using automatic split-brain-recovery
[7c689e63a847316c1b2500f86891b0a574ce7e69]
Robert Jennings (1):
powerpc: Bring all threads online prior to migration/hibernation
[120496ac2d2d60aee68d3123a68169502a85f4b5]
Sergei Shtylyov (2):
3c59x: fix PCI resource management
[4b264a1676e70dc656ba53a8cac690f2d4b65f4e]
3c59x: fix freeing nonexistent resource on driver unload
[c81400be716aa4c76f6ebf339ba94358dbbf6da6]
Shlomo Pongratz (1):
iscsi-target: Fix processing of OOO commands
[3eccfdb01da58fbd0f789ae6ca61cee3769e26de]
Shuah Khan (1):
hp_accel: Ignore the error from lis3lv02d_poweron() at resume
[7783819920ca52fc582a2782f654fe6ed373f465]
Steven Rostedt (Red Hat) (1):
tracing: Fix leaks of filter preds
[60705c89460fdc7227f2d153b68b3f34814738a4]
Thomas Gleixner (1):
tick: Cleanup NOHZ per cpu data on cpu down
[4b0c0f294f60abcdd20994a8341a95c8ac5eeb96]
Thommy Jakobsson (1):
B43: Handle DMA RX descriptor underrun
[73b82bf0bfbf58e6ff328d3726934370585f6e78]
Tirupathi Reddy (1):
timer: Don't reinitialize the cpu base lock during CPU_UP_PREPARE
[42a5cf46cd56f46267d2a9fcf2655f4078cd3042]
Tomoya MORINAGA (1):
pch_dma: Use GFP_ATOMIC because called from interrupt context
[5c1ef59168c485318e40ba485c1eba57d81d0faa]
Wang YanQing (1):
ALSA: HDA: Fix Oops caused by dereference NULL pointer
[2195b063f6609e4c6268f291683902f25eaf9aa6]
Wei Yongjun (3):
hwmon: fix error return code in abituguru_probe()
[ecacb0b17c08fae89f65468727f0e4b8e91da4e1]
drivers/rtc/rtc-pcf2123.c: fix error return code in pcf2123_probe()
[35623715818dfa720cccf99cd280dcbb4b78da23]
dm snapshot: fix error return code in snapshot_ctr
[09e8b813897a0f85bb401435d009228644c81214]
stephen hemminger (1):
bridge: fix race with topology change timer
[83401eb4990ff6af55aeed8f49681558544192e6]
----
arch/arm/include/asm/cmpxchg.h | 8 +- arch/arm/mach-exynos/include/mach/regs-pmu.h | 1 + arch/arm/mach-exynos/pmu.c | 5 +- arch/arm/mach-omap2/board-rx51-peripherals.c | 4 +- arch/parisc/Makefile | 24 ++-- arch/parisc/kernel/entry.S | 169 ++++++++++++++------------ arch/powerpc/include/asm/rtas.h | 2 + arch/powerpc/kernel/machine_kexec_64.c | 4 + arch/powerpc/kernel/rtas.c | 113 +++++++++++++++++ arch/powerpc/platforms/pseries/suspend.c | 22 ++++ arch/tile/Kconfig | 14 ++- arch/tile/include/hv/hypervisor.h | 27 +++- arch/tile/kernel/head_32.S | 2 +- arch/tile/kernel/head_64.S | 12 +- arch/x86/kvm/vmx.c | 6 + arch/x86/xen/enlighten.c | 15 +++ drivers/acpi/acpica/exfldio.c | 14 ++- drivers/acpi/ec.c | 4 +- drivers/block/drbd/drbd_receiver.c | 1 - drivers/char/ipmi/ipmi_bt_sm.c | 4 +- drivers/char/ipmi/ipmi_devintf.c | 14 ++- drivers/dma/pch_dma.c | 2 +- drivers/gpu/drm/mgag200/mgag200_mode.c | 69 +++++++---- drivers/gpu/drm/radeon/evergreen.c | 4 +- drivers/gpu/drm/radeon/r300_cmdbuf.c | 2 +- drivers/gpu/drm/radeon/radeon_ttm.c | 2 +- drivers/gpu/drm/radeon/si.c | 4 +- drivers/hwmon/abituguru.c | 16 ++- drivers/i2c/busses/i2c-designware-core.c | 14 ++- drivers/i2c/busses/i2c-designware-core.h | 2 + drivers/md/dm-bufio.c | 26 +++- drivers/md/dm-snap.c | 1 + drivers/md/dm-stripe.c | 11 +- drivers/net/ethernet/3com/3c509.c | 2 + drivers/net/ethernet/3com/3c59x.c | 27 ++-- drivers/net/ethernet/sfc/mcdi.c | 2 +- drivers/net/ethernet/tile/tilegx.c | 2 +- drivers/net/macvlan.c | 7 +- drivers/net/wireless/ath/ath9k/main.c | 6 +- drivers/net/wireless/b43/dma.c | 19 +++ drivers/net/wireless/b43/dma.h | 4 +- drivers/net/wireless/b43/main.c | 43 +++---- drivers/net/wireless/mwifiex/cfg80211.c | 3 - drivers/net/wireless/mwifiex/cmdevt.c | 1 + drivers/net/wireless/mwifiex/main.c | 1 + drivers/net/wireless/mwifiex/sta_ioctl.c | 21 +--- drivers/platform/x86/hp_accel.c | 3 +- drivers/rtc/rtc-pcf2123.c | 1 + drivers/scsi/sd.c | 20 +++ drivers/scsi/sd.h | 1 + drivers/target/iscsi/iscsi_target_erl1.c | 7 +- drivers/target/target_core_transport.c | 11 +- drivers/watchdog/watchdog_dev.c | 3 +- fs/btrfs/ioctl.c | 10 +- fs/ext4/mballoc.c | 6 +- include/linux/audit.h | 2 +- include/linux/if_cablemodem.h | 12 +- include/linux/kref.h | 33 +++++ include/linux/math64.h | 19 ++- include/linux/virtio_console.h | 2 +- include/net/sock.h | 12 ++ include/net/tcp.h | 1 + kernel/kmod.c | 5 + kernel/time/tick-sched.c | 2 +- kernel/timer.c | 2 +- kernel/trace/trace_events_filter.c | 4 + lib/div64.c | 19 ++- net/8021q/vlan_dev.c | 2 +- net/bridge/br_stp_timer.c | 2 +- net/core/dev.c | 2 +- net/core/ethtool.c | 2 +- net/core/sock.c | 12 -- net/ipv6/tcp_ipv6.c | 12 ++ net/ipv6/udp.c | 13 +- net/ipv6/udp_impl.h | 2 + net/ipv6/udplite.c | 2 +- net/ipv6/xfrm6_policy.c | 4 +- net/mac802154/mac802154.h | 2 +- net/packet/af_packet.c | 53 ++++---- net/sched/act_ipt.c | 33 ++++- sound/pci/hda/hda_codec.c | 3 + sound/soc/codecs/wm8994.c | 1 + 82 files changed, 761 insertions(+), 315 deletions(-)
Steven Rostedt
maintainerPATCH 1/65 KVM: VMX: fix halt emulation while emulating invalid guest sate
3.6.11.5 stable review patch.
If anyone has any objections, please let me know.
------------------
From: Gleb Natapov <[email protected]>
[ Upstream commit 8d76c49e9ffeee839bc0b7a3278a23f99101263e ]
The invalid guest state emulation loop does not check halt_request which causes 100% cpu loop while guest is in halt and in invalid state, but more serious issue is that this leaves halt_request set, so random instruction emulated by vm86 #GP exit can be interpreted as halt which causes guest hang. Fix both problems by handling halt_request in emulation loop.
--- arch/x86/kvm/vmx.c | 6 ++++++ 1 file changed, 6 insertions(+)
arch/x86/kvm/vmx.c +6 -0
@@ -5030,6 +5030,12 @@ static int handle_invalid_guest_state(struct kvm_vcpu *vcpu)return 0 ; } +if (vcpu->arch.halt_request) { + vcpu->arch.halt_request =0 ; + ret =kvm_emulate_halt (vcpu); + goto out; + } +if (signal_pending (current)) goto out;if (need_resched ())
Signature · 1 line
1.7.10.4
Steven Rostedt
maintainerPATCH 2/65 ARM: OMAP: RX-51: change probe order of touchscreen and panel SPI devices
In reply to Steven Rostedt3.6.11.5 stable review patch.
If anyone has any objections, please let me know.
------------------
From: Aaro Koskinen <[email protected]>
[ Upstream commit e65f131a14726e5f1b880a528271a52428e5b3a5 ]
Commit 9fdca9df (spi: omap2-mcspi: convert to module_platform_driver) broke the SPI display/panel driver probe on RX-51/N900. The exact cause is not fully understood, but it seems to be related to the probe order. SPI communication to the panel driver (spi1.2) fails unless the touchscreen (spi1.0) has been probed/initialized before. When the omap2-mcspi driver was converted to a platform driver, it resulted in that the devices are probed immediately after the board registers them in the order they are listed in the board file.
Fix the issue by moving the touchscreen before the panel in the SPI device list.
The patch fixes the following failure:
[ 1.260955] acx565akm spi1.2: invalid display ID [ 1.265899] panel-acx565akm display0: acx_panel_probe panel detect error [ 1.273071] omapdss CORE error: driver probe failed: -19
--- arch/arm/mach-omap2/board-rx51-peripherals.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/arm/mach-omap2/board-rx51-peripherals.c +2 -2
@@ -67,11 +67,11 @@#define LIS302_IRQ1_GPIO 181#define LIS302_IRQ2_GPIO 180/* Not yet in use */ -/* list all spi devices here */ +/* List all SPI devices here. Note that the list/probe order seems to matter! */ enum {RX51_SPI_WL1251 , -RX51_SPI_MIPID ,/* LCD panel */ RX51_SPI_TSC2005 ,/* Touch Controller */ +RX51_SPI_MIPID ,/* LCD panel */ };static struct wl12xx_platform_data wl1251_pdata;
Signature · 1 line
1.7.10.4
Steven Rostedt
maintainerPATCH 3/65 ASoC: wm8994: missing break in wm8994_aif3_hw_params()
In reply to Steven Rostedt3.6.11.5 stable review patch.
If anyone has any objections, please let me know.
------------------
From: Dan Carpenter <[email protected]>
[ Upstream commit 4495e46fe18f198366961bb2b324a694ef8a9b44 ]
The missing break here means that we always return early and the function is a no-op.
--- sound/soc/codecs/wm8994.c | 1 + 1 file changed, 1 insertion(+)
sound/soc/codecs/wm8994.c +1 -0
@@ -2778,6 +2778,7 @@ static int wm8994_aif3_hw_params(struct snd_pcm_substream *substream,default :return 0 ; } +break ;default :return 0 ; }
Signature · 1 line
1.7.10.4
Steven Rostedt
maintainerPATCH 4/65 ACPICA: Fix possible buffer overflow during a field unit read operation
In reply to Steven Rostedt3.6.11.5 stable review patch.
If anyone has any objections, please let me know.
------------------
From: Bob Moore <[email protected]>
[ Upstream commit 61388f9e5d93053cf399a356414f31f9b4814c6d ]
Can only happen under these conditions: 1) The DSDT version is 1, meaning integers are 32-bits. 2) The field is between 33 and 64 bits long.
It applies cleanly back to ACPICA 20100806+ (Linux v2.6.37+).
--- drivers/acpi/acpica/exfldio.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-)
drivers/acpi/acpica/exfldio.c +13 -1
@@ -722,7 +722,19 @@ acpi_ex_extract_from_field(union acpi_operand_object *obj_desc,if ((obj_desc->common_field.start_field_bit_offset ==0 ) && (obj_desc->common_field.bit_length == access_bit_width)) { - status =acpi_ex_field_datum_io (obj_desc,0 , buffer,ACPI_READ ); +if (buffer_length >=sizeof (u64)) { + status = +acpi_ex_field_datum_io (obj_desc,0 , buffer, +ACPI_READ ); + }else { +/* Use raw_datum (u64) to handle buffers < 64 bits */ + + status = +acpi_ex_field_datum_io (obj_desc,0 , &raw_datum, +ACPI_READ ); +ACPI_MEMCPY (buffer, &raw_datum, buffer_length); + } +return_ACPI_STATUS (status); }
Signature · 1 line
1.7.10.4
Steven Rostedt
maintainerPATCH 5/65 ALSA: HDA: Fix Oops caused by dereference NULL pointer
In reply to Steven Rostedt3.6.11.5 stable review patch.
If anyone has any objections, please let me know.
------------------
From: Wang YanQing <[email protected]>
[ Upstream commit 2195b063f6609e4c6268f291683902f25eaf9aa6 ]
The interrupt handler azx_interrupt will call azx_update_rirb, which may call snd_hda_queue_unsol_event, snd_hda_queue_unsol_event will dereference chip->bus pointer.
The problem is we alloc chip->bus in azx_codec_create which will be called after we enable IRQ and enable unsolicited event in azx_probe.
This will cause Oops due dereference NULL pointer. I meet it, good luck:)
[Rearranged the NULL check before the tracepoint and added another
NULL check of bus->workq -- tiwai]
--- sound/pci/hda/hda_codec.c | 3 +++ 1 file changed, 3 insertions(+)
sound/pci/hda/hda_codec.c +3 -0
@@ -609,6 +609,9 @@ int snd_hda_queue_unsol_event(struct hda_bus *bus, u32 res, u32 res_ex)struct hda_bus_unsolicited *unsol;unsigned int wp; +if (!bus || !bus->workq) +return 0 ; +trace_hda_unsol_event (bus, res, res_ex); unsol = bus->unsol;if (!unsol)
Signature · 1 line
1.7.10.4
Steven Rostedt
maintainerPATCH 6/65 dm stripe: fix regression in stripe_width calculation
In reply to Steven Rostedt3.6.11.5 stable review patch.
If anyone has any objections, please let me know.
------------------
From: Mike Snitzer <[email protected]>
[ Upstream commit d793e684277124d55c5d2444007e224635821346 ]
Fix a regression in the calculation of the stripe_width in the dm stripe target which led to incorrect processing of device limits.
The stripe_width is the stripe device length divided by the number of stripes. The group of commits in the range f14fa69 ("dm stripe: fix size test") to eb850de ("dm stripe: support for non power of 2 chunksize") interfered with each other (a merging error) and led to the stripe_width being set incorrectly to the stripe device length divided by chunk_size * stripe_count.
For example, a stripe device's table with: 0 33553920 striped 3 512 ... should result in a stripe_width of 11184640 (33553920 / 3), but due to the bug it was getting set to 21845 (33553920 / (512 * 3)).
The impact of this bug is that device topologies that previously worked
fine with the stripe target are no longer considered valid. In
particular, there is a higher risk of seeing this issue if one of the
stripe devices has a 4K logical block size. Resulting in an error
message like this:
"device-mapper: table: 253:4: len=21845 not aligned to h/w logical block size 4096 of dm-1"
The fix is to swap the order of the divisions and to use a temporary variable for the second one, so that width retains the intended value.
--- drivers/md/dm-stripe.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-)
drivers/md/dm-stripe.c +6 -5
@@ -94,7 +94,7 @@ static int get_stripe(struct dm_target *ti, struct stripe_c *sc,static int stripe_ctr (struct dm_target *ti,unsigned int argc,char **argv) {struct stripe_c *sc; -sector_t width; +sector_t width, tmp_len;uint32_t stripes;uint32_t chunk_size;int r;
@@ -116,15 +116,16 @@ static int stripe_ctr(struct dm_target *ti, unsigned int argc, char **argv) } width = ti->len; -if (sector_div (width, chunk_size)) { +if (sector_div (width, stripes)) { ti->error ="Target length not divisible by " -"chunk size" ; +"number of stripes" ;return -EINVAL ; } -if (sector_div (width, stripes)) { + tmp_len = width; +if (sector_div (tmp_len, chunk_size)) { ti->error ="Target length not divisible by " -"number of stripes" ; +"chunk size" ;return -EINVAL ; }
Signature · 1 line
1.7.10.4
Steven Rostedt
maintainerPATCH 7/65 dm bufio: avoid a possible __vmalloc deadlock
In reply to Steven Rostedt3.6.11.5 stable review patch.
If anyone has any objections, please let me know.
------------------
From: Mikulas Patocka <[email protected]>
[ Upstream commit 502624bdad3dba45dfaacaf36b7d83e39e74b2d2 ]
This patch uses memalloc_noio_save to avoid a possible deadlock in dm-bufio. (it could happen only with large block size, at most PAGE_SIZE << MAX_ORDER (typically 8MiB).
__vmalloc doesn't fully respect gfp flags. The specified gfp flags are used for allocation of requested pages, structures vmap_area, vmap_block and vm_struct and the radix tree nodes.
However, the kernel pagetables are allocated always with GFP_KERNEL. Thus the allocation of pagetables can recurse back to the I/O layer and cause a deadlock.
This patch uses the function memalloc_noio_save to set per-process PF_MEMALLOC_NOIO flag and the function memalloc_noio_restore to restore it. When this flag is set, all allocations in the process are done with implied GFP_NOIO flag, thus the deadlock can't happen.
This should be backported to stable kernels, but they don't have the PF_MEMALLOC_NOIO flag and memalloc_noio_save/memalloc_noio_restore functions. So, PF_MEMALLOC should be set and restored instead.
--- drivers/md/dm-bufio.c | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-)
drivers/md/dm-bufio.c +25 -1
@@ -321,6 +321,9 @@ static void __cache_size_refresh(void)static void *alloc_buffer_data (struct dm_bufio_client *c,gfp_t gfp_mask,enum data_mode *data_mode) { +unsigned noio_flag; +void *ptr; +if (c->block_size <=DM_BUFIO_BLOCK_SIZE_SLAB_LIMIT ) { *data_mode =DATA_MODE_SLAB ;return kmem_cache_alloc (DM_BUFIO_CACHE (c), gfp_mask);
@@ -334,7 +337,28 @@ static void *alloc_buffer_data(struct dm_bufio_client *c, gfp_t gfp_mask, } *data_mode =DATA_MODE_VMALLOC ; -return __vmalloc (c->block_size, gfp_mask,PAGE_KERNEL ); + +/* +* __vmalloc allocates the data pages and auxiliary structures with +* gfp_flags that were specified, but pagetables are always allocated +* with GFP_KERNEL, no matter what was specified as gfp_mask. +* +* Consequently, we must set per-process flag PF_MEMALLOC_NOIO so that +* all allocations done by this process (including pagetables) are done +* as if GFP_NOIO was specified. +*/ + +if (gfp_mask & __GFP_NORETRY) { + noio_flag = current->flags; + current->flags |=PF_MEMALLOC ; + } + + ptr =__vmalloc (c->block_size, gfp_mask,PAGE_KERNEL ); + +if (gfp_mask & __GFP_NORETRY) + current->flags = (current->flags & ~PF_MEMALLOC ) | noio_flag; + +return ptr; }/*
Signature · 1 line
1.7.10.4
Mikulas Patocka
maintainerRe: [07/65] dm bufio: avoid a possible __vmalloc deadlock
Quoted 61 lines · Steven Rostedt
3.6.11.5 stable review patch.
If anyone has any objections, please let me know.------------------
From: Mikulas Patocka <[email protected]>
[ Upstream commit
502624bdad3dba45dfaacaf36b7d83e39e74b2d2]This patch uses
memalloc_noio_saveto avoid a possible deadlock in dm-bufio. (it could happen only with large block size, at mostPAGE_SIZE<<MAX_ORDER(typically 8MiB).
__vmallocdoesn't fully respect gfp flags. The specified gfp flags are used for allocation of requested pages, structuresvmap_area,vmap_blockandvm_structand the radix tree nodes.However, the kernel pagetables are allocated always with
GFP_KERNEL. Thus the allocation of pagetables can recurse back to the I/O layer and cause a deadlock.This patch uses the function
memalloc_noio_saveto set per-processPF_MEMALLOC_NOIOflag and the functionmemalloc_noio_restoreto restore it. When this flag is set, all allocations in the process are done with impliedGFP_NOIOflag, thus the deadlock can't happen.This should be backported to stable kernels, but they don't have the
PF_MEMALLOC_NOIOflag and memalloc_noio_save/memalloc_noio_restore functions. So,PF_MEMALLOCshould be set and restored instead.Signed-off-by Mikulas Patocka <[email protected]>Signed-off-by Alasdair G Kergon <[email protected]>[ Set and clear PF_MEMALLOC manually - SR ]Signed-off-by Steven Rostedt <[email protected]>--- drivers/md/dm-bufio.c | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-)drivers/md/dm-bufio.c +6
-1@@ -321,6 +321,9 @@ static void __cache_size_refresh(void)static void *alloc_buffer_data (struct dm_bufio_client *c,gfp_t gfp_mask,enum data_mode *data_mode) { +unsigned noio_flag; +void *ptr; +if (c->block_size <=DM_BUFIO_BLOCK_SIZE_SLAB_LIMIT ) { *data_mode =DATA_MODE_SLAB ;return kmem_cache_alloc (DM_BUFIO_CACHE (c), gfp_mask);@@ -334,7 +337,28 @@ static void *alloc_buffer_data(struct dm_bufio_client *c, gfp_t gfp_mask, } *data_mode =DATA_MODE_VMALLOC ; -return __vmalloc (c->block_size, gfp_mask,PAGE_KERNEL ); + +/* +* __vmalloc allocates the data pages and auxiliary structures with
drivers/md/dm-bufio.c static void *alloc_buffer_data(struct dm_bufio_client *c, gfp_t gfp_mask, · line 352
Quoted 10 lines
drivers/md/dm-bufio.c +10
-0+* gfp_flags that were specified, but pagetables are always allocated +* with GFP_KERNEL, no matter what was specified as gfp_mask. +* +* Consequently, we must set per-process flag PF_MEMALLOC_NOIO so that +* all allocations done by this process (including pagetables) are done +* as if GFP_NOIO was specified. +*/ + +if (gfp_mask & __GFP_NORETRY) { + noio_flag = current->flags;
There should be noio_flag = current->flags & PF_MEMALLOC; because we don't want to restore other flags.
Quoted 14 lines
drivers/md/dm-bufio.c +9
-0+ current->flags |=PF_MEMALLOC ; + } + + ptr =__vmalloc (c->block_size, gfp_mask,PAGE_KERNEL ); + +if (gfp_mask & __GFP_NORETRY) + current->flags = (current->flags & ~PF_MEMALLOC ) | noio_flag; + +return ptr; }/* Signature · 1 line
1.7.10.4
Mikulas
Steven Rostedt
maintainerRe: [07/65] dm bufio: avoid a possible __vmalloc deadlock
Quoted 69 lines · Mikulas Patocka
Quoted 66 lines · Steven Rostedt
3.6.11.5 stable review patch.
If anyone has any objections, please let me know.------------------
From: Mikulas Patocka <[email protected]>
[ Upstream commit
502624bdad3dba45dfaacaf36b7d83e39e74b2d2]This patch uses
memalloc_noio_saveto avoid a possible deadlock in dm-bufio. (it could happen only with large block size, at mostPAGE_SIZE<<MAX_ORDER(typically 8MiB).
__vmallocdoesn't fully respect gfp flags. The specified gfp flags are used for allocation of requested pages, structuresvmap_area,vmap_blockandvm_structand the radix tree nodes.However, the kernel pagetables are allocated always with
GFP_KERNEL. Thus the allocation of pagetables can recurse back to the I/O layer and cause a deadlock.This patch uses the function
memalloc_noio_saveto set per-processPF_MEMALLOC_NOIOflag and the functionmemalloc_noio_restoreto restore it. When this flag is set, all allocations in the process are done with impliedGFP_NOIOflag, thus the deadlock can't happen.This should be backported to stable kernels, but they don't have the
PF_MEMALLOC_NOIOflag and memalloc_noio_save/memalloc_noio_restore functions. So,PF_MEMALLOCshould be set and restored instead.Signed-off-by Mikulas Patocka <[email protected]>Signed-off-by Alasdair G Kergon <[email protected]>[ Set and clear PF_MEMALLOC manually - SR ]Signed-off-by Steven Rostedt <[email protected]>--- drivers/md/dm-bufio.c | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-)drivers/md/dm-bufio.c +11
-1@@ -321,6 +321,9 @@ static void __cache_size_refresh(void)static void *alloc_buffer_data (struct dm_bufio_client *c,gfp_t gfp_mask,enum data_mode *data_mode) { +unsigned noio_flag; +void *ptr; +if (c->block_size <=DM_BUFIO_BLOCK_SIZE_SLAB_LIMIT ) { *data_mode =DATA_MODE_SLAB ;return kmem_cache_alloc (DM_BUFIO_CACHE (c), gfp_mask);@@ -334,7 +337,28 @@ static void *alloc_buffer_data(struct dm_bufio_client *c, gfp_t gfp_mask, } *data_mode =DATA_MODE_VMALLOC ; -return __vmalloc (c->block_size, gfp_mask,PAGE_KERNEL ); + +/* +* __vmalloc allocates the data pages and auxiliary structures with +* gfp_flags that were specified, but pagetables are always allocated +* with GFP_KERNEL, no matter what was specified as gfp_mask. +* +* Consequently, we must set per-process flag PF_MEMALLOC_NOIO so that +* all allocations done by this process (including pagetables) are done
Quoted 8 lines
drivers/md/dm-bufio.c static void *alloc_buffer_data(struct dm_bufio_client *c, gfp_t gfp_mask, · line 352
Quoted 5 lines
drivers/md/dm-bufio.c +5
-0+* as if GFP_NOIO was specified. +*/ + +if (gfp_mask & __GFP_NORETRY) { + noio_flag = current->flags;There should be
noio_flag=current->flags&PF_MEMALLOC; because we don't want to restore other flags.
Thanks for the review. Will fix.
-- Steve
Quoted 17 lines
Quoted 15 lines
drivers/md/dm-bufio.c +9
-0+ current->flags |=PF_MEMALLOC ; + } + + ptr =__vmalloc (c->block_size, gfp_mask,PAGE_KERNEL ); + +if (gfp_mask & __GFP_NORETRY) + current->flags = (current->flags & ~PF_MEMALLOC ) | noio_flag; + +return ptr; }/* Signature · 1 line
1.7.10.4Mikulas
Steven Rostedt
maintainerRe: [07/65] dm bufio: avoid a possible __vmalloc deadlock
In reply to Mikulas PatockaQuoted 8 lines · Mikulas Patocka
Review
Quoted 4 lines
(quoted diff) +4
-0+ */ + + if (gfp_mask & __GFP_NORETRY) { + noio_flag = current->flags;There should be
noio_flag=current->flags&PF_MEMALLOC; because we don't want to restore other flags.
Here's the updated version:
Thanks,
-- Steve
Quoted 1 line
From
e265a702cb479f58f451ec4458a26dd2bebeedabMon Sep 17 00:00:00 2001
From: Mikulas Patocka <[email protected]>
Date: Fri, 10 May 2013 14:37:15 +0100
Subject: [PATCH] dm bufio: avoid a possible __vmalloc deadlock
[ Upstream commit 502624bdad3dba45dfaacaf36b7d83e39e74b2d2 ]
This patch uses memalloc_noio_save to avoid a possible deadlock in dm-bufio. (it could happen only with large block size, at most PAGE_SIZE << MAX_ORDER (typically 8MiB).
__vmalloc doesn't fully respect gfp flags. The specified gfp flags are used for allocation of requested pages, structures vmap_area, vmap_block and vm_struct and the radix tree nodes.
However, the kernel pagetables are allocated always with GFP_KERNEL. Thus the allocation of pagetables can recurse back to the I/O layer and cause a deadlock.
This patch uses the function memalloc_noio_save to set per-process PF_MEMALLOC_NOIO flag and the function memalloc_noio_restore to restore it. When this flag is set, all allocations in the process are done with implied GFP_NOIO flag, thus the deadlock can't happen.
This should be backported to stable kernels, but they don't have the PF_MEMALLOC_NOIO flag and memalloc_noio_save/memalloc_noio_restore functions. So, PF_MEMALLOC should be set and restored instead.
--- drivers/md/dm-bufio.c | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-)
drivers/md/dm-bufio.c +25 -1
@@ -321,6 +321,9 @@ static void __cache_size_refresh(void)static void *alloc_buffer_data (struct dm_bufio_client *c,gfp_t gfp_mask,enum data_mode *data_mode) { +unsigned noio_flag; +void *ptr; +if (c->block_size <=DM_BUFIO_BLOCK_SIZE_SLAB_LIMIT ) { *data_mode =DATA_MODE_SLAB ;return kmem_cache_alloc (DM_BUFIO_CACHE (c), gfp_mask);
@@ -334,7 +337,28 @@ static void *alloc_buffer_data(struct dm_bufio_client *c, gfp_t gfp_mask, } *data_mode =DATA_MODE_VMALLOC ; -return __vmalloc (c->block_size, gfp_mask,PAGE_KERNEL ); + +/* +* __vmalloc allocates the data pages and auxiliary structures with +* gfp_flags that were specified, but pagetables are always allocated +* with GFP_KERNEL, no matter what was specified as gfp_mask. +* +* Consequently, we must set per-process flag PF_MEMALLOC_NOIO so that +* all allocations done by this process (including pagetables) are done +* as if GFP_NOIO was specified. +*/ + +if (gfp_mask & __GFP_NORETRY) { + noio_flag = current->flags &PF_MEMALLOC ; + current->flags |=PF_MEMALLOC ; + } + + ptr =__vmalloc (c->block_size, gfp_mask,PAGE_KERNEL ); + +if (gfp_mask & __GFP_NORETRY) + current->flags = (current->flags & ~PF_MEMALLOC ) | noio_flag; + +return ptr; }/*
Signature · 1 line
1.7.10.4
Steven Rostedt
maintainerPATCH 8/65 dm snapshot: fix error return code in snapshot_ctr
In reply to Steven Rostedt3.6.11.5 stable review patch.
If anyone has any objections, please let me know.
------------------
From: Wei Yongjun <[email protected]>
[ Upstream commit 09e8b813897a0f85bb401435d009228644c81214 ]
Return -ENOMEM instead of success if unable to allocate pending exception mempool in snapshot_ctr.
--- drivers/md/dm-snap.c | 1 + 1 file changed, 1 insertion(+)
drivers/md/dm-snap.c +1 -0
@@ -1117,6 +1117,7 @@ static int snapshot_ctr(struct dm_target *ti, unsigned int argc, char **argv) s->pending_pool =mempool_create_slab_pool (MIN_IOS , pending_cache);if (!s->pending_pool) { ti->error ="Could not allocate mempool for pending exceptions" ; + r = -ENOMEM ; goto bad_pending_pool; }
Signature · 1 line
1.7.10.4
Steven Rostedt
maintainerPATCH 9/65 math64: New div64_u64_rem helper
In reply to Steven Rostedt3.6.11.5 stable review patch.
If anyone has any objections, please let me know.
------------------
From: Frederic Weisbecker <[email protected]>
[ Upstream commit f792685006274a850e6cc0ea9ade275ccdfc90bc ]
Provide an extended version of div64_u64() that
also returns the remainder of the division.
We are going to need this to refine the cputime
scaling code.
--- include/linux/math64.h | 19 ++++++++++++++++++- lib/div64.c | 19 +++++++++++++------ 2 files changed, 31 insertions(+), 7 deletions(-)
include/linux/math64.h +18 -1
@@ -30,6 +30,15 @@ static inline s64 div_s64_rem(s64 dividend, s32 divisor, s32 *remainder) }/** +* div64_u64_rem - unsigned 64bit divide with 64bit divisor +*/ +static inline u64 div64_u64_rem (u64 dividend,u64 divisor,u64 *remainder) +{ + *remainder = dividend % divisor; +return dividend / divisor; +} + +/** * div64_u64 - unsigned 64bit divide with 64bit divisor */ static inline u64 div64_u64 (u64 dividend,u64 divisor)
@@ -61,8 +70,16 @@ static inline u64 div_u64_rem(u64 dividend, u32 divisor, u32 *remainder)extern s64 div_s64_rem (s64 dividend,s32 divisor,s32 *remainder);#endif +#ifndef div64_u64_rem +extern u64 div64_u64_rem (u64 dividend,u64 divisor,u64 *remainder); +#endif +#ifndef div64_u64 -extern u64 div64_u64 (u64 dividend,u64 divisor); +static inline u64 div64_u64 (u64 dividend,u64 divisor) +{ +u64 remainder; +return div64_u64_rem (dividend, divisor, &remainder); +}#endif #ifndef div64_s64
lib/div64.c +13 -6
@@ -79,9 +79,10 @@ EXPORT_SYMBOL(div_s64_rem);#endif /** -* div64_u64 - unsigned 64bit divide with 64bit divisor +* div64_u64_rem - unsigned 64bit divide with 64bit divisor and 64bit remainder * @dividend: 64bit dividend * @divisor: 64bit divisor +* @remainder: 64bit remainder * * This implementation is a modified version of the algorithm proposed * by the book 'Hacker's Delight'. The original source and full proof
@@ -89,27 +90,33 @@ EXPORT_SYMBOL(div_s64_rem);* * 'http://www.hackersdelight.org/HDcode/newCode/divDouble.c.txt' */ -#ifndef div64_u64 -u64 div64_u64 (u64 dividend,u64 divisor) +#ifndef div64_u64_rem +u64 div64_u64_rem (u64 dividend,u64 divisor,u64 *remainder) {u32 high = divisor >>32 ;u64 quot;if (high ==0 ) { - quot =div_u64 (dividend, divisor); +u32 rem32; + quot =div_u64_rem (dividend, divisor, &rem32); + *remainder = rem32; }else {int n =1 +fls (high); quot =div_u64 (dividend >> n, divisor >> n);if (quot !=0 ) quot--; -if ((dividend - quot * divisor) >= divisor) + + *remainder = dividend - quot * divisor; +if (*remainder >= divisor) { quot++; + *remainder -= divisor; + } }return quot; } -EXPORT_SYMBOL (div64_u64); +EXPORT_SYMBOL (div64_u64_rem);#endif /**
Signature · 1 line
1.7.10.4
Re: [09/65] math64: New div64_u64_rem helper
Quoted 2 lines · Steven Rostedt
3.6.11.5 stable review patch.
If anyone has any objections, please let me know.
If you will not pull other commits (I do not see them in the set):
d9a3c9823a2e6a543eb7807fb3d15d8233817ec555eaa7c1f511af5fb6ef808b5328804f4d4e5243772c808a252594692972773f6ee41c289b8e0b2af3002134158092178be81339ec5a22ff80e6c308
68aa8efcd1ab961e4684ef5af32f72a6ec1911deA
this one is not necessary and actually hit performance a bit.
Stanislaw
Steven Rostedt
maintainerRe: [09/65] math64: New div64_u64_rem helper
Quoted 11 lines · Stanislaw Gruszka
Quoted 2 lines · Steven Rostedt
3.6.11.5 stable review patch.
If anyone has any objections, please let me know.If you will not pull other commits (I do not see them in the set):
d9a3c9823a2e6a543eb7807fb3d15d8233817ec555eaa7c1f511af5fb6ef808b5328804f4d4e5243772c808a252594692972773f6ee41c289b8e0b2af3002134158092178be81339ec5a22ff80e6c308
68aa8efcd1ab961e4684ef5af32f72a6ec1911deA
Yeah, they didn't apply well at all.
Quoted 2 lines
this one is not necessary and actually hit performance a bit.
Thanks, I'll remove it.
-- Steve
Steven Rostedt
maintainerPATCH 10/65 hp_accel: Ignore the error from lis3lv02d_poweron() at resume
In reply to Steven Rostedt3.6.11.5 stable review patch.
If anyone has any objections, please let me know.
------------------
From: Shuah Khan <[email protected]>
[ Upstream commit 7783819920ca52fc582a2782f654fe6ed373f465 ]
The error in lis3lv02_poweron() is harmless in the resume path, so we should ignore it. It is inline with the other usages of lis3lv02_poweron() and matches the 3.0 code for this routine. This patch is in suse git and might have missed making it into the mainline.
opensuse - commit id: 66ccdac87c322cf7af12bddba8c805af640b1cff
--- drivers/platform/x86/hp_accel.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/platform/x86/hp_accel.c +2 -1
@@ -362,7 +362,8 @@ static int lis3lv02d_suspend(struct device *dev)static int lis3lv02d_resume (struct device *dev) { -return lis3lv02d_poweron (&lis3_dev); +lis3lv02d_poweron (&lis3_dev); +return 0 ; } static SIMPLE_DEV_PM_OPS(hp_accel_pm, lis3lv02d_suspend, lis3lv02d_resume);
Signature · 1 line
1.7.10.4
Steven Rostedt
maintainerPATCH 11/65 xen/vcpu/pvhvm: Fix vcpu hotplugging hanging.
In reply to Steven Rostedt3.6.11.5 stable review patch.
If anyone has any objections, please let me know.
------------------
From: Konrad Rzeszutek Wilk <[email protected]>
[ Upstream commit 7f1fc268c47491fd5e63548f6415fc8604e13003 ]
If a user did:
echo 0 > /sys/devices/system/cpu/cpu1/online echo 1 > /sys/devices/system/cpu/cpu1/online
we would (this a build with DEBUG enabled) get to:
smpboot: ++++++++++++++++++++=_---CPU UP 1 .. snip..
smpboot: Stack at about ffff880074c0ff44
smpboot: CPU1: has booted.
and hang. The RCU mechanism would kick in an try to IPI the CPU1 but the IPIs (and all other interrupts) would never arrive at the CPU1. At first glance at least. A bit digging in the hypervisor trace shows that (using xenanalyze):
[vla] d4v1 vec 243 injecting
0.043163027 --|x d4v1 intr_window vec 243 src 5(vector) intr f3 ] 0.043163639 --|x d4v1 vmentry cycles 1468 ] 0.043164913 --|x d4v1 vmexit exit_reason PENDING_INTERRUPT eip ffffffff81673254 0.043164913 --|x d4v1 inj_virq vec 243 real [vla] d4v1 vec 243 injecting 0.043164913 --|x d4v1 intr_window vec 243 src 5(vector) intr f3 ] 0.043165526 --|x d4v1 vmentry cycles 1472 ] 0.043166800 --|x d4v1 vmexit exit_reason PENDING_INTERRUPT eip ffffffff81673254 0.043166800 --|x d4v1 inj_virq vec 243 real
[vla] d4v1 vec 243 injecting
there is a pending event (subsequent debugging shows it is the IPI from the VCPU0 when smpboot.c on VCPU1 has done "set_cpu_online(smp_processor_id(), true)") and the guest VCPU1 is interrupted with the callback IPI (0xf3 aka 243) which ends up calling __xen_evtchn_do_upcall.
The __xen_evtchn_do_upcall seems to do *something* but not acknowledge the pending events. And the moment the guest does a 'cli' (that is the ffffffff81673254 in the log above) the hypervisor is invoked again to inject the IPI (0xf3) to tell the guest it has pending interrupts. This repeats itself forever.
The culprit was the per_cpu(xen_vcpu, cpu) pointer. At the bootup we set each per_cpu(xen_vcpu, cpu) to point to the shared_info->vcpu_info[vcpu] but later on use the VCPUOP_register_vcpu_info to register per-CPU structures (xen_vcpu_setup).
This is used to allow events for more than 32 VCPUs and for performance optimizations reasons.
When the user performs the VCPU hotplug we end up calling the the xen_vcpu_setup once more. We make the hypercall which returns -EINVAL as it does not allow multiple registration calls (and already has re-assigned where the events are being set). We pick the fallback case and set per_cpu(xen_vcpu, cpu) to point to the shared_info->vcpu_info[vcpu] (which is a good fallback during bootup). However the hypervisor is still setting events in the register per-cpu structure (per_cpu(xen_vcpu_info, cpu)).
As such when the events are set by the hypervisor (such as timer one), and when we iterate in __xen_evtchn_do_upcall we end up reading stale events from the shared_info->vcpu_info[vcpu] instead of the per_cpu(xen_vcpu_info, cpu) structures. Hence we never acknowledge the events that the hypervisor has set and the hypervisor keeps on reminding us to ack the events which we never do.
The fix is simple. Don't on the second time when xen_vcpu_setup is called over-write the per_cpu(xen_vcpu, cpu) if it points to per_cpu(xen_vcpu_info).
--- arch/x86/xen/enlighten.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+)
arch/x86/xen/enlighten.c +15 -0
@@ -154,6 +154,21 @@ static void xen_vcpu_setup(int cpu)BUG_ON (HYPERVISOR_shared_info == &xen_dummy_shared_info); +/* +* This path is called twice on PVHVM - first during bootup via +* smp_init -> xen_hvm_cpu_notify, and then if the VCPU is being +* hotplugged: cpu_up -> xen_hvm_cpu_notify. +* As we can only do the VCPUOP_register_vcpu_info once lets +* not over-write its result. +* +* For PV it is called during restore (xen_vcpu_restore) and bootup +* (xen_setup_vcpu_info_placement). The hotplug mechanism does not +* use this function. +*/ +if (xen_hvm_domain ()) { +if (per_cpu (xen_vcpu, cpu) == &per_cpu (xen_vcpu_info, cpu)) +return ; + }if (cpu <MAX_VIRT_CPUS )per_cpu (xen_vcpu,cpu) = &HYPERVISOR_shared_info->vcpu_info[cpu];
Signature · 1 line
1.7.10.4
Steven Rostedt
maintainerPATCH 12/65 sd: fix array cache flushing bug causing performance problems
In reply to Steven Rostedt3.6.11.5 stable review patch.
If anyone has any objections, please let me know.
------------------
From: James Bottomley <[email protected]>
[ Upstream commit 39c60a0948cc06139e2fbfe084f83cb7e7deae3b ]
Some arrays synchronize their full non volatile cache when the sd driver sends a SYNCHRONIZE CACHE command. Unfortunately, they can have Terrabytes of this and we send a SYNCHRONIZE CACHE for every barrier if an array reports it has a writeback cache. This leads to massive slowdowns on journalled filesystems.
The fix is to allow userspace to turn off the writeback cache setting as a temporary measure (i.e. without doing the MODE SELECT to write it back to the device), so even though the device reported it has a writeback cache, the user, knowing that the cache is non volatile and all they care about is filesystem correctness, can turn that bit off in the kernel and avoid the performance ruinous (and safety irrelevant) SYNCHRONIZE CACHE commands.
The way you do this is add a 'temporary' prefix when performing the usual cache setting operations, so
echo temporary write through > /sys/class/scsi_disk/<disk>/cache_type
--- drivers/scsi/sd.c | 20 ++++++++++++++++++++ drivers/scsi/sd.h | 1 + 2 files changed, 21 insertions(+)
drivers/scsi/sd.c +20 -0
@@ -141,6 +141,7 @@ sd_store_cache_type(struct device *dev, struct device_attribute *attr,char *buffer_data;struct scsi_mode_data data;struct scsi_sense_hdr sshdr; +const char *temp ="temporary " ;int len;if (sdp->type !=TYPE_DISK )
@@ -149,6 +150,13 @@ sd_store_cache_type(struct device *dev, struct device_attribute *attr,* it's not worth the risk */ return -EINVAL ; +if (strncmp (buf, temp,sizeof (temp) -1 ) ==0 ) { + buf +=sizeof (temp) -1 ; + sdkp->cache_override =1 ; + }else { + sdkp->cache_override =0 ; + } +for (i =0 ; i <ARRAY_SIZE (sd_cache_types); i++) { len =strlen (sd_cache_types[i]); if (strncmp(sd_cache_types[i], buf, len) == 0 &&
@@ -161,6 +169,13 @@ sd_store_cache_type(struct device *dev, struct device_attribute *attr,return -EINVAL ; rcd = ct &0x01 ?1 :0 ; wce = ct &0x02 ?1 :0 ; + +if (sdkp->cache_override) { + sdkp->WCE = wce; + sdkp->RCD = rcd; +return count; + } +if (scsi_mode_sense (sdp,0x08 ,8 , buffer,sizeof (buffer),SD_TIMEOUT ,SD_MAX_RETRIES , &data,NULL ))return -EINVAL ;
@@ -2127,6 +2142,10 @@ sd_read_cache_type(struct scsi_disk *sdkp, unsigned char *buffer)int old_rcd = sdkp->RCD;int old_dpofua = sdkp->DPOFUA; + +if (sdkp->cache_override) +return ; + first_len =4 ;if (sdp->skip_ms_page_8) {if (sdp->type ==TYPE_RBC )
@@ -2613,6 +2632,7 @@ static void sd_probe_async(void *data, async_cookie_t cookie) sdkp->capacity =0 ; sdkp->media_present =1 ; sdkp->write_prot =0 ; + sdkp->cache_override =0 ; sdkp->WCE =0 ; sdkp->RCD =0 ; sdkp->ATO =0 ;
drivers/scsi/sd.h +1 -0
@@ -67,6 +67,7 @@ struct scsi_disk {u8 protection_type;/* Data Integrity Field */ u8 provisioning_mode; unsigned ATO : 1; /* state of disk ATO bit */ + unsigned cache_override : 1; /* temp override of WCE,RCD */ unsigned WCE : 1; /* state of disk WCE bit */ unsigned RCD : 1; /* state of disk RCD bit, unused */ unsigned DPOFUA : 1; /* state of disk DPOFUA bit */
Signature · 1 line
1.7.10.4
Steven Rostedt
maintainerPATCH 13/65 audit: Syscall rules are not applied to existing processes on non-x86
In reply to Steven Rostedt3.6.11.5 stable review patch.
If anyone has any objections, please let me know.
------------------
From: Anton Blanchard <[email protected]>
[ Upstream commit cdee3904b4ce7c03d1013ed6dd704b43ae7fc2e9 ]
Commit b05d8447e782 (audit: inline audit_syscall_entry to reduce burden on archs) changed audit_syscall_entry to check for a dummy context before calling __audit_syscall_entry. Unfortunately the dummy context state is maintained in __audit_syscall_entry so once set it never gets cleared, even if the audit rules change.
As a result, if there are no auditing rules when a process starts then it will never be subject to any rules added later. x86 doesn't see this because it has an assembly fast path that calls directly into __audit_syscall_entry.
I noticed this issue when working on audit performance optimisations. I wrote a set of simple test cases available at:
http://ozlabs.org/~anton/junkcode/audit_tests.tar.gz
02_new_rule.py fails without the patch and passes with it. The test case clears all rules, starts a process, adds a rule then verifies the process produces a syscall audit record.
--- include/linux/audit.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
include/linux/audit.h +1 -1
@@ -481,7 +481,7 @@ static inline void audit_syscall_entry(int arch, int major, unsigned long a0, unsigned long a1, unsigned long a2, unsigned long a3) { - if (unlikely(!audit_dummy_context())) + if (unlikely(current->audit_context)) __audit_syscall_entry(arch, major, a0, a1, a2, a3); }static inline void audit_syscall_exit (void *pt_regs)
Signature · 1 line
1.7.10.4
Steven Rostedt
maintainerPATCH 14/65 timer: Dont reinitialize the cpu base lock during CPU_UP_PREPARE
In reply to Steven Rostedt3.6.11.5 stable review patch.
If anyone has any objections, please let me know.
------------------
From: Tirupathi Reddy <[email protected]>
[ Upstream commit 42a5cf46cd56f46267d2a9fcf2655f4078cd3042 ]
An inactive timer's base can refer to a offline cpu's base.
In the current code, cpu_base's lock is blindly reinitialized each time a CPU is brought up. If a CPU is brought online during the period that another thread is trying to modify an inactive timer on that CPU with holding its timer base lock, then the lock will be reinitialized under its feet. This leads to following SPIN_BUG().
<0> BUG: spinlock already unlocked on CPU#3, kworker/u:3/1466
<0> lock: 0xe3ebe000, .magic: dead4ead, .owner: kworker/u:3/1466, .owner_cpu: 1
<4> [<c0013dc4>] (unwind_backtrace+0x0/0x11c) from [<c026e794>] (do_raw_spin_unlock+0x40/0xcc) <4> [<c026e794>] (do_raw_spin_unlock+0x40/0xcc) from [<c076c160>] (_raw_spin_unlock+0x8/0x30) <4> [<c076c160>] (_raw_spin_unlock+0x8/0x30) from [<c009b858>] (mod_timer+0x294/0x310) <4> [<c009b858>] (mod_timer+0x294/0x310) from [<c00a5e04>] (queue_delayed_work_on+0x104/0x120) <4> [<c00a5e04>] (queue_delayed_work_on+0x104/0x120) from [<c04eae00>] (sdhci_msm_bus_voting+0x88/0x9c) <4> [<c04eae00>] (sdhci_msm_bus_voting+0x88/0x9c) from [<c04d8780>] (sdhci_disable+0x40/0x48) <4> [<c04d8780>] (sdhci_disable+0x40/0x48) from [<c04bf300>] (mmc_release_host+0x4c/0xb0) <4> [<c04bf300>] (mmc_release_host+0x4c/0xb0) from [<c04c7aac>] (mmc_sd_detect+0x90/0xfc) <4> [<c04c7aac>] (mmc_sd_detect+0x90/0xfc) from [<c04c2504>] (mmc_rescan+0x7c/0x2c4) <4> [<c04c2504>] (mmc_rescan+0x7c/0x2c4) from [<c00a6a7c>] (process_one_work+0x27c/0x484) <4> [<c00a6a7c>] (process_one_work+0x27c/0x484) from [<c00a6e94>] (worker_thread+0x210/0x3b0) <4> [<c00a6e94>] (worker_thread+0x210/0x3b0) from [<c00aad9c>] (kthread+0x80/0x8c)
<4> [<c00aad9c>] (kthread+0x80/0x8c) from [<c000ea80>] (kernel_thread_exit+0x0/0x8)
As an example, this particular crash occurred when CPU #3 is executing mod_timer() on an inactive timer whose base is refered to offlined CPU #2. The code locked the timer_base corresponding to CPU #2. Before it could proceed, CPU #2 came online and reinitialized the spinlock corresponding to its base. Thus now CPU #3 held a lock which was reinitialized. When CPU #3 finally ended up unlocking the old cpu_base corresponding to CPU #2, we hit the above SPIN_BUG().
CPU #0 CPU #3 CPU #2
------ ------- -------
..... ...... <Offline>
mod_timer() lock_timer_base spin_lock_irqsave(&base->lock)
cpu_up(2) ..... ......
init_timers_cpu()
.... ..... spin_lock_init(&base->lock)
..... spin_unlock_irqrestore(&base->lock) ......
<spin_bug>
Allocation of per_cpu timer vector bases is done only once under "tvec_base_done[]" check. In the current code, spinlock_initialization of base->lock isn't under this check. When a CPU is up each time the base lock is reinitialized. Move base spinlock initialization under the check.
--- kernel/timer.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
kernel/timer.c +1 -1
@@ -1692,12 +1692,12 @@ static int __cpuinit init_timers_cpu(int cpu) boot_done =1 ; base = &boot_tvec_bases; } +spin_lock_init (&base->lock); tvec_base_done[cpu] =1 ; }else { base =per_cpu (tvec_bases, cpu); } -spin_lock_init (&base->lock);for (j =0 ; j <TVN_SIZE ; j++) {INIT_LIST_HEAD (base->tv5.vec + j);
Signature · 1 line
1.7.10.4
Steven Rostedt
maintainerPATCH 15/65 tick: Cleanup NOHZ per cpu data on cpu down
In reply to Steven Rostedt3.6.11.5 stable review patch.
If anyone has any objections, please let me know.
------------------
From: Thomas Gleixner <[email protected]>
[ Upstream commit 4b0c0f294f60abcdd20994a8341a95c8ac5eeb96 ]
Prarit reported a crash on CPU offline/online. The reason is that on CPU down the NOHZ related per cpu data of the dead cpu is not cleaned up. If at cpu online an interrupt happens before the per cpu tick device is registered the irq_enter() check potentially sees stale data and dereferences a NULL pointer.
Cleanup the data after the cpu is dead.
--- kernel/time/tick-sched.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
kernel/time/tick-sched.c +1 -1
@@ -909,7 +909,7 @@ void tick_cancel_sched_timer(int cpu)hrtimer_cancel (&ts->sched_timer);# endif - ts->nohz_mode = NOHZ_MODE_INACTIVE; + memset(ts, 0, sizeof(*ts)); }#endif
Signature · 1 line
1.7.10.4
Steven Rostedt
maintainerPATCH 16/65 tracing: Fix leaks of filter preds
In reply to Steven Rostedt3.6.11.5 stable review patch.
If anyone has any objections, please let me know.
------------------
From: "Steven Rostedt (Red Hat)" <[email protected]>
[ Upstream commit 60705c89460fdc7227f2d153b68b3f34814738a4 ]
Special preds are created when folding a series of preds that can be done in serial. These are allocated in an ops field of the pred structure. But they were never freed, causing memory leaks.
This was discovered using the kmemleak checker:
unreferenced object 0xffff8800797fd5e0 (size 32):
comm "swapper/0", pid 1, jiffies 4294690605 (age 104.608s) hex dump (first 32 bytes):
00 00 01 00 03 00 05 00 07 00 09 00 0b 00 0d 00 ................
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
backtrace:
[<ffffffff814b52af>] kmemleak_alloc+0x73/0x98
[<ffffffff8111ff84>] kmemleak_alloc_recursive.constprop.42+0x16/0x18
[<ffffffff81120e68>] __kmalloc+0xd7/0x125
[<ffffffff810d47eb>] kcalloc.constprop.24+0x2d/0x2f
[<ffffffff810d4896>] fold_pred_tree_cb+0xa9/0xf4
[<ffffffff810d3781>] walk_pred_tree+0x47/0xcc
[<ffffffff810d5030>] replace_preds.isra.20+0x6f8/0x72f
[<ffffffff810d50b5>] create_filter+0x4e/0x8b
[<ffffffff81b1c30d>] ftrace_test_event_filter+0x5a/0x155
[<ffffffff8100028d>] do_one_initcall+0xa0/0x137
[<ffffffff81afbedf>] kernel_init_freeable+0x14d/0x1dc
[<ffffffff814b24b7>] kernel_init+0xe/0xdb
[<ffffffff814d539c>] ret_from_fork+0x7c/0xb0
[<ffffffffffffffff>] 0xffffffffffffffff--- kernel/trace/trace_events_filter.c | 4 ++++ 1 file changed, 4 insertions(+)
kernel/trace/trace_events_filter.c +4 -0
@@ -777,7 +777,11 @@ static int filter_set_pred(struct event_filter *filter,static void __free_preds (struct event_filter *filter) { +int i; +if (filter->preds) { +for (i =0 ; i < filter->n_preds; i++) +kfree (filter->preds[i].ops);kfree (filter->preds); filter->preds =NULL ; }
Signature · 1 line
1.7.10.4
Steven Rostedt
maintainerPATCH 17/65 ext4: limit group search loop for non-extent files
In reply to Steven Rostedt3.6.11.5 stable review patch.
If anyone has any objections, please let me know.
------------------
From: Lachlan McIlroy <[email protected]>
[ Upstream commit e6155736ad76b2070652745f9e54cdea3f0d8567 ]
In the case where we are allocating for a non-extent file, we must limit the groups we allocate from to those below 2^32 blocks, and ext4_mb_regular_allocator() attempts to do this initially by putting a cap on ngroups for the subsequent search loop.
However, the initial target group comes in from the allocation context (ac), and it may already be beyond the artificially limited ngroups. In this case, the limit
if (group == ngroups) group = 0;
at the top of the loop is never true, and the loop will run away.
Catch this case inside the loop and reset the search to start at group 0.
[[email protected]: add commit msg & comments]
--- fs/ext4/mballoc.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
fs/ext4/mballoc.c +5 -1
@@ -1979,7 +1979,11 @@ repeat: group = ac->ac_g_ex.fe_group;for (i =0 ; i < ngroups; group++, i++) { -if (group == ngroups) +/* +* Artificially restricted ngroups for non-extent +* files makes group > ngroups possible on first loop. +*/ +if (group >= ngroups) group =0 ;/* This now checks without needing the buddy page */
Signature · 1 line
1.7.10.4
Steven Rostedt
maintainerPATCH 18/65 ARM: 7720/1: ARM v6/v7 cmpxchg64 shouldnt clear upper 32 bits of the old/new value
In reply to Steven Rostedt3.6.11.5 stable review patch.
If anyone has any objections, please let me know.
------------------
From: Jaccon Bastiaansen <[email protected]>
[ Upstream commit 6eabb3301b1facee669d9938f7c5a0295c21d71d ]
The implementation of cmpxchg64() for the ARM v6 and v7 architecture casts parameter 2 and 3 (the old and new 64bit values) to an unsigned long before calling the atomic_cmpxchg64() function. This clears the top 32 bits of the old and new values, resulting in the wrong values being compare-exchanged. Luckily, this only appears to be used for 64-bit sched_clock, which we don't (yet) have on ARM.
This bug was introduced by commit 3e0f5a15f500 ("ARM: 7404/1: cmpxchg64:
use atomic64 and local64 routines for cmpxchg64").
--- arch/arm/include/asm/cmpxchg.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
arch/arm/include/asm/cmpxchg.h +4 -4
@@ -233,15 +233,15 @@ static inline unsigned long __cmpxchg_local(volatile void *ptr, ((__typeof__ (*(ptr )))atomic64_cmpxchg (container_of ((ptr), \ atomic64_t, \ counter), \ - (unsigned long )(o), \ - (unsigned long)(n))) + (unsigned long long )(o), \ + (unsigned long long)(n)))#define cmpxchg64_local (ptr, o, n) \ ((__typeof__(*(ptr)))local64_cmpxchg(container_of((ptr), \ local64_t, \ a), \ - (unsigned long)(o), \ - (unsigned long)(n))) + (unsigned long long)(o), \ + (unsigned long long)(n)))#endif /* __LINUX_ARM_ARCH__ >= 6 */
Signature · 1 line
1.7.10.4
Steven Rostedt
maintainerPATCH 19/65 powerpc: Bring all threads online prior to migration/hibernation
In reply to Steven Rostedt3.6.11.5 stable review patch.
If anyone has any objections, please let me know.
------------------
From: Robert Jennings <[email protected]>
[ Upstream commit 120496ac2d2d60aee68d3123a68169502a85f4b5 ]
This patch brings online all threads which are present but not online prior to migration/hibernation. After migration/hibernation those threads are taken back offline.
During migration/hibernation all online CPUs must call H_JOIN, this is required by the hypervisor. Without this patch, threads that are offline (H_CEDE'd) will not be woken to make the H_JOIN call and the OS will be deadlocked (all threads either JOIN'd or CEDE'd).
--- arch/powerpc/include/asm/rtas.h | 2 + arch/powerpc/kernel/rtas.c | 113 ++++++++++++++++++++++++++++++ arch/powerpc/platforms/pseries/suspend.c | 22 ++++++ 3 files changed, 137 insertions(+)
arch/powerpc/include/asm/rtas.h +2 -0
@@ -262,6 +262,8 @@ extern void rtas_progress(char *s, unsigned short hex);extern void rtas_initialize (void );extern int rtas_suspend_cpu (struct rtas_suspend_me_data *data);extern int rtas_suspend_last_cpu (struct rtas_suspend_me_data *data); +extern int rtas_online_cpus_mask (cpumask_var_t cpus); +extern int rtas_offline_cpus_mask (cpumask_var_t cpus);extern int rtas_ibm_suspend_me (struct rtas_args *);struct rtc_time ;
arch/powerpc/kernel/rtas.c +113 -0
148 lines not on this page · raw message
arch/powerpc/platforms/pseries/suspend.c +22 -0
@@ -16,6 +16,7 @@* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +#include <linux/cpu.h> #include <linux/delay.h> #include <linux/suspend.h> #include <linux/stat.h>
@@ -126,11 +127,15 @@ static ssize_t store_hibernate(struct device *dev,struct device_attribute *attr, const char *buf, size_t count) { + cpumask_var_t offline_mask;int rc;if (!capable (CAP_SYS_ADMIN ))return -EPERM ; +if (!alloc_cpumask_var (&offline_mask,GFP_TEMPORARY )) +return -ENOMEM ; + stream_id =simple_strtoul (buf,NULL ,16 ); do {
@@ -140,15 +145,32 @@ static ssize_t store_hibernate(struct device *dev, }while (rc == -EAGAIN );if (!rc) { +/* All present CPUs must be online */ +cpumask_andnot (offline_mask, cpu_present_mask, + cpu_online_mask); + rc =rtas_online_cpus_mask (offline_mask); +if (rc) { +pr_err ("%s: Could not bring present CPUs online.\n" , + __func__); + goto out; + } +stop_topology_update (); rc =pm_suspend (PM_SUSPEND_MEM );start_topology_update (); + +/* Take down CPUs not online prior to suspend */ +if (!rtas_offline_cpus_mask (offline_mask)) +pr_warn ("%s: Could not restore CPUs to offline " +"state.\n" , __func__); } stream_id =0 ;if (!rc) rc = count; +out: +free_cpumask_var (offline_mask);return rc; }
Signature · 1 line
1.7.10.4
Steven Rostedt
maintainerPATCH 20/65 powerpc/kexec: Fix kexec when using VMX optimised memcpy
In reply to Steven Rostedt3.6.11.5 stable review patch.
If anyone has any objections, please let me know.
------------------
From: Anton Blanchard <[email protected]>
[ Upstream commit 79c66ce8f6448a3295a32efeac88c9debd7f7094 ]
commit b3f271e86e5a (powerpc: POWER7 optimised memcpy using VMX and enhanced prefetch) uses VMX when it is safe to do so (ie not in interrupt). It also looks at the task struct to decide if we have to save the current tasks' VMX state.
kexec calls memcpy() at a point where the task struct may have been overwritten by the new kexec segments. If it has been overwritten then when memcpy -> enable_altivec looks up current->thread.regs->msr we get a cryptic oops or lockup.
I also notice we aren't initialising thread_info->cpu, which means smp_processor_id is broken. Fix that too.
--- arch/powerpc/kernel/machine_kexec_64.c | 4 ++++ 1 file changed, 4 insertions(+)
arch/powerpc/kernel/machine_kexec_64.c +4 -0
@@ -17,6 +17,7 @@#include <linux/errno.h> #include <linux/kernel.h> #include <linux/cpu.h> +#include <linux/hardirq.h> #include <asm/page.h> #include <asm/current.h>
@@ -330,10 +331,13 @@ void default_machine_kexec(struct kimage *image)pr_debug ("kexec: Starting switchover sequence.\n" );/* switch to a staticly allocated stack. Based on irq stack code. +* We setup preempt_count to avoid using VMX in memcpy. * XXX: the task struct will likely be invalid once we do the copy! */ kexec_stack.thread_info.task =current_thread_info ()->task; kexec_stack.thread_info.flags =0 ; + kexec_stack.thread_info.preempt_count =HARDIRQ_OFFSET ; + kexec_stack.thread_info.cpu =current_thread_info ()->cpu;/* We need a static PACA, too; copy this CPU's PACA over and switch to * it. Also poison per_cpu_offset to catch anyone using non-static
Signature · 1 line
1.7.10.4
Steven Rostedt
maintainerPATCH 21/65 ath9k: fix key allocation error handling for powersave keys
In reply to Steven Rostedt3.6.11.5 stable review patch.
If anyone has any objections, please let me know.
------------------
From: Felix Fietkau <[email protected]>
[ Upstream commit 4ef69d0394cba8caa9f75d3f2e53429bfb8b3045 ]
If no keycache slots are available, ath_key_config can return -ENOSPC. If the key index is not checked for errors, it can lead to logspam that looks like this: "ath: wiphy0: keyreset: keycache entry 228 out of range" This can cause follow-up errors if the invalid keycache index gets used for tx.
--- drivers/net/wireless/ath/ath9k/main.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
drivers/net/wireless/ath/ath9k/main.c +5 -1
@@ -1292,6 +1292,7 @@ static int ath9k_sta_add(struct ieee80211_hw *hw,struct ath_common *common =ath9k_hw_common (sc->sc_ah);struct ath_node *an = (struct ath_node *) sta->drv_priv;struct ieee80211_key_conf ps_key = { }; +int key;ath_node_attach (sc, sta, vif);
@@ -1299,7 +1300,9 @@ static int ath9k_sta_add(struct ieee80211_hw *hw, vif->type != NL80211_IFTYPE_AP_VLAN)return 0 ; - an->ps_key =ath_key_config (common, vif, sta, &ps_key); + key =ath_key_config (common, vif, sta, &ps_key); +if (key >0 ) + an->ps_key = key;return 0 ; }
@@ -1316,6 +1319,7 @@ static void ath9k_del_ps_key(struct ath_softc *sc,return ;ath_key_delete (common, &ps_key); + an->ps_key =0 ; } static int ath9k_sta_remove(struct ieee80211_hw *hw,
Signature · 1 line
1.7.10.4
Steven Rostedt
maintainerPATCH 22/65 mwifiex: clear is_suspended flag when interrupt is received early
In reply to Steven Rostedt3.6.11.5 stable review patch.
If anyone has any objections, please let me know.
------------------
From: Bing Zhao <[email protected]>
[ Upstream commit 48795424acff7215d5eac0b52793a2c1eb3a6283 ]
When the XO-4 with 8787 wireless is woken up due to wake-on-WLAN mwifiex is often flooded with "not allowed while suspended" messages and the interface is unusable.
[ 202.171609] int: sdio_ireg = 0x1
[ 202.180700] info: mwifiex_process_hs_config: auto cancelling host
sleep since there is interrupt from the firmware
[ 202.201880] event: wakeup device...
[ 202.211452] event: hs_deactivated
[ 202.514638] info: --- Rx: Data packet ---
[ 202.514753] data: 4294957544 BSS(0-0): Data <= kernel
[ 202.514825] PREP_CMD: device in suspended state
[ 202.514839] data: dequeuing the packet ec7248c0 ec4869c0
[ 202.514886] mwifiex_write_data_sync: not allowed while suspended
[ 202.514886] host_to_card, write iomem (1) failed: -1
[ 202.514917] mwifiex_write_data_sync: not allowed while suspended
[ 202.514936] host_to_card, write iomem (2) failed: -1
[ 202.514949] mwifiex_write_data_sync: not allowed while suspended
[ 202.514965] host_to_card, write iomem (3) failed: -1
[ 202.514976] mwifiex_write_data_async failed: 0xFFFFFFFFThis can be readily reproduced when putting the XO-4 in a loop where it goes to sleep due to inactivity, but then wakes up due to an incoming ping. The error is hit within an hour or two.
This issue happens when an interrupt comes in early while host sleep is still activated. Driver handles this case by auto cancelling host sleep. However is_suspended flag is still set which prevents any cmd or data from being sent to firmware. Fix it by clearing is_suspended flag in this path.
--- drivers/net/wireless/mwifiex/cmdevt.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/wireless/mwifiex/cmdevt.c +1 -0
@@ -1159,6 +1159,7 @@ mwifiex_process_hs_config(struct mwifiex_adapter *adapter) adapter->if_ops.wakeup (adapter); adapter->hs_activated = false; adapter->is_hs_configured = false; + adapter->is_suspended = false;mwifiex_hs_activated_event (mwifiex_get_priv (adapter,MWIFIEX_BSS_ROLE_ANY ), false);
Signature · 1 line
1.7.10.4
Steven Rostedt
maintainerPATCH 23/65 mwifiex: fix memory leak issue when driver unload
In reply to Steven Rostedt3.6.11.5 stable review patch.
If anyone has any objections, please let me know.
------------------
From: Amitkumar Karwar <[email protected]>
[ Upstream commit f16fdc9d2dc1e5b270e9a08377587e831e0d36ac ]
After unregister_netdevice() call the request is queued and reg_state is changed to NETREG_UNREGISTERING.
As we check for NETREG_UNREGISTERED state, free_netdev() never gets executed causing memory leak.
Initialize "dev->destructor" to free_netdev() to free device data after unregistration.
--- drivers/net/wireless/mwifiex/cfg80211.c | 3 --- drivers/net/wireless/mwifiex/main.c | 1 + 2 files changed, 1 insertion(+), 3 deletions(-)
drivers/net/wireless/mwifiex/cfg80211.c +0 -3
@@ -1741,9 +1741,6 @@ int mwifiex_del_virtual_intf(struct wiphy *wiphy, struct wireless_dev *wdev)if (wdev->netdev->reg_state ==NETREG_REGISTERED )unregister_netdevice (wdev->netdev); -if (wdev->netdev->reg_state ==NETREG_UNREGISTERED ) -free_netdev (wdev->netdev); -/* Clear the priv in adapter */ priv->netdev =NULL ;
drivers/net/wireless/mwifiex/main.c +1 -0
@@ -637,6 +637,7 @@ void mwifiex_init_priv_params(struct mwifiex_private *priv, struct net_device *dev) { dev->netdev_ops = &mwifiex_netdev_ops; + dev->destructor = free_netdev;/* Initialize private structure */ priv->current_key_index =0 ; priv->media_connected = false;
Signature · 1 line
1.7.10.4
Steven Rostedt
maintainerPATCH 24/65 mwifiex: fix setting of multicast filter
In reply to Steven Rostedt3.6.11.5 stable review patch.
If anyone has any objections, please let me know.
------------------
From: Daniel Drake <[email protected]>
[ Upstream commit ccd384b10420ac81ba3fb9b0a7d18272c7173552 ]
A small bug in this code was causing the ALLMULTI filter to be set when in fact we were just wanting to program a selective multicast list to the hardware.
Fix that bug and remove a redundant if condition in the code that follows.
This fixes wakeup behaviour when multicast WOL is enabled. Previously, all multicast packets would wake up the system. Now, only those that the host intended to receive trigger wakeups.
--- drivers/net/wireless/mwifiex/sta_ioctl.c | 21 ++++++--------------- 1 file changed, 6 insertions(+), 15 deletions(-)
drivers/net/wireless/mwifiex/sta_ioctl.c +6 -15
@@ -106,7 +106,7 @@ int mwifiex_request_set_multicast_list(struct mwifiex_private *priv, }else {/* Multicast */ priv->curr_pkt_filter &= ~HostCmd_ACT_MAC_PROMISCUOUS_ENABLE; -if (mcast_list->mode ==MWIFIEX_MULTICAST_MODE ) { +if (mcast_list->mode ==MWIFIEX_ALL_MULTI_MODE ) {dev_dbg (priv->adapter->dev,"info: Enabling All Multicast!\n" ); priv->curr_pkt_filter |=
@@ -118,20 +118,11 @@ int mwifiex_request_set_multicast_list(struct mwifiex_private *priv,dev_dbg (priv->adapter->dev,"info: Set multicast list=%d\n" , mcast_list->num_multicast_addr); -/* Set multicast addresses to firmware */ -if (old_pkt_filter == priv->curr_pkt_filter) { -/* Send request to firmware */ - ret =mwifiex_send_cmd_async (priv, - HostCmd_CMD_MAC_MULTICAST_ADR, - HostCmd_ACT_GEN_SET,0 , - mcast_list); - }else { -/* Send request to firmware */ - ret =mwifiex_send_cmd_async (priv, - HostCmd_CMD_MAC_MULTICAST_ADR, - HostCmd_ACT_GEN_SET,0 , - mcast_list); - } +/* Send multicast addresses to firmware */ + ret =mwifiex_send_cmd_async (priv, + HostCmd_CMD_MAC_MULTICAST_ADR, + HostCmd_ACT_GEN_SET,0 , + mcast_list); } } }
Signature · 1 line
1.7.10.4
Steven Rostedt
maintainerPATCH 25/65 tile: support new Tilera hypervisor
In reply to Steven Rostedt3.6.11.5 stable review patch.
If anyone has any objections, please let me know.
------------------
From: Chris Metcalf <[email protected]>
[ Upstream commit c539914dcd9a68c63305e055b14115a6a19578a8 ]
The Tilera hypervisor shipped in releases up through MDE 4.1 launches the client operating system (i.e. Linux) at privilege level 1 (PL1). Starting with MDE 4.2, as part of the work to enable KVM, the Tilera hypervisor launches Linux at PL2 instead.
This commit makes the KERNEL_PL option default to 2 for tilegx, while still saying at 1 for tilepro, which doesn't have an updated hypervisor. It also explains how and when you might want to choose another value. In addition, we change a small buglet in the on-chip Ethernet driver, where we were failing to use the KERNEL_PL constant in an API call.
To make the transition cleaner, this change also provides the updated hv_init() API for the new hypervisor that supports announcing Linux's compiled-in PL, so the hypervisor can generate a suitable error in the case of a mismatched hypervisor and Linux binary.
--- arch/tile/Kconfig | 14 ++++++++++---- arch/tile/include/hv/hypervisor.h | 27 ++++++++++++++++++++++++--- arch/tile/kernel/head_32.S | 2 +- arch/tile/kernel/head_64.S | 12 +++++++++--- drivers/net/ethernet/tile/tilegx.c | 2 +- 5 files changed, 45 insertions(+), 12 deletions(-)
arch/tile/Kconfig +10 -4
@@ -360,11 +360,17 @@ config HARDWALL config KERNEL_PL int "Processor protection level for kernel" range 1 2 - default "1" + default 2 if TILEGX + default 1 if !TILEGX ---help--- - This setting determines the processor protection level the - kernel will be built to run at. Generally you should use - the default value here. + Since MDE 4.2, the Tilera hypervisor runs the kernel + at PL2 by default. If running under an older hypervisor, + or as a KVM guest, you must run at PL1. (The current + hypervisor may also be recompiled with "make HV_PL=2" to + allow it to run a kernel at PL1, but clients running at PL1 + are not expected to be supported indefinitely.) + + If you're not sure, don't change the default. source "arch/tile/gxio/Kconfig"
arch/tile/include/hv/hypervisor.h +24 -3
@@ -107,7 +107,22 @@#define HV_DISPATCH_ENTRY_SIZE 32/** Version of the hypervisor interface defined by this file */ -#define _HV_VERSION 11 +#define _HV_VERSION 13 + +/** Last version of the hypervisor interface with old hv_init() ABI. +* +* The change from version 12 to version 13 corresponds to launching +* the client by default at PL2 instead of PL1 (corresponding to the +* hv itself running at PL3 instead of PL2). To make this explicit, +* the hv_init() API was also extended so the client can report its +* desired PL, resulting in a more helpful failure diagnostic. If you +* call hv_init() with _HV_VERSION_OLD_HV_INIT and omit the client_pl +* argument, the hypervisor will assume client_pl = 1. +* +* Note that this is a deprecated solution and we do not expect to +* support clients of the Tilera hypervisor running at PL1 indefinitely. +*/ +#define _HV_VERSION_OLD_HV_INIT 12/* Index into hypervisor interface dispatch code blocks. *
@@ -377,7 +392,11 @@ typedef int HV_Errno;#ifndef __ASSEMBLER__/** Pass HV_VERSION to hv_init to request this version of the interface. */ -typedef enum {HV_VERSION = _HV_VERSION }HV_VersionNumber ; +typedef enum { +HV_VERSION = _HV_VERSION, +HV_VERSION_OLD_HV_INIT = _HV_VERSION_OLD_HV_INIT, + +}HV_VersionNumber ;/** Initializes the hypervisor. *
@@ -385,9 +404,11 @@ typedef enum { HV_VERSION = _HV_VERSION } HV_VersionNumber;* that this program expects, typically HV_VERSION. * @param chip_num Architecture number of the chip the client was built for. * @param chip_rev_num Revision number of the chip the client was built for. +* @param client_pl Privilege level the client is built for +* (not required if interface_version_number == HV_VERSION_OLD_HV_INIT). */ void hv_init (HV_VersionNumber interface_version_number, -int chip_num,int chip_rev_num); +int chip_num,int chip_rev_num,int client_pl);/** Queries we can make for hv_sysconf().
arch/tile/kernel/head_32.S +1 -1
@@ -38,7 +38,7 @@ ENTRY(_start) movei r2, TILE_CHIP_REV } { - moveli r0, _HV_VERSION + moveli r0, _HV_VERSION_OLD_HV_INIT jal hv_init } /* Get a reasonable default ASID in r0 */
arch/tile/kernel/head_64.S +9 -3
@@ -34,13 +34,19 @@ ENTRY(_start) /* Notify the hypervisor of what version of the API we want */ { +#if KERNEL_PL == 1 && _HV_VERSION == 13 + /* Support older hypervisors by asking for API version 12. */ + movei r0, _HV_VERSION_OLD_HV_INIT +#else + movei r0, _HV_VERSION +#endif movei r1, TILE_CHIP - movei r2, TILE_CHIP_REV } { - moveli r0, _HV_VERSION - jal hv_init + movei r2, TILE_CHIP_REV + movei r3, KERNEL_PL } + jal hv_init /* Get a reasonable default ASID in r0 */ { move r0, zero
drivers/net/ethernet/tile/tilegx.c +1 -1
@@ -930,7 +930,7 @@ static int tile_net_setup_interrupts(struct net_device *dev)if (info->has_iqueue) {gxio_mpipe_request_notif_ring_interrupt ( &context,cpu_x (cpu),cpu_y (cpu), -1 , ingress_irq, info->iqueue.ring); +KERNEL_PL , ingress_irq, info->iqueue.ring); } }
Signature · 1 line
1.7.10.4
Steven Rostedt
maintainerPATCH 26/65 B43: Handle DMA RX descriptor underrun
In reply to Steven Rostedt3.6.11.5 stable review patch.
If anyone has any objections, please let me know.
------------------
From: Thommy Jakobsson <[email protected]>
[ Upstream commit 73b82bf0bfbf58e6ff328d3726934370585f6e78 ]
Add handling of rx descriptor underflow. This fixes a fault that could happen on slow machines, where data is received faster than the CPU can handle. In such a case the device will use up all rx descriptors and refuse to send any more data before confirming that it is ok. This patch enables necessary interrupt to discover such a situation and will handle them by dropping everything in the ring buffer.
--- drivers/net/wireless/b43/dma.c | 19 +++++++++++++++++ drivers/net/wireless/b43/dma.h | 4 +++- drivers/net/wireless/b43/main.c | 43 ++++++++++++++++----------------------- 3 files changed, 40 insertions(+), 26 deletions(-)
drivers/net/wireless/b43/dma.c +19 -0
@@ -1730,6 +1730,25 @@ drop_recycle_buffer:sync_descbuffer_for_device (ring, dmaaddr, ring->rx_buffersize); } +void b43_dma_handle_rx_overflow (struct b43_dmaring *ring) +{ +int current_slot, previous_slot; + +B43_WARN_ON (ring->tx); + +/* Device has filled all buffers, drop all packets and let TCP +* decrease speed. +* Decrement RX index by one will let the device to see all slots +* as free again +*/ +/* +*TODO: How to increase rx_drop in mac80211? +*/ + current_slot = ring->ops->get_current_rxslot (ring); + previous_slot =prev_slot (ring, current_slot); + ring->ops->set_current_rxslot (ring, previous_slot); +} +void b43_dma_rx (struct b43_dmaring *ring) {const struct b43_dma_ops *ops = ring->ops;
drivers/net/wireless/b43/dma.h +3 -1
@@ -9,7 +9,7 @@/* DMA-Interrupt reasons. */ #define B43_DMAIRQ_FATALMASK ((1 << 10) | (1 << 11) | (1 << 12) \ | (1 << 14) | (1 << 15)) -#define B43_DMAIRQ_NONFATALMASK (1 << 13) +#define B43_DMAIRQ_RDESC_UFLOW (1 << 13)#define B43_DMAIRQ_RX_DONE (1 << 16)/*** 32-bit DMA Engine. ***/
@@ -295,6 +295,8 @@ int b43_dma_tx(struct b43_wldev *dev,void b43_dma_handle_txstatus (struct b43_wldev *dev,const struct b43_txstatus *status); +void b43_dma_handle_rx_overflow (struct b43_dmaring *ring); +void b43_dma_rx (struct b43_dmaring *ring); void b43_dma_direct_fifo_rx(struct b43_wldev *dev,
drivers/net/wireless/b43/main.c +18 -25
68 lines not on this page · raw message
Signature · 1 line
1.7.10.4
Steven Rostedt
maintainerPATCH 27/65 drm/mgag200: Fix writes into MGA1064_PIX_CLK_CTL register
In reply to Steven Rostedt3.6.11.5 stable review patch.
If anyone has any objections, please let me know.
------------------
From: Christopher Harvey <[email protected]>
[ Upstream commit fb70a6690875315a3a1454e52fa339441ee7612b ]
The original line,
WREG_DAC(MGA1064_PIX_CLK_CTL_CLK_DIS, tmp);
wrote tmp into MGA1064_PIX_CLK_CTL_CLK_DIS, where MGA1064_PIX_CLK_CTL_CLK_DIS is an offset into MGA1064_PIX_CLK_CTL. Change the line to write properly into MGA1064_PIX_CLK_CTL. There were other chunks of code nearby that use the same pattern (but work correctly), so this patch updates them all to use this new (slightly more efficient) write pattern. The WREG_DAC macro was causing the DAC_INDEX register to be set to the same value twice. WREG8(DAC_DATA, foo) takes advantage of the fact that DAC_INDEX is already at the value we want.
--- drivers/gpu/drm/mgag200/mgag200_mode.c | 42 ++++++++++++++++---------------- 1 file changed, 21 insertions(+), 21 deletions(-)
drivers/gpu/drm/mgag200/mgag200_mode.c +21 -21
@@ -190,12 +190,12 @@ static int mga_g200wb_set_plls(struct mga_device *mdev, long clock)WREG8 (DAC_INDEX ,MGA1064_PIX_CLK_CTL ); tmp =RREG8 (DAC_DATA ); tmp |=MGA1064_PIX_CLK_CTL_CLK_DIS ; -WREG_DAC (MGA1064_PIX_CLK_CTL_CLK_DIS , tmp); +WREG8 (DAC_DATA , tmp);WREG8 (DAC_INDEX ,MGA1064_REMHEADCTL ); tmp =RREG8 (DAC_DATA ); tmp |=MGA1064_REMHEADCTL_CLKDIS ; -WREG_DAC (MGA1064_REMHEADCTL , tmp); +WREG8 (DAC_DATA , tmp);/* select PLL Set C */ tmp =RREG8 (MGAREG_MEM_MISC_READ );
@@ -205,7 +205,7 @@ static int mga_g200wb_set_plls(struct mga_device *mdev, long clock)WREG8 (DAC_INDEX ,MGA1064_PIX_CLK_CTL ); tmp =RREG8 (DAC_DATA ); tmp |=MGA1064_PIX_CLK_CTL_CLK_POW_DOWN |0x80 ; -WREG_DAC (MGA1064_PIX_CLK_CTL , tmp); +WREG8 (DAC_DATA , tmp);udelay (500 );
@@ -213,7 +213,7 @@ static int mga_g200wb_set_plls(struct mga_device *mdev, long clock)WREG8 (DAC_INDEX ,MGA1064_VREF_CTL ); tmp =RREG8 (DAC_DATA ); tmp &= ~0x04 ; -WREG_DAC (MGA1064_VREF_CTL , tmp); +WREG8 (DAC_DATA , tmp);udelay (50 );
@@ -237,13 +237,13 @@ static int mga_g200wb_set_plls(struct mga_device *mdev, long clock) tmp =RREG8 (DAC_DATA ); tmp &= ~MGA1064_PIX_CLK_CTL_SEL_MSK ; tmp |=MGA1064_PIX_CLK_CTL_SEL_PLL ; -WREG_DAC (MGA1064_PIX_CLK_CTL , tmp); +WREG8 (DAC_DATA , tmp);WREG8 (DAC_INDEX ,MGA1064_REMHEADCTL ); tmp =RREG8 (DAC_DATA ); tmp &= ~MGA1064_REMHEADCTL_CLKSL_MSK ; tmp |=MGA1064_REMHEADCTL_CLKSL_PLL ; -WREG_DAC (MGA1064_REMHEADCTL , tmp); +WREG8 (DAC_DATA , tmp);/* reset dotclock rate bit */ WREG8 (MGAREG_SEQ_INDEX ,1 );
@@ -254,7 +254,7 @@ static int mga_g200wb_set_plls(struct mga_device *mdev, long clock)WREG8 (DAC_INDEX ,MGA1064_PIX_CLK_CTL ); tmp =RREG8 (DAC_DATA ); tmp &= ~MGA1064_PIX_CLK_CTL_CLK_DIS ; -WREG_DAC (MGA1064_PIX_CLK_CTL , tmp); +WREG8 (DAC_DATA , tmp); vcount =RREG8 (MGAREG_VCOUNT );
@@ -319,7 +319,7 @@ static int mga_g200ev_set_plls(struct mga_device *mdev, long clock)WREG8 (DAC_INDEX ,MGA1064_PIX_CLK_CTL ); tmp =RREG8 (DAC_DATA ); tmp |=MGA1064_PIX_CLK_CTL_CLK_DIS ; -WREG_DAC (MGA1064_PIX_CLK_CTL_CLK_DIS , tmp); +WREG8 (DAC_DATA , tmp); tmp =RREG8 (MGAREG_MEM_MISC_READ ); tmp |=0x3 <<2 ;
@@ -327,12 +327,12 @@ static int mga_g200ev_set_plls(struct mga_device *mdev, long clock)WREG8 (DAC_INDEX ,MGA1064_PIX_PLL_STAT ); tmp =RREG8 (DAC_DATA ); -WREG_DAC (MGA1064_PIX_PLL_STAT , tmp & ~0x40 ); +WREG8 (DAC_DATA , tmp & ~0x40 );WREG8 (DAC_INDEX ,MGA1064_PIX_CLK_CTL ); tmp =RREG8 (DAC_DATA ); tmp |=MGA1064_PIX_CLK_CTL_CLK_POW_DOWN ; -WREG_DAC (MGA1064_PIX_CLK_CTL , tmp); +WREG8 (DAC_DATA , tmp);WREG_DAC (MGA1064_EV_PIX_PLLC_M , m);WREG_DAC (MGA1064_EV_PIX_PLLC_N , n);
@@ -343,7 +343,7 @@ static int mga_g200ev_set_plls(struct mga_device *mdev, long clock)WREG8 (DAC_INDEX ,MGA1064_PIX_CLK_CTL ); tmp =RREG8 (DAC_DATA ); tmp &= ~MGA1064_PIX_CLK_CTL_CLK_POW_DOWN ; -WREG_DAC (MGA1064_PIX_CLK_CTL , tmp); +WREG8 (DAC_DATA , tmp);udelay (500 );
@@ -351,11 +351,11 @@ static int mga_g200ev_set_plls(struct mga_device *mdev, long clock) tmp =RREG8 (DAC_DATA ); tmp &= ~MGA1064_PIX_CLK_CTL_SEL_MSK ; tmp |=MGA1064_PIX_CLK_CTL_SEL_PLL ; -WREG_DAC (MGA1064_PIX_CLK_CTL , tmp); +WREG8 (DAC_DATA , tmp);WREG8 (DAC_INDEX ,MGA1064_PIX_PLL_STAT ); tmp =RREG8 (DAC_DATA ); -WREG_DAC (MGA1064_PIX_PLL_STAT , tmp |0x40 ); +WREG8 (DAC_DATA , tmp |0x40 ); tmp =RREG8 (MGAREG_MEM_MISC_READ ); tmp |= (0x3 <<2 );
@@ -364,7 +364,7 @@ static int mga_g200ev_set_plls(struct mga_device *mdev, long clock)WREG8 (DAC_INDEX ,MGA1064_PIX_CLK_CTL ); tmp =RREG8 (DAC_DATA ); tmp &= ~MGA1064_PIX_CLK_CTL_CLK_DIS ; -WREG_DAC (MGA1064_PIX_CLK_CTL , tmp); +WREG8 (DAC_DATA , tmp);return 0 ; }
@@ -417,7 +417,7 @@ static int mga_g200eh_set_plls(struct mga_device *mdev, long clock)WREG8 (DAC_INDEX ,MGA1064_PIX_CLK_CTL ); tmp =RREG8 (DAC_DATA ); tmp |=MGA1064_PIX_CLK_CTL_CLK_DIS ; -WREG_DAC (MGA1064_PIX_CLK_CTL_CLK_DIS , tmp); +WREG8 (DAC_DATA , tmp); tmp =RREG8 (MGAREG_MEM_MISC_READ ); tmp |=0x3 <<2 ;
@@ -426,7 +426,7 @@ static int mga_g200eh_set_plls(struct mga_device *mdev, long clock)WREG8 (DAC_INDEX ,MGA1064_PIX_CLK_CTL ); tmp =RREG8 (DAC_DATA ); tmp |=MGA1064_PIX_CLK_CTL_CLK_POW_DOWN ; -WREG_DAC (MGA1064_PIX_CLK_CTL , tmp); +WREG8 (DAC_DATA , tmp);udelay (500 );
@@ -440,13 +440,13 @@ static int mga_g200eh_set_plls(struct mga_device *mdev, long clock) tmp =RREG8 (DAC_DATA ); tmp &= ~MGA1064_PIX_CLK_CTL_SEL_MSK ; tmp |=MGA1064_PIX_CLK_CTL_SEL_PLL ; -WREG_DAC (MGA1064_PIX_CLK_CTL , tmp); +WREG8 (DAC_DATA , tmp);WREG8 (DAC_INDEX ,MGA1064_PIX_CLK_CTL ); tmp =RREG8 (DAC_DATA ); tmp &= ~MGA1064_PIX_CLK_CTL_CLK_DIS ; tmp &= ~MGA1064_PIX_CLK_CTL_CLK_POW_DOWN ; -WREG_DAC (MGA1064_PIX_CLK_CTL , tmp); +WREG8 (DAC_DATA , tmp); vcount =RREG8 (MGAREG_VCOUNT );
@@ -516,12 +516,12 @@ static int mga_g200er_set_plls(struct mga_device *mdev, long clock)WREG8 (DAC_INDEX ,MGA1064_PIX_CLK_CTL ); tmp =RREG8 (DAC_DATA ); tmp |=MGA1064_PIX_CLK_CTL_CLK_DIS ; -WREG_DAC (MGA1064_PIX_CLK_CTL_CLK_DIS , tmp); +WREG8 (DAC_DATA , tmp);WREG8 (DAC_INDEX ,MGA1064_REMHEADCTL ); tmp =RREG8 (DAC_DATA ); tmp |=MGA1064_REMHEADCTL_CLKDIS ; -WREG_DAC (MGA1064_REMHEADCTL , tmp); +WREG8 (DAC_DATA , tmp); tmp =RREG8 (MGAREG_MEM_MISC_READ ); tmp |= (0x3 <<2 ) |0xc0 ;
@@ -531,7 +531,7 @@ static int mga_g200er_set_plls(struct mga_device *mdev, long clock) tmp =RREG8 (DAC_DATA ); tmp &= ~MGA1064_PIX_CLK_CTL_CLK_DIS ; tmp |=MGA1064_PIX_CLK_CTL_CLK_POW_DOWN ; -WREG_DAC (MGA1064_PIX_CLK_CTL , tmp); +WREG8 (DAC_DATA , tmp);udelay (500 );
Signature · 1 line
1.7.10.4
Steven Rostedt
maintainerPATCH 28/65 drm/mgag200: Fix framebuffer base address programming
In reply to Steven Rostedt3.6.11.5 stable review patch.
If anyone has any objections, please let me know.
------------------
From: Christopher Harvey <[email protected]>
[ Upstream commit 9f1d036648c1c5ed81b0e98d7a06d55df972701e ]
Higher bits of the base address of framebuffers weren't being programmed properly. This caused framebuffers that didn't happen to be allocated at a low enough address to not be displayed properly.
--- drivers/gpu/drm/mgag200/mgag200_mode.c | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-)
drivers/gpu/drm/mgag200/mgag200_mode.c +24 -3
@@ -658,12 +658,26 @@ static void mga_g200wb_commit(struct drm_crtc *crtc)WREG_DAC (MGA1064_GEN_IO_DATA , tmp); } - +/* +This is how the framebuffer base address is stored in g200 cards: +* Assume @offset is the gpu_addr variable of the framebuffer object +* Then addr is the number of _pixels_ (not bytes) from the start of +VRAM to the first pixel we want to display. (divided by 2 for 32bit +framebuffers) +* addr is stored in the CRTCEXT0, CRTCC and CRTCD registers +addr<20> -> CRTCEXT0<6> +addr<19-16> -> CRTCEXT0<3-0> +addr<15-8> -> CRTCC<7-0> +addr<7-0> -> CRTCD<7-0> +CRTCEXT0 has to be programmed last to trigger an update and make the +new addr variable take effect. +*/ void mga_set_start_address (struct drm_crtc *crtc,unsigned offset) {struct mga_device *mdev = crtc->dev->dev_private;u32 addr;int count; +u8 crtcext0;while (RREG8 (0x1fda ) &0x08 );while (!(RREG8 (0x1fda ) &0x08 ));
@@ -671,10 +685,17 @@ void mga_set_start_address(struct drm_crtc *crtc, unsigned offset) count =RREG8 (MGAREG_VCOUNT ) +2 ;while (RREG8 (MGAREG_VCOUNT ) < count); - addr = offset >>2 ; +WREG8 (MGAREG_CRTCEXT_INDEX ,0 ); + crtcext0 =RREG8 (MGAREG_CRTCEXT_DATA ); + crtcext0 &=0xB0 ; + addr = offset /8 ; +/* Can't store addresses any higher than that... +but we also don't have more than 16MB of memory, so it should be fine. */ +WARN_ON (addr >0x1fffff ); + crtcext0 |= (!!(addr & (1 <<20 )))<<6 ;WREG_CRT (0x0d , (u8)(addr &0xff ));WREG_CRT (0x0c , (u8)(addr >>8 ) &0xff ); -WREG_CRT (0xaf , (u8)(addr >>16 ) &0xf ); +WREG_ECRT (0x0 , ((u8)(addr >>16 ) &0xf ) | crtcext0); }
Signature · 1 line
1.7.10.4
Steven Rostedt
maintainerPATCH 29/65 tcp: force a dst refcount when prequeue packet
In reply to Steven Rostedt3.6.11.5 stable review patch.
If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit 093162553c33e9479283e107b4431378271c735d ]
Before escaping RCU protected section and adding packet into prequeue, make sure the dst is refcounted.
--- include/net/tcp.h | 1 + 1 file changed, 1 insertion(+)
include/net/tcp.h +1 -0
@@ -1015,6 +1015,7 @@ static inline bool tcp_prequeue(struct sock *sk, struct sk_buff *skb)if (sysctl_tcp_low_latency || !tp->ucopy.task)return false; +skb_dst_force (skb);__skb_queue_tail (&tp->ucopy.prequeue, skb); tp->ucopy.memory += skb->truesize;if (tp->ucopy.memory > sk->sk_rcvbuf) {
Signature · 1 line
1.7.10.4
Steven Rostedt
maintainerPATCH 30/65 sfc: Fix naming of MTD partitions for FPGA bitfiles
In reply to Steven Rostedt3.6.11.5 stable review patch.
If anyone has any objections, please let me know.
------------------
From: Ben Hutchings <[email protected]>
[ Upstream commit 89cc80a44b7c320e08599cb86f6aef0ead8986a1 ]
efx_mcdi_get_board_cfg() uses a buffer for the firmware response that is only large enough to hold subtypes for the originally defined set of NVRAM partitions. Longer responses are truncated, and we may read off the end of the buffer when copying out subtypes for additional partitions. In particular, this can result in the MTD partition for an FPGA bitfile being named e.g. 'eth5 sfc_fpga:00' when it should be 'eth5 sfc_fpga:01'. This means the firmware update tool (sfupdate) can't tell which bitfile should be written to the partition.
Correct the response buffer size.
--- drivers/net/ethernet/sfc/mcdi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/sfc/mcdi.c +1 -1
@@ -647,7 +647,7 @@ fail:int efx_mcdi_get_board_cfg (struct efx_nic *efx,u8 *mac_address,u16 *fw_subtype_list,u32 *capabilities) { -uint8_t outbuf[MC_CMD_GET_BOARD_CFG_OUT_LENMIN ]; +uint8_t outbuf[MC_CMD_GET_BOARD_CFG_OUT_LENMAX ];size_t outlen, offset, i;int port_num =efx_port_num (efx);int rc;
Signature · 1 line
1.7.10.4
Steven Rostedt
maintainerPATCH 31/65 net: mac802154: comparision issue of type cast, finding by EXTRA_CFLAGS=-W
In reply to Steven Rostedt3.6.11.5 stable review patch.
If anyone has any objections, please let me know.
------------------
From: Chen Gang <[email protected]>
[ Upstream commit 2c1bbbffa0b644fab4f91878cde0c2e8f52e2dcc ]
Change MAC802154_CHAN_NONE from ~(u8)0 to 0xff, or the comparison in mac802154_wpan_xmit() for ``chan == MAC802154_CHAN_NONE'' will not succeed.
This bug can be boiled down to ``u8 foo = 0xff; if (foo == ~(u8)0) [...] else [...]'' where the condition will always take the else branch.
--- net/mac802154/mac802154.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/mac802154/mac802154.h +1 -1
@@ -90,7 +90,7 @@ struct mac802154_sub_if_data {#define MAC802154_MAX_XMIT_ATTEMPTS 3 -#define MAC802154_CHAN_NONE (~(u8)0)/* No channel is assigned */ +#define MAC802154_CHAN_NONE 0xff/* No channel is assigned */ extern struct ieee802154_reduced_mlme_ops mac802154_mlme_reduced;extern struct ieee802154_mlme_ops mac802154_mlme_wpan;
Signature · 1 line
1.7.10.4
Steven Rostedt
maintainerPATCH 32/65 3c509.c: call SET_NETDEV_DEV for all device types (ISA/ISAPnP/EISA)
In reply to Steven Rostedt3.6.11.5 stable review patch.
If anyone has any objections, please let me know.
------------------
From: Matthew Whitehead <[email protected]>
[ Upstream commit 3b54912f9cd167641b91d4a697bd742f70e534fe ]
The venerable 3c509 driver only sets its device parent in one case, the ISAPnP one. It does this with the SET_NETDEV_DEV function. It should register with the device hierarchy in two additional cases: standard (non-PnP) ISA and EISA.
- Currently they appear here:/sys/devices/virtual/net/eth0 (standard ISA)/sys/devices/virtual/net/eth1 (EISA)
- Rather, they should instead be here:/sys/devices/isa/3c509.0/net/eth0 (standard ISA) /sys/devices/pci0000:00/0000:00:07.0/00:04/net/eth1 (EISA)
Tested on ISA and EISA boards.
--- drivers/net/ethernet/3com/3c509.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/net/ethernet/3com/3c509.c +2 -0
@@ -308,6 +308,7 @@ static int __devinit el3_isa_match(struct device *pdev,if (!dev)return -ENOMEM ; +SET_NETDEV_DEV (dev, pdev);netdev_boot_setup_check (dev);if (!request_region (ioaddr,EL3_IO_EXTENT ,"3c509-isa" )) {
@@ -598,6 +599,7 @@ static int __init el3_eisa_probe (struct device *device)return -ENOMEM ; } +SET_NETDEV_DEV (dev, device);netdev_boot_setup_check (dev);el3_dev_fill (dev, phys_addr, ioaddr, irq, if_port,EL3_EISA );
Signature · 1 line
1.7.10.4
Steven Rostedt
maintainerPATCH 33/65 net_sched: act_ipt forward compat with xtables
In reply to Steven Rostedt3.6.11.5 stable review patch.
If anyone has any objections, please let me know.
------------------
From: Jamal Hadi Salim <[email protected]>
[ Upstream commit 0dcffd09641f3abb21ac5cabc61542ab289d1a3c ]
Deal with changes in newer xtables while maintaining backward compatibility. Thanks to Jan Engelhardt for suggestions.
--- net/sched/act_ipt.c | 33 ++++++++++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-)
net/sched/act_ipt.c +30 -3
@@ -8,7 +8,7 @@* as published by the Free Software Foundation; either version * 2 of the License, or (at your option) any later version. * -* Copyright: Jamal Hadi Salim (2002-4) +* Copyright: Jamal Hadi Salim (2002-13) */ #include <linux/types.h>
@@ -305,17 +305,44 @@ static struct tc_action_ops act_ipt_ops = { .walk = tcf_generic_walker }; -MODULE_AUTHOR ("Jamal Hadi Salim(2002-4)" ); +static struct tc_action_ops act_xt_ops = { + .kind ="xt" , + .hinfo = &ipt_hash_info, + .type =TCA_ACT_IPT , + .capab =TCA_CAP_NONE , + .owner =THIS_MODULE , + .act = tcf_ipt, + .dump = tcf_ipt_dump, + .cleanup = tcf_ipt_cleanup, + .lookup = tcf_hash_search, + .init = tcf_ipt_init, + .walk = tcf_generic_walker +}; + +MODULE_AUTHOR ("Jamal Hadi Salim(2002-13)" );MODULE_DESCRIPTION ("Iptables target actions" );MODULE_LICENSE ("GPL" ); +MODULE_ALIAS ("act_xt" );static int __init ipt_init_module (void ) { -return tcf_register_action (&act_ipt_ops); +int ret1, ret2; + ret1 =tcf_register_action (&act_xt_ops); +if (ret1 <0 ) +printk ("Failed to load xt action\n" ); + ret2 =tcf_register_action (&act_ipt_ops); +if (ret2 <0 ) +printk ("Failed to load ipt action\n" ); + +if (ret1 <0 && ret2 <0 ) +return ret1; +else +return 0 ; } static void __exit ipt_cleanup_module(void) { +tcf_unregister_action (&act_xt_ops);tcf_unregister_action (&act_ipt_ops); }
Signature · 1 line
1.7.10.4
Steven Rostedt
maintainerPATCH 34/65 net: use netdev_features_t in skb_needs_linearize()
In reply to Steven Rostedt3.6.11.5 stable review patch.
If anyone has any objections, please let me know.
------------------
From: Patrick McHardy <[email protected]>
[ Upstream commit 6708c9e5cc9bfc7c9a00ce9c0fdd0b1d4952b3d1 ]
--- net/core/dev.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/core/dev.c +1 -1
@@ -2182,7 +2182,7 @@ EXPORT_SYMBOL(netif_skb_features);* support DMA from it. */ static inline int skb_needs_linearize (struct sk_buff *skb, -int features) +netdev_features_t features) { return skb_is_nonlinear(skb) && ((skb_has_frag_list(skb) &&
Signature · 1 line
1.7.10.4
Steven Rostedt
maintainerPATCH 35/65 net: vlan,ethtool: netdev_features_t is more than 32 bit
In reply to Steven Rostedt3.6.11.5 stable review patch.
If anyone has any objections, please let me know.
------------------
From: =?UTF-8?q?Bj=C3=B8rn=20Mork?= <[email protected]>
[ Upstream commit b29d3145183da4e07d4b570fa8acdd3ac4a5c572 ]
--- net/8021q/vlan_dev.c | 2 +- net/core/ethtool.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
net/8021q/vlan_dev.c +1 -1
@@ -611,7 +611,7 @@ static netdev_features_t vlan_dev_fix_features(struct net_device *dev, netdev_features_t features) {struct net_device *real_dev =vlan_dev_priv (dev)->real_dev; -u32 old_features = features; +netdev_features_t old_features = features; features &= real_dev->vlan_features; features |=NETIF_F_RXCSUM ;
net/core/ethtool.c +1 -1
@@ -1418,7 +1418,7 @@ int dev_ethtool(struct net *net, struct ifreq *ifr)void __user *useraddr = ifr->ifr_data;u32 ethcmd;int rc; -u32 old_features; +netdev_features_t old_features;if (!dev || !netif_device_present (dev))return -ENODEV ;
Signature · 1 line
1.7.10.4
Steven Rostedt
maintainerPATCH 36/65 bridge: fix race with topology change timer
In reply to Steven Rostedt3.6.11.5 stable review patch.
If anyone has any objections, please let me know.
------------------
From: stephen hemminger <[email protected]>
[ Upstream commit 83401eb4990ff6af55aeed8f49681558544192e6 ]
A bridge should only send topology change notice if it is not the root bridge. It is possible for message age timer to elect itself as a new root bridge, and still have a topology change timer running but waiting for bridge lock on other CPU.
Solve the race by checking if we are root bridge before continuing. This was the root cause of the cases where br_send_tcn_bpdu would OOPS.
--- net/bridge/br_stp_timer.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/bridge/br_stp_timer.c +1 -1
@@ -107,7 +107,7 @@ static void br_tcn_timer_expired(unsigned long arg)br_debug (br,"tcn timer expired\n" );spin_lock (&br->lock); -if (br->dev->flags &IFF_UP ) { +if (!br_is_root_bridge (br) && (br->dev->flags &IFF_UP )) {br_transmit_tcn (br);mod_timer (&br->tcn_timer,jiffies + br->bridge_hello_time);
Signature · 1 line
1.7.10.4
Steven Rostedt
maintainerPATCH 37/65 packet: tpacket_v3: do not trigger bug() on wrong header status
In reply to Steven Rostedt3.6.11.5 stable review patch.
If anyone has any objections, please let me know.
------------------
From: Daniel Borkmann <[email protected]>
[ Upstream commit 8da3056c04bfc5f69f840ab038a38389e2de8189 ]
Jakub reported that it is fairly easy to trigger the BUG() macro from user space with TPACKET_V3's RX_RING by just giving a wrong header status flag. We already had a similar situation in commit 7f5c3e3a80e6654 (``af_packet: remove BUG statement in tpacket_destruct_skb'') where this was the case in the TX_RING side that could be triggered from user space. So really, don't use BUG() or BUG_ON() unless there's really no way out, and i.e. don't use it for consistency checking when there's user space involved, no excuses, especially not if you're slapping the user with WARN + dump_stack + BUG all at once. The two functions are of concern:
prb_retire_current_block() [when block status != TP_STATUS_KERNEL] prb_open_block() [when block_status != TP_STATUS_KERNEL]
Calls to prb_open_block() are guarded by ealier checks if block_status is really TP_STATUS_KERNEL (racy!), but the first one BUG() is easily triggable from user space. System behaves still stable after they are removed. Also remove that yoda condition entirely, since it's already guarded.
--- net/packet/af_packet.c | 53 +++++++++++++++++++++--------------------------- 1 file changed, 23 insertions(+), 30 deletions(-)
net/packet/af_packet.c +23 -30
@@ -806,36 +806,33 @@ static void prb_open_block(struct tpacket_kbdq_core *pkc1,smp_rmb (); -if (likely (TP_STATUS_KERNEL ==BLOCK_STATUS (pbd1))) { +/* We could have just memset this but we will lose the +* flexibility of making the priv area sticky +*/ -/* We could have just memset this but we will lose the -* flexibility of making the priv area sticky -*/ -BLOCK_SNUM (pbd1) = pkc1->knxt_seq_num++; -BLOCK_NUM_PKTS (pbd1) =0 ; -BLOCK_LEN (pbd1) =BLK_PLUS_PRIV (pkc1->blk_sizeof_priv); -getnstimeofday (&ts); - h1->ts_first_pkt.ts_sec = ts.tv_sec; - h1->ts_first_pkt.ts_nsec = ts.tv_nsec; - pkc1->pkblk_start = (char *)pbd1; - pkc1->nxt_offset = pkc1->pkblk_start +BLK_PLUS_PRIV (pkc1->blk_sizeof_priv); -BLOCK_O2FP (pbd1) = (__u32 )BLK_PLUS_PRIV (pkc1->blk_sizeof_priv); -BLOCK_O2PRIV (pbd1) =BLK_HDR_LEN ; - pbd1->version = pkc1->version; - pkc1->prev = pkc1->nxt_offset; - pkc1->pkblk_end = pkc1->pkblk_start + pkc1->kblk_size; -prb_thaw_queue (pkc1); -_prb_refresh_rx_retire_blk_timer (pkc1); +BLOCK_SNUM (pbd1) = pkc1->knxt_seq_num++; +BLOCK_NUM_PKTS (pbd1) =0 ; +BLOCK_LEN (pbd1) =BLK_PLUS_PRIV (pkc1->blk_sizeof_priv); -smp_wmb (); +getnstimeofday (&ts); -return ; - } + h1->ts_first_pkt.ts_sec = ts.tv_sec; + h1->ts_first_pkt.ts_nsec = ts.tv_nsec; -WARN (1 ,"ERROR block:%p is NOT FREE status:%d kactive_blk_num:%d\n" , - pbd1,BLOCK_STATUS (pbd1), pkc1->kactive_blk_num); -dump_stack (); -BUG (); + pkc1->pkblk_start = (char *)pbd1; + pkc1->nxt_offset = pkc1->pkblk_start +BLK_PLUS_PRIV (pkc1->blk_sizeof_priv); + +BLOCK_O2FP (pbd1) = (__u32 )BLK_PLUS_PRIV (pkc1->blk_sizeof_priv); +BLOCK_O2PRIV (pbd1) =BLK_HDR_LEN ; + + pbd1->version = pkc1->version; + pkc1->prev = pkc1->nxt_offset; + pkc1->pkblk_end = pkc1->pkblk_start + pkc1->kblk_size; + +prb_thaw_queue (pkc1); +_prb_refresh_rx_retire_blk_timer (pkc1); + +smp_wmb (); }/*
@@ -926,10 +923,6 @@ static void prb_retire_current_block(struct tpacket_kbdq_core *pkc,prb_close_block (pkc, pbd, po, status);return ; } - -WARN (1 ,"ERROR-pbd[%d]:%p\n" , pkc->kactive_blk_num, pbd); -dump_stack (); -BUG (); } static int prb_curr_blk_in_use(struct tpacket_kbdq_core *pkc,
Signature · 1 line
1.7.10.4
Steven Rostedt
maintainerPATCH 38/65 3c59x: fix freeing nonexistent resource on driver unload
In reply to Steven Rostedt3.6.11.5 stable review patch.
If anyone has any objections, please let me know.
------------------
From: Sergei Shtylyov <[email protected]>
[ Upstream commit c81400be716aa4c76f6ebf339ba94358dbbf6da6 ]
When unloading the driver that drives an EISA board, a message similar to the following one is displayed:
Trying to free nonexistent resource <0000000000013000-000000000001301f>
Then an user is unable to reload the driver because the resource it requested in the previous load hasn't been freed. This happens most probably due to a typo in vortex_eisa_remove() which calls release_region() with 'dev->base_addr' instead of 'edev->base_addr'...
--- drivers/net/ethernet/3com/3c59x.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/3com/3c59x.c +1 -1
@@ -951,7 +951,7 @@ static int __devexit vortex_eisa_remove(struct device *device)unregister_netdev (dev);iowrite16 (TotalReset|0x14 , ioaddr +EL3_CMD ); -release_region (dev->base_addr,VORTEX_TOTAL_SIZE ); +release_region (edev->base_addr,VORTEX_TOTAL_SIZE );free_netdev (dev);return 0 ;
Signature · 1 line
1.7.10.4
Steven Rostedt
maintainerPATCH 39/65 3c59x: fix PCI resource management
In reply to Steven Rostedt3.6.11.5 stable review patch.
If anyone has any objections, please let me know.
------------------
From: Sergei Shtylyov <[email protected]>
[ Upstream commit 4b264a1676e70dc656ba53a8cac690f2d4b65f4e ]
The driver wrongly claimed I/O ports at an address returned by pci_iomap() -- even if it was passed an MMIO address. Fix this by claiming/releasing all PCI resources in the PCI driver's probe()/remove() methods instead and get rid of 'must_free_region' flag weirdness (why would Cardbus claim anything for us?).
--- drivers/net/ethernet/3com/3c59x.c | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-)
drivers/net/ethernet/3com/3c59x.c +13 -12
@@ -632,7 +632,6 @@ struct vortex_private { pm_state_valid:1, /* pci_dev->saved_config_space has sane contents */ open:1, medialock:1, - must_free_region:1, /* Flag: if zero, Cardbus owns the I/O region */ large_frames:1, /* accept large frames */ handling_irq:1; /* private in_irq indicator *//* {get|set}_wol operations are already serialized by rtnl.
@@ -1012,6 +1011,12 @@ static int __devinit vortex_init_one(struct pci_dev *pdev,if (rc <0 ) goto out; + rc =pci_request_regions (pdev,DRV_NAME ); +if (rc <0 ) { +pci_disable_device (pdev); + goto out; + } + unit = vortex_cards_found;if (global_use_mmio <0 && (unit >=MAX_UNITS || use_mmio[unit] <0 )) {
@@ -1027,6 +1032,7 @@ static int __devinit vortex_init_one(struct pci_dev *pdev,if (!ioaddr)/* If mapping fails, fall-back to BAR 0... */ ioaddr =pci_iomap (pdev,0 ,0 );if (!ioaddr) { +pci_release_regions (pdev);pci_disable_device (pdev); rc = -ENOMEM ; goto out;
@@ -1036,6 +1042,7 @@ static int __devinit vortex_init_one(struct pci_dev *pdev, ent->driver_data, unit);if (rc <0 ) {pci_iounmap (pdev, ioaddr); +pci_release_regions (pdev);pci_disable_device (pdev); goto out; }
@@ -1179,11 +1186,6 @@ static int __devinit vortex_probe1(struct device *gendev,/* PCI-only startup logic */ if (pdev) { -/* EISA resources already marked, so only PCI needs to do this here */ -/* Ignore return value, because Cardbus drivers already allocate for us */ -if (request_region (dev->base_addr, vci->io_size, print_name) !=NULL ) - vp->must_free_region =1 ; -/* enable bus-mastering if necessary */ if (vci->flags &PCI_USES_MASTER )pci_set_master (pdev);
@@ -1221,7 +1223,7 @@ static int __devinit vortex_probe1(struct device *gendev, &vp->rx_ring_dma); retval = -ENOMEM ;if (!vp->rx_ring) - goto free_region; + goto free_device; vp->tx_ring = (struct boom_tx_desc *)(vp->rx_ring +RX_RING_SIZE ); vp->tx_ring_dma = vp->rx_ring_dma +sizeof (struct boom_rx_desc ) *RX_RING_SIZE ;
@@ -1486,9 +1488,7 @@ free_ring: +sizeof (struct boom_tx_desc ) *TX_RING_SIZE , vp->rx_ring, vp->rx_ring_dma); -free_region: -if (vp->must_free_region) -release_region (dev->base_addr, vci->io_size); +free_device:free_netdev (dev);pr_err (PFX "vortex_probe1 fails. Returns %d\n" , retval); out:
@@ -3256,8 +3256,9 @@ static void __devexit vortex_remove_one(struct pci_dev *pdev) +sizeof (struct boom_tx_desc ) *TX_RING_SIZE , vp->rx_ring, vp->rx_ring_dma); -if (vp->must_free_region) -release_region (dev->base_addr, vp->io_size); + +pci_release_regions (pdev); +free_netdev (dev); }
Signature · 1 line
1.7.10.4
Steven Rostedt
maintainerPATCH 40/65 if_cablemodem.h: Add parenthesis around ioctl macros
In reply to Steven Rostedt3.6.11.5 stable review patch.
If anyone has any objections, please let me know.
------------------
From: Josh Boyer <[email protected]>
[ Upstream commit 4f924b2aa4d3cb30f07e57d6b608838edcbc0d88 ]
Protect the SIOCGCM* ioctl macros with parenthesis.
--- include/linux/if_cablemodem.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
include/linux/if_cablemodem.h +6 -6
@@ -12,11 +12,11 @@*/ /* some useful defines for sb1000.c e cmconfig.c - fv */ -#define SIOCGCMSTATS SIOCDEVPRIVATE+0/* get cable modem stats */ -#define SIOCGCMFIRMWARE SIOCDEVPRIVATE+1/* get cm firmware version */ -#define SIOCGCMFREQUENCY SIOCDEVPRIVATE+2/* get cable modem frequency */ -#define SIOCSCMFREQUENCY SIOCDEVPRIVATE+3/* set cable modem frequency */ -#define SIOCGCMPIDS SIOCDEVPRIVATE+4/* get cable modem PIDs */ -#define SIOCSCMPIDS SIOCDEVPRIVATE+5/* set cable modem PIDs */ +#define SIOCGCMSTATS (SIOCDEVPRIVATE+0)/* get cable modem stats */ +#define SIOCGCMFIRMWARE (SIOCDEVPRIVATE+1)/* get cm firmware version */ +#define SIOCGCMFREQUENCY (SIOCDEVPRIVATE+2)/* get cable modem frequency */ +#define SIOCSCMFREQUENCY (SIOCDEVPRIVATE+3)/* set cable modem frequency */ +#define SIOCGCMPIDS (SIOCDEVPRIVATE+4)/* get cable modem PIDs */ +#define SIOCSCMPIDS (SIOCDEVPRIVATE+5)/* set cable modem PIDs */ #endif
Signature · 1 line
1.7.10.4
Steven Rostedt
maintainerPATCH 41/65 macvlan: fix passthru mode race between dev removal and rx path
In reply to Steven Rostedt3.6.11.5 stable review patch.
If anyone has any objections, please let me know.
------------------
From: Jiri Pirko <[email protected]>
[ Upstream commit 233c7df0821c4190e2d3f4be0f2ca0ab40a5ed8c ]
Currently, if macvlan in passthru mode is created and data are rxed and you remove this device, following panic happens:
NULL pointer dereference at 0000000000000198
IP: [<ffffffffa0196058>] macvlan_handle_frame+0x153/0x1f7 [macvlan]
I'm using following script to trigger this:
<script>
while [ 1 ]
do
ip link add link e1 name macvtap0 type macvtap mode passthru ip link set e1 up
ip link set macvtap0 up
IFINDEX=ip link |grep macvtap0 | cut -f 1 -d ':' cat /dev/tap$IFINDEX >/dev/null &
ip link del dev macvtap0
done
</script>
I run this script while "ping -f" is running on another machine to send packets to e1 rx.
Reason of the panic is that list_first_entry() is blindly called in macvlan_handle_frame() even if the list was empty. vlan is set to incorrect pointer which leads to the crash.
I'm fixing this by protecting port->vlans list by rcu and by preventing from getting incorrect pointer in case the list is empty.
Introduced by: commit eb06acdc85585f2 "macvlan: Introduce 'passthru' mode to takeover the underlying device"
--- drivers/net/macvlan.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
drivers/net/macvlan.c +4 -3
@@ -204,7 +204,8 @@ static rx_handler_result_t macvlan_handle_frame(struct sk_buff **pskb) }if (port->passthru) - vlan = list_first_entry(&port->vlans, struct macvlan_dev, list); + vlan =list_first_or_null_rcu (&port->vlans, + struct macvlan_dev, list);else vlan =macvlan_hash_lookup (port, eth->h_dest);if (vlan ==NULL )
@@ -771,7 +772,7 @@ int macvlan_common_newlink(struct net *src_net, struct net_device *dev,if (err <0 ) goto destroy_port; -list_add_tail (&vlan->list, &port->vlans); +list_add_tail_rcu (&vlan->list, &port->vlans);netif_stacked_transfer_operstate (lowerdev, dev);return 0 ;
@@ -797,7 +798,7 @@ void macvlan_dellink(struct net_device *dev, struct list_head *head) {struct macvlan_dev *vlan =netdev_priv (dev); -list_del (&vlan->list); +list_del_rcu (&vlan->list);unregister_netdevice_queue (dev, head); }EXPORT_SYMBOL_GPL (macvlan_dellink);
Signature · 1 line
1.7.10.4
Steven Rostedt
maintainerPATCH 42/65 ipv6: do not clear pinet6 field
In reply to Steven Rostedt3.6.11.5 stable review patch.
If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit f77d602124d865c38705df7fa25c03de9c284ad2 ]
We have seen multiple NULL dereferences in __inet6_lookup_established()
After analysis, I found that inet6_sk() could be NULL while the check for sk_family == AF_INET6 was true.
Bug was added in linux-2.6.29 when RCU lookups were introduced in UDP and TCP stacks.
Once an IPv6 socket, using SLAB_DESTROY_BY_RCU is inserted in a hash table, we no longer can clear pinet6 field.
This patch extends logic used in commit fcbdf09d9652c891 ("net: fix nulls list corruptions in sk_prot_alloc")
TCP/UDP/UDPLite IPv6 protocols provide their own .clear_sk() method to make sure we do not clear pinet6 field.
At socket clone phase, we do not really care, as cloning the parent (non NULL) pinet6 is not adding a fatal race.
--- include/net/sock.h | 12 ++++++++++++ net/core/sock.c | 12 ------------ net/ipv6/tcp_ipv6.c | 12 ++++++++++++ net/ipv6/udp.c | 13 ++++++++++++- net/ipv6/udp_impl.h | 2 ++ net/ipv6/udplite.c | 2 +- 6 files changed, 39 insertions(+), 14 deletions(-)
include/net/sock.h +12 -0
@@ -837,6 +837,18 @@ struct inet_hashinfo;struct raw_hashinfo ;struct module ; +/* +* caches using SLAB_DESTROY_BY_RCU should let .next pointer from nulls nodes +* un-modified. Special care is taken when initializing object to zero. +*/ +static inline void sk_prot_clear_nulls (struct sock *sk,int size) +{ + if (offsetof(struct sock, sk_node.next) != 0) + memset(sk, 0, offsetof(struct sock, sk_node.next)); +memset (&sk->sk_node.pprev,0 , + size - offsetof(struct sock, sk_node.pprev)); +} +/* Networking protocol blocks we attach to sockets. * socket layer -> transport layer interface * transport -> network interface is defined by struct inet_proto
net/core/sock.c +0 -12
@@ -1140,18 +1140,6 @@ static void sock_copy(struct sock *nsk, const struct sock *osk)#endif } -/* -* caches using SLAB_DESTROY_BY_RCU should let .next pointer from nulls nodes -* un-modified. Special care is taken when initializing object to zero. -*/ -static inline void sk_prot_clear_nulls (struct sock *sk,int size) -{ - if (offsetof(struct sock, sk_node.next) != 0) - memset(sk, 0, offsetof(struct sock, sk_node.next)); -memset (&sk->sk_node.pprev,0 , - size - offsetof(struct sock, sk_node.pprev)); -} -void sk_prot_clear_portaddr_nulls (struct sock *sk,int size) {unsigned long nulls1, nulls2;
net/ipv6/tcp_ipv6.c +12 -0
@@ -2013,6 +2013,17 @@ void tcp6_proc_exit(struct net *net) }#endif +static void tcp_v6_clear_sk (struct sock *sk,int size) +{ +struct inet_sock *inet =inet_sk (sk); + +/* we do not want to clear pinet6 field, because of RCU lookups */ +sk_prot_clear_nulls (sk, offsetof(struct inet_sock , pinet6)); + + size -= offsetof(struct inet_sock , pinet6) +sizeof (inet->pinet6); +memset (&inet->pinet6 +1 ,0 , size); +} +struct proto tcpv6_prot = { .name ="TCPv6" , .owner =THIS_MODULE ,
@@ -2056,6 +2067,7 @@ struct proto tcpv6_prot = { #ifdef CONFIG_MEMCG_KMEM .proto_cgroup = tcp_proto_cgroup, #endif + .clear_sk = tcp_v6_clear_sk, }; static const struct inet6_protocol tcpv6_protocol = {
net/ipv6/udp.c +12 -1
@@ -1517,6 +1517,17 @@ void udp6_proc_exit(struct net *net) { }#endif /* CONFIG_PROC_FS */ +void udp_v6_clear_sk (struct sock *sk,int size) +{ +struct inet_sock *inet =inet_sk (sk); + +/* we do not want to clear pinet6 field, because of RCU lookups */ +sk_prot_clear_portaddr_nulls (sk, offsetof(struct inet_sock , pinet6)); + + size -= offsetof(struct inet_sock , pinet6) +sizeof (inet->pinet6); +memset (&inet->pinet6 +1 ,0 , size); +} +/* ------------------------------------------------------------------------ */ struct proto udpv6_prot = {
@@ -1547,7 +1558,7 @@ struct proto udpv6_prot = { .compat_setsockopt = compat_udpv6_setsockopt, .compat_getsockopt = compat_udpv6_getsockopt, #endif - .clear_sk = sk_prot_clear_portaddr_nulls, + .clear_sk = udp_v6_clear_sk, }; static struct inet_protosw udpv6_protosw = {
net/ipv6/udp_impl.h +2 -0
@@ -31,6 +31,8 @@ extern int udpv6_recvmsg(struct kiocb *iocb, struct sock *sk,extern int udpv6_queue_rcv_skb (struct sock * sk,struct sk_buff *skb);extern void udpv6_destroy_sock (struct sock *sk); +extern void udp_v6_clear_sk (struct sock *sk,int size); +#ifdef CONFIG_PROC_FS extern int udp6_seq_show (struct seq_file *seq,void *v);#endif
net/ipv6/udplite.c +1 -1
@@ -56,7 +56,7 @@ struct proto udplitev6_prot = { .compat_setsockopt = compat_udpv6_setsockopt, .compat_getsockopt = compat_udpv6_getsockopt, #endif - .clear_sk = sk_prot_clear_portaddr_nulls, + .clear_sk = udp_v6_clear_sk, }; static struct inet_protosw udplite6_protosw = {
Signature · 1 line
1.7.10.4
Steven Rostedt
maintainerPATCH 43/65 xfrm6: release dev before returning error
In reply to Steven Rostedt3.6.11.5 stable review patch.
If anyone has any objections, please let me know.
------------------
From: Cong Wang <[email protected]>
[ Upstream commit 84c4a9dfbf430861e7588d95ae3ff61535dca351 ]
We forget to call dev_put() on error path in xfrm6_fill_dst(), its caller doesn't handle this.
--- net/ipv6/xfrm6_policy.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
net/ipv6/xfrm6_policy.c +3 -1
@@ -103,8 +103,10 @@ static int xfrm6_fill_dst(struct xfrm_dst *xdst, struct net_device *dev,dev_hold (dev); xdst->u.rt6.rt6i_idev =in6_dev_get (dev); -if (!xdst->u.rt6.rt6i_idev) +if (!xdst->u.rt6.rt6i_idev) { +dev_put (dev);return -ENODEV ; + }rt6_transfer_peer (&xdst->u.rt6, rt);
Signature · 1 line
1.7.10.4
Steven Rostedt
maintainerPATCH 44/65 pch_dma: Use GFP_ATOMIC because called from interrupt context
In reply to Steven Rostedt3.6.11.5 stable review patch.
If anyone has any objections, please let me know.
------------------
From: Tomoya MORINAGA <[email protected]>
[ Upstream commit 5c1ef59168c485318e40ba485c1eba57d81d0faa ]
pdc_desc_get() is called from pd_prep_slave_sg, and the function is called from interrupt context(e.g. Uart driver "pch_uart.c"). In fact, I saw kernel error message.
So, GFP_ATOMIC must be used not GFP_NOIO.
--- drivers/dma/pch_dma.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/dma/pch_dma.c +1 -1
@@ -476,7 +476,7 @@ static struct pch_dma_desc *pdc_desc_get(struct pch_dma_chan *pd_chan)dev_dbg (chan2dev (&pd_chan->chan),"scanned %d descriptors\n" , i);if (!ret) { - ret =pdc_alloc_desc (&pd_chan->chan,GFP_NOIO ); + ret =pdc_alloc_desc (&pd_chan->chan,GFP_ATOMIC );if (ret) {spin_lock (&pd_chan->lock); pd_chan->descs_allocated++;
Signature · 1 line
1.7.10.4
Steven Rostedt
maintainerPATCH 45/65 watchdog: Fix race condition in registration code
In reply to Steven Rostedt3.6.11.5 stable review patch.
If anyone has any objections, please let me know.
------------------
From: Guenter Roeck <[email protected]>
[ Upstream commit 60403f7a4d9368d187f79cba5e4672d01df37574 ]
A race condition exists when registering the first watchdog device. Sequence of events:
- watchdog_register_device calls watchdog_dev_register
- watchdog_dev_register creates the watchdog misc device by calling misc_register.
At that time, the matching character device (/dev/watchdog0) does not yet exist, and old_wdd is not set either.
- Userspace gets an event and opens /dev/watchdog
- watchdog_open is called and sets wdd = old_wdd, which is still NULL, and tries to dereference it. This causes the kernel to panic.
Seen with systemd trying to open /dev/watchdog immediately after it was created.
--- drivers/watchdog/watchdog_dev.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/watchdog/watchdog_dev.c +2 -1
@@ -524,6 +524,7 @@ int watchdog_dev_register(struct watchdog_device *watchdog)int err, devno;if (watchdog->id ==0 ) { + old_wdd = watchdog; watchdog_miscdev.parent = watchdog->parent; err =misc_register (&watchdog_miscdev);if (err !=0 ) {
@@ -532,9 +533,9 @@ int watchdog_dev_register(struct watchdog_device *watchdog)if (err == -EBUSY )pr_err ("%s: a legacy watchdog module is probably present.\n" , watchdog->info->identity); + old_wdd =NULL ;return err; } - old_wdd = watchdog; }/* Fill in the data structures */
Signature · 1 line
1.7.10.4
Steven Rostedt
maintainerPATCH 46/65 drbd: fix for deadlock when using automatic split-brain-recovery
In reply to Steven Rostedt3.6.11.5 stable review patch.
If anyone has any objections, please let me know.
------------------
From: Philipp Reisner <[email protected]>
[ Upstream commit 7c689e63a847316c1b2500f86891b0a574ce7e69 ]
With an automatic after split-brain recovery policy of "after-sb-1pri call-pri-lost-after-sb",
when trying to drbd_set_role() to R_SECONDARY, we run into a deadlock.
This was first recognized and supposedly fixed by
2009-06-10 "Fixed a deadlock when using automatic split brain recovery when both nodes are" replacing drbd_set_role() with drbd_change_state() in that code-path,
but the first hunk of that patch forgets to remove the drbd_set_role().
We apparently only ever tested the "two primaries" case.
--- drivers/block/drbd/drbd_receiver.c | 1 - 1 file changed, 1 deletion(-)
drivers/block/drbd/drbd_receiver.c +0 -1
@@ -2271,7 +2271,6 @@ static int drbd_asb_recover_1p(struct drbd_conf *mdev) __must_hold(local)if (hg ==-1 && mdev->state.role ==R_PRIMARY ) {enum drbd_state_rv rv2; -drbd_set_role (mdev,R_SECONDARY ,0 );/* drbd_change_state() does not sleep while in SS_IN_TRANSIENT_STATE, * we might be here in C_WF_REPORT_PARAMS which is transient. * we do not need to wait for the after state change work either. */
Signature · 1 line
1.7.10.4
Steven Rostedt
maintainerPATCH 47/65 ARM: EXYNOS5: Fix kernel dump in AFTR idle mode
In reply to Steven Rostedt3.6.11.5 stable review patch.
If anyone has any objections, please let me know.
------------------
From: Inderpal Singh <[email protected]>
[ Upstream commit 088584618836b159947bc4ab5011a5cf1f081a62 ]
The kernel crashes while resuming from AFTR idle mode. It happens because L2 cache was not going into retention state.
This patch configures the USE_RETENTION bit of ARM_L2_OPTION register so that it does not depend on MANUAL_L2RSTDISABLE_CONTROL of ARM_COMMON_OPTION register for L2RSTDISABLE signal.
--- arch/arm/mach-exynos/include/mach/regs-pmu.h | 1 + arch/arm/mach-exynos/pmu.c | 5 ++--- 2 files changed, 3 insertions(+), 3 deletions(-)
arch/arm/mach-exynos/include/mach/regs-pmu.h +1 -0
@@ -342,6 +342,7 @@#define EXYNOS5_FSYS_ARM_OPTION S5P_PMUREG(0x2208)#define EXYNOS5_ISP_ARM_OPTION S5P_PMUREG(0x2288)#define EXYNOS5_ARM_COMMON_OPTION S5P_PMUREG(0x2408) +#define EXYNOS5_ARM_L2_OPTION S5P_PMUREG(0x2608)#define EXYNOS5_TOP_PWR_OPTION S5P_PMUREG(0x2C48)#define EXYNOS5_TOP_PWR_SYSMEM_OPTION S5P_PMUREG(0x2CC8)#define EXYNOS5_JPEG_MEM_OPTION S5P_PMUREG(0x2F48)
arch/arm/mach-exynos/pmu.c +2 -3
@@ -227,6 +227,7 @@ static struct exynos_pmu_conf exynos5250_pmu_config[] = { { EXYNOS5_DIS_IRQ_ISP_ARM_CENTRAL_SYS_PWR_REG, { 0x0, 0x0, 0x0} }, { EXYNOS5_ARM_COMMON_SYS_PWR_REG, { 0x0, 0x0, 0x2} }, { EXYNOS5_ARM_L2_SYS_PWR_REG, { 0x3, 0x3, 0x3} }, + { EXYNOS5_ARM_L2_OPTION, { 0x10, 0x10, 0x0 } }, { EXYNOS5_CMU_ACLKSTOP_SYS_PWR_REG, { 0x1, 0x0, 0x1} }, { EXYNOS5_CMU_SCLKSTOP_SYS_PWR_REG, { 0x1, 0x0, 0x1} }, { EXYNOS5_CMU_RESET_SYS_PWR_REG, { 0x1, 0x1, 0x0} },
@@ -352,11 +353,9 @@ static void exynos5_init_pmu(void)/* * SKIP_DEACTIVATE_ACEACP_IN_PWDN_BITFIELD Enable -* MANUAL_L2RSTDISABLE_CONTROL_BITFIELD Enable */ tmp =__raw_readl (EXYNOS5_ARM_COMMON_OPTION ); - tmp |= (EXYNOS5_MANUAL_L2RSTDISABLE_CONTROL | -EXYNOS5_SKIP_DEACTIVATE_ACEACP_IN_PWDN ); + tmp |=EXYNOS5_SKIP_DEACTIVATE_ACEACP_IN_PWDN ;__raw_writel (tmp,EXYNOS5_ARM_COMMON_OPTION );/*
Signature · 1 line
1.7.10.4
Steven Rostedt
maintainerPATCH 48/65 drivers/rtc/rtc-pcf2123.c: fix error return code in pcf2123_probe()
In reply to Steven Rostedt3.6.11.5 stable review patch.
If anyone has any objections, please let me know.
------------------
From: Wei Yongjun <[email protected]>
[ Upstream commit 35623715818dfa720cccf99cd280dcbb4b78da23 ]
Fix to return -ENODEV in the chip not found error handling case instead of 0, as done elsewhere in this function.
--- drivers/rtc/rtc-pcf2123.c | 1 + 1 file changed, 1 insertion(+)
drivers/rtc/rtc-pcf2123.c +1 -0
@@ -265,6 +265,7 @@ static int __devinit pcf2123_probe(struct spi_device *spi)if (!(rxbuf[0 ] &0x20 )) {dev_err (&spi->dev,"chip not found\n" ); + ret = -ENODEV ; goto kfree_exit; }
Signature · 1 line
1.7.10.4
Steven Rostedt
maintainerPATCH 49/65 iscsi-target: Fix processing of OOO commands
In reply to Steven Rostedt3.6.11.5 stable review patch.
If anyone has any objections, please let me know.
------------------
From: Shlomo Pongratz <[email protected]>
[ Upstream commit 3eccfdb01da58fbd0f789ae6ca61cee3769e26de ]
Fix two issues in OOO commands processing done at iscsit_attach_ooo_cmdsn.
Handle command serial numbers wrap around by using iscsi_sna_lt and not regular comparisson.
The routine iterates until it finds an entry whose serial number is greater than the serial number of the new one, thus the new entry should be inserted before that entry and not after.
--- drivers/target/iscsi/iscsi_target_erl1.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
drivers/target/iscsi/iscsi_target_erl1.c +4 -3
@@ -819,7 +819,7 @@ static int iscsit_attach_ooo_cmdsn(/* * CmdSN is greater than the tail of the list. */ -if (ooo_tail->cmdsn < ooo_cmdsn->cmdsn) +if (iscsi_sna_lt (ooo_tail->cmdsn, ooo_cmdsn->cmdsn))list_add_tail (&ooo_cmdsn->ooo_list, &sess->sess_ooo_cmdsn_list);else {
@@ -829,11 +829,12 @@ static int iscsit_attach_ooo_cmdsn(*/ list_for_each_entry (ooo_tmp, &sess->sess_ooo_cmdsn_list, ooo_list) { -if (ooo_tmp->cmdsn < ooo_cmdsn->cmdsn) +if (iscsi_sna_lt (ooo_tmp->cmdsn, ooo_cmdsn->cmdsn))continue ; +/* Insert before this entry */ list_add (&ooo_cmdsn->ooo_list, - &ooo_tmp->ooo_list); + ooo_tmp->ooo_list.prev);break ; } }
Signature · 1 line
1.7.10.4
Steven Rostedt
maintainerPATCH 50/65 target: close target_put_sess_cmd() vs. core_tmr_abort_task() race
In reply to Steven Rostedt3.6.11.5 stable review patch.
If anyone has any objections, please let me know.
------------------
From: Joern Engel <[email protected]>
[ Upstream commit ccf5ae83a6cf3d9cfe9a7038bfe7cd38ab03d5e1 ]
It is possible for one thread to to take se_sess->sess_cmd_lock in core_tmr_abort_task() before taking a reference count on se_cmd->cmd_kref, while another thread in target_put_sess_cmd() drops se_cmd->cmd_kref before taking se_sess->sess_cmd_lock.
This introduces kref_put_spinlock_irqsave() and uses it in target_put_sess_cmd() to close the race window.
--- drivers/target/target_core_transport.c | 11 +++++------ include/linux/kref.h | 33 ++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 6 deletions(-)
drivers/target/target_core_transport.c +5 -6
@@ -2430,21 +2430,19 @@ static void target_release_cmd_kref(struct kref *kref) { struct se_cmd *se_cmd = container_of(kref, struct se_cmd, cmd_kref);struct se_session *se_sess = se_cmd->se_sess; -unsigned long flags; -spin_lock_irqsave (&se_sess->sess_cmd_lock, flags);if (list_empty (&se_cmd->se_cmd_list)) { -spin_unlock_irqrestore (&se_sess->sess_cmd_lock, flags); +spin_unlock (&se_sess->sess_cmd_lock); se_cmd->se_tfo->release_cmd (se_cmd);return ; }if (se_sess->sess_tearing_down && se_cmd->cmd_wait_set) { -spin_unlock_irqrestore (&se_sess->sess_cmd_lock, flags); +spin_unlock (&se_sess->sess_cmd_lock);complete (&se_cmd->cmd_wait_comp);return ; }list_del (&se_cmd->se_cmd_list); -spin_unlock_irqrestore (&se_sess->sess_cmd_lock, flags); +spin_unlock (&se_sess->sess_cmd_lock); se_cmd->se_tfo->release_cmd (se_cmd); }
@@ -2455,7 +2453,8 @@ static void target_release_cmd_kref(struct kref *kref)*/ int target_put_sess_cmd (struct se_session *se_sess,struct se_cmd *se_cmd) { -return kref_put (&se_cmd->cmd_kref, target_release_cmd_kref); +return kref_put_spinlock_irqsave (&se_cmd->cmd_kref, target_release_cmd_kref, + &se_sess->sess_cmd_lock); }EXPORT_SYMBOL (target_put_sess_cmd);
include/linux/kref.h +33 -0
@@ -19,6 +19,7 @@#include <linux/atomic.h> #include <linux/kernel.h> #include <linux/mutex.h> +#include <linux/spinlock.h> struct kref {atomic_t refcount;
@@ -95,6 +96,38 @@ static inline int kref_put(struct kref *kref, void (*release)(struct kref *kref)return kref_sub (kref,1 , release); } +/** +* kref_put_spinlock_irqsave - decrement refcount for object. +* @kref: object. +* @release: pointer to the function that will clean up the object when the +* last reference to the object is released. +* This pointer is required, and it is not acceptable to pass kfree +* in as this function. +* @lock: lock to take in release case +* +* Behaves identical to kref_put with one exception. If the reference count +* drops to zero, the lock will be taken atomically wrt dropping the reference +* count. The release function has to call spin_unlock() without _irqrestore. +*/ +static inline int kref_put_spinlock_irqsave (struct kref *kref, +void (*release)(struct kref *kref), +spinlock_t *lock) +{ +unsigned long flags; + +WARN_ON (release ==NULL ); +if (atomic_add_unless (&kref->refcount,-1 ,1 )) +return 0 ; +spin_lock_irqsave (lock, flags); +if (atomic_dec_and_test (&kref->refcount)) { +release (kref); +local_irq_restore (flags); +return 1 ; + } +spin_unlock_irqrestore (lock, flags); +return 0 ; +} +static inline int kref_put_mutex (struct kref *kref,void (*release)(struct kref *kref),struct mutex *lock)
Signature · 1 line
1.7.10.4
Steven Rostedt
maintainerPATCH 51/65 ACPI / EC: Restart transaction even when the IBF flag set
In reply to Steven Rostedt3.6.11.5 stable review patch.
If anyone has any objections, please let me know.
------------------
From: Lan Tianyu <[email protected]>
[ Upstream commit 28fe5c825f8e15744d04c7c1b8df197950923ecd ]
The EC driver works abnormally with IBF flag always set. IBF means "The host has written a byte of data to the command or data port, but the embedded controller has not yet read it". If IBF is set in the EC status and not cleared, this will cause all subsequent EC requests to fail with a timeout error.
Change the EC driver so that it doesn't refuse to restart a transaction if IBF is set in the status. Also increase the number of transaction restarts to 5, as it turns out that 2 is not sufficient in some cases.
This bug happens on several different machines (Asus V1S, Dell Latitude E6530, Samsung R719, Acer Aspire 5930G, Sony Vaio SR19VN and others).
[rjw: Changelog]
References: https://bugzilla.kernel.org/show_bug.cgi?id=14733
References: https://bugzilla.kernel.org/show_bug.cgi?id=15560
References: https://bugzilla.kernel.org/show_bug.cgi?id=15946
References: https://bugzilla.kernel.org/show_bug.cgi?id=42945
References: https://bugzilla.kernel.org/show_bug.cgi?id=48221
--- drivers/acpi/ec.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
drivers/acpi/ec.c +1 -3
@@ -217,7 +217,7 @@ static int ec_check_sci_sync(struct acpi_ec *ec, u8 state)static int ec_poll (struct acpi_ec *ec) {unsigned long flags; -int repeat =2 ;/* number of command restarts */ +int repeat =5 ;/* number of command restarts */ while (repeat--) {unsigned long delay = jiffies +msecs_to_jiffies (ec_delay);
@@ -235,8 +235,6 @@ static int ec_poll(struct acpi_ec *ec) }advance_transaction (ec,acpi_ec_read_status (ec)); }while (time_before (jiffies, delay)); -if (acpi_ec_read_status (ec) &ACPI_EC_FLAG_IBF ) -break ;pr_debug (PREFIX "controller reset, restart transaction\n" );spin_lock_irqsave (&ec->curr_lock, flags);start_transaction (ec);
Signature · 1 line
1.7.10.4
Steven Rostedt
maintainerPATCH 52/65 drivers/char/ipmi: memcpy, need additional 2 bytes to avoid memory overflow
In reply to Steven Rostedt3.6.11.5 stable review patch.
If anyone has any objections, please let me know.
------------------
From: Chen Gang <[email protected]>
[ Upstream commit a5f2b3d6a738e7d4180012fe7b541172f8c8dcea ]
When calling memcpy, read_data and write_data need additional 2 bytes.
write_data:
for checking: "if (size > IPMI_MAX_MSG_LENGTH)"
for operating: "memcpy(bt->write_data + 3, data + 1, size - 1)"
read_data:
for checking: "if (msg_len < 3 || msg_len > IPMI_MAX_MSG_LENGTH)"
for operating: "memcpy(data + 2, bt->read_data + 4, msg_len - 2)"--- drivers/char/ipmi/ipmi_bt_sm.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/char/ipmi/ipmi_bt_sm.c +2 -2
@@ -95,9 +95,9 @@ struct si_sm_data {enum bt_states state;unsigned char seq;/* BT sequence number */ struct si_sm_io *io; -unsigned char write_data[IPMI_MAX_MSG_LENGTH ]; +unsigned char write_data[IPMI_MAX_MSG_LENGTH +2 ];/* +2 for memcpy */ int write_count; -unsigned char read_data[IPMI_MAX_MSG_LENGTH ]; +unsigned char read_data[IPMI_MAX_MSG_LENGTH +2 ];/* +2 for memcpy */ int read_count;int truncated;long timeout;/* microseconds countdown */
Signature · 1 line
1.7.10.4
Steven Rostedt
maintainerPATCH 53/65 ipmi: ipmi_devintf: compat_ioctl method fails to take ipmi_mutex
In reply to Steven Rostedt3.6.11.5 stable review patch.
If anyone has any objections, please let me know.
------------------
From: Benjamin LaHaise <[email protected]>
[ Upstream commit 6368087e851e697679af059b4247aca33a69cef3 ]
When a 32 bit version of ipmitool is used on a 64 bit kernel, the ipmi_devintf code fails to correctly acquire ipmi_mutex. This results in incomplete data being retrieved in some cases, or other possible failures. Add a wrapper around compat_ipmi_ioctl() to take ipmi_mutex to fix this.
--- drivers/char/ipmi/ipmi_devintf.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-)
drivers/char/ipmi/ipmi_devintf.c +13 -1
@@ -837,13 +837,25 @@ static long compat_ipmi_ioctl(struct file *filep, unsigned int cmd, return ipmi_ioctl(filep, cmd, arg); } } + +static long unlocked_compat_ipmi_ioctl (struct file *filep,unsigned int cmd, +unsigned long arg) +{ +int ret; + +mutex_lock (&ipmi_mutex); + ret =compat_ipmi_ioctl (filep, cmd, arg); +mutex_unlock (&ipmi_mutex); + +return ret; +}#endif static const struct file_operations ipmi_fops = { .owner =THIS_MODULE , .unlocked_ioctl = ipmi_unlocked_ioctl, #ifdef CONFIG_COMPAT - .compat_ioctl = compat_ipmi_ioctl, + .compat_ioctl = unlocked_compat_ipmi_ioctl, #endif .open = ipmi_open, .release = ipmi_release,
Signature · 1 line
1.7.10.4
Steven Rostedt
maintainerPATCH 54/65 drm/radeon: check incoming cliprects pointer
In reply to Steven Rostedt3.6.11.5 stable review patch.
If anyone has any objections, please let me know.
------------------
From: Kees Cook <[email protected]>
[ Upstream commit fefaedcfb82d2e57c2320acf60604ab03b750cc0 ]
The "boxes" parameter points into userspace memory. It should be verified like any other operation against user memory.
--- drivers/gpu/drm/radeon/r300_cmdbuf.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/radeon/r300_cmdbuf.c +1 -1
@@ -74,7 +74,7 @@ static int r300_emit_cliprects(drm_radeon_private_t *dev_priv,OUT_RING (CP_PACKET0 (R300_RE_CLIPRECT_TL_0 , nr *2 -1 ));for (i =0 ; i < nr; ++i) { -if (DRM_COPY_FROM_USER_UNCHECKED +if (DRM_COPY_FROM_USER (&box, &cmdbuf->boxes[n + i],sizeof (box))) {DRM_ERROR ("copy cliprect faulted\n" );return -EFAULT ;
Signature · 1 line
1.7.10.4
Steven Rostedt
maintainerPATCH 55/65 usermodehelper: check subprocess_info->path != NULL
In reply to Steven Rostedt3.6.11.5 stable review patch.
If anyone has any objections, please let me know.
------------------
From: Oleg Nesterov <[email protected]>
[ Upstream commit 264b83c07a84223f0efd0d1db9ccc66d6f88288f ]
argv_split(empty_or_all_spaces) happily succeeds, it simply returns argc == 0 and argv[0] == NULL. Change call_usermodehelper_exec() to check sub_info->path != NULL to avoid the crash.
This is the minimal fix, todo:
- perhaps we should change argv_split() to return NULL or change the callers.
- kill or justify ->path[0] check
- narrow the scope of helper_lock()
--- kernel/kmod.c | 5 +++++ 1 file changed, 5 insertions(+)
kernel/kmod.c +5 -0
@@ -558,6 +558,11 @@ int call_usermodehelper_exec(struct subprocess_info *sub_info, int wait)int retval =0 ;helper_lock (); +if (!sub_info->path) { + retval = -EINVAL ; + goto out; + } +if (sub_info->path[0 ] =='\0' ) goto out;
Signature · 1 line
1.7.10.4
Steven Rostedt
maintainerPATCH 56/65 parisc: only re-enable interrupts if we need to schedule or deliver signals when returning to userspace
In reply to Steven Rostedt3.6.11.5 stable review patch.
If anyone has any objections, please let me know.
------------------
From: John David Anglin <[email protected]>
[ Upstream commit c207a76bf155cb5cf24cf849c08f6555e9180594 ]
Helge and I have found that we have a kernel stack overflow problem which causes a variety of random failures.
Currently, we re-enable interrupts when returning from an external interrupt incase we need to schedule or delivery
signals. As a result, a potentially unlimited number of interrupts can occur while we are running on the kernel
stack. It is very limited in space (currently, 16k). This change defers enabling interrupts until we have
actually decided to schedule or delivery signals. This only occurs when we about to return to userspace. This
limits the number of interrupts on the kernel stack to one. In other cases, interrupts remain disabled until the
final return from interrupt (rfi).
--- arch/parisc/kernel/entry.S | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-)
arch/parisc/kernel/entry.S +9 -5
@@ -909,11 +909,6 @@ ENTRY(syscall_exit_rfi) STREG %r19,PT_SR7(%r16) intr_return: - /* NOTE: Need to enable interrupts incase we schedule. */ - ssm PSW_SM_I, %r0 - -intr_check_resched: - /* check for reschedule */ mfctl %cr30,%r1 LDREG TI_FLAGS(%r1),%r19 /* sched.h: TIF_NEED_RESCHED */
@@ -940,6 +935,11 @@ intr_check_sig: LDREG PT_IASQ1(%r16), %r20 cmpib,COND(=),n 0,%r20,intr_restore /* backward */ + /* NOTE: We need to enable interrupts if we have to deliver + * signals. We used to do this earlier but it caused kernel + * stack overflows. */ + ssm PSW_SM_I, %r0 + copy %r0, %r25 /* long in_syscall = 0 */ #ifdef CONFIG_64BIT ldo -16(%r30),%r29 /* Reference param save area */
@@ -991,6 +991,10 @@ intr_do_resched: cmpib,COND(=) 0, %r20, intr_do_preempt nop + /* NOTE: We need to enable interrupts if we schedule. We used + * to do this earlier but it caused kernel stack overflows. */ + ssm PSW_SM_I, %r0 + #ifdef CONFIG_64BIT ldo -16(%r30),%r29 /* Reference param save area */ #endif
Signature · 1 line
1.7.10.4
Steven Rostedt
maintainerPATCH 57/65 parisc: fix SMP races when updating PTE and TLB entries in entry.S
In reply to Steven Rostedt3.6.11.5 stable review patch.
If anyone has any objections, please let me know.
------------------
From: John David Anglin <[email protected]>
[ Upstream commit f0a18819e261afc5fdbd8c5c6f9943123c5461ba ]
Currently, race conditions exist in the handling of TLB interruptions in entry.S. In particular, dirty bit updates can be lost if an accessed interruption occurs just after the dirty bit interruption on a different cpu. Lost dirty bit updates result in user pages not being flushed and general system instability. This change adds lock and unlock macros to synchronize all PTE and TLB updates done in entry.S. As a result, userspace stability is significantly improved.
--- arch/parisc/kernel/entry.S | 155 ++++++++++++++++++++++++-------------------- 1 file changed, 83 insertions(+), 72 deletions(-)
arch/parisc/kernel/entry.S +83 -72
@@ -444,9 +444,41 @@ L2_ptep \pgd,\pte,\index,\va,\fault .endm + /* Acquire pa_dbit_lock lock. */ + .macro dbit_lock spc,tmp,tmp1 +#ifdef CONFIG_SMP + cmpib,COND(=),n 0,\spc,2f + load32 PA(pa_dbit_lock),\tmp +1: LDCW 0(\tmp),\tmp1 + cmpib,COND(=) 0,\tmp1,1b + nop +2: +#endif + .endm + + /* Release pa_dbit_lock lock without reloading lock address. */ + .macro dbit_unlock0 spc,tmp +#ifdef CONFIG_SMP + or,COND(=) %r0,\spc,%r0 + stw \spc,0(\tmp) +#endif + .endm + + /* Release pa_dbit_lock lock. */ + .macro dbit_unlock1 spc,tmp +#ifdef CONFIG_SMP + load32 PA(pa_dbit_lock),\tmp + dbit_unlock0 \spc,\tmp +#endif + .endm + /* Set the _PAGE_ACCESSED bit of the PTE. Be clever and * don't needlessly dirty the cache line if it was already set */ - .macro update_ptep ptep,pte,tmp,tmp1 + .macro update_ptep spc,ptep,pte,tmp,tmp1 +#ifdef CONFIG_SMP + or,COND(=) %r0,\spc,%r0 + LDREG 0(\ptep),\pte +#endif ldi _PAGE_ACCESSED,\tmp1 or \tmp1,\pte,\tmp and,COND(<>) \tmp1,\pte,%r0
@@ -455,7 +487,11 @@ /* Set the dirty bit (and accessed bit). No need to be * clever, this is only used from the dirty fault */ - .macro update_dirty ptep,pte,tmp + .macro update_dirty spc,ptep,pte,tmp +#ifdef CONFIG_SMP + or,COND(=) %r0,\spc,%r0 + LDREG 0(\ptep),\pte +#endif ldi _PAGE_ACCESSED|_PAGE_DIRTY,\tmp or \tmp,\pte,\pte STREG \pte,0(\ptep)
@@ -1187,11 +1223,13 @@ dtlb_miss_20w: L3_ptep ptp,pte,t0,va,dtlb_check_alias_20w - update_ptep ptp,pte,t0,t1 + dbit_lock spc,t0,t1 + update_ptep spc,ptp,pte,t0,t1 make_insert_tlb spc,pte,prot idtlbt pte,prot + dbit_unlock1 spc,t0 rfir nop
@@ -1211,11 +1249,13 @@ nadtlb_miss_20w: L3_ptep ptp,pte,t0,va,nadtlb_check_alias_20w - update_ptep ptp,pte,t0,t1 + dbit_lock spc,t0,t1 + update_ptep spc,ptp,pte,t0,t1 make_insert_tlb spc,pte,prot idtlbt pte,prot + dbit_unlock1 spc,t0 rfir nop
@@ -1237,7 +1277,8 @@ dtlb_miss_11: L2_ptep ptp,pte,t0,va,dtlb_check_alias_11 - update_ptep ptp,pte,t0,t1 + dbit_lock spc,t0,t1 + update_ptep spc,ptp,pte,t0,t1 make_insert_tlb_11 spc,pte,prot
@@ -1248,6 +1289,7 @@ dtlb_miss_11: idtlbp prot,(%sr1,va) mtsp t0, %sr1 /* Restore sr1 */ + dbit_unlock1 spc,t0 rfir nop
@@ -1268,7 +1310,8 @@ nadtlb_miss_11: L2_ptep ptp,pte,t0,va,nadtlb_check_alias_11 - update_ptep ptp,pte,t0,t1 + dbit_lock spc,t0,t1 + update_ptep spc,ptp,pte,t0,t1 make_insert_tlb_11 spc,pte,prot
@@ -1280,6 +1323,7 @@ nadtlb_miss_11: idtlbp prot,(%sr1,va) mtsp t0, %sr1 /* Restore sr1 */ + dbit_unlock1 spc,t0 rfir nop
@@ -1300,13 +1344,15 @@ dtlb_miss_20: L2_ptep ptp,pte,t0,va,dtlb_check_alias_20 - update_ptep ptp,pte,t0,t1 + dbit_lock spc,t0,t1 + update_ptep spc,ptp,pte,t0,t1 make_insert_tlb spc,pte,prot f_extend pte,t0 idtlbt pte,prot + dbit_unlock1 spc,t0 rfir nop
@@ -1326,13 +1372,15 @@ nadtlb_miss_20: L2_ptep ptp,pte,t0,va,nadtlb_check_alias_20 - update_ptep ptp,pte,t0,t1 + dbit_lock spc,t0,t1 + update_ptep spc,ptp,pte,t0,t1 make_insert_tlb spc,pte,prot f_extend pte,t0 idtlbt pte,prot + dbit_unlock1 spc,t0 rfir nop
@@ -1433,11 +1481,13 @@ itlb_miss_20w: L3_ptep ptp,pte,t0,va,itlb_fault - update_ptep ptp,pte,t0,t1 + dbit_lock spc,t0,t1 + update_ptep spc,ptp,pte,t0,t1 make_insert_tlb spc,pte,prot iitlbt pte,prot + dbit_unlock1 spc,t0 rfir nop
@@ -1455,11 +1505,13 @@ naitlb_miss_20w: L3_ptep ptp,pte,t0,va,naitlb_check_alias_20w - update_ptep ptp,pte,t0,t1 + dbit_lock spc,t0,t1 + update_ptep spc,ptp,pte,t0,t1 make_insert_tlb spc,pte,prot iitlbt pte,prot + dbit_unlock1 spc,t0 rfir nop
@@ -1481,7 +1533,8 @@ itlb_miss_11: L2_ptep ptp,pte,t0,va,itlb_fault - update_ptep ptp,pte,t0,t1 + dbit_lock spc,t0,t1 + update_ptep spc,ptp,pte,t0,t1 make_insert_tlb_11 spc,pte,prot
@@ -1492,6 +1545,7 @@ itlb_miss_11: iitlbp prot,(%sr1,va) mtsp t0, %sr1 /* Restore sr1 */ + dbit_unlock1 spc,t0 rfir nop
@@ -1503,7 +1557,8 @@ naitlb_miss_11: L2_ptep ptp,pte,t0,va,naitlb_check_alias_11 - update_ptep ptp,pte,t0,t1 + dbit_lock spc,t0,t1 + update_ptep spc,ptp,pte,t0,t1 make_insert_tlb_11 spc,pte,prot
@@ -1514,6 +1569,7 @@ naitlb_miss_11: iitlbp prot,(%sr1,va) mtsp t0, %sr1 /* Restore sr1 */ + dbit_unlock1 spc,t0 rfir nop
@@ -1535,13 +1591,15 @@ itlb_miss_20: L2_ptep ptp,pte,t0,va,itlb_fault - update_ptep ptp,pte,t0,t1 + dbit_lock spc,t0,t1 + update_ptep spc,ptp,pte,t0,t1 make_insert_tlb spc,pte,prot f_extend pte,t0 iitlbt pte,prot + dbit_unlock1 spc,t0 rfir nop
@@ -1553,13 +1611,15 @@ naitlb_miss_20: L2_ptep ptp,pte,t0,va,naitlb_check_alias_20 - update_ptep ptp,pte,t0,t1 + dbit_lock spc,t0,t1 + update_ptep spc,ptp,pte,t0,t1 make_insert_tlb spc,pte,prot f_extend pte,t0 iitlbt pte,prot + dbit_unlock1 spc,t0 rfir nop
@@ -1583,29 +1643,13 @@ dbit_trap_20w: L3_ptep ptp,pte,t0,va,dbit_fault -#ifdef CONFIG_SMP - cmpib,COND(=),n 0,spc,dbit_nolock_20w - load32 PA(pa_dbit_lock),t0 - -dbit_spin_20w: - LDCW 0(t0),t1 - cmpib,COND(=) 0,t1,dbit_spin_20w - nop - -dbit_nolock_20w: -#endif - update_dirty ptp,pte,t1 + dbit_lock spc,t0,t1 + update_dirty spc,ptp,pte,t1 make_insert_tlb spc,pte,prot idtlbt pte,prot -#ifdef CONFIG_SMP - cmpib,COND(=),n 0,spc,dbit_nounlock_20w - ldi 1,t1 - stw t1,0(t0) - -dbit_nounlock_20w: -#endif + dbit_unlock0 spc,t0 rfir nop
@@ -1619,18 +1663,8 @@ dbit_trap_11: L2_ptep ptp,pte,t0,va,dbit_fault -#ifdef CONFIG_SMP - cmpib,COND(=),n 0,spc,dbit_nolock_11 - load32 PA(pa_dbit_lock),t0 - -dbit_spin_11: - LDCW 0(t0),t1 - cmpib,= 0,t1,dbit_spin_11 - nop - -dbit_nolock_11: -#endif - update_dirty ptp,pte,t1 + dbit_lock spc,t0,t1 + update_dirty spc,ptp,pte,t1 make_insert_tlb_11 spc,pte,prot
@@ -1641,13 +1675,7 @@ dbit_nolock_11: idtlbp prot,(%sr1,va) mtsp t1, %sr1 /* Restore sr1 */ -#ifdef CONFIG_SMP - cmpib,COND(=),n 0,spc,dbit_nounlock_11 - ldi 1,t1 - stw t1,0(t0) - -dbit_nounlock_11: -#endif + dbit_unlock0 spc,t0 rfir nop
@@ -1659,32 +1687,15 @@ dbit_trap_20: L2_ptep ptp,pte,t0,va,dbit_fault -#ifdef CONFIG_SMP - cmpib,COND(=),n 0,spc,dbit_nolock_20 - load32 PA(pa_dbit_lock),t0 - -dbit_spin_20: - LDCW 0(t0),t1 - cmpib,= 0,t1,dbit_spin_20 - nop - -dbit_nolock_20: -#endif - update_dirty ptp,pte,t1 + dbit_lock spc,t0,t1 + update_dirty spc,ptp,pte,t1 make_insert_tlb spc,pte,prot f_extend pte,t1 idtlbt pte,prot - -#ifdef CONFIG_SMP - cmpib,COND(=),n 0,spc,dbit_nounlock_20 - ldi 1,t1 - stw t1,0(t0) - -dbit_nounlock_20: -#endif + dbit_unlock0 spc,t0 rfir nop
Signature · 1 line
1.7.10.4
Steven Rostedt
maintainerPATCH 58/65 parisc: fix NATIVE set up in build
In reply to Steven Rostedt3.6.11.5 stable review patch.
If anyone has any objections, please let me know.
------------------
From: Mike Frysinger <[email protected]>
[ Upstream commit 93782eba49e23c3f311a6b05a19ba15927ec4e8b ]
The ifeq operator does not accept globs, so this little bit of code will never match (unless uname literally prints out "parsic*"). Rewrite to use a pattern matching operator so that NATIVE is set to 1 on parisc.
--- arch/parisc/Makefile | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
arch/parisc/Makefile +1 -3
@@ -24,9 +24,7 @@ CHECKFLAGS += -D__hppa__=1 LIBGCC = $(shell $(CC) $(KBUILD_CFLAGS) -print-libgcc-file-name) MACHINE := $(shell uname -m) -ifeq ($(MACHINE),parisc*) -NATIVE := 1 -endif +NATIVE := $(if $(filter parisc%,$(MACHINE)),1,0) ifdef CONFIG_64BIT UTS_MACHINE := parisc64
Signature · 1 line
1.7.10.4
Steven Rostedt
maintainerPATCH 59/65 parisc: make default cross compiler search more robust (v3)
In reply to Steven Rostedt3.6.11.5 stable review patch.
If anyone has any objections, please let me know.
------------------
From: Helge Deller <[email protected]>
[ Upstream commit 6880b0150a7c25fd75c5ece80abc49ebf53c38c1 ]
People/distros vary how they prefix the toolchain name for 64bit builds. Rather than enforce one convention over another, add a for loop which does a search for all the general prefixes.
For 64bit builds, we now search for (in order):
hppa64-unknown-linux-gnu
hppa64-linux-gnu
hppa64-linux
For 32bit builds, we look for:
hppa-unknown-linux-gnu hppa-linux-gnu hppa-linux hppa2.0-unknown-linux-gnu hppa2.0-linux-gnu hppa2.0-linux hppa1.1-unknown-linux-gnu hppa1.1-linux-gnu hppa1.1-linux
This patch was initiated by Mike Frysinger, with feedback from Jeroen Roovers, John David Anglin and Helge Deller.
--- arch/parisc/Makefile | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-)
arch/parisc/Makefile +9 -13
@@ -23,25 +23,21 @@ NM = sh $(srctree)/arch/parisc/nm CHECKFLAGS += -D__hppa__=1 LIBGCC = $(shell $(CC) $(KBUILD_CFLAGS) -print-libgcc-file-name) -MACHINE := $(shell uname -m) -NATIVE := $(if $(filter parisc%,$(MACHINE)),1,0) - ifdef CONFIG_64BIT UTS_MACHINE := parisc64 CHECKFLAGS += -D__LP64__=1 -m64 -WIDTH := 64 - -# FIXME: if no default set, should really try to locate dynamically -ifeq ($(CROSS_COMPILE),) -CROSS_COMPILE := hppa64-linux-gnu- -endif +CC_ARCHES = hppa64 else # 32-bit -WIDTH := +CC_ARCHES = hppa hppa2.0 hppa1.1 endif -# attempt to help out folks who are cross-compiling -ifeq ($(NATIVE),1) -CROSS_COMPILE := hppa$(WIDTH)-linux- +ifneq ($(SUBARCH),$(UTS_MACHINE)) + ifeq ($(CROSS_COMPILE),) + CC_SUFFIXES = linux linux-gnu unknown-linux-gnu + CROSS_COMPILE := $(call cc-cross-prefix, \ + $(foreach a,$(CC_ARCHES), \ + $(foreach s,$(CC_SUFFIXES),$(a)-$(s)-))) + endif endif OBJCOPY_FLAGS =-O binary -R .note -R .comment -S
Signature · 1 line
1.7.10.4
Steven Rostedt
maintainerPATCH 60/65 btrfs: dont stop searching after encountering the wrong item
In reply to Steven Rostedt3.6.11.5 stable review patch.
If anyone has any objections, please let me know.
------------------
From: Gabriel de Perthuis <[email protected]>
[ Upstream commit 03b71c6ca6286625d8f1ed44aabab9b5bf5dac10 ]
The search ioctl skips items that are too large for a result buffer, but inline items of a certain size occuring before any search result is found would trigger an overflow and stop the search entirely.
--- fs/btrfs/ioctl.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
fs/btrfs/ioctl.c +5 -5
@@ -1707,7 +1707,11 @@ static noinline int copy_to_sk(struct btrfs_root *root, item_off =btrfs_item_ptr_offset (leaf, i); item_len =btrfs_item_size_nr (leaf, i); -if (item_len >BTRFS_SEARCH_ARGS_BUFSIZE ) +btrfs_item_key_to_cpu (leaf, key, i); +if (!key_in_sk (key, sk)) +continue ; + +if (sizeof (sh) + item_len >BTRFS_SEARCH_ARGS_BUFSIZE ) item_len =0 ; if (sizeof(sh) + item_len + *sk_offset >
@@ -1716,10 +1720,6 @@ static noinline int copy_to_sk(struct btrfs_root *root, goto overflow; } -btrfs_item_key_to_cpu (leaf, key, i); -if (!key_in_sk (key, sk)) -continue ; - sh.objectid = key->objectid; sh.offset = key->offset; sh.type = key->type;
Signature · 1 line
1.7.10.4
Steven Rostedt
maintainerPATCH 61/65 hwmon: fix error return code in abituguru_probe()
In reply to Steven Rostedt3.6.11.5 stable review patch.
If anyone has any objections, please let me know.
------------------
From: Wei Yongjun <[email protected]>
[ Upstream commit ecacb0b17c08fae89f65468727f0e4b8e91da4e1 ]
Fix to return a negative error code from the error handling case instead of 0, as done elsewhere in this function.
--- drivers/hwmon/abituguru.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-)
drivers/hwmon/abituguru.c +10 -6
@@ -1410,14 +1410,18 @@ static int __devinit abituguru_probe(struct platform_device *pdev)pr_info ("found Abit uGuru\n" );/* Register sysfs hooks */ -for (i =0 ; i < sysfs_attr_i; i++) -if (device_create_file (&pdev->dev, - &data->sysfs_attr[i].dev_attr)) +for (i =0 ; i < sysfs_attr_i; i++) { + res =device_create_file (&pdev->dev, + &data->sysfs_attr[i].dev_attr); +if (res) goto abituguru_probe_error; -for (i =0 ; i <ARRAY_SIZE (abituguru_sysfs_attr); i++) -if (device_create_file (&pdev->dev, - &abituguru_sysfs_attr[i].dev_attr)) + } +for (i =0 ; i <ARRAY_SIZE (abituguru_sysfs_attr); i++) { + res =device_create_file (&pdev->dev, + &abituguru_sysfs_attr[i].dev_attr); +if (res) goto abituguru_probe_error; + } data->hwmon_dev =hwmon_device_register (&pdev->dev);if (!IS_ERR (data->hwmon_dev))
Signature · 1 line
1.7.10.4
Steven Rostedt
maintainerPATCH 62/65 i2c: designware: fix RX FIFO overrun
In reply to Steven Rostedt3.6.11.5 stable review patch.
If anyone has any objections, please let me know.
------------------
From: Josef Ahmad <[email protected]>
[ Upstream commit e6f34cea56f5b95498070eaa9f4aa3ba4a9e4f62 ]
i2c_dw_xfer_msg() pushes a number of bytes to transmit/receive to/from the bus into the TX FIFO.
For master-rx transactions, the maximum amount of data that can be received is calculated depending solely on TX and RX FIFO load.
This is racy - TX FIFO may contain master-rx data yet to be processed, which will eventually land into the RX FIFO. This data is not taken into account and the function may request more data than the controller is actually capable of storing.
This patch ensures the driver takes into account the outstanding master-rx data in TX FIFO to prevent RX FIFO overrun.
--- drivers/i2c/busses/i2c-designware-core.c | 11 ++++++++++- drivers/i2c/busses/i2c-designware-core.h | 2 ++ 2 files changed, 12 insertions(+), 1 deletion(-)
drivers/i2c/busses/i2c-designware-core.c +10 -1
@@ -413,8 +413,14 @@ i2c_dw_xfer_msg(struct dw_i2c_dev *dev)while (buf_len >0 && tx_limit >0 && rx_limit >0 ) {if (msgs[dev->msg_write_idx].flags &I2C_M_RD ) { + +/* avoid rx buffer overrun */ +if (rx_limit - dev->rx_outstanding <=0 ) +break ; +dw_writel (dev,0x100 ,DW_IC_DATA_CMD ); rx_limit--; + dev->rx_outstanding++; }else dw_writel (dev, *buf++,DW_IC_DATA_CMD ); tx_limit--; buf_len--;
@@ -467,8 +473,10 @@ i2c_dw_read(struct dw_i2c_dev *dev) rx_valid =dw_readl (dev,DW_IC_RXFLR ); -for (; len >0 && rx_valid >0 ; len--, rx_valid--) +for (; len >0 && rx_valid >0 ; len--, rx_valid--) { *buf++ =dw_readl (dev,DW_IC_DATA_CMD ); + dev->rx_outstanding--; + }if (len >0 ) { dev->status |=STATUS_READ_IN_PROGRESS ;
@@ -526,6 +534,7 @@ i2c_dw_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num) dev->msg_err =0 ; dev->status =STATUS_IDLE ; dev->abort_source =0 ; + dev->rx_outstanding =0 ; ret =i2c_dw_wait_bus_not_busy (dev);if (ret <0 )
drivers/i2c/busses/i2c-designware-core.h +2 -0
@@ -60,6 +60,7 @@* @adapter: i2c subsystem adapter node * @tx_fifo_depth: depth of the hardware tx fifo * @rx_fifo_depth: depth of the hardware rx fifo +* @rx_outstanding: current master-rx elements in tx fifo */ struct dw_i2c_dev {struct device *dev;
@@ -88,6 +89,7 @@ struct dw_i2c_dev {u32 master_cfg;unsigned int tx_fifo_depth;unsigned int rx_fifo_depth; +int rx_outstanding; };#define ACCESS_SWAP 0x00000001
Signature · 1 line
1.7.10.4
Steven Rostedt
maintainerPATCH 63/65 i2c: designware: always clear interrupts before enabling them
In reply to Steven Rostedt3.6.11.5 stable review patch.
If anyone has any objections, please let me know.
------------------
From: Mika Westerberg <[email protected]>
[ Upstream commit 2a2d95e9d6d29e726cc294b65391917ed2e32bf4 ]
If the I2C bus is put to a low power state by an ACPI method it might pull the SDA line low (as its power is removed). Once the bus is put to full power state again, the SDA line is pulled back to high. This transition looks like a STOP condition from the controller point-of-view which sets STOP detected bit in its status register causing the driver to fail subsequent transfers.
Fix this by always clearing all interrupts before we start a transfer.
--- drivers/i2c/busses/i2c-designware-core.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/i2c/busses/i2c-designware-core.c +2 -1
@@ -360,7 +360,8 @@ static void i2c_dw_xfer_init(struct dw_i2c_dev *dev)/* Enable the adapter */ dw_writel (dev,1 ,DW_IC_ENABLE ); -/* Enable interrupts */ +/* Clear and enable interrupts */ +i2c_dw_clear_int (dev);dw_writel (dev,DW_IC_INTR_DEFAULT_MASK ,DW_IC_INTR_MASK ); }
Signature · 1 line
1.7.10.4
Steven Rostedt
maintainerPATCH 64/65 drm/radeon: Fix VRAM size calculation for VRAM >= 4GB
In reply to Steven Rostedt3.6.11.5 stable review patch.
If anyone has any objections, please let me know.
------------------
From: Niels Ole Salscheider <[email protected]>
[ Upstream commit fc986034540102cd090237bf3f70262e1ae80d9c ]
Add ULL prefix to avoid overflow.
--- drivers/gpu/drm/radeon/evergreen.c | 4 ++-- drivers/gpu/drm/radeon/radeon_ttm.c | 2 +- drivers/gpu/drm/radeon/si.c | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-)
drivers/gpu/drm/radeon/evergreen.c +2 -2
@@ -2272,8 +2272,8 @@ int evergreen_mc_init(struct radeon_device *rdev) rdev->mc.real_vram_size =RREG32 (CONFIG_MEMSIZE ); }else {/* size in MB on evergreen/cayman/tn */ - rdev->mc.mc_vram_size =RREG32 (CONFIG_MEMSIZE ) *1024 *1024 ; - rdev->mc.real_vram_size =RREG32 (CONFIG_MEMSIZE ) *1024 *1024 ; + rdev->mc.mc_vram_size =RREG32 (CONFIG_MEMSIZE ) *1024ULL *1024ULL ; + rdev->mc.real_vram_size =RREG32 (CONFIG_MEMSIZE ) *1024ULL *1024ULL ; } rdev->mc.visible_vram_size = rdev->mc.aper_size;r700_vram_gtt_location (rdev, &rdev->mc);
drivers/gpu/drm/radeon/radeon_ttm.c +1 -1
@@ -725,7 +725,7 @@ int radeon_ttm_init(struct radeon_device *rdev)return r; }DRM_INFO ("radeon: %uM of VRAM memory ready\n" , - (unsigned )rdev->mc.real_vram_size / (1024 *1024 )); + (unsigned ) (rdev->mc.real_vram_size / (1024 *1024 ))); r =ttm_bo_init_mm (&rdev->mman.bdev,TTM_PL_TT , rdev->mc.gtt_size >>PAGE_SHIFT );if (r) {
drivers/gpu/drm/radeon/si.c +2 -2
@@ -2343,8 +2343,8 @@ static int si_mc_init(struct radeon_device *rdev) rdev->mc.aper_base =pci_resource_start (rdev->pdev,0 ); rdev->mc.aper_size =pci_resource_len (rdev->pdev,0 );/* size in MB on si */ - rdev->mc.mc_vram_size =RREG32 (CONFIG_MEMSIZE ) *1024 *1024 ; - rdev->mc.real_vram_size =RREG32 (CONFIG_MEMSIZE ) *1024 *1024 ; + rdev->mc.mc_vram_size =RREG32 (CONFIG_MEMSIZE ) *1024ULL *1024ULL ; + rdev->mc.real_vram_size =RREG32 (CONFIG_MEMSIZE ) *1024ULL *1024ULL ; rdev->mc.visible_vram_size = rdev->mc.aper_size;si_vram_gtt_location (rdev, &rdev->mc);radeon_update_bandwidth_info (rdev);
Signature · 1 line
1.7.10.4
Steven Rostedt
maintainerPATCH 65/65 virtio_console: fix uapi header
In reply to Steven Rostedt3.6.11.5 stable review patch.
If anyone has any objections, please let me know.
------------------
From: "Michael S. Tsirkin" <[email protected]>
[ Upstream commit 6407d75afd08545f2252bb39806ffd3f10c7faac ]
uapi should use __u32 not u32.
Fix a macro in virtio_console.h which uses u32.
--- include/linux/virtio_console.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
include/linux/virtio_console.h +1 -1
@@ -39,7 +39,7 @@#define VIRTIO_CONSOLE_F_SIZE 0/* Does host provide console size? */ #define VIRTIO_CONSOLE_F_MULTIPORT 1/* Does host provide multiple ports? */ -#define VIRTIO_CONSOLE_BAD_ID (~(u32)0) +#define VIRTIO_CONSOLE_BAD_ID (~(__u32)0)struct virtio_console_config {/* colums of the screens */
Signature · 1 line
1.7.10.4