Patch Upstream: drm/radeon: fix bank tiling parameters on SI

2012-08-13 Thread Gregs git-bot
commit: dca571a6a4edda1f61ba7ecb47431a22245490a3
From: =?UTF-8?q?Christian=20K=C3=B6nig?= 
Date: Tue, 31 Jul 2012 13:48:51 +0200
Subject: drm/radeon: fix bank tiling parameters on SI
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

The sixteen bank case wasn't handled here, leading to GPU
crashes because of userspace miscalculation.

Signed-off-by: Christian König 
Cc: stable@vger.kernel.org
Signed-off-by: Alex Deucher 
---
 drivers/gpu/drm/radeon/si.c |   16 
 1 files changed, 12 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/radeon/si.c b/drivers/gpu/drm/radeon/si.c
index c053f81..c153a7f 100644
--- a/drivers/gpu/drm/radeon/si.c
+++ b/drivers/gpu/drm/radeon/si.c
@@ -1639,11 +1639,19 @@ static void si_gpu_init(struct radeon_device *rdev)
/* XXX what about 12? */
rdev->config.si.tile_config |= (3 << 0);
break;
-   }
-   if ((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT)
-   rdev->config.si.tile_config |= 1 << 4;
-   else
+   }   
+   switch ((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT) {
+   case 0: /* four banks */
rdev->config.si.tile_config |= 0 << 4;
+   break;
+   case 1: /* eight banks */
+   rdev->config.si.tile_config |= 1 << 4;
+   break;
+   case 2: /* sixteen banks */
+   default:
+   rdev->config.si.tile_config |= 2 << 4;
+   break;
+   }
rdev->config.si.tile_config |=
((gb_addr_config & PIPE_INTERLEAVE_SIZE_MASK) >> 
PIPE_INTERLEAVE_SIZE_SHIFT) << 8;
rdev->config.si.tile_config |=
-- 
1.7.3.4
--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Patch Upstream: drm/radeon: fix bank tiling parameters on cayman

2012-08-13 Thread Gregs git-bot
commit: 5b23c9045a8b61352986270b2d109edf5085e113
From: Alex Deucher 
Date: Tue, 31 Jul 2012 11:05:11 -0400
Subject: drm/radeon: fix bank tiling parameters on cayman

Handle the 16 bank case.

Signed-off-by: Alex Deucher 
Cc: stable@vger.kernel.org
---
 drivers/gpu/drm/radeon/ni.c |   14 +++---
 1 files changed, 11 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/radeon/ni.c b/drivers/gpu/drm/radeon/ni.c
index 9945d86..853800e 100644
--- a/drivers/gpu/drm/radeon/ni.c
+++ b/drivers/gpu/drm/radeon/ni.c
@@ -574,10 +574,18 @@ static void cayman_gpu_init(struct radeon_device *rdev)
if (rdev->flags & RADEON_IS_IGP)
rdev->config.cayman.tile_config |= 1 << 4;
else {
-   if ((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT)
-   rdev->config.cayman.tile_config |= 1 << 4;
-   else
+   switch ((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT) {
+   case 0: /* four banks */
rdev->config.cayman.tile_config |= 0 << 4;
+   break;
+   case 1: /* eight banks */
+   rdev->config.cayman.tile_config |= 1 << 4;
+   break;
+   case 2: /* sixteen banks */
+   default:
+   rdev->config.cayman.tile_config |= 2 << 4;
+   break;
+   }
}
rdev->config.cayman.tile_config |=
((gb_addr_config & PIPE_INTERLEAVE_SIZE_MASK) >> 
PIPE_INTERLEAVE_SIZE_SHIFT) << 8;
-- 
1.7.3.4
--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Patch Upstream: drm/radeon/kms: allow "invalid" DB formats as a means to disable DB

2012-08-13 Thread Gregs git-bot
commit: 0f457e488c79922dfd646f94ed058764f7ba758c
From: =?UTF-8?q?Marek=20Ol=C5=A1=C3=A1k?= 
Date: Sun, 29 Jul 2012 16:24:57 +0200
Subject: drm/radeon/kms: allow "invalid" DB formats as a means to disable DB
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Marek Olšák 
Reviewed-by: Alex Deucher 
Cc: stable@vger.kernel.org
Signed-off-by: Dave Airlie 
---
 drivers/gpu/drm/radeon/evergreen_cs.c |6 --
 drivers/gpu/drm/radeon/evergreend.h   |2 ++
 drivers/gpu/drm/radeon/r600_cs.c  |6 --
 drivers/gpu/drm/radeon/radeon_drv.c   |3 ++-
 4 files changed, 12 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/radeon/evergreen_cs.c 
b/drivers/gpu/drm/radeon/evergreen_cs.c
index c1655412..f2e5c54 100644
--- a/drivers/gpu/drm/radeon/evergreen_cs.c
+++ b/drivers/gpu/drm/radeon/evergreen_cs.c
@@ -961,13 +961,15 @@ static int evergreen_cs_track_check(struct 
radeon_cs_parser *p)
 
if (track->db_dirty) {
/* Check stencil buffer */
-   if (G_028800_STENCIL_ENABLE(track->db_depth_control)) {
+   if (G_028044_FORMAT(track->db_s_info) != 
V_028044_STENCIL_INVALID &&
+   G_028800_STENCIL_ENABLE(track->db_depth_control)) {
r = evergreen_cs_track_validate_stencil(p);
if (r)
return r;
}
/* Check depth buffer */
-   if (G_028800_Z_ENABLE(track->db_depth_control)) {
+   if (G_028040_FORMAT(track->db_z_info) != V_028040_Z_INVALID &&
+   G_028800_Z_ENABLE(track->db_depth_control)) {
r = evergreen_cs_track_validate_depth(p);
if (r)
return r;
diff --git a/drivers/gpu/drm/radeon/evergreend.h 
b/drivers/gpu/drm/radeon/evergreend.h
index d3bd098..7934785 100644
--- a/drivers/gpu/drm/radeon/evergreend.h
+++ b/drivers/gpu/drm/radeon/evergreend.h
@@ -1277,6 +1277,8 @@
 #define   S_028044_FORMAT(x)   (((x) & 0x1) << 0)
 #define   G_028044_FORMAT(x)   (((x) >> 0) & 0x1)
 #define   C_028044_FORMAT  0xFFFE
+#defineV_028044_STENCIL_INVALID0
+#defineV_028044_STENCIL_8  1
 #define   G_028044_TILE_SPLIT(x)   (((x) >> 8) & 0x7)
 #define DB_Z_READ_BASE 0x28048
 #define DB_STENCIL_READ_BASE   0x2804c
diff --git a/drivers/gpu/drm/radeon/r600_cs.c b/drivers/gpu/drm/radeon/r600_cs.c
index ca87f7a..1119e31 100644
--- a/drivers/gpu/drm/radeon/r600_cs.c
+++ b/drivers/gpu/drm/radeon/r600_cs.c
@@ -764,8 +764,10 @@ static int r600_cs_track_check(struct radeon_cs_parser *p)
}
 
/* Check depth buffer */
-   if (track->db_dirty && 
(G_028800_STENCIL_ENABLE(track->db_depth_control) ||
-   G_028800_Z_ENABLE(track->db_depth_control))) {
+   if (track->db_dirty &&
+   G_028010_FORMAT(track->db_depth_info) != V_028010_DEPTH_INVALID &&
+   (G_028800_STENCIL_ENABLE(track->db_depth_control) ||
+G_028800_Z_ENABLE(track->db_depth_control))) {
r = r600_cs_track_validate_db(p);
if (r)
return r;
diff --git a/drivers/gpu/drm/radeon/radeon_drv.c 
b/drivers/gpu/drm/radeon/radeon_drv.c
index dcea6f0..4b736ec 100644
--- a/drivers/gpu/drm/radeon/radeon_drv.c
+++ b/drivers/gpu/drm/radeon/radeon_drv.c
@@ -59,9 +59,10 @@
  *   2.15.0 - add max_pipes query
  *   2.16.0 - fix evergreen 2D tiled surface calculation
  *   2.17.0 - add STRMOUT_BASE_UPDATE for r7xx
+ *   2.18.0 - r600-eg: allow "invalid" DB formats
  */
 #define KMS_DRIVER_MAJOR   2
-#define KMS_DRIVER_MINOR   17
+#define KMS_DRIVER_MINOR   18
 #define KMS_DRIVER_PATCHLEVEL  0
 int radeon_driver_load_kms(struct drm_device *dev, unsigned long flags);
 int radeon_driver_unload_kms(struct drm_device *dev);
-- 
1.7.3.4
--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Patch Upstream: drm/radeon: add some new SI pci ids

2012-08-13 Thread Gregs git-bot
commit: 2f292004dd1fb005788dc0a9cdd5559812ed866e
From: Alex Deucher 
Date: Mon, 6 Aug 2012 10:03:59 -0400
Subject: drm/radeon: add some new SI pci ids

Signed-off-by: Alex Deucher 
Cc: stable@vger.kernel.org
---
 include/drm/drm_pciids.h |3 +++
 1 files changed, 3 insertions(+), 0 deletions(-)

diff --git a/include/drm/drm_pciids.h b/include/drm/drm_pciids.h
index 7ff5c99..c78bb99 100644
--- a/include/drm/drm_pciids.h
+++ b/include/drm/drm_pciids.h
@@ -213,9 +213,12 @@
{0x1002, 0x6800, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 
CHIP_PITCAIRN|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \
{0x1002, 0x6801, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 
CHIP_PITCAIRN|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \
{0x1002, 0x6802, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 
CHIP_PITCAIRN|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \
+   {0x1002, 0x6806, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 
CHIP_PITCAIRN|RADEON_NEW_MEMMAP}, \
{0x1002, 0x6808, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 
CHIP_PITCAIRN|RADEON_NEW_MEMMAP}, \
{0x1002, 0x6809, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 
CHIP_PITCAIRN|RADEON_NEW_MEMMAP}, \
{0x1002, 0x6810, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 
CHIP_PITCAIRN|RADEON_NEW_MEMMAP}, \
+   {0x1002, 0x6816, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 
CHIP_PITCAIRN|RADEON_NEW_MEMMAP}, \
+   {0x1002, 0x6817, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 
CHIP_PITCAIRN|RADEON_NEW_MEMMAP}, \
{0x1002, 0x6818, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 
CHIP_PITCAIRN|RADEON_NEW_MEMMAP}, \
{0x1002, 0x6819, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 
CHIP_PITCAIRN|RADEON_NEW_MEMMAP}, \
{0x1002, 0x6820, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 
CHIP_VERDE|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \
-- 
1.7.3.4
--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Patch Upstream: s390/compat: fix mmap compat system calls

2012-08-13 Thread Gregs git-bot
commit: e85871218513c54f7dfdb6009043cb638f2fecbe
From: Heiko Carstens 
Date: Wed, 8 Aug 2012 09:32:20 +0200
Subject: s390/compat: fix mmap compat system calls

The native 31 bit and the compat behaviour for the mmap system calls differ:

In native 31 bit mode the passed in address for the mmap system call will be
unmodified passed to sys_mmap_pgoff().
In compat mode however the passed in address will be modified with
compat_ptr() which masks out the most significant bit.

The result is that in native 31 bit mode each mmap request (with MAP_FIXED)
will fail where the most significat bit is set, while in compat mode it
may succeed.

This odd behaviour was introduced with d3815898 "[S390] mmap: add missing
compat_ptr conversion to both mmap compat syscalls".

To restore a consistent behaviour accross native and compat mode this
patch functionally reverts the above mentioned commit.

Cc: stable@vger.kernel.org
Signed-off-by: Heiko Carstens 
Signed-off-by: Martin Schwidefsky 
---
 arch/s390/kernel/compat_linux.c |2 --
 1 files changed, 0 insertions(+), 2 deletions(-)

diff --git a/arch/s390/kernel/compat_linux.c b/arch/s390/kernel/compat_linux.c
index d122508..f606d93 100644
--- a/arch/s390/kernel/compat_linux.c
+++ b/arch/s390/kernel/compat_linux.c
@@ -620,7 +620,6 @@ asmlinkage unsigned long old32_mmap(struct 
mmap_arg_struct_emu31 __user *arg)
return -EFAULT;
if (a.offset & ~PAGE_MASK)
return -EINVAL;
-   a.addr = (unsigned long) compat_ptr(a.addr);
return sys_mmap_pgoff(a.addr, a.len, a.prot, a.flags, a.fd,
  a.offset >> PAGE_SHIFT);
 }
@@ -631,7 +630,6 @@ asmlinkage long sys32_mmap2(struct mmap_arg_struct_emu31 
__user *arg)
 
if (copy_from_user(&a, arg, sizeof(a)))
return -EFAULT;
-   a.addr = (unsigned long) compat_ptr(a.addr);
return sys_mmap_pgoff(a.addr, a.len, a.prot, a.flags, a.fd, a.offset);
 }
 
-- 
1.7.3.4
--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Patch Upstream: drm/i915: correctly order the ring init sequence

2012-08-13 Thread Gregs git-bot
commit: 0d8957c8a90bbb5d34fab9a304459448a5131e06
From: Daniel Vetter 
Date: Tue, 7 Aug 2012 09:54:14 +0200
Subject: drm/i915: correctly order the ring init sequence

We may only start to set up the new register values after having
confirmed that the ring is truely off. Otherwise the hw might lose the
newly written register values. This is caught later on in the init
sequence, when we check whether the register writes have stuck.

Cc: stable@vger.kernel.org
Reviewed-by: Jani Nikula 
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=50522
Tested-by: Yang Guang 
Signed-off-by: Daniel Vetter 
---
 drivers/gpu/drm/i915/intel_ringbuffer.c |7 +--
 1 files changed, 5 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c 
b/drivers/gpu/drm/i915/intel_ringbuffer.c
index bf0195a..414af1e 100644
--- a/drivers/gpu/drm/i915/intel_ringbuffer.c
+++ b/drivers/gpu/drm/i915/intel_ringbuffer.c
@@ -289,8 +289,6 @@ static int init_ring_common(struct intel_ring_buffer *ring)
I915_WRITE_HEAD(ring, 0);
ring->write_tail(ring, 0);
 
-   /* Initialize the ring. */
-   I915_WRITE_START(ring, obj->gtt_offset);
head = I915_READ_HEAD(ring) & HEAD_ADDR;
 
/* G45 ring initialization fails to reset head to zero */
@@ -316,6 +314,11 @@ static int init_ring_common(struct intel_ring_buffer *ring)
}
}
 
+   /* Initialize the ring. This must happen _after_ we've cleared the ring
+* registers with the above sequence (the readback of the HEAD registers
+* also enforces ordering), otherwise the hw might lose the new ring
+* register values. */
+   I915_WRITE_START(ring, obj->gtt_offset);
I915_WRITE_CTL(ring,
((ring->size - PAGE_SIZE) & RING_NR_PAGES)
| RING_VALID);
-- 
1.7.3.4
--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Patch Upstream: drm/i915: make rc6 in sysfs functions conditional

2012-08-13 Thread Gregs git-bot
commit: 5ab3633d6907018b0b830a720e877c3884d679c3
From: Hunt Xu 
Date: Sun, 1 Jul 2012 03:45:07 +
Subject: drm/i915: make rc6 in sysfs functions conditional

Commit 0136db586c028f71e7cc21cc183064ff0d5919c8 merges rc6 information
into the power group. However, when compiled with CONFIG_PM not set,
modprobing i915 would taint since power_group_name is defined as NULL.

This patch makes these rc6 in sysfs functions conditional upon the
definition of the CONFIG_PM macro to avoid the above-mentioned problem.

Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=45181
Cc: stable@vger.kernel.org
Tested-by: Kris Karas 
Signed-off-by: Hunt Xu 
Signed-off-by: Daniel Vetter 
---
 drivers/gpu/drm/i915/i915_sysfs.c |   12 
 1 files changed, 12 insertions(+), 0 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_sysfs.c 
b/drivers/gpu/drm/i915/i915_sysfs.c
index 2f5388a..7631807 100644
--- a/drivers/gpu/drm/i915/i915_sysfs.c
+++ b/drivers/gpu/drm/i915/i915_sysfs.c
@@ -32,6 +32,7 @@
 #include "intel_drv.h"
 #include "i915_drv.h"
 
+#ifdef CONFIG_PM
 static u32 calc_residency(struct drm_device *dev, const u32 reg)
 {
struct drm_i915_private *dev_priv = dev->dev_private;
@@ -224,3 +225,14 @@ void i915_teardown_sysfs(struct drm_device *dev)
device_remove_bin_file(&dev->primary->kdev,  &dpf_attrs);
sysfs_unmerge_group(&dev->primary->kdev.kobj, &rc6_attr_group);
 }
+#else
+void i915_setup_sysfs(struct drm_device *dev)
+{
+   return;
+}
+
+void i915_teardown_sysfs(struct drm_device *dev)
+{
+   return;
+}
+#endif /* CONFIG_PM */
-- 
1.7.3.4
--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Patch Upstream: s390/compat: fix compat wrappers for process_vm system calls

2012-08-13 Thread Gregs git-bot
commit: 82aabdb6f1eb61e0034ec23901480f5dd23db7c4
From: Heiko Carstens 
Date: Tue, 7 Aug 2012 09:48:13 +0200
Subject: s390/compat: fix compat wrappers for process_vm system calls

The compat wrappers incorrectly called the non compat versions of
the system process_vm system calls.

Cc: stable@vger.kernel.org
Signed-off-by: Heiko Carstens 
Signed-off-by: Martin Schwidefsky 
---
 arch/s390/kernel/compat_wrapper.S |4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/arch/s390/kernel/compat_wrapper.S 
b/arch/s390/kernel/compat_wrapper.S
index e835d6d..2d82cfc 100644
--- a/arch/s390/kernel/compat_wrapper.S
+++ b/arch/s390/kernel/compat_wrapper.S
@@ -1635,7 +1635,7 @@ ENTRY(compat_sys_process_vm_readv_wrapper)
llgfr   %r6,%r6 # unsigned long
llgf%r0,164(%r15)   # unsigned long
stg %r0,160(%r15)
-   jg  sys_process_vm_readv
+   jg  compat_sys_process_vm_readv
 
 ENTRY(compat_sys_process_vm_writev_wrapper)
lgfr%r2,%r2 # compat_pid_t
@@ -1645,4 +1645,4 @@ ENTRY(compat_sys_process_vm_writev_wrapper)
llgfr   %r6,%r6 # unsigned long
llgf%r0,164(%r15)   # unsigned long
stg %r0,160(%r15)
-   jg  sys_process_vm_writev
+   jg  compat_sys_process_vm_writev
-- 
1.7.3.4
--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Patch Upstream: drm/mgag200: fix G200ER pll picking algorithm

2012-08-13 Thread Gregs git-bot
commit: 9830605d4c070b16ec5c24a75503877cc7698409
From: Dave Airlie 
Date: Thu, 9 Aug 2012 15:00:15 +1000
Subject: drm/mgag200: fix G200ER pll picking algorithm

The original code was misported from the X driver,

a) an int went to unsigned int, breaking the downward counting testm code
b) the port did the vco/computed clock bits completely wrong.

This fixes an infinite loop on modprobe on some Dell servers with the G200ER
chipset variant.

Found in internal testing.

Cc: stable@vger.kernel.org
Signed-off-by: Dave Airlie 
---
 drivers/gpu/drm/mgag200/mgag200_mode.c |   12 +++-
 1 files changed, 7 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/mgag200/mgag200_mode.c 
b/drivers/gpu/drm/mgag200/mgag200_mode.c
index a4d7c50..b69642d 100644
--- a/drivers/gpu/drm/mgag200/mgag200_mode.c
+++ b/drivers/gpu/drm/mgag200/mgag200_mode.c
@@ -468,10 +468,11 @@ static int mga_g200er_set_plls(struct mga_device *mdev, 
long clock)
 {
unsigned int vcomax, vcomin, pllreffreq;
unsigned int delta, tmpdelta;
-   unsigned int testr, testn, testm, testo;
+   int testr, testn, testm, testo;
unsigned int p, m, n;
-   unsigned int computed;
+   unsigned int computed, vco;
int tmp;
+   const unsigned int m_div_val[] = { 1, 2, 4, 8 };
 
m = n = p = 0;
vcomax = 1488000;
@@ -490,12 +491,13 @@ static int mga_g200er_set_plls(struct mga_device *mdev, 
long clock)
if (delta == 0)
break;
for (testo = 5; testo < 33; testo++) {
-   computed = pllreffreq * (testn + 1) /
+   vco = pllreffreq * (testn + 1) /
(testr + 1);
-   if (computed < vcomin)
+   if (vco < vcomin)
continue;
-   if (computed > vcomax)
+   if (vco > vcomax)
continue;
+   computed = vco / (m_div_val[testm] * 
(testo + 1));
if (computed > clock)
tmpdelta = computed - clock;
else
-- 
1.7.3.4
--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Patch Upstream: drm/radeon: properly handle crtc powergating

2012-08-13 Thread Gregs git-bot
commit: 6c0ae2ab85fc4a95cae82047a7db1f688a7737ab
From: Alex Deucher 
Date: Thu, 26 Jul 2012 13:38:52 -0400
Subject: drm/radeon: properly handle crtc powergating

Need to make sure the crtc is gated on before modesetting.
Explicitly gate the crtc on in prepare() and set a flag
so that the dpms functions don't gate it off during
mode set.

Noticed by sylware on IRC.

Signed-off-by: Alex Deucher 
Cc: stable@vger.kernel.org
---
 drivers/gpu/drm/radeon/atombios_crtc.c  |   14 --
 drivers/gpu/drm/radeon/radeon_legacy_crtc.c |4 
 drivers/gpu/drm/radeon/radeon_mode.h|1 +
 3 files changed, 17 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/radeon/atombios_crtc.c 
b/drivers/gpu/drm/radeon/atombios_crtc.c
index 9e6f76f..dc279eb 100644
--- a/drivers/gpu/drm/radeon/atombios_crtc.c
+++ b/drivers/gpu/drm/radeon/atombios_crtc.c
@@ -259,7 +259,7 @@ void atombios_crtc_dpms(struct drm_crtc *crtc, int mode)
/* adjust pm to dpms changes BEFORE enabling crtcs */
radeon_pm_compute_clocks(rdev);
/* disable crtc pair power gating before programming */
-   if (ASIC_IS_DCE6(rdev))
+   if (ASIC_IS_DCE6(rdev) && !radeon_crtc->in_mode_set)
atombios_powergate_crtc(crtc, ATOM_DISABLE);
atombios_enable_crtc(crtc, ATOM_ENABLE);
if (ASIC_IS_DCE3(rdev) && !ASIC_IS_DCE6(rdev))
@@ -279,7 +279,7 @@ void atombios_crtc_dpms(struct drm_crtc *crtc, int mode)
atombios_enable_crtc(crtc, ATOM_DISABLE);
radeon_crtc->enabled = false;
/* power gating is per-pair */
-   if (ASIC_IS_DCE6(rdev)) {
+   if (ASIC_IS_DCE6(rdev) && !radeon_crtc->in_mode_set) {
struct drm_crtc *other_crtc;
struct radeon_crtc *other_radeon_crtc;
list_for_each_entry(other_crtc, 
&rdev->ddev->mode_config.crtc_list, head) {
@@ -1635,18 +1635,28 @@ static bool atombios_crtc_mode_fixup(struct drm_crtc 
*crtc,
 static void atombios_crtc_prepare(struct drm_crtc *crtc)
 {
struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
+   struct drm_device *dev = crtc->dev;
+   struct radeon_device *rdev = dev->dev_private;
 
+   radeon_crtc->in_mode_set = true;
/* pick pll */
radeon_crtc->pll_id = radeon_atom_pick_pll(crtc);
 
+   /* disable crtc pair power gating before programming */
+   if (ASIC_IS_DCE6(rdev))
+   atombios_powergate_crtc(crtc, ATOM_DISABLE);
+
atombios_lock_crtc(crtc, ATOM_ENABLE);
atombios_crtc_dpms(crtc, DRM_MODE_DPMS_OFF);
 }
 
 static void atombios_crtc_commit(struct drm_crtc *crtc)
 {
+   struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
+
atombios_crtc_dpms(crtc, DRM_MODE_DPMS_ON);
atombios_lock_crtc(crtc, ATOM_DISABLE);
+   radeon_crtc->in_mode_set = false;
 }
 
 static void atombios_crtc_disable(struct drm_crtc *crtc)
diff --git a/drivers/gpu/drm/radeon/radeon_legacy_crtc.c 
b/drivers/gpu/drm/radeon/radeon_legacy_crtc.c
index d5fd615..94b4a1c 100644
--- a/drivers/gpu/drm/radeon/radeon_legacy_crtc.c
+++ b/drivers/gpu/drm/radeon/radeon_legacy_crtc.c
@@ -1025,9 +1025,11 @@ static int radeon_crtc_mode_set(struct drm_crtc *crtc,
 
 static void radeon_crtc_prepare(struct drm_crtc *crtc)
 {
+   struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
struct drm_device *dev = crtc->dev;
struct drm_crtc *crtci;
 
+   radeon_crtc->in_mode_set = true;
/*
* The hardware wedges sometimes if you reconfigure one CRTC
* whilst another is running (see fdo bug #24611).
@@ -1038,6 +1040,7 @@ static void radeon_crtc_prepare(struct drm_crtc *crtc)
 
 static void radeon_crtc_commit(struct drm_crtc *crtc)
 {
+   struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
struct drm_device *dev = crtc->dev;
struct drm_crtc *crtci;
 
@@ -1048,6 +1051,7 @@ static void radeon_crtc_commit(struct drm_crtc *crtc)
if (crtci->enabled)
radeon_crtc_dpms(crtci, DRM_MODE_DPMS_ON);
}
+   radeon_crtc->in_mode_set = false;
 }
 
 static const struct drm_crtc_helper_funcs legacy_helper_funcs = {
diff --git a/drivers/gpu/drm/radeon/radeon_mode.h 
b/drivers/gpu/drm/radeon/radeon_mode.h
index f380d59..d569789 100644
--- a/drivers/gpu/drm/radeon/radeon_mode.h
+++ b/drivers/gpu/drm/radeon/radeon_mode.h
@@ -275,6 +275,7 @@ struct radeon_crtc {
u16 lut_r[256], lut_g[256], lut_b[256];
bool enabled;
bool can_tile;
+   bool in_mode_set;
uint32_t crtc_offset;
struct drm_gem_object *cursor_bo;
uint64_t cursor_addr;
-- 
1.7.3.4
--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Patch Upstream: drm/radeon: do not reenable crtc after moving vram start address

2012-08-13 Thread Gregs git-bot
commit: 81ee8fb6b52ec69eeed37fe7943446af1dccecc5
From: Jerome Glisse 
Date: Fri, 27 Jul 2012 16:32:24 -0400
Subject: drm/radeon: do not reenable crtc after moving vram start address

It seems we can not update the crtc scanout address. After disabling
crtc, update to base address do not take effect after crtc being
reenable leading to at least frame being scanout from the old crtc
base address. Disabling crtc display request lead to same behavior.

So after changing the vram address if we don't keep crtc disabled
we will have the GPU trying to read some random system memory address
with some iommu this will broke the crtc engine and will lead to
broken display and iommu error message.

So to avoid this, disable crtc. For flicker less boot we will need
to avoid moving the vram start address.

This patch should also fix :

https://bugs.freedesktop.org/show_bug.cgi?id=42373

Cc: 
Signed-off-by: Jerome Glisse 
---
 drivers/gpu/drm/radeon/evergreen.c   |   57 --
 drivers/gpu/drm/radeon/radeon_asic.h |8 +---
 drivers/gpu/drm/radeon/rv515.c   |   13 
 3 files changed, 2 insertions(+), 76 deletions(-)

diff --git a/drivers/gpu/drm/radeon/evergreen.c 
b/drivers/gpu/drm/radeon/evergreen.c
index f4ef24f..e93b80a 100644
--- a/drivers/gpu/drm/radeon/evergreen.c
+++ b/drivers/gpu/drm/radeon/evergreen.c
@@ -1229,24 +1229,8 @@ void evergreen_agp_enable(struct radeon_device *rdev)
 
 void evergreen_mc_stop(struct radeon_device *rdev, struct evergreen_mc_save 
*save)
 {
-   save->vga_control[0] = RREG32(D1VGA_CONTROL);
-   save->vga_control[1] = RREG32(D2VGA_CONTROL);
save->vga_render_control = RREG32(VGA_RENDER_CONTROL);
save->vga_hdp_control = RREG32(VGA_HDP_CONTROL);
-   save->crtc_control[0] = RREG32(EVERGREEN_CRTC_CONTROL + 
EVERGREEN_CRTC0_REGISTER_OFFSET);
-   save->crtc_control[1] = RREG32(EVERGREEN_CRTC_CONTROL + 
EVERGREEN_CRTC1_REGISTER_OFFSET);
-   if (rdev->num_crtc >= 4) {
-   save->vga_control[2] = RREG32(EVERGREEN_D3VGA_CONTROL);
-   save->vga_control[3] = RREG32(EVERGREEN_D4VGA_CONTROL);
-   save->crtc_control[2] = RREG32(EVERGREEN_CRTC_CONTROL + 
EVERGREEN_CRTC2_REGISTER_OFFSET);
-   save->crtc_control[3] = RREG32(EVERGREEN_CRTC_CONTROL + 
EVERGREEN_CRTC3_REGISTER_OFFSET);
-   }
-   if (rdev->num_crtc >= 6) {
-   save->vga_control[4] = RREG32(EVERGREEN_D5VGA_CONTROL);
-   save->vga_control[5] = RREG32(EVERGREEN_D6VGA_CONTROL);
-   save->crtc_control[4] = RREG32(EVERGREEN_CRTC_CONTROL + 
EVERGREEN_CRTC4_REGISTER_OFFSET);
-   save->crtc_control[5] = RREG32(EVERGREEN_CRTC_CONTROL + 
EVERGREEN_CRTC5_REGISTER_OFFSET);
-   }
 
/* Stop all video */
WREG32(VGA_RENDER_CONTROL, 0);
@@ -1357,47 +1341,6 @@ void evergreen_mc_resume(struct radeon_device *rdev, 
struct evergreen_mc_save *s
/* Unlock host access */
WREG32(VGA_HDP_CONTROL, save->vga_hdp_control);
mdelay(1);
-   /* Restore video state */
-   WREG32(D1VGA_CONTROL, save->vga_control[0]);
-   WREG32(D2VGA_CONTROL, save->vga_control[1]);
-   if (rdev->num_crtc >= 4) {
-   WREG32(EVERGREEN_D3VGA_CONTROL, save->vga_control[2]);
-   WREG32(EVERGREEN_D4VGA_CONTROL, save->vga_control[3]);
-   }
-   if (rdev->num_crtc >= 6) {
-   WREG32(EVERGREEN_D5VGA_CONTROL, save->vga_control[4]);
-   WREG32(EVERGREEN_D6VGA_CONTROL, save->vga_control[5]);
-   }
-   WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC0_REGISTER_OFFSET, 1);
-   WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC1_REGISTER_OFFSET, 1);
-   if (rdev->num_crtc >= 4) {
-   WREG32(EVERGREEN_CRTC_UPDATE_LOCK + 
EVERGREEN_CRTC2_REGISTER_OFFSET, 1);
-   WREG32(EVERGREEN_CRTC_UPDATE_LOCK + 
EVERGREEN_CRTC3_REGISTER_OFFSET, 1);
-   }
-   if (rdev->num_crtc >= 6) {
-   WREG32(EVERGREEN_CRTC_UPDATE_LOCK + 
EVERGREEN_CRTC4_REGISTER_OFFSET, 1);
-   WREG32(EVERGREEN_CRTC_UPDATE_LOCK + 
EVERGREEN_CRTC5_REGISTER_OFFSET, 1);
-   }
-   WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET, 
save->crtc_control[0]);
-   WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET, 
save->crtc_control[1]);
-   if (rdev->num_crtc >= 4) {
-   WREG32(EVERGREEN_CRTC_CONTROL + 
EVERGREEN_CRTC2_REGISTER_OFFSET, save->crtc_control[2]);
-   WREG32(EVERGREEN_CRTC_CONTROL + 
EVERGREEN_CRTC3_REGISTER_OFFSET, save->crtc_control[3]);
-   }
-   if (rdev->num_crtc >= 6) {
-   WREG32(EVERGREEN_CRTC_CONTROL + 
EVERGREEN_CRTC4_REGISTER_OFFSET, save->crtc_control[4]);
-   WREG32(EVERGREEN_CRTC_CONTROL + 
EVERGREEN_CRTC5_REGISTER_OFFSET, save->crtc_control[5]);
-   }
-   WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC0_REGISTER_OFFSET, 0);
-   WREG32(EVERGREEN_CRTC_UPDATE_LOCK 

Patch Upstream: drm/radeon: fix bank tiling parameters on evergreen

2012-08-13 Thread Gregs git-bot
commit: c8d15edc17d836686d1f071e564800e1a2724fa6
From: Alex Deucher 
Date: Tue, 31 Jul 2012 11:01:10 -0400
Subject: drm/radeon: fix bank tiling parameters on evergreen

Handle the 16 bank case.

Signed-off-by: Alex Deucher 
Cc: stable@vger.kernel.org
---
 drivers/gpu/drm/radeon/evergreen.c |   14 +++---
 1 files changed, 11 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/radeon/evergreen.c 
b/drivers/gpu/drm/radeon/evergreen.c
index e585a3b..f4ef24f 100644
--- a/drivers/gpu/drm/radeon/evergreen.c
+++ b/drivers/gpu/drm/radeon/evergreen.c
@@ -1986,10 +1986,18 @@ static void evergreen_gpu_init(struct radeon_device 
*rdev)
if (rdev->flags & RADEON_IS_IGP)
rdev->config.evergreen.tile_config |= 1 << 4;
else {
-   if ((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT)
-   rdev->config.evergreen.tile_config |= 1 << 4;
-   else
+   switch ((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT) {
+   case 0: /* four banks */
rdev->config.evergreen.tile_config |= 0 << 4;
+   break;
+   case 1: /* eight banks */
+   rdev->config.evergreen.tile_config |= 1 << 4;
+   break;
+   case 2: /* sixteen banks */
+   default:
+   rdev->config.evergreen.tile_config |= 2 << 4;
+   break;
+   }
}
rdev->config.evergreen.tile_config |= 0 << 8;
rdev->config.evergreen.tile_config |=
-- 
1.7.3.4
--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [ 10/44] ALSA: hda - remove quirk for Dell Vostro 1015

2012-08-13 Thread Takashi Iwai
At Tue, 14 Aug 2012 07:17:43 +0200,
David Henningsson wrote:
> 
> On 08/14/2012 12:02 AM, Greg Kroah-Hartman wrote:
> > From: Greg KH 
> >
> > 3.0-stable review patch.  If anyone has any objections, please let me know.
> 
> As my previous email states, I still object to this patch being applied 
> to 3.0 (it is for 3.2+). Repeating that text now:
> 
> This patch will not work on 3.0 because there is no model=auto fallback, 
> so please remove it from 3.0-stable-queue.

Right, Greg, could you remove this patch from the 3.0 queue?
This will cause a regression on 3.0.


thanks,

Takashi

> 
> In the original patch [1], the cc to stable was written as this:
> 
> Cc: sta...@kernel.org (3.2+)
> 
> Is there a better way to specify what kernels it should and should not 
> be applied to, as it doesn't seem to have worked in this case?
> 
> [1] 
> http://git.kernel.org/?p=linux/kernel/git/tiwai/sound.git;a=commit;h=e9fc83cb2e5877801a255a37ddbc5be996ea8046
> 
> -- 
> David Henningsson, Canonical Ltd.
> https://launchpad.net/~diwic
> 
--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH] drm/i915: reorder edp disabling to fix ivb MacBook Air

2012-08-13 Thread Keith Packard
Daniel Vetter  writes:

> Cc: Keith Packard 

I tried this on top of v3.5, appears to work just fine. Thanks!

Tested-by: Keith Packard 

-- 
keith.pack...@intel.com


pgpNeuLfmFLls.pgp
Description: PGP signature


Re: [ 10/44] ALSA: hda - remove quirk for Dell Vostro 1015

2012-08-13 Thread David Henningsson

On 08/14/2012 12:02 AM, Greg Kroah-Hartman wrote:

From: Greg KH 

3.0-stable review patch.  If anyone has any objections, please let me know.


As my previous email states, I still object to this patch being applied 
to 3.0 (it is for 3.2+). Repeating that text now:


This patch will not work on 3.0 because there is no model=auto fallback, 
so please remove it from 3.0-stable-queue.


In the original patch [1], the cc to stable was written as this:

Cc: sta...@kernel.org (3.2+)

Is there a better way to specify what kernels it should and should not 
be applied to, as it doesn't seem to have worked in this case?


[1] 
http://git.kernel.org/?p=linux/kernel/git/tiwai/sound.git;a=commit;h=e9fc83cb2e5877801a255a37ddbc5be996ea8046


--
David Henningsson, Canonical Ltd.
https://launchpad.net/~diwic
--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: FAILED: patch "[PATCH] mm: hugetlbfs: close race during teardown of hugetlbfs" failed to apply to 3.5-stable tree

2012-08-13 Thread Ben Hutchings
On Fri, 2012-08-10 at 11:02 +0100, Mel Gorman wrote:
> On Thu, Aug 09, 2012 at 11:05:48AM -0700, gre...@linuxfoundation.org wrote:
> > 
> > The patch below does not apply to the 3.5-stable tree.
> > If someone wants it applied there, or to any other stable or longterm
> > tree, then please email the backport, including the original git commit
> > id to .
> > 
> > thanks,
> > 
> 
> This was expected and it is due to patches upstream that would be overkill
> to backport. This version should apply and as it is the original version
> of the patch it should still be ok with Hugh and Michal (cc'd just in case).
> 
> The same patch should be usable for 3.4-stable. I did not get rejection mails
> but I would also suggest that this be merged to 3.0-stable and 3.2-stable
> (added Ben to cc).
[...]

I backported this myself rather than rejecting it.  I think you must not
have noticed my note at the bottom of the original long commit message
when I sent it out as part of 3.2.27-rc1.  My version (commit
6f72a41f67bb23a6478a0277d97f563830d3f25d, attached) appears to retain
some unnecessary complexity and leaves dead code, but does look
equivalent to this.  But I'll be happy to substitute your cleaner
backport.

Ben.

-- 
Ben Hutchings
I say we take off; nuke the site from orbit.  It's the only way to be sure.
From 6f72a41f67bb23a6478a0277d97f563830d3f25d Mon Sep 17 00:00:00 2001
From: Mel Gorman 
Date: Tue, 31 Jul 2012 16:46:20 -0700
Subject: mm: hugetlbfs: close race during teardown of hugetlbfs shared page
 tables

commit d833352a4338dc31295ed832a30c9ccff5c7a183 upstream.

If a process creates a large hugetlbfs mapping that is eligible for page
table sharing and forks heavily with children some of whom fault and
others which destroy the mapping then it is possible for page tables to
get corrupted.  Some teardowns of the mapping encounter a "bad pmd" and
output a message to the kernel log.  The final teardown will trigger a
BUG_ON in mm/filemap.c.

This was reproduced in 3.4 but is known to have existed for a long time
and goes back at least as far as 2.6.37.  It was probably was introduced
in 2.6.20 by [39dde65c: shared page table for hugetlb page].  The messages
look like this;

[  ..] Lots of bad pmd messages followed by this
[  127.164256] mm/memory.c:391: bad pmd 880412e04fe8(8003de4000e7).
[  127.164257] mm/memory.c:391: bad pmd 880412e04ff0(8003de6000e7).
[  127.164258] mm/memory.c:391: bad pmd 880412e04ff8(8003dee7).
[  127.186778] [ cut here ]
[  127.186781] kernel BUG at mm/filemap.c:134!
[  127.186782] invalid opcode:  [#1] SMP
[  127.186783] CPU 7
[  127.186784] Modules linked in: af_packet cpufreq_conservative cpufreq_userspace cpufreq_powersave acpi_cpufreq mperf ext3 jbd dm_mod coretemp crc32c_intel usb_storage ghash_clmulni_intel aesni_intel i2c_i801 r8169 mii uas sr_mod cdrom sg iTCO_wdt iTCO_vendor_support shpchp serio_raw cryptd aes_x86_64 e1000e pci_hotplug dcdbas aes_generic container microcode ext4 mbcache jbd2 crc16 sd_mod crc_t10dif i915 drm_kms_helper drm i2c_algo_bit ehci_hcd ahci libahci usbcore rtc_cmos usb_common button i2c_core intel_agp video intel_gtt fan processor thermal thermal_sys hwmon ata_generic pata_atiixp libata scsi_mod
[  127.186801]
[  127.186802] Pid: 9017, comm: hugetlbfs-test Not tainted 3.4.0-autobuild #53 Dell Inc. OptiPlex 990/06D7TR
[  127.186804] RIP: 0010:[]  [] __delete_from_page_cache+0x15e/0x160
[  127.186809] RSP: :8804144b5c08  EFLAGS: 00010002
[  127.186810] RAX: 0001 RBX: ea000a5c9000 RCX: ffc0
[  127.186811] RDX:  RSI: 0009 RDI: 88042dfdad00
[  127.186812] RBP: 8804144b5c18 R08: 0009 R09: 0003
[  127.186813] R10:  R11: 002d R12: 880412ff83d8
[  127.186814] R13: 880412ff83d8 R14:  R15: 880412ff83d8
[  127.186815] FS:  7fe18ed2c700() GS:88042dce() knlGS:
[  127.186816] CS:  0010 DS:  ES:  CR0: 8005003b
[  127.186817] CR2: 7fe34503 CR3: 000417a14000 CR4: 000407e0
[  127.186818] DR0:  DR1:  DR2: 
[  127.186819] DR3:  DR6: 0ff0 DR7: 0400
[  127.186820] Process hugetlbfs-test (pid: 9017, threadinfo 8804144b4000, task 880417f803c0)
[  127.186821] Stack:
[  127.186822]  ea000a5c9000  8804144b5c48 810ed83b
[  127.186824]  8804144b5c48 138a 1387 8804144b5c98
[  127.186825]  8804144b5d48 811bc925 8804144b5cb8 
[  127.186827] Call Trace:
[  127.186829]  [] delete_from_page_cache+0x3b/0x80
[  127.186832]  [] truncate_hugepages+0x115/0x220
[  127.186834]  [] hugetlbfs_evict_inode+0x13/0x30
[  127.186837]  [] evict+0xa7/0x1b0
[  127.186839]  [] iput_final+0xd3/0x1f0
[  127.186840]  [] iput+0x39/0x50
[  

Re: [PATCH 3.2.y] KVM: VMX: Advertise CPU_BASED_RDPMC_EXITING for nested guests

2012-08-13 Thread Ben Hutchings
On Thu, 2012-08-09 at 12:33 +0300, Avi Kivity wrote:
> From: Stefan Bader 
> 
> Based on commit fee84b079d5ddee2247b5c1f53162c330c622902 upstream.
> 
>   Intercept RDPMC and forward it to the PMU emulation code.
> 
> Newer vmx support will only allow to load the kvm_intel module
> if RDPMC_EXITING is supported. Even without the actual support
> this part of the change is required on 3.2 hosts.
> 
> BugLink: http://bugs.launchpad.net/bugs/1031090
> Signed-off-by: Stefan Bader 
> Signed-off-by: Avi Kivity 

Added to the queue, thanks.

Ben.

> ---
>  arch/x86/kvm/vmx.c | 1 +
>  1 file changed, 1 insertion(+)
> 
> diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
> index 7315488..407789b 100644
> --- a/arch/x86/kvm/vmx.c
> +++ b/arch/x86/kvm/vmx.c
> @@ -1956,6 +1956,7 @@ static __init void nested_vmx_setup_ctls_msrs(void)
>  #endif
>   CPU_BASED_MOV_DR_EXITING | CPU_BASED_UNCOND_IO_EXITING |
>   CPU_BASED_USE_IO_BITMAPS | CPU_BASED_MONITOR_EXITING |
> + CPU_BASED_RDPMC_EXITING |
>   CPU_BASED_ACTIVATE_SECONDARY_CONTROLS;
>   /*
>* We can allow some features even when not supported by the

-- 
Ben Hutchings
I say we take off; nuke the site from orbit.  It's the only way to be sure.


signature.asc
Description: This is a digitally signed message part


Re: [PATCH 2/2] drm/i915: fixup seqno allocation logic for lazy_request

2012-08-13 Thread Ben Hutchings
On Wed, 2012-08-08 at 11:00 +0300, Timo Aaltonen wrote:
> From: Daniel Vetter 
[...]
> (cherry picked from commit 53d227f282eb9fa4c7cdbfd691fa372b7ca8c4c3)
[...]

Queued up for 3.2, thanks.

Ben.

-- 
Ben Hutchings
I say we take off; nuke the site from orbit.  It's the only way to be sure.


signature.asc
Description: This is a digitally signed message part


[ 03/44] nilfs2: fix deadlock issue between chcp and thaw ioctls

2012-08-13 Thread Greg Kroah-Hartman
From: Greg KH 

3.0-stable review patch.  If anyone has any objections, please let me know.

--

From: Ryusuke Konishi 

commit 572d8b3945a31bee7c40d21556803e4807fd9141 upstream.

An fs-thaw ioctl causes deadlock with a chcp or mkcp -s command:

 chcpD 88013870f3d0 0  1325   1324 0x0004
 ...
 Call Trace:
   nilfs_transaction_begin+0x11c/0x1a0 [nilfs2]
   wake_up_bit+0x20/0x20
   copy_from_user+0x18/0x30 [nilfs2]
   nilfs_ioctl_change_cpmode+0x7d/0xcf [nilfs2]
   nilfs_ioctl+0x252/0x61a [nilfs2]
   do_page_fault+0x311/0x34c
   get_unmapped_area+0x132/0x14e
   do_vfs_ioctl+0x44b/0x490
   __set_task_blocked+0x5a/0x61
   vm_mmap_pgoff+0x76/0x87
   __set_current_blocked+0x30/0x4a
   sys_ioctl+0x4b/0x6f
   system_call_fastpath+0x16/0x1b
 thawD 88013870d890 0  1352   1351 0x0004
 ...
 Call Trace:
   rwsem_down_failed_common+0xdb/0x10f
   call_rwsem_down_write_failed+0x13/0x20
   down_write+0x25/0x27
   thaw_super+0x13/0x9e
   do_vfs_ioctl+0x1f5/0x490
   vm_mmap_pgoff+0x76/0x87
   sys_ioctl+0x4b/0x6f
   filp_close+0x64/0x6c
   system_call_fastpath+0x16/0x1b

where the thaw ioctl deadlocked at thaw_super() when called while chcp was
waiting at nilfs_transaction_begin() called from
nilfs_ioctl_change_cpmode().  This deadlock is 100% reproducible.

This is because nilfs_ioctl_change_cpmode() first locks sb->s_umount in
read mode and then waits for unfreezing in nilfs_transaction_begin(),
whereas thaw_super() locks sb->s_umount in write mode.  The locking of
sb->s_umount here was intended to make snapshot mounts and the downgrade
of snapshots to checkpoints exclusive.

This fixes the deadlock issue by replacing the sb->s_umount usage in
nilfs_ioctl_change_cpmode() with a dedicated mutex which protects snapshot
mounts.

Signed-off-by: Ryusuke Konishi 
Cc: Fernando Luis Vazquez Cao 
Tested-by: Ryusuke Konishi 
Signed-off-by: Andrew Morton 
Signed-off-by: Linus Torvalds 
Signed-off-by: Greg Kroah-Hartman 

---
 fs/nilfs2/ioctl.c |4 ++--
 fs/nilfs2/super.c |3 +++
 fs/nilfs2/the_nilfs.c |1 +
 fs/nilfs2/the_nilfs.h |2 ++
 4 files changed, 8 insertions(+), 2 deletions(-)

--- a/fs/nilfs2/ioctl.c
+++ b/fs/nilfs2/ioctl.c
@@ -182,7 +182,7 @@ static int nilfs_ioctl_change_cpmode(str
if (copy_from_user(&cpmode, argp, sizeof(cpmode)))
goto out;
 
-   down_read(&inode->i_sb->s_umount);
+   mutex_lock(&nilfs->ns_snapshot_mount_mutex);
 
nilfs_transaction_begin(inode->i_sb, &ti, 0);
ret = nilfs_cpfile_change_cpmode(
@@ -192,7 +192,7 @@ static int nilfs_ioctl_change_cpmode(str
else
nilfs_transaction_commit(inode->i_sb); /* never fails */
 
-   up_read(&inode->i_sb->s_umount);
+   mutex_unlock(&nilfs->ns_snapshot_mount_mutex);
 out:
mnt_drop_write(filp->f_path.mnt);
return ret;
--- a/fs/nilfs2/super.c
+++ b/fs/nilfs2/super.c
@@ -951,6 +951,8 @@ static int nilfs_attach_snapshot(struct
struct nilfs_root *root;
int ret;
 
+   mutex_lock(&nilfs->ns_snapshot_mount_mutex);
+
down_read(&nilfs->ns_segctor_sem);
ret = nilfs_cpfile_is_snapshot(nilfs->ns_cpfile, cno);
up_read(&nilfs->ns_segctor_sem);
@@ -975,6 +977,7 @@ static int nilfs_attach_snapshot(struct
ret = nilfs_get_root_dentry(s, root, root_dentry);
nilfs_put_root(root);
  out:
+   mutex_unlock(&nilfs->ns_snapshot_mount_mutex);
return ret;
 }
 
--- a/fs/nilfs2/the_nilfs.c
+++ b/fs/nilfs2/the_nilfs.c
@@ -76,6 +76,7 @@ struct the_nilfs *alloc_nilfs(struct blo
nilfs->ns_bdev = bdev;
atomic_set(&nilfs->ns_ndirtyblks, 0);
init_rwsem(&nilfs->ns_sem);
+   mutex_init(&nilfs->ns_snapshot_mount_mutex);
INIT_LIST_HEAD(&nilfs->ns_dirty_files);
INIT_LIST_HEAD(&nilfs->ns_gc_inodes);
spin_lock_init(&nilfs->ns_inode_lock);
--- a/fs/nilfs2/the_nilfs.h
+++ b/fs/nilfs2/the_nilfs.h
@@ -47,6 +47,7 @@ enum {
  * @ns_flags: flags
  * @ns_bdev: block device
  * @ns_sem: semaphore for shared states
+ * @ns_snapshot_mount_mutex: mutex to protect snapshot mounts
  * @ns_sbh: buffer heads of on-disk super blocks
  * @ns_sbp: pointers to super block data
  * @ns_sbwtime: previous write time of super block
@@ -99,6 +100,7 @@ struct the_nilfs {
 
struct block_device*ns_bdev;
struct rw_semaphore ns_sem;
+   struct mutexns_snapshot_mount_mutex;
 
/*
 * used for


--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[ 04/44] pcdp: use early_ioremap/early_iounmap to access pcdp table

2012-08-13 Thread Greg Kroah-Hartman
From: Greg KH 

3.0-stable review patch.  If anyone has any objections, please let me know.

--

From: Greg Pearson 

commit 6c4088ac3a4d82779903433bcd5f048c58fb1aca upstream.

efi_setup_pcdp_console() is called during boot to parse the HCDP/PCDP
EFI system table and setup an early console for printk output.  The
routine uses ioremap/iounmap to setup access to the HCDP/PCDP table
information.

The call to ioremap is happening early in the boot process which leads
to a panic on x86_64 systems:

panic+0x01ca
do_exit+0x043c
oops_end+0x00a7
no_context+0x0119
__bad_area_nosemaphore+0x0138
bad_area_nosemaphore+0x000e
do_page_fault+0x0321
page_fault+0x0020
reserve_memtype+0x02a1
__ioremap_caller+0x0123
ioremap_nocache+0x0012
efi_setup_pcdp_console+0x002b
setup_arch+0x03a9
start_kernel+0x00d4
x86_64_start_reservations+0x012c
x86_64_start_kernel+0x00fe

This replaces the calls to ioremap/iounmap in efi_setup_pcdp_console()
with calls to early_ioremap/early_iounmap which can be called during
early boot.

This patch was tested on an x86_64 prototype system which uses the
HCDP/PCDP table for early console setup.

Signed-off-by: Greg Pearson 
Acked-by: Khalid Aziz 
Signed-off-by: Andrew Morton 
Signed-off-by: Linus Torvalds 
Signed-off-by: Greg Kroah-Hartman 

---
 drivers/firmware/pcdp.c |4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

--- a/drivers/firmware/pcdp.c
+++ b/drivers/firmware/pcdp.c
@@ -95,7 +95,7 @@ efi_setup_pcdp_console(char *cmdline)
if (efi.hcdp == EFI_INVALID_TABLE_ADDR)
return -ENODEV;
 
-   pcdp = ioremap(efi.hcdp, 4096);
+   pcdp = early_ioremap(efi.hcdp, 4096);
printk(KERN_INFO "PCDP: v%d at 0x%lx\n", pcdp->rev, efi.hcdp);
 
if (strstr(cmdline, "console=hcdp")) {
@@ -131,6 +131,6 @@ efi_setup_pcdp_console(char *cmdline)
}
 
 out:
-   iounmap(pcdp);
+   early_iounmap(pcdp, 4096);
return rc;
 }


--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[ 02/44] SUNRPC: return negative value in case rpcbind client creation error

2012-08-13 Thread Greg Kroah-Hartman
From: Greg KH 

3.0-stable review patch.  If anyone has any objections, please let me know.

--

From: Stanislav Kinsbursky 

commit caea33da898e4e14f0ba58173e3b7689981d2c0b upstream.

Without this patch kernel will panic on LockD start, because lockd_up() checks
lockd_up_net() result for negative value.
>From my pow it's better to return negative value from rpcbind routines instead
of replacing all such checks like in lockd_up().

Signed-off-by: Stanislav Kinsbursky 
Signed-off-by: Trond Myklebust 
Signed-off-by: Greg Kroah-Hartman 

---
 net/sunrpc/rpcb_clnt.c |4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

--- a/net/sunrpc/rpcb_clnt.c
+++ b/net/sunrpc/rpcb_clnt.c
@@ -193,7 +193,7 @@ static int rpcb_create_local_unix(void)
if (IS_ERR(clnt)) {
dprintk("RPC:   failed to create AF_LOCAL rpcbind "
"client (errno %ld).\n", PTR_ERR(clnt));
-   result = -PTR_ERR(clnt);
+   result = PTR_ERR(clnt);
goto out;
}
 
@@ -242,7 +242,7 @@ static int rpcb_create_local_net(void)
if (IS_ERR(clnt)) {
dprintk("RPC:   failed to create local rpcbind "
"client (errno %ld).\n", PTR_ERR(clnt));
-   result = -PTR_ERR(clnt);
+   result = PTR_ERR(clnt);
goto out;
}
 


--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[ 05/44] mm: fix wrong argument of migrate_huge_pages() in soft_offline_huge_page()

2012-08-13 Thread Greg Kroah-Hartman
From: Greg KH 

3.0-stable review patch.  If anyone has any objections, please let me know.

--

From: Joonsoo Kim 

commit dc32f63453f56d07a1073a697dcd843dd3098c09 upstream.

Commit a6bc32b89922 ("mm: compaction: introduce sync-light migration for
use by compaction") changed the declaration of migrate_pages() and
migrate_huge_pages().

But it missed changing the argument of migrate_huge_pages() in
soft_offline_huge_page().  In this case, we should call
migrate_huge_pages() with MIGRATE_SYNC.

Additionally, there is a mismatch between type the of argument and the
function declaration for migrate_pages().

Signed-off-by: Joonsoo Kim 
Cc: Christoph Lameter 
Cc: Mel Gorman 
Acked-by: David Rientjes 
Cc: "Aneesh Kumar K.V" 
Signed-off-by: Andrew Morton 
Signed-off-by: Linus Torvalds 
Signed-off-by: Greg Kroah-Hartman 

---
 mm/memory-failure.c |6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

--- a/mm/memory-failure.c
+++ b/mm/memory-failure.c
@@ -1334,8 +1334,8 @@ static int soft_offline_huge_page(struct
/* Keep page count to indicate a given hugepage is isolated. */
 
list_add(&hpage->lru, &pagelist);
-   ret = migrate_huge_pages(&pagelist, new_page, MPOL_MF_MOVE_ALL, 0,
-   true);
+   ret = migrate_huge_pages(&pagelist, new_page, MPOL_MF_MOVE_ALL, false,
+   MIGRATE_SYNC);
if (ret) {
struct page *page1, *page2;
list_for_each_entry_safe(page1, page2, &pagelist, lru)
@@ -1464,7 +1464,7 @@ int soft_offline_page(struct page *page,
page_is_file_cache(page));
list_add(&page->lru, &pagelist);
ret = migrate_pages(&pagelist, new_page, MPOL_MF_MOVE_ALL,
-   0, MIGRATE_SYNC);
+   false, MIGRATE_SYNC);
if (ret) {
putback_lru_pages(&pagelist);
pr_info("soft offline: %#lx: migration failed %d, type 
%lx\n",


--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[ 11/44] mm: mmu_notifier: fix freed page still mapped in secondary MMU

2012-08-13 Thread Greg Kroah-Hartman
From: Greg KH 

3.0-stable review patch.  If anyone has any objections, please let me know.

--

From: Xiao Guangrong 

commit 3ad3d901bbcfb15a5e4690e55350db0899095a68 upstream.

mmu_notifier_release() is called when the process is exiting.  It will
delete all the mmu notifiers.  But at this time the page belonging to the
process is still present in page tables and is present on the LRU list, so
this race will happen:

  CPU 0 CPU 1
mmu_notifier_release:try_to_unmap:
   hlist_del_init_rcu(&mn->hlist);
ptep_clear_flush_notify:
  mmu nofifler not found
free page  !!
/*
 * At the point, the page has been
 * freed, but it is still mapped in
 * the secondary MMU.
 */

  mn->ops->release(mn, mm);

Then the box is not stable and sometimes we can get this bug:

[  738.075923] BUG: Bad page state in process migrate-perf  pfn:03bec
[  738.075931] page:ea0efb00 count:0 mapcount:0 mapping:  
(null) index:0x8076
[  738.075936] page flags: 0x200014(referenced|dirty)

The same issue is present in mmu_notifier_unregister().

We can call ->release before deleting the notifier to ensure the page has
been unmapped from the secondary MMU before it is freed.

Signed-off-by: Xiao Guangrong 
Cc: Avi Kivity 
Cc: Marcelo Tosatti 
Cc: Paul Gortmaker 
Cc: Andrea Arcangeli 
Signed-off-by: Andrew Morton 
Signed-off-by: Linus Torvalds 
Signed-off-by: Greg Kroah-Hartman 

---
 mm/mmu_notifier.c |   45 +++--
 1 file changed, 23 insertions(+), 22 deletions(-)

--- a/mm/mmu_notifier.c
+++ b/mm/mmu_notifier.c
@@ -33,6 +33,24 @@
 void __mmu_notifier_release(struct mm_struct *mm)
 {
struct mmu_notifier *mn;
+   struct hlist_node *n;
+
+   /*
+* RCU here will block mmu_notifier_unregister until
+* ->release returns.
+*/
+   rcu_read_lock();
+   hlist_for_each_entry_rcu(mn, n, &mm->mmu_notifier_mm->list, hlist)
+   /*
+* if ->release runs before mmu_notifier_unregister it
+* must be handled as it's the only way for the driver
+* to flush all existing sptes and stop the driver
+* from establishing any more sptes before all the
+* pages in the mm are freed.
+*/
+   if (mn->ops->release)
+   mn->ops->release(mn, mm);
+   rcu_read_unlock();
 
spin_lock(&mm->mmu_notifier_mm->lock);
while (unlikely(!hlist_empty(&mm->mmu_notifier_mm->list))) {
@@ -46,23 +64,6 @@ void __mmu_notifier_release(struct mm_st
 * mmu_notifier_unregister to return.
 */
hlist_del_init_rcu(&mn->hlist);
-   /*
-* RCU here will block mmu_notifier_unregister until
-* ->release returns.
-*/
-   rcu_read_lock();
-   spin_unlock(&mm->mmu_notifier_mm->lock);
-   /*
-* if ->release runs before mmu_notifier_unregister it
-* must be handled as it's the only way for the driver
-* to flush all existing sptes and stop the driver
-* from establishing any more sptes before all the
-* pages in the mm are freed.
-*/
-   if (mn->ops->release)
-   mn->ops->release(mn, mm);
-   rcu_read_unlock();
-   spin_lock(&mm->mmu_notifier_mm->lock);
}
spin_unlock(&mm->mmu_notifier_mm->lock);
 
@@ -284,16 +285,13 @@ void mmu_notifier_unregister(struct mmu_
 {
BUG_ON(atomic_read(&mm->mm_count) <= 0);
 
-   spin_lock(&mm->mmu_notifier_mm->lock);
if (!hlist_unhashed(&mn->hlist)) {
-   hlist_del_rcu(&mn->hlist);
-
/*
 * RCU here will force exit_mmap to wait ->release to finish
 * before freeing the pages.
 */
rcu_read_lock();
-   spin_unlock(&mm->mmu_notifier_mm->lock);
+
/*
 * exit_mmap will block in mmu_notifier_release to
 * guarantee ->release is called before freeing the
@@ -302,8 +300,11 @@ void mmu_notifier_unregister(struct mmu_
if (mn->ops->release)
mn->ops->release(mn, mm);
rcu_read_unlock();
-   } else
+
+   spin_lock(&mm->mmu_notifier_mm->lock);
+   hlist_del_rcu(&mn->hlist);
spin_unlock(&mm->mmu_notifier_mm->lock);
+   }
 
/*
 * Wait any running method to finish, of course including


--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a messag

[ 10/44] ALSA: hda - remove quirk for Dell Vostro 1015

2012-08-13 Thread Greg Kroah-Hartman
From: Greg KH 

3.0-stable review patch.  If anyone has any objections, please let me know.

--

From: David Henningsson 

commit e9fc83cb2e5877801a255a37ddbc5be996ea8046 upstream.

This computer is confirmed working with model=auto on kernel 3.2.
Also, parsing fails with hda-emu with the current model.

Signed-off-by: David Henningsson 
Signed-off-by: Takashi Iwai 
Signed-off-by: Greg Kroah-Hartman 

---
 sound/pci/hda/patch_conexant.c |1 -
 1 file changed, 1 deletion(-)

--- a/sound/pci/hda/patch_conexant.c
+++ b/sound/pci/hda/patch_conexant.c
@@ -3089,7 +3089,6 @@ static const struct snd_pci_quirk cxt506
SND_PCI_QUIRK(0x1028, 0x02d8, "Dell Vostro", CXT5066_DELL_VOSTRO),
SND_PCI_QUIRK(0x1028, 0x02f5, "Dell Vostro 320", CXT5066_IDEAPAD),
SND_PCI_QUIRK(0x1028, 0x0401, "Dell Vostro 1014", CXT5066_DELL_VOSTRO),
-   SND_PCI_QUIRK(0x1028, 0x0402, "Dell Vostro", CXT5066_DELL_VOSTRO),
SND_PCI_QUIRK(0x1028, 0x0408, "Dell Inspiron One 19T", CXT5066_IDEAPAD),
SND_PCI_QUIRK(0x1028, 0x050f, "Dell Inspiron", CXT5066_IDEAPAD),
SND_PCI_QUIRK(0x1028, 0x0510, "Dell Vostro", CXT5066_IDEAPAD),


--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[ 01/44] [IA64] Redefine ATOMIC_INIT and ATOMIC64_INIT to drop the casts

2012-08-13 Thread Greg Kroah-Hartman
From: Greg KH 

3.0-stable review patch.  If anyone has any objections, please let me know.

--

From: Tony Luck 

commit a119365586b0130dfea06457f584953e0ff6481d upstream.

The following build error occured during a ia64 build with
swap-over-NFS patches applied.

net/core/sock.c:274:36: error: initializer element is not constant
net/core/sock.c:274:36: error: (near initialization for 'memalloc_socks')
net/core/sock.c:274:36: error: initializer element is not constant

This is identical to a parisc build error. Fengguang Wu, Mel Gorman
and James Bottomley did all the legwork to track the root cause of
the problem. This fix and entire commit log is shamelessly copied
from them with one extra detail to change a dubious runtime use of
ATOMIC_INIT() to atomic_set() in drivers/char/mspec.c

Dave Anglin says:
> Here is the line in sock.i:
>
> struct static_key memalloc_socks = ((struct static_key) { .enabled =
> ((atomic_t) { (0) }) });

The above line contains two compound literals.  It also uses a designated
initializer to initialize the field enabled.  A compound literal is not a
constant expression.

The location of the above statement isn't fully clear, but if a compound
literal occurs outside the body of a function, the initializer list must
consist of constant expressions.

Signed-off-by: Tony Luck 
Signed-off-by: Greg Kroah-Hartman 

---
 arch/ia64/include/asm/atomic.h |4 ++--
 drivers/char/mspec.c   |2 +-
 2 files changed, 3 insertions(+), 3 deletions(-)

--- a/arch/ia64/include/asm/atomic.h
+++ b/arch/ia64/include/asm/atomic.h
@@ -18,8 +18,8 @@
 #include 
 
 
-#define ATOMIC_INIT(i) ((atomic_t) { (i) })
-#define ATOMIC64_INIT(i)   ((atomic64_t) { (i) })
+#define ATOMIC_INIT(i) { (i) }
+#define ATOMIC64_INIT(i)   { (i) }
 
 #define atomic_read(v) (*(volatile int *)&(v)->counter)
 #define atomic64_read(v)   (*(volatile long *)&(v)->counter)
--- a/drivers/char/mspec.c
+++ b/drivers/char/mspec.c
@@ -284,7 +284,7 @@ mspec_mmap(struct file *file, struct vm_
vdata->flags = flags;
vdata->type = type;
spin_lock_init(&vdata->lock);
-   vdata->refcnt = ATOMIC_INIT(1);
+   atomic_set(&vdata->refcnt, 1);
vma->vm_private_data = vdata;
 
vma->vm_flags |= (VM_IO | VM_RESERVED | VM_PFNMAP | VM_DONTEXPAND);


--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[ 08/44] ARM: 7478/1: errata: extend workaround for erratum #720789

2012-08-13 Thread Greg Kroah-Hartman
From: Greg KH 

3.0-stable review patch.  If anyone has any objections, please let me know.

--

From: Will Deacon 

commit 5a783cbc48367cfc7b65afc75430953dfe60098f upstream.

Commit cdf357f1 ("ARM: 6299/1: errata: TLBIASIDIS and TLBIMVAIS
operations can broadcast a faulty ASID") replaced by-ASID TLB flushing
operations with all-ASID variants to workaround A9 erratum #720789.

This patch extends the workaround to include the tlb_range operations,
which were overlooked by the original patch.

Tested-by: Steve Capper 
Signed-off-by: Will Deacon 
Signed-off-by: Russell King 
Signed-off-by: Greg Kroah-Hartman 

---
 arch/arm/mm/tlb-v7.S |   12 
 1 file changed, 12 insertions(+)

--- a/arch/arm/mm/tlb-v7.S
+++ b/arch/arm/mm/tlb-v7.S
@@ -38,11 +38,19 @@ ENTRY(v7wbi_flush_user_tlb_range)
dsb
mov r0, r0, lsr #PAGE_SHIFT @ align address
mov r1, r1, lsr #PAGE_SHIFT
+#ifdef CONFIG_ARM_ERRATA_720789
+   mov r3, #0
+#else
asidr3, r3  @ mask ASID
+#endif
orr r0, r3, r0, lsl #PAGE_SHIFT @ Create initial MVA
mov r1, r1, lsl #PAGE_SHIFT
 1:
+#ifdef CONFIG_ARM_ERRATA_720789
+   ALT_SMP(mcr p15, 0, r0, c8, c3, 3)  @ TLB invalidate U MVA all ASID 
(shareable)
+#else
ALT_SMP(mcr p15, 0, r0, c8, c3, 1)  @ TLB invalidate U MVA 
(shareable)
+#endif
ALT_UP(mcr  p15, 0, r0, c8, c7, 1)  @ TLB invalidate U MVA
 
add r0, r0, #PAGE_SZ
@@ -70,7 +78,11 @@ ENTRY(v7wbi_flush_kern_tlb_range)
mov r0, r0, lsl #PAGE_SHIFT
mov r1, r1, lsl #PAGE_SHIFT
 1:
+#ifdef CONFIG_ARM_ERRATA_720789
+   ALT_SMP(mcr p15, 0, r0, c8, c3, 3)  @ TLB invalidate U MVA all ASID 
(shareable)
+#else
ALT_SMP(mcr p15, 0, r0, c8, c3, 1)  @ TLB invalidate U MVA 
(shareable)
+#endif
ALT_UP(mcr  p15, 0, r0, c8, c7, 1)  @ TLB invalidate U MVA
add r0, r0, #PAGE_SZ
cmp r0, r1


--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[ 07/44] ARM: 7477/1: vfp: Always save VFP state in vfp_pm_suspend on UP

2012-08-13 Thread Greg Kroah-Hartman
From: Greg KH 

3.0-stable review patch.  If anyone has any objections, please let me know.

--

From: Colin Cross 

commit 24b35521b8ddf088531258f06f681bb7b227bf47 upstream.

vfp_pm_suspend should save the VFP state in suspend after
any lazy context switch.  If it only saves when the VFP is enabled,
the state can get lost when, on a UP system:
  Thread 1 uses the VFP
  Context switch occurs to thread 2, VFP is disabled but the
 VFP context is not saved
  Thread 2 initiates suspend
  vfp_pm_suspend is called with the VFP disabled, and the unsaved
 VFP context of Thread 1 in the registers

Modify vfp_pm_suspend to save the VFP context whenever
vfp_current_hw_state is not NULL.

Includes a fix from Ido Yariv , who pointed out that on
SMP systems, the state pointer can be pointing to a freed task struct if
a task exited on another cpu, fixed by using #ifndef CONFIG_SMP in the
new if clause.

Signed-off-by: Colin Cross 
Cc: Barry Song 
Cc: Catalin Marinas 
Cc: Ido Yariv 
Cc: Daniel Drake 
Cc: Will Deacon 
Signed-off-by: Russell King 
Signed-off-by: Greg Kroah-Hartman 

---
 arch/arm/vfp/vfpmodule.c |6 ++
 1 file changed, 6 insertions(+)

--- a/arch/arm/vfp/vfpmodule.c
+++ b/arch/arm/vfp/vfpmodule.c
@@ -412,6 +412,12 @@ static int vfp_pm_suspend(void)
 
/* disable, just in case */
fmxr(FPEXC, fmrx(FPEXC) & ~FPEXC_EN);
+   } else if (vfp_current_hw_state[ti->cpu]) {
+#ifndef CONFIG_SMP
+   fmxr(FPEXC, fpexc | FPEXC_EN);
+   vfp_save_state(vfp_current_hw_state[ti->cpu], fpexc);
+   fmxr(FPEXC, fpexc);
+#endif
}
 
/* clear any information we had about last context state */


--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[ 06/44] ARM: 7467/1: mutex: use generic xchg-based implementation for ARMv6+

2012-08-13 Thread Greg Kroah-Hartman
From: Greg KH 

3.0-stable review patch.  If anyone has any objections, please let me know.

--

From: Will Deacon 

commit a76d7bd96d65fa5119adba97e1b58d95f2e78829 upstream.

The open-coded mutex implementation for ARMv6+ cores suffers from a
severe lack of barriers, so in the uncontended case we don't actually
protect any accesses performed during the critical section.

Furthermore, the code is largely a duplication of the ARMv6+ atomic_dec
code but optimised to remove a branch instruction, as the mutex fastpath
was previously inlined. Now that this is executed out-of-line, we can
reuse the atomic access code for the locking (in fact, we use the xchg
code as this produces shorter critical sections).

This patch uses the generic xchg based implementation for mutexes on
ARMv6+, which introduces barriers to the lock/unlock operations and also
has the benefit of removing a fair amount of inline assembly code.

Acked-by: Arnd Bergmann 
Acked-by: Nicolas Pitre 
Reported-by: Shan Kang 
Signed-off-by: Will Deacon 
Signed-off-by: Russell King 
Signed-off-by: Greg Kroah-Hartman 

---
 arch/arm/include/asm/mutex.h |  119 +--
 1 file changed, 4 insertions(+), 115 deletions(-)

--- a/arch/arm/include/asm/mutex.h
+++ b/arch/arm/include/asm/mutex.h
@@ -7,121 +7,10 @@
  */
 #ifndef _ASM_MUTEX_H
 #define _ASM_MUTEX_H
-
-#if __LINUX_ARM_ARCH__ < 6
-/* On pre-ARMv6 hardware the swp based implementation is the most efficient. */
-# include 
-#else
-
 /*
- * Attempting to lock a mutex on ARMv6+ can be done with a bastardized
- * atomic decrement (it is not a reliable atomic decrement but it satisfies
- * the defined semantics for our purpose, while being smaller and faster
- * than a real atomic decrement or atomic swap.  The idea is to attempt
- * decrementing the lock value only once.  If once decremented it isn't zero,
- * or if its store-back fails due to a dispute on the exclusive store, we
- * simply bail out immediately through the slow path where the lock will be
- * reattempted until it succeeds.
+ * On pre-ARMv6 hardware this results in a swp-based implementation,
+ * which is the most efficient. For ARMv6+, we emit a pair of exclusive
+ * accesses instead.
  */
-static inline void
-__mutex_fastpath_lock(atomic_t *count, void (*fail_fn)(atomic_t *))
-{
-   int __ex_flag, __res;
-
-   __asm__ (
-
-   "ldrex  %0, [%2]\n\t"
-   "sub%0, %0, #1  \n\t"
-   "strex  %1, %0, [%2]"
-
-   : "=&r" (__res), "=&r" (__ex_flag)
-   : "r" (&(count)->counter)
-   : "cc","memory" );
-
-   __res |= __ex_flag;
-   if (unlikely(__res != 0))
-   fail_fn(count);
-}
-
-static inline int
-__mutex_fastpath_lock_retval(atomic_t *count, int (*fail_fn)(atomic_t *))
-{
-   int __ex_flag, __res;
-
-   __asm__ (
-
-   "ldrex  %0, [%2]\n\t"
-   "sub%0, %0, #1  \n\t"
-   "strex  %1, %0, [%2]"
-
-   : "=&r" (__res), "=&r" (__ex_flag)
-   : "r" (&(count)->counter)
-   : "cc","memory" );
-
-   __res |= __ex_flag;
-   if (unlikely(__res != 0))
-   __res = fail_fn(count);
-   return __res;
-}
-
-/*
- * Same trick is used for the unlock fast path. However the original value,
- * rather than the result, is used to test for success in order to have
- * better generated assembly.
- */
-static inline void
-__mutex_fastpath_unlock(atomic_t *count, void (*fail_fn)(atomic_t *))
-{
-   int __ex_flag, __res, __orig;
-
-   __asm__ (
-
-   "ldrex  %0, [%3]\n\t"
-   "add%1, %0, #1  \n\t"
-   "strex  %2, %1, [%3]"
-
-   : "=&r" (__orig), "=&r" (__res), "=&r" (__ex_flag)
-   : "r" (&(count)->counter)
-   : "cc","memory" );
-
-   __orig |= __ex_flag;
-   if (unlikely(__orig != 0))
-   fail_fn(count);
-}
-
-/*
- * If the unlock was done on a contended lock, or if the unlock simply fails
- * then the mutex remains locked.
- */
-#define __mutex_slowpath_needs_to_unlock() 1
-
-/*
- * For __mutex_fastpath_trylock we use another construct which could be
- * described as a "single value cmpxchg".
- *
- * This provides the needed trylock semantics like cmpxchg would, but it is
- * lighter and less generic than a true cmpxchg implementation.
- */
-static inline int
-__mutex_fastpath_trylock(atomic_t *count, int (*fail_fn)(atomic_t *))
-{
-   int __ex_flag, __res, __orig;
-
-   __asm__ (
-
-   "1: ldrex   %0, [%3]\n\t"
-   "subs   %1, %0, #1  \n\t"
-   "strexeq%2, %1, [%3]\n\t"
-   "movlt  %0, #0  \n\t"
-   "cmpeq  %2, #0  \n\t"
-   "bgt1b  "
-
-   : "=&r" (__orig), "=&r" (__res), "=

[ 00/65] 3.4.9-stable review

2012-08-13 Thread Greg Kroah-Hartman
From: Greg KH 

This is the start of the stable review cycle for the 3.4.9 release.
There are 65 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 Wed Aug 15 22:14:12 UTC 2012.
Anything received after that time might be too late.

The whole patch series can be found in one patch at:
kernel.org/pub/linux/kernel/v3.0/stable-review/patch-3.4.9-rc1.gz
and the diffstat can be found below.

thanks,

greg k-h

-
 MAINTAINERS   |2 +-
 Makefile  |4 +-
 arch/arm/boot/dts/imx53-ard.dts   |   20 ++
 arch/arm/configs/mxs_defconfig|1 -
 arch/arm/include/asm/cacheflush.h |8 +-
 arch/arm/include/asm/mutex.h  |  119 +-
 arch/arm/kernel/entry-armv.S  |  111 +
 arch/arm/kernel/process.c |2 +
 arch/arm/kernel/smp.c |3 +-
 arch/arm/kernel/traps.c   |8 -
 arch/arm/mach-pxa/raumfeld.c  |2 +-
 arch/arm/mm/tlb-v7.S  |   12 +
 arch/arm/vfp/entry.S  |   16 +-
 arch/arm/vfp/vfphw.S  |   19 +-
 arch/arm/vfp/vfpmodule.c  |8 +-
 arch/ia64/include/asm/atomic.h|4 +-
 arch/ia64/kernel/irq_ia64.c   |1 -
 arch/x86/kernel/alternative.c |2 +-
 arch/x86/kernel/microcode_core.c  |   31 ++-
 drivers/acpi/processor_driver.c   |2 +-
 drivers/char/mspec.c  |2 +-
 drivers/char/random.c |  352 +++--
 drivers/firmware/dmi_scan.c   |3 +
 drivers/firmware/pcdp.c   |4 +-
 drivers/hid/hid-chicony.c |1 +
 drivers/hid/hid-core.c|2 +
 drivers/hid/hid-cypress.c |2 +
 drivers/hid/hid-ids.h |5 +
 drivers/hid/hid-multitouch.c  |5 +
 drivers/input/tablet/wacom_wac.c  |2 +-
 drivers/input/touchscreen/eeti_ts.c   |   21 +-
 drivers/md/raid1.c|5 +-
 drivers/media/rc/ene_ir.c |3 +-
 drivers/mfd/ab3100-core.c |5 -
 drivers/mfd/ezx-pcap.c|2 +-
 drivers/mfd/wm831x-otp.c  |8 +
 drivers/net/ethernet/intel/e1000e/82571.c |4 +-
 drivers/net/tun.c |1 -
 drivers/net/wireless/ath/ath9k/hw.c   |1 +
 drivers/net/wireless/ath/ath9k/hw.h   |1 +
 drivers/net/wireless/ath/ath9k/pci.c  |1 +
 drivers/net/wireless/iwlwifi/iwl-agn-rs.c |   13 +-
 drivers/net/wireless/rt2x00/rt61pci.c |3 +-
 drivers/platform/x86/asus-wmi.c   |7 +-
 drivers/rtc/rtc-wm831x.c  |   24 +-
 drivers/target/target_core_cdb.c  |   43 ++--
 drivers/usb/core/hub.c|9 +
 drivers/video/smscufx.c   |2 +-
 fs/exofs/ore.c|   14 +-
 fs/nilfs2/ioctl.c |4 +-
 fs/nilfs2/super.c |3 +
 fs/nilfs2/the_nilfs.c |1 +
 fs/nilfs2/the_nilfs.h |2 +
 include/linux/input/eeti_ts.h |1 +
 include/linux/irqdesc.h   |1 -
 include/linux/mfd/ezx-pcap.h  |1 +
 include/linux/random.h|6 +-
 include/trace/events/random.h |  134 +++
 kernel/irq/handle.c   |7 +-
 kernel/irq/manage.c   |   17 --
 mm/hugetlb.c  |   25 +-
 mm/memory-failure.c   |6 +-
 mm/mmu_notifier.c |   45 ++--
 net/core/dev.c|3 +
 net/core/rtnetlink.c  |1 +
 net/mac80211/mesh.c   |1 +
 net/sunrpc/clnt.c |3 +-
 net/sunrpc/rpcb_clnt.c|4 +-
 net/wireless/core.c   |5 +
 net/wireless/core.h   |1 +
 net/wireless/reg.c|   16 +-
 net/wireless/util.c   |5 +-
 sound/pci/hda/patch_conexant.c|1 -
 sound/pci/hda/patch_realtek.c |7 +-
 74 files changed, 774 insertions(+), 446 deletions(-)


--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[ 04/65] SUNRPC: return negative value in case rpcbind client creation error

2012-08-13 Thread Greg Kroah-Hartman
From: Greg KH 

3.4-stable review patch.  If anyone has any objections, please let me know.

--

From: Stanislav Kinsbursky 

commit caea33da898e4e14f0ba58173e3b7689981d2c0b upstream.

Without this patch kernel will panic on LockD start, because lockd_up() checks
lockd_up_net() result for negative value.
>From my pow it's better to return negative value from rpcbind routines instead
of replacing all such checks like in lockd_up().

Signed-off-by: Stanislav Kinsbursky 
Signed-off-by: Trond Myklebust 
Signed-off-by: Greg Kroah-Hartman 

---
 net/sunrpc/rpcb_clnt.c |4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

--- a/net/sunrpc/rpcb_clnt.c
+++ b/net/sunrpc/rpcb_clnt.c
@@ -251,7 +251,7 @@ static int rpcb_create_local_unix(struct
if (IS_ERR(clnt)) {
dprintk("RPC:   failed to create AF_LOCAL rpcbind "
"client (errno %ld).\n", PTR_ERR(clnt));
-   result = -PTR_ERR(clnt);
+   result = PTR_ERR(clnt);
goto out;
}
 
@@ -298,7 +298,7 @@ static int rpcb_create_local_net(struct
if (IS_ERR(clnt)) {
dprintk("RPC:   failed to create local rpcbind "
"client (errno %ld).\n", PTR_ERR(clnt));
-   result = -PTR_ERR(clnt);
+   result = PTR_ERR(clnt);
goto out;
}
 


--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[ 05/65] nilfs2: fix deadlock issue between chcp and thaw ioctls

2012-08-13 Thread Greg Kroah-Hartman
From: Greg KH 

3.4-stable review patch.  If anyone has any objections, please let me know.

--

From: Ryusuke Konishi 

commit 572d8b3945a31bee7c40d21556803e4807fd9141 upstream.

An fs-thaw ioctl causes deadlock with a chcp or mkcp -s command:

 chcpD 88013870f3d0 0  1325   1324 0x0004
 ...
 Call Trace:
   nilfs_transaction_begin+0x11c/0x1a0 [nilfs2]
   wake_up_bit+0x20/0x20
   copy_from_user+0x18/0x30 [nilfs2]
   nilfs_ioctl_change_cpmode+0x7d/0xcf [nilfs2]
   nilfs_ioctl+0x252/0x61a [nilfs2]
   do_page_fault+0x311/0x34c
   get_unmapped_area+0x132/0x14e
   do_vfs_ioctl+0x44b/0x490
   __set_task_blocked+0x5a/0x61
   vm_mmap_pgoff+0x76/0x87
   __set_current_blocked+0x30/0x4a
   sys_ioctl+0x4b/0x6f
   system_call_fastpath+0x16/0x1b
 thawD 88013870d890 0  1352   1351 0x0004
 ...
 Call Trace:
   rwsem_down_failed_common+0xdb/0x10f
   call_rwsem_down_write_failed+0x13/0x20
   down_write+0x25/0x27
   thaw_super+0x13/0x9e
   do_vfs_ioctl+0x1f5/0x490
   vm_mmap_pgoff+0x76/0x87
   sys_ioctl+0x4b/0x6f
   filp_close+0x64/0x6c
   system_call_fastpath+0x16/0x1b

where the thaw ioctl deadlocked at thaw_super() when called while chcp was
waiting at nilfs_transaction_begin() called from
nilfs_ioctl_change_cpmode().  This deadlock is 100% reproducible.

This is because nilfs_ioctl_change_cpmode() first locks sb->s_umount in
read mode and then waits for unfreezing in nilfs_transaction_begin(),
whereas thaw_super() locks sb->s_umount in write mode.  The locking of
sb->s_umount here was intended to make snapshot mounts and the downgrade
of snapshots to checkpoints exclusive.

This fixes the deadlock issue by replacing the sb->s_umount usage in
nilfs_ioctl_change_cpmode() with a dedicated mutex which protects snapshot
mounts.

Signed-off-by: Ryusuke Konishi 
Cc: Fernando Luis Vazquez Cao 
Tested-by: Ryusuke Konishi 
Signed-off-by: Andrew Morton 
Signed-off-by: Linus Torvalds 
Signed-off-by: Greg Kroah-Hartman 

---
 fs/nilfs2/ioctl.c |4 ++--
 fs/nilfs2/super.c |3 +++
 fs/nilfs2/the_nilfs.c |1 +
 fs/nilfs2/the_nilfs.h |2 ++
 4 files changed, 8 insertions(+), 2 deletions(-)

--- a/fs/nilfs2/ioctl.c
+++ b/fs/nilfs2/ioctl.c
@@ -182,7 +182,7 @@ static int nilfs_ioctl_change_cpmode(str
if (copy_from_user(&cpmode, argp, sizeof(cpmode)))
goto out;
 
-   down_read(&inode->i_sb->s_umount);
+   mutex_lock(&nilfs->ns_snapshot_mount_mutex);
 
nilfs_transaction_begin(inode->i_sb, &ti, 0);
ret = nilfs_cpfile_change_cpmode(
@@ -192,7 +192,7 @@ static int nilfs_ioctl_change_cpmode(str
else
nilfs_transaction_commit(inode->i_sb); /* never fails */
 
-   up_read(&inode->i_sb->s_umount);
+   mutex_unlock(&nilfs->ns_snapshot_mount_mutex);
 out:
mnt_drop_write_file(filp);
return ret;
--- a/fs/nilfs2/super.c
+++ b/fs/nilfs2/super.c
@@ -948,6 +948,8 @@ static int nilfs_attach_snapshot(struct
struct nilfs_root *root;
int ret;
 
+   mutex_lock(&nilfs->ns_snapshot_mount_mutex);
+
down_read(&nilfs->ns_segctor_sem);
ret = nilfs_cpfile_is_snapshot(nilfs->ns_cpfile, cno);
up_read(&nilfs->ns_segctor_sem);
@@ -972,6 +974,7 @@ static int nilfs_attach_snapshot(struct
ret = nilfs_get_root_dentry(s, root, root_dentry);
nilfs_put_root(root);
  out:
+   mutex_unlock(&nilfs->ns_snapshot_mount_mutex);
return ret;
 }
 
--- a/fs/nilfs2/the_nilfs.c
+++ b/fs/nilfs2/the_nilfs.c
@@ -76,6 +76,7 @@ struct the_nilfs *alloc_nilfs(struct blo
nilfs->ns_bdev = bdev;
atomic_set(&nilfs->ns_ndirtyblks, 0);
init_rwsem(&nilfs->ns_sem);
+   mutex_init(&nilfs->ns_snapshot_mount_mutex);
INIT_LIST_HEAD(&nilfs->ns_dirty_files);
INIT_LIST_HEAD(&nilfs->ns_gc_inodes);
spin_lock_init(&nilfs->ns_inode_lock);
--- a/fs/nilfs2/the_nilfs.h
+++ b/fs/nilfs2/the_nilfs.h
@@ -47,6 +47,7 @@ enum {
  * @ns_flags: flags
  * @ns_bdev: block device
  * @ns_sem: semaphore for shared states
+ * @ns_snapshot_mount_mutex: mutex to protect snapshot mounts
  * @ns_sbh: buffer heads of on-disk super blocks
  * @ns_sbp: pointers to super block data
  * @ns_sbwtime: previous write time of super block
@@ -99,6 +100,7 @@ struct the_nilfs {
 
struct block_device*ns_bdev;
struct rw_semaphore ns_sem;
+   struct mutexns_snapshot_mount_mutex;
 
/*
 * used for


--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[ 02/65] asus-wmi: use ASUS_WMI_METHODID_DSTS2 as default DSTS ID.

2012-08-13 Thread Greg Kroah-Hartman
From: Greg KH 

3.4-stable review patch.  If anyone has any objections, please let me know.

--

From: Alex Hung 

commit 63a78bb1051b240417daad3a3fa9c1bb10646dca upstream.

According to responses from the BIOS team, ASUS_WMI_METHODID_DSTS2
(0x53545344) will be used as future DSTS ID. In addition, calling
asus_wmi_evaluate_method(ASUS_WMI_METHODID_DSTS2, 0, 0, NULL) returns
ASUS_WMI_UNSUPPORTED_METHOD in new ASUS laptop PCs. This patch fixes
no DSTS ID will be assigned in this case.

Signed-off-by: Alex Hung 
Signed-off-by: Matthew Garrett 
Signed-off-by: Greg Kroah-Hartman 

---
 drivers/platform/x86/asus-wmi.c |7 +--
 1 file changed, 1 insertion(+), 6 deletions(-)

--- a/drivers/platform/x86/asus-wmi.c
+++ b/drivers/platform/x86/asus-wmi.c
@@ -1467,14 +1467,9 @@ static int asus_wmi_platform_init(struct
 */
if (!asus_wmi_evaluate_method(ASUS_WMI_METHODID_DSTS, 0, 0, NULL))
asus->dsts_id = ASUS_WMI_METHODID_DSTS;
-   else if (!asus_wmi_evaluate_method(ASUS_WMI_METHODID_DSTS2, 0, 0, NULL))
+   else
asus->dsts_id = ASUS_WMI_METHODID_DSTS2;
 
-   if (!asus->dsts_id) {
-   pr_err("Can't find DSTS");
-   return -ENODEV;
-   }
-
/* CWAP allow to define the behavior of the Fn+F2 key,
 * this method doesn't seems to be present on Eee PCs */
if (asus->driver->quirks->wapf >= 0)


--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[ 03/65] sunrpc: clnt: Add missing braces

2012-08-13 Thread Greg Kroah-Hartman
From: Greg KH 

3.4-stable review patch.  If anyone has any objections, please let me know.

--

From: Joe Perches 

commit cac5d07e3ca696dcacfb123553cf6c722111cfd3 upstream.

Add a missing set of braces that commit 4e0038b6b24
("SUNRPC: Move clnt->cl_server into struct rpc_xprt")
forgot.

Signed-off-by: Joe Perches 
Signed-off-by: Trond Myklebust 
Signed-off-by: Greg Kroah-Hartman 

---
 net/sunrpc/clnt.c |3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

--- a/net/sunrpc/clnt.c
+++ b/net/sunrpc/clnt.c
@@ -1846,12 +1846,13 @@ call_timeout(struct rpc_task *task)
return;
}
if (RPC_IS_SOFT(task)) {
-   if (clnt->cl_chatty)
+   if (clnt->cl_chatty) {
rcu_read_lock();
printk(KERN_NOTICE "%s: server %s not responding, timed 
out\n",
clnt->cl_protname,
rcu_dereference(clnt->cl_xprt)->servername);
rcu_read_unlock();
+   }
if (task->tk_flags & RPC_TASK_TIMEOUT)
rpc_exit(task, -ETIMEDOUT);
else


--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[ 07/65] pcdp: use early_ioremap/early_iounmap to access pcdp table

2012-08-13 Thread Greg Kroah-Hartman
From: Greg KH 

3.4-stable review patch.  If anyone has any objections, please let me know.

--

From: Greg Pearson 

commit 6c4088ac3a4d82779903433bcd5f048c58fb1aca upstream.

efi_setup_pcdp_console() is called during boot to parse the HCDP/PCDP
EFI system table and setup an early console for printk output.  The
routine uses ioremap/iounmap to setup access to the HCDP/PCDP table
information.

The call to ioremap is happening early in the boot process which leads
to a panic on x86_64 systems:

panic+0x01ca
do_exit+0x043c
oops_end+0x00a7
no_context+0x0119
__bad_area_nosemaphore+0x0138
bad_area_nosemaphore+0x000e
do_page_fault+0x0321
page_fault+0x0020
reserve_memtype+0x02a1
__ioremap_caller+0x0123
ioremap_nocache+0x0012
efi_setup_pcdp_console+0x002b
setup_arch+0x03a9
start_kernel+0x00d4
x86_64_start_reservations+0x012c
x86_64_start_kernel+0x00fe

This replaces the calls to ioremap/iounmap in efi_setup_pcdp_console()
with calls to early_ioremap/early_iounmap which can be called during
early boot.

This patch was tested on an x86_64 prototype system which uses the
HCDP/PCDP table for early console setup.

Signed-off-by: Greg Pearson 
Acked-by: Khalid Aziz 
Signed-off-by: Andrew Morton 
Signed-off-by: Linus Torvalds 
Signed-off-by: Greg Kroah-Hartman 

---
 drivers/firmware/pcdp.c |4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

--- a/drivers/firmware/pcdp.c
+++ b/drivers/firmware/pcdp.c
@@ -95,7 +95,7 @@ efi_setup_pcdp_console(char *cmdline)
if (efi.hcdp == EFI_INVALID_TABLE_ADDR)
return -ENODEV;
 
-   pcdp = ioremap(efi.hcdp, 4096);
+   pcdp = early_ioremap(efi.hcdp, 4096);
printk(KERN_INFO "PCDP: v%d at 0x%lx\n", pcdp->rev, efi.hcdp);
 
if (strstr(cmdline, "console=hcdp")) {
@@ -131,6 +131,6 @@ efi_setup_pcdp_console(char *cmdline)
}
 
 out:
-   iounmap(pcdp);
+   early_iounmap(pcdp, 4096);
return rc;
 }


--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[ 06/65] media: ene_ir: Fix driver initialisation

2012-08-13 Thread Greg Kroah-Hartman
From: Greg KH 

3.4-stable review patch.  If anyone has any objections, please let me know.

--

From: Luis Henriques 

commit b31b021988fed9e3741a46918f14ba9b063811db upstream.

commit 9ef449c6b31bb6a8e6dedc24de475a3b8c79be20 ("[media] rc: Postpone ISR
registration") fixed an early ISR registration on several drivers.  It did
however also introduced a bug by moving the invocation of pnp_port_start()
to the end of the probe function.

This patch fixes this issue by moving the invocation of pnp_port_start() to
an earlier stage in the probe function.

Signed-off-by: Luis Henriques 
Cc: Jarod Wilson 
Signed-off-by: Mauro Carvalho Chehab 
Signed-off-by: Greg Kroah-Hartman 

---
 drivers/media/rc/ene_ir.c |3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

--- a/drivers/media/rc/ene_ir.c
+++ b/drivers/media/rc/ene_ir.c
@@ -1018,6 +1018,8 @@ static int ene_probe(struct pnp_dev *pnp
 
spin_lock_init(&dev->hw_lock);
 
+   dev->hw_io = pnp_port_start(pnp_dev, 0);
+
pnp_set_drvdata(pnp_dev, dev);
dev->pnp_dev = pnp_dev;
 
@@ -1072,7 +1074,6 @@ static int ene_probe(struct pnp_dev *pnp
 
/* claim the resources */
error = -EBUSY;
-   dev->hw_io = pnp_port_start(pnp_dev, 0);
if (!request_region(dev->hw_io, ENE_IO_SIZE, ENE_DRIVER_NAME)) {
dev->hw_io = -1;
dev->irq = -1;


--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[ 01/65] [IA64] Redefine ATOMIC_INIT and ATOMIC64_INIT to drop the casts

2012-08-13 Thread Greg Kroah-Hartman
From: Greg KH 

3.4-stable review patch.  If anyone has any objections, please let me know.

--

From: Tony Luck 

commit a119365586b0130dfea06457f584953e0ff6481d upstream.

The following build error occured during a ia64 build with
swap-over-NFS patches applied.

net/core/sock.c:274:36: error: initializer element is not constant
net/core/sock.c:274:36: error: (near initialization for 'memalloc_socks')
net/core/sock.c:274:36: error: initializer element is not constant

This is identical to a parisc build error. Fengguang Wu, Mel Gorman
and James Bottomley did all the legwork to track the root cause of
the problem. This fix and entire commit log is shamelessly copied
from them with one extra detail to change a dubious runtime use of
ATOMIC_INIT() to atomic_set() in drivers/char/mspec.c

Dave Anglin says:
> Here is the line in sock.i:
>
> struct static_key memalloc_socks = ((struct static_key) { .enabled =
> ((atomic_t) { (0) }) });

The above line contains two compound literals.  It also uses a designated
initializer to initialize the field enabled.  A compound literal is not a
constant expression.

The location of the above statement isn't fully clear, but if a compound
literal occurs outside the body of a function, the initializer list must
consist of constant expressions.

Signed-off-by: Tony Luck 
Signed-off-by: Greg Kroah-Hartman 

---
 arch/ia64/include/asm/atomic.h |4 ++--
 drivers/char/mspec.c   |2 +-
 2 files changed, 3 insertions(+), 3 deletions(-)

--- a/arch/ia64/include/asm/atomic.h
+++ b/arch/ia64/include/asm/atomic.h
@@ -17,8 +17,8 @@
 #include 
 
 
-#define ATOMIC_INIT(i) ((atomic_t) { (i) })
-#define ATOMIC64_INIT(i)   ((atomic64_t) { (i) })
+#define ATOMIC_INIT(i) { (i) }
+#define ATOMIC64_INIT(i)   { (i) }
 
 #define atomic_read(v) (*(volatile int *)&(v)->counter)
 #define atomic64_read(v)   (*(volatile long *)&(v)->counter)
--- a/drivers/char/mspec.c
+++ b/drivers/char/mspec.c
@@ -283,7 +283,7 @@ mspec_mmap(struct file *file, struct vm_
vdata->flags = flags;
vdata->type = type;
spin_lock_init(&vdata->lock);
-   vdata->refcnt = ATOMIC_INIT(1);
+   atomic_set(&vdata->refcnt, 1);
vma->vm_private_data = vdata;
 
vma->vm_flags |= (VM_IO | VM_RESERVED | VM_PFNMAP | VM_DONTEXPAND);


--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[ 11/65] ARM: 7476/1: vfp: only clear vfp state for current cpu in vfp_pm_suspend

2012-08-13 Thread Greg Kroah-Hartman
From: Greg KH 

3.4-stable review patch.  If anyone has any objections, please let me know.

--

From: Colin Cross 

commit a84b895a2348f0dbff31b71ddf954f70a6cde368 upstream.

vfp_pm_suspend runs on each cpu, only clear the hardware state
pointer for the current cpu.  Prevents a possible crash if one
cpu clears the hw state pointer when another cpu has already
checked if it is valid.

Signed-off-by: Colin Cross 
Signed-off-by: Russell King 
Signed-off-by: Greg Kroah-Hartman 

---
 arch/arm/vfp/vfpmodule.c |2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

--- a/arch/arm/vfp/vfpmodule.c
+++ b/arch/arm/vfp/vfpmodule.c
@@ -460,7 +460,7 @@ static int vfp_pm_suspend(void)
}
 
/* clear any information we had about last context state */
-   memset(vfp_current_hw_state, 0, sizeof(vfp_current_hw_state));
+   vfp_current_hw_state[ti->cpu] = NULL;
 
return 0;
 }


--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[ 10/65] ARM: 7467/1: mutex: use generic xchg-based implementation for ARMv6+

2012-08-13 Thread Greg Kroah-Hartman
From: Greg KH 

3.4-stable review patch.  If anyone has any objections, please let me know.

--

From: Will Deacon 

commit a76d7bd96d65fa5119adba97e1b58d95f2e78829 upstream.

The open-coded mutex implementation for ARMv6+ cores suffers from a
severe lack of barriers, so in the uncontended case we don't actually
protect any accesses performed during the critical section.

Furthermore, the code is largely a duplication of the ARMv6+ atomic_dec
code but optimised to remove a branch instruction, as the mutex fastpath
was previously inlined. Now that this is executed out-of-line, we can
reuse the atomic access code for the locking (in fact, we use the xchg
code as this produces shorter critical sections).

This patch uses the generic xchg based implementation for mutexes on
ARMv6+, which introduces barriers to the lock/unlock operations and also
has the benefit of removing a fair amount of inline assembly code.

Acked-by: Arnd Bergmann 
Acked-by: Nicolas Pitre 
Reported-by: Shan Kang 
Signed-off-by: Will Deacon 
Signed-off-by: Russell King 
Signed-off-by: Greg Kroah-Hartman 

---
 arch/arm/include/asm/mutex.h |  119 +--
 1 file changed, 4 insertions(+), 115 deletions(-)

--- a/arch/arm/include/asm/mutex.h
+++ b/arch/arm/include/asm/mutex.h
@@ -7,121 +7,10 @@
  */
 #ifndef _ASM_MUTEX_H
 #define _ASM_MUTEX_H
-
-#if __LINUX_ARM_ARCH__ < 6
-/* On pre-ARMv6 hardware the swp based implementation is the most efficient. */
-# include 
-#else
-
 /*
- * Attempting to lock a mutex on ARMv6+ can be done with a bastardized
- * atomic decrement (it is not a reliable atomic decrement but it satisfies
- * the defined semantics for our purpose, while being smaller and faster
- * than a real atomic decrement or atomic swap.  The idea is to attempt
- * decrementing the lock value only once.  If once decremented it isn't zero,
- * or if its store-back fails due to a dispute on the exclusive store, we
- * simply bail out immediately through the slow path where the lock will be
- * reattempted until it succeeds.
+ * On pre-ARMv6 hardware this results in a swp-based implementation,
+ * which is the most efficient. For ARMv6+, we emit a pair of exclusive
+ * accesses instead.
  */
-static inline void
-__mutex_fastpath_lock(atomic_t *count, void (*fail_fn)(atomic_t *))
-{
-   int __ex_flag, __res;
-
-   __asm__ (
-
-   "ldrex  %0, [%2]\n\t"
-   "sub%0, %0, #1  \n\t"
-   "strex  %1, %0, [%2]"
-
-   : "=&r" (__res), "=&r" (__ex_flag)
-   : "r" (&(count)->counter)
-   : "cc","memory" );
-
-   __res |= __ex_flag;
-   if (unlikely(__res != 0))
-   fail_fn(count);
-}
-
-static inline int
-__mutex_fastpath_lock_retval(atomic_t *count, int (*fail_fn)(atomic_t *))
-{
-   int __ex_flag, __res;
-
-   __asm__ (
-
-   "ldrex  %0, [%2]\n\t"
-   "sub%0, %0, #1  \n\t"
-   "strex  %1, %0, [%2]"
-
-   : "=&r" (__res), "=&r" (__ex_flag)
-   : "r" (&(count)->counter)
-   : "cc","memory" );
-
-   __res |= __ex_flag;
-   if (unlikely(__res != 0))
-   __res = fail_fn(count);
-   return __res;
-}
-
-/*
- * Same trick is used for the unlock fast path. However the original value,
- * rather than the result, is used to test for success in order to have
- * better generated assembly.
- */
-static inline void
-__mutex_fastpath_unlock(atomic_t *count, void (*fail_fn)(atomic_t *))
-{
-   int __ex_flag, __res, __orig;
-
-   __asm__ (
-
-   "ldrex  %0, [%3]\n\t"
-   "add%1, %0, #1  \n\t"
-   "strex  %2, %1, [%3]"
-
-   : "=&r" (__orig), "=&r" (__res), "=&r" (__ex_flag)
-   : "r" (&(count)->counter)
-   : "cc","memory" );
-
-   __orig |= __ex_flag;
-   if (unlikely(__orig != 0))
-   fail_fn(count);
-}
-
-/*
- * If the unlock was done on a contended lock, or if the unlock simply fails
- * then the mutex remains locked.
- */
-#define __mutex_slowpath_needs_to_unlock() 1
-
-/*
- * For __mutex_fastpath_trylock we use another construct which could be
- * described as a "single value cmpxchg".
- *
- * This provides the needed trylock semantics like cmpxchg would, but it is
- * lighter and less generic than a true cmpxchg implementation.
- */
-static inline int
-__mutex_fastpath_trylock(atomic_t *count, int (*fail_fn)(atomic_t *))
-{
-   int __ex_flag, __res, __orig;
-
-   __asm__ (
-
-   "1: ldrex   %0, [%3]\n\t"
-   "subs   %1, %0, #1  \n\t"
-   "strexeq%2, %1, [%3]\n\t"
-   "movlt  %0, #0  \n\t"
-   "cmpeq  %2, #0  \n\t"
-   "bgt1b  "
-
-   : "=&r" (__orig), "=&r" (__res), "=

[ 12/65] ARM: 7477/1: vfp: Always save VFP state in vfp_pm_suspend on UP

2012-08-13 Thread Greg Kroah-Hartman
From: Greg KH 

3.4-stable review patch.  If anyone has any objections, please let me know.

--

From: Colin Cross 

commit 24b35521b8ddf088531258f06f681bb7b227bf47 upstream.

vfp_pm_suspend should save the VFP state in suspend after
any lazy context switch.  If it only saves when the VFP is enabled,
the state can get lost when, on a UP system:
  Thread 1 uses the VFP
  Context switch occurs to thread 2, VFP is disabled but the
 VFP context is not saved
  Thread 2 initiates suspend
  vfp_pm_suspend is called with the VFP disabled, and the unsaved
 VFP context of Thread 1 in the registers

Modify vfp_pm_suspend to save the VFP context whenever
vfp_current_hw_state is not NULL.

Includes a fix from Ido Yariv , who pointed out that on
SMP systems, the state pointer can be pointing to a freed task struct if
a task exited on another cpu, fixed by using #ifndef CONFIG_SMP in the
new if clause.

Signed-off-by: Colin Cross 
Cc: Barry Song 
Cc: Catalin Marinas 
Cc: Ido Yariv 
Cc: Daniel Drake 
Cc: Will Deacon 
Signed-off-by: Russell King 
Signed-off-by: Greg Kroah-Hartman 

---
 arch/arm/vfp/vfpmodule.c |6 ++
 1 file changed, 6 insertions(+)

--- a/arch/arm/vfp/vfpmodule.c
+++ b/arch/arm/vfp/vfpmodule.c
@@ -457,6 +457,12 @@ static int vfp_pm_suspend(void)
 
/* disable, just in case */
fmxr(FPEXC, fmrx(FPEXC) & ~FPEXC_EN);
+   } else if (vfp_current_hw_state[ti->cpu]) {
+#ifndef CONFIG_SMP
+   fmxr(FPEXC, fpexc | FPEXC_EN);
+   vfp_save_state(vfp_current_hw_state[ti->cpu], fpexc);
+   fmxr(FPEXC, fpexc);
+#endif
}
 
/* clear any information we had about last context state */


--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[ 13/65] ARM: 7478/1: errata: extend workaround for erratum #720789

2012-08-13 Thread Greg Kroah-Hartman
From: Greg KH 

3.4-stable review patch.  If anyone has any objections, please let me know.

--

From: Will Deacon 

commit 5a783cbc48367cfc7b65afc75430953dfe60098f upstream.

Commit cdf357f1 ("ARM: 6299/1: errata: TLBIASIDIS and TLBIMVAIS
operations can broadcast a faulty ASID") replaced by-ASID TLB flushing
operations with all-ASID variants to workaround A9 erratum #720789.

This patch extends the workaround to include the tlb_range operations,
which were overlooked by the original patch.

Tested-by: Steve Capper 
Signed-off-by: Will Deacon 
Signed-off-by: Russell King 
Signed-off-by: Greg Kroah-Hartman 

---
 arch/arm/mm/tlb-v7.S |   12 
 1 file changed, 12 insertions(+)

--- a/arch/arm/mm/tlb-v7.S
+++ b/arch/arm/mm/tlb-v7.S
@@ -38,11 +38,19 @@ ENTRY(v7wbi_flush_user_tlb_range)
dsb
mov r0, r0, lsr #PAGE_SHIFT @ align address
mov r1, r1, lsr #PAGE_SHIFT
+#ifdef CONFIG_ARM_ERRATA_720789
+   mov r3, #0
+#else
asidr3, r3  @ mask ASID
+#endif
orr r0, r3, r0, lsl #PAGE_SHIFT @ Create initial MVA
mov r1, r1, lsl #PAGE_SHIFT
 1:
+#ifdef CONFIG_ARM_ERRATA_720789
+   ALT_SMP(mcr p15, 0, r0, c8, c3, 3)  @ TLB invalidate U MVA all ASID 
(shareable)
+#else
ALT_SMP(mcr p15, 0, r0, c8, c3, 1)  @ TLB invalidate U MVA 
(shareable)
+#endif
ALT_UP(mcr  p15, 0, r0, c8, c7, 1)  @ TLB invalidate U MVA
 
add r0, r0, #PAGE_SZ
@@ -67,7 +75,11 @@ ENTRY(v7wbi_flush_kern_tlb_range)
mov r0, r0, lsl #PAGE_SHIFT
mov r1, r1, lsl #PAGE_SHIFT
 1:
+#ifdef CONFIG_ARM_ERRATA_720789
+   ALT_SMP(mcr p15, 0, r0, c8, c3, 3)  @ TLB invalidate U MVA all ASID 
(shareable)
+#else
ALT_SMP(mcr p15, 0, r0, c8, c3, 1)  @ TLB invalidate U MVA 
(shareable)
+#endif
ALT_UP(mcr  p15, 0, r0, c8, c7, 1)  @ TLB invalidate U MVA
add r0, r0, #PAGE_SZ
cmp r0, r1


--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[ 14/65] ARM: 7479/1: mm: avoid NULL dereference when flushing gate_vma with VIVT caches

2012-08-13 Thread Greg Kroah-Hartman
From: Greg KH 

3.4-stable review patch.  If anyone has any objections, please let me know.

--

From: Will Deacon 

commit b74253f78400f9a4b42da84bb1de7540b88ce7c4 upstream.

The vivt_flush_cache_{range,page} functions check that the mm_struct
of the VMA being flushed has been active on the current CPU before
performing the cache maintenance.

The gate_vma has a NULL mm_struct pointer and, as such, will cause a
kernel fault if we try to flush it with the above operations. This
happens during ELF core dumps, which include the gate_vma as it may be
useful for debugging purposes.

This patch adds checks to the VIVT cache flushing functions so that VMAs
with a NULL mm_struct are flushed unconditionally (the vectors page may
be dirty if we use it to store the current TLS pointer).

Reported-by: Gilles Chanteperdrix 
Tested-by: Uros Bizjak 
Signed-off-by: Will Deacon 
Signed-off-by: Russell King 
Signed-off-by: Greg Kroah-Hartman 

---
 arch/arm/include/asm/cacheflush.h |8 ++--
 1 file changed, 6 insertions(+), 2 deletions(-)

--- a/arch/arm/include/asm/cacheflush.h
+++ b/arch/arm/include/asm/cacheflush.h
@@ -215,7 +215,9 @@ static inline void vivt_flush_cache_mm(s
 static inline void
 vivt_flush_cache_range(struct vm_area_struct *vma, unsigned long start, 
unsigned long end)
 {
-   if (cpumask_test_cpu(smp_processor_id(), mm_cpumask(vma->vm_mm)))
+   struct mm_struct *mm = vma->vm_mm;
+
+   if (!mm || cpumask_test_cpu(smp_processor_id(), mm_cpumask(mm)))
__cpuc_flush_user_range(start & PAGE_MASK, PAGE_ALIGN(end),
vma->vm_flags);
 }
@@ -223,7 +225,9 @@ vivt_flush_cache_range(struct vm_area_st
 static inline void
 vivt_flush_cache_page(struct vm_area_struct *vma, unsigned long user_addr, 
unsigned long pfn)
 {
-   if (cpumask_test_cpu(smp_processor_id(), mm_cpumask(vma->vm_mm))) {
+   struct mm_struct *mm = vma->vm_mm;
+
+   if (!mm || cpumask_test_cpu(smp_processor_id(), mm_cpumask(mm))) {
unsigned long addr = user_addr & PAGE_MASK;
__cpuc_flush_user_range(addr, addr + PAGE_SIZE, vma->vm_flags);
}


--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[ 15/65] ARM: 7480/1: only call smp_send_stop() on SMP

2012-08-13 Thread Greg Kroah-Hartman
From: Greg KH 

3.4-stable review patch.  If anyone has any objections, please let me know.

--

From: Javier Martinez Canillas 

commit c5dff4ffd327088d85035bec535b7d0c9ea03151 upstream.

On reboot or poweroff (machine_shutdown()) a call to smp_send_stop() is
made (to stop the others CPU's) when CONFIG_SMP=y.

arch/arm/kernel/process.c:

void machine_shutdown(void)
{
 #ifdef CONFIG_SMP
   smp_send_stop();
 #endif
}

smp_send_stop() calls the function pointer smp_cross_call(), which is set
on the smp_init_cpus() function for OMAP processors.

arch/arm/mach-omap2/omap-smp.c:

void __init smp_init_cpus(void)
{
...
set_smp_cross_call(gic_raise_softirq);
...
}

But the ARM setup_arch() function only calls smp_init_cpus()
if CONFIG_SMP=y && is_smp().

arm/kernel/setup.c:

void __init setup_arch(char **cmdline_p)
{
...
 #ifdef CONFIG_SMP
if (is_smp())
smp_init_cpus();
 #endif
...
}

Newer OMAP CPU's are SMP machines so omap2plus_defconfig sets
CONFIG_SMP=y. Unfortunately on an OMAP UP machine is_smp()
returns false and smp_init_cpus() is never called and the
smp_cross_call() function remains NULL.

If the machine is rebooted or powered off, smp_send_stop() will
be called (since CONFIG_SMP=y) leading to the following error:

[   42.815551] Restarting system.
[   42.819030] Unable to handle kernel NULL pointer dereference at virtual 
address 
[   42.827667] pgd = d7a74000
[   42.830566] [] *pgd=96ce7831, *pte=, *ppte=
[   42.837249] Internal error: Oops: 8007 [#1] SMP ARM
[   42.842773] Modules linked in:
[   42.846008] CPU: 0Not tainted  
(3.5.0-rc3-next-20120622-2-g62e87ba-dirty #44)
[   42.854278] PC is at 0x0
[   42.856994] LR is at smp_send_stop+0x4c/0xe4
[   42.861511] pc : [<>]lr : []psr: 6013
[   42.861511] sp : d6c85e70  ip :   fp : 
[   42.873626] r10:   r9 : d6c84000  r8 : 0002
[   42.879150] r7 : c07235a0  r6 : c06dd2d0  r5 : 000f4241  r4 : d6c85e74
[   42.886047] r3 :   r2 :   r1 : 0006  r0 : d6c85e74
[   42.892944] Flags: nZCv  IRQs on  FIQs on  Mode SVC_32  ISA ARM  Segment user
[   42.900482] Control: 10c5387d  Table: 97a74019  DAC: 0015
[   42.906555] Process reboot (pid: 1166, stack limit = 0xd6c842f8)
[   42.912902] Stack: (0xd6c85e70 to 0xd6c86000)
[   42.917510] 5e60: c07235a0  
 d6c84000
[   42.926177] 5e80: 01234567 c00143d0 4321fedc c00511bc d6c85ebc 0168 
0460 
[   42.934814] 5ea0: c1017950 a013 c1017900 d8014390 d7ec3858 c0498e48 
c1017950 
[   42.943481] 5ec0: d6ddde10 d6c85f78 0003  d6ddde10 d6c84000 
 
[   42.952117] 5ee0: 0002   c0088c88 0002  
 c00f4b90
[   42.960784] 5f00:  d6c85ebc d8014390 d7e311c8 6013 0103 
0002 d6c84000
[   42.969421] 5f20: c00f3274 d6e00a00 0001 6013 d6c84000  
 c00895d4
[   42.978057] 5f40: 0002 d8007c80 d781f000 c00f6150 d8010cc0 c00f3274 
d781f000 d6c84000
[   42.986694] 5f60: c0013020 d6e00a00 0001 2010 0001257c ef00 
 c00895d4
[   42.995361] 5f80: 0002 0001 0003  0001 0003 
 0058
[   43.003997] 5fa0: c00130c8 c0012f00 0001 0003 fee1dead 28121969 
01234567 0002
[   43.012634] 5fc0: 0001 0003  0058 00012584 0001257c 
0001 
[   43.021270] 5fe0: 000124bc bec5cc6c 8f9c 4a2f7c40 2010 fee1dead 
 
[   43.029968] [] (smp_send_stop+0x4c/0xe4) from [] 
(machine_restart+0xc/0x4c)
[   43.039154] [] (machine_restart+0xc/0x4c) from [] 
(sys_reboot+0x144/0x1f0)
[   43.048278] [] (sys_reboot+0x144/0x1f0) from [] 
(ret_fast_syscall+0x0/0x3c)
[   43.057464] Code: bad PC value
[   43.060760] ---[ end trace c3988d1dd0b8f0fb ]---

Add a check so smp_cross_call() is only called when there is more than one CPU 
on-line.

Signed-off-by: Javier Martinez Canillas 
Acked-by: Will Deacon 
Signed-off-by: Russell King 
Signed-off-by: Greg Kroah-Hartman 

---
 arch/arm/kernel/smp.c |3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

--- a/arch/arm/kernel/smp.c
+++ b/arch/arm/kernel/smp.c
@@ -590,7 +590,8 @@ void smp_send_stop(void)
 
cpumask_copy(&mask, cpu_online_mask);
cpumask_clear_cpu(smp_processor_id(), &mask);
-   smp_cross_call(&mask, IPI_CPU_STOP);
+   if (!cpumask_empty(&mask))
+   smp_cross_call(&mask, IPI_CPU_STOP);
 
/* Wait up to one second for other CPUs to stop */
timeout = USEC_PER_SEC;


--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[ 09/65] ARM: 7466/1: disable interrupt before spinning endlessly

2012-08-13 Thread Greg Kroah-Hartman
From: Greg KH 

3.4-stable review patch.  If anyone has any objections, please let me know.

--

From: Shawn Guo 

commit 98bd8b96b26db3399a48202318dca4aaa2515355 upstream.

The CPU will endlessly spin at the end of machine_halt and
machine_restart calls.  However, this will lead to a soft lockup
warning after about 20 seconds, if CONFIG_LOCKUP_DETECTOR is enabled,
as system timer is still alive.

Disable interrupt before going to spin endlessly, so that the lockup
warning will never be seen.

Reported-by: Marek Vasut 
Signed-off-by: Shawn Guo 
Signed-off-by: Russell King 
Signed-off-by: Greg Kroah-Hartman 

---
 arch/arm/kernel/process.c |2 ++
 1 file changed, 2 insertions(+)

--- a/arch/arm/kernel/process.c
+++ b/arch/arm/kernel/process.c
@@ -267,6 +267,7 @@ void machine_shutdown(void)
 void machine_halt(void)
 {
machine_shutdown();
+   local_irq_disable();
while (1);
 }
 
@@ -288,6 +289,7 @@ void machine_restart(char *cmd)
 
/* Whoops - the platform was unable to reboot. Tell the user! */
printk("Reboot failed -- System halted\n");
+   local_irq_disable();
while (1);
 }
 


--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[ 21/65] mm: mmu_notifier: fix freed page still mapped in secondary MMU

2012-08-13 Thread Greg Kroah-Hartman
From: Greg KH 

3.4-stable review patch.  If anyone has any objections, please let me know.

--

From: Xiao Guangrong 

commit 3ad3d901bbcfb15a5e4690e55350db0899095a68 upstream.

mmu_notifier_release() is called when the process is exiting.  It will
delete all the mmu notifiers.  But at this time the page belonging to the
process is still present in page tables and is present on the LRU list, so
this race will happen:

  CPU 0 CPU 1
mmu_notifier_release:try_to_unmap:
   hlist_del_init_rcu(&mn->hlist);
ptep_clear_flush_notify:
  mmu nofifler not found
free page  !!
/*
 * At the point, the page has been
 * freed, but it is still mapped in
 * the secondary MMU.
 */

  mn->ops->release(mn, mm);

Then the box is not stable and sometimes we can get this bug:

[  738.075923] BUG: Bad page state in process migrate-perf  pfn:03bec
[  738.075931] page:ea0efb00 count:0 mapcount:0 mapping:  
(null) index:0x8076
[  738.075936] page flags: 0x200014(referenced|dirty)

The same issue is present in mmu_notifier_unregister().

We can call ->release before deleting the notifier to ensure the page has
been unmapped from the secondary MMU before it is freed.

Signed-off-by: Xiao Guangrong 
Cc: Avi Kivity 
Cc: Marcelo Tosatti 
Cc: Paul Gortmaker 
Cc: Andrea Arcangeli 
Signed-off-by: Andrew Morton 
Signed-off-by: Linus Torvalds 
Signed-off-by: Greg Kroah-Hartman 

---
 mm/mmu_notifier.c |   45 +++--
 1 file changed, 23 insertions(+), 22 deletions(-)

--- a/mm/mmu_notifier.c
+++ b/mm/mmu_notifier.c
@@ -33,6 +33,24 @@
 void __mmu_notifier_release(struct mm_struct *mm)
 {
struct mmu_notifier *mn;
+   struct hlist_node *n;
+
+   /*
+* RCU here will block mmu_notifier_unregister until
+* ->release returns.
+*/
+   rcu_read_lock();
+   hlist_for_each_entry_rcu(mn, n, &mm->mmu_notifier_mm->list, hlist)
+   /*
+* if ->release runs before mmu_notifier_unregister it
+* must be handled as it's the only way for the driver
+* to flush all existing sptes and stop the driver
+* from establishing any more sptes before all the
+* pages in the mm are freed.
+*/
+   if (mn->ops->release)
+   mn->ops->release(mn, mm);
+   rcu_read_unlock();
 
spin_lock(&mm->mmu_notifier_mm->lock);
while (unlikely(!hlist_empty(&mm->mmu_notifier_mm->list))) {
@@ -46,23 +64,6 @@ void __mmu_notifier_release(struct mm_st
 * mmu_notifier_unregister to return.
 */
hlist_del_init_rcu(&mn->hlist);
-   /*
-* RCU here will block mmu_notifier_unregister until
-* ->release returns.
-*/
-   rcu_read_lock();
-   spin_unlock(&mm->mmu_notifier_mm->lock);
-   /*
-* if ->release runs before mmu_notifier_unregister it
-* must be handled as it's the only way for the driver
-* to flush all existing sptes and stop the driver
-* from establishing any more sptes before all the
-* pages in the mm are freed.
-*/
-   if (mn->ops->release)
-   mn->ops->release(mn, mm);
-   rcu_read_unlock();
-   spin_lock(&mm->mmu_notifier_mm->lock);
}
spin_unlock(&mm->mmu_notifier_mm->lock);
 
@@ -284,16 +285,13 @@ void mmu_notifier_unregister(struct mmu_
 {
BUG_ON(atomic_read(&mm->mm_count) <= 0);
 
-   spin_lock(&mm->mmu_notifier_mm->lock);
if (!hlist_unhashed(&mn->hlist)) {
-   hlist_del_rcu(&mn->hlist);
-
/*
 * RCU here will force exit_mmap to wait ->release to finish
 * before freeing the pages.
 */
rcu_read_lock();
-   spin_unlock(&mm->mmu_notifier_mm->lock);
+
/*
 * exit_mmap will block in mmu_notifier_release to
 * guarantee ->release is called before freeing the
@@ -302,8 +300,11 @@ void mmu_notifier_unregister(struct mmu_
if (mn->ops->release)
mn->ops->release(mn, mm);
rcu_read_unlock();
-   } else
+
+   spin_lock(&mm->mmu_notifier_mm->lock);
+   hlist_del_rcu(&mn->hlist);
spin_unlock(&mm->mmu_notifier_mm->lock);
+   }
 
/*
 * Wait any running method to finish, of course including


--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a messag

[ 20/65] ALSA: hda - Fix double quirk for Quanta FL1 / Lenovo Ideapad

2012-08-13 Thread Greg Kroah-Hartman
From: Greg KH 

3.4-stable review patch.  If anyone has any objections, please let me know.

--

From: David Henningsson 

commit 012e7eb1e501d0120e0383b81477f63091f5e365 upstream.

The same ID is twice in the quirk table, so the second one is not used.

Signed-off-by: David Henningsson 
Signed-off-by: Takashi Iwai 
Signed-off-by: Greg Kroah-Hartman 

---
 sound/pci/hda/patch_realtek.c |5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

--- a/sound/pci/hda/patch_realtek.c
+++ b/sound/pci/hda/patch_realtek.c
@@ -6056,6 +6056,8 @@ static const struct alc_fixup alc269_fix
[ALC269_FIXUP_PCM_44K] = {
.type = ALC_FIXUP_FUNC,
.v.func = alc269_fixup_pcm_44k,
+   .chained = true,
+   .chain_id = ALC269_FIXUP_QUANTA_MUTE
},
[ALC269_FIXUP_STEREO_DMIC] = {
.type = ALC_FIXUP_FUNC,
@@ -6160,8 +6162,7 @@ static const struct snd_pci_quirk alc269
SND_PCI_QUIRK(0x17aa, 0x21fa, "Thinkpad X230", 
ALC269_FIXUP_LENOVO_DOCK),
SND_PCI_QUIRK(0x17aa, 0x21fb, "Thinkpad T430s", 
ALC269_FIXUP_LENOVO_DOCK),
SND_PCI_QUIRK(0x17aa, 0x2203, "Thinkpad X230 Tablet", 
ALC269_FIXUP_LENOVO_DOCK),
-   SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_FIXUP_QUANTA_MUTE),
-   SND_PCI_QUIRK(0x17aa, 0x3bf8, "Lenovo Ideapd", ALC269_FIXUP_PCM_44K),
+   SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_FIXUP_PCM_44K),
SND_PCI_QUIRK(0x17aa, 0x9e54, "LENOVO NB", ALC269_FIXUP_LENOVO_EAPD),
 
 #if 0


--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[ 19/65] ALSA: hda - remove quirk for Dell Vostro 1015

2012-08-13 Thread Greg Kroah-Hartman
From: Greg KH 

3.4-stable review patch.  If anyone has any objections, please let me know.

--

From: David Henningsson 

commit e9fc83cb2e5877801a255a37ddbc5be996ea8046 upstream.

This computer is confirmed working with model=auto on kernel 3.2.
Also, parsing fails with hda-emu with the current model.

Signed-off-by: David Henningsson 
Signed-off-by: Takashi Iwai 
Signed-off-by: Greg Kroah-Hartman 

---
 sound/pci/hda/patch_conexant.c |1 -
 1 file changed, 1 deletion(-)

--- a/sound/pci/hda/patch_conexant.c
+++ b/sound/pci/hda/patch_conexant.c
@@ -2975,7 +2975,6 @@ static const struct snd_pci_quirk cxt506
SND_PCI_QUIRK(0x1028, 0x02d8, "Dell Vostro", CXT5066_DELL_VOSTRO),
SND_PCI_QUIRK(0x1028, 0x02f5, "Dell Vostro 320", CXT5066_IDEAPAD),
SND_PCI_QUIRK(0x1028, 0x0401, "Dell Vostro 1014", CXT5066_DELL_VOSTRO),
-   SND_PCI_QUIRK(0x1028, 0x0402, "Dell Vostro", CXT5066_DELL_VOSTRO),
SND_PCI_QUIRK(0x1028, 0x0408, "Dell Inspiron One 19T", CXT5066_IDEAPAD),
SND_PCI_QUIRK(0x1028, 0x050f, "Dell Inspiron", CXT5066_IDEAPAD),
SND_PCI_QUIRK(0x1028, 0x0510, "Dell Vostro", CXT5066_IDEAPAD),


--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[ 16/65] ARM: Fix undefined instruction exception handling

2012-08-13 Thread Greg Kroah-Hartman
From: Greg KH 

3.4-stable review patch.  If anyone has any objections, please let me know.

--

From: Russell King 

commit 15ac49b65024f55c4371a53214879a9c77c4fbf9 upstream.

While trying to get a v3.5 kernel booted on the cubox, I noticed that
VFP does not work correctly with VFP bounce handling.  This is because
of the confusion over 16-bit vs 32-bit instructions, and where PC is
supposed to point to.

The rule is that FP handlers are entered with regs->ARM_pc pointing at
the _next_ instruction to be executed.  However, if the exception is
not handled, regs->ARM_pc points at the faulting instruction.

This is easy for ARM mode, because we know that the next instruction and
previous instructions are separated by four bytes.  This is not true of
Thumb2 though.

Since all FP instructions are 32-bit in Thumb2, it makes things easy.
We just need to select the appropriate adjustment.  Do this by moving
the adjustment out of do_undefinstr() into the assembly code, as only
the assembly code knows whether it's dealing with a 32-bit or 16-bit
instruction.

Acked-by: Will Deacon 
Signed-off-by: Russell King 
Signed-off-by: Greg Kroah-Hartman 

---
 arch/arm/kernel/entry-armv.S |  111 +++
 arch/arm/kernel/traps.c  |8 ---
 arch/arm/vfp/entry.S |   16 +++---
 arch/arm/vfp/vfphw.S |   19 ---
 4 files changed, 92 insertions(+), 62 deletions(-)

--- a/arch/arm/kernel/entry-armv.S
+++ b/arch/arm/kernel/entry-armv.S
@@ -244,6 +244,19 @@ svc_preempt:
b   1b
 #endif
 
+__und_fault:
+   @ Correct the PC such that it is pointing at the instruction
+   @ which caused the fault.  If the faulting instruction was ARM
+   @ the PC will be pointing at the next instruction, and have to
+   @ subtract 4.  Otherwise, it is Thumb, and the PC will be
+   @ pointing at the second half of the Thumb instruction.  We
+   @ have to subtract 2.
+   ldr r2, [r0, #S_PC]
+   sub r2, r2, r1
+   str r2, [r0, #S_PC]
+   b   do_undefinstr
+ENDPROC(__und_fault)
+
.align  5
 __und_svc:
 #ifdef CONFIG_KPROBES
@@ -261,25 +274,32 @@ __und_svc:
@
@  r0 - instruction
@
-#ifndefCONFIG_THUMB2_KERNEL
+#ifndef CONFIG_THUMB2_KERNEL
ldr r0, [r4, #-4]
 #else
+   mov r1, #2
ldrhr0, [r4, #-2]   @ Thumb instruction at LR - 2
cmp r0, #0xe800 @ 32-bit instruction if xx >= 0
-   ldrhhs  r9, [r4]@ bottom 16 bits
-   orrhs   r0, r9, r0, lsl #16
+   blo __und_svc_fault
+   ldrhr9, [r4]@ bottom 16 bits
+   add r4, r4, #2
+   str r4, [sp, #S_PC]
+   orr r0, r9, r0, lsl #16
 #endif
-   adr r9, BSYM(1f)
+   adr r9, BSYM(__und_svc_finish)
mov r2, r4
bl  call_fpe
 
+   mov r1, #4  @ PC correction to apply
+__und_svc_fault:
mov r0, sp  @ struct pt_regs *regs
-   bl  do_undefinstr
+   bl  __und_fault
 
@
@ IRQs off again before pulling preserved data off the stack
@
-1: disable_irq_notrace
+__und_svc_finish:
+   disable_irq_notrace
 
@
@ restore SPSR and restart the instruction
@@ -423,25 +443,33 @@ __und_usr:
mov r2, r4
mov r3, r5
 
+   @ r2 = regs->ARM_pc, which is either 2 or 4 bytes ahead of the
+   @  faulting instruction depending on Thumb mode.
+   @ r3 = regs->ARM_cpsr
@
-   @ fall through to the emulation code, which returns using r9 if
-   @ it has emulated the instruction, or the more conventional lr
-   @ if we are to treat this as a real undefined instruction
-   @
-   @  r0 - instruction
+   @ The emulation code returns using r9 if it has emulated the
+   @ instruction, or the more conventional lr if we are to treat
+   @ this as a real undefined instruction
@
adr r9, BSYM(ret_from_exception)
-   adr lr, BSYM(__und_usr_unknown)
+
tst r3, #PSR_T_BIT  @ Thumb mode?
-   iteteq  @ explicit IT needed for the 1f 
label
-   subeq   r4, r2, #4  @ ARM instr at LR - 4
-   subne   r4, r2, #2  @ Thumb instr at LR - 2
-1: ldreqt  r0, [r4]
+   bne __und_usr_thumb
+   sub r4, r2, #4  @ ARM instr at LR - 4
+1: ldrtr0, [r4]
 #ifdef CONFIG_CPU_ENDIAN_BE8
-   reveq   r0, r0  @ little endian instruction
+   rev r0, r0  @ little endian instruction
 #endif
-   beq call_fpe
+   @ r0 = 32-bit ARM instruction which caused the exception
+   @ r2 = PC value for the following instruction (:= regs->ARM_pc)
+   @ r4 = PC va

[ 18/65] ALSA: hda - add dock support for Thinkpad X230

2012-08-13 Thread Greg Kroah-Hartman
From: Greg KH 

3.4-stable review patch.  If anyone has any objections, please let me know.

--

From: Felix Kaechele 

commit c8415a48fcb7a29889f4405d38c57db351e4b50a upstream.

As with the ThinkPad Models X230 Tablet and T530 the X230 needs a qurik to
correctly set up the pins for the dock port.

Signed-off-by: Felix Kaechele 
Signed-off-by: Takashi Iwai 
Signed-off-by: Greg Kroah-Hartman 

---
 sound/pci/hda/patch_realtek.c |1 +
 1 file changed, 1 insertion(+)

--- a/sound/pci/hda/patch_realtek.c
+++ b/sound/pci/hda/patch_realtek.c
@@ -6157,6 +6157,7 @@ static const struct snd_pci_quirk alc269
SND_PCI_QUIRK(0x17aa, 0x21ca, "Thinkpad L412", ALC269_FIXUP_SKU_IGNORE),
SND_PCI_QUIRK(0x17aa, 0x21e9, "Thinkpad Edge 15", 
ALC269_FIXUP_SKU_IGNORE),
SND_PCI_QUIRK(0x17aa, 0x21f6, "Thinkpad T530", 
ALC269_FIXUP_LENOVO_DOCK),
+   SND_PCI_QUIRK(0x17aa, 0x21fa, "Thinkpad X230", 
ALC269_FIXUP_LENOVO_DOCK),
SND_PCI_QUIRK(0x17aa, 0x21fb, "Thinkpad T430s", 
ALC269_FIXUP_LENOVO_DOCK),
SND_PCI_QUIRK(0x17aa, 0x2203, "Thinkpad X230 Tablet", 
ALC269_FIXUP_LENOVO_DOCK),
SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_FIXUP_QUANTA_MUTE),


--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[ 22/65] md/raid1: dont abort a resync on the first badblock.

2012-08-13 Thread Greg Kroah-Hartman
From: Greg KH 

3.4-stable review patch.  If anyone has any objections, please let me know.

--

From: NeilBrown 

commit b7219ccb33aa0df9949a60c68b5e9f712615e56f upstream.

If a resync of a RAID1 array with 2 devices finds a known bad block
one device it will neither read from, or write to, that device for
this block offset.
So there will be one read_target (The other device) and zero write
targets.
This condition causes md/raid1 to abort the resync assuming that it
has finished - without known bad blocks this would be true.

When there are no write targets because of the presence of bad blocks
we should only skip over the area covered by the bad block.
RAID10 already gets this right, raid1 doesn't.  Or didn't.

As this can cause a 'sync' to abort early and appear to have succeeded
it could lead to some data corruption, so it suitable for -stable.

Reported-by: Alexander Lyakas 
Signed-off-by: NeilBrown 
Signed-off-by: Greg Kroah-Hartman 

---
 drivers/md/raid1.c |5 -
 1 file changed, 4 insertions(+), 1 deletion(-)

--- a/drivers/md/raid1.c
+++ b/drivers/md/raid1.c
@@ -2429,7 +2429,10 @@ static sector_t sync_request(struct mdde
/* There is nowhere to write, so all non-sync
 * drives must be failed - so we are finished
 */
-   sector_t rv = max_sector - sector_nr;
+   sector_t rv;
+   if (min_bad > 0)
+   max_sector = sector_nr + min_bad;
+   rv = max_sector - sector_nr;
*skipped = 1;
put_buf(r1_bio);
return rv;


--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[ 24/65] ore: Fix out-of-bounds access in _ios_obj()

2012-08-13 Thread Greg Kroah-Hartman
From: Greg KH 

3.4-stable review patch.  If anyone has any objections, please let me know.

--

From: Boaz Harrosh 

commit 9e62bb4458ad2cf28bd701aa5fab380b846db326 upstream.

_ios_obj() is accessed by group_index not device_table index.

The oc->comps array is only a group_full of devices at a time
it is not like ore_comp_dev() which is indexed by a global
device_table index.

This did not BUG until now because exofs only uses a single
COMP for all devices. But with other FSs like PanFS this is
not true.

This bug was only in the write_path, all other users were
using it correctly

[This is a bug since 3.2 Kernel]

Signed-off-by: Boaz Harrosh 
Signed-off-by: Greg Kroah-Hartman 

---
 fs/exofs/ore.c |   14 +++---
 1 file changed, 7 insertions(+), 7 deletions(-)

--- a/fs/exofs/ore.c
+++ b/fs/exofs/ore.c
@@ -837,11 +837,11 @@ static int _write_mirror(struct ore_io_s
bio->bi_rw |= REQ_WRITE;
}
 
-   osd_req_write(or, _ios_obj(ios, dev), per_dev->offset,
- bio, per_dev->length);
+   osd_req_write(or, _ios_obj(ios, cur_comp),
+ per_dev->offset, bio, per_dev->length);
ORE_DBGMSG("write(0x%llx) offset=0x%llx "
  "length=0x%llx dev=%d\n",
-_LLU(_ios_obj(ios, dev)->id),
+_LLU(_ios_obj(ios, cur_comp)->id),
 _LLU(per_dev->offset),
 _LLU(per_dev->length), dev);
} else if (ios->kern_buff) {
@@ -853,20 +853,20 @@ static int _write_mirror(struct ore_io_s
   (ios->si.unit_off + ios->length >
ios->layout->stripe_unit));
 
-   ret = osd_req_write_kern(or, _ios_obj(ios, 
per_dev->dev),
+   ret = osd_req_write_kern(or, _ios_obj(ios, cur_comp),
 per_dev->offset,
 ios->kern_buff, ios->length);
if (unlikely(ret))
goto out;
ORE_DBGMSG2("write_kern(0x%llx) offset=0x%llx "
  "length=0x%llx dev=%d\n",
-_LLU(_ios_obj(ios, dev)->id),
+_LLU(_ios_obj(ios, cur_comp)->id),
 _LLU(per_dev->offset),
 _LLU(ios->length), per_dev->dev);
} else {
-   osd_req_set_attributes(or, _ios_obj(ios, dev));
+   osd_req_set_attributes(or, _ios_obj(ios, cur_comp));
ORE_DBGMSG2("obj(0x%llx) set_attributes=%d dev=%d\n",
-_LLU(_ios_obj(ios, dev)->id),
+_LLU(_ios_obj(ios, cur_comp)->id),
 ios->out_attr_len, dev);
}
 


--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[ 27/65] ath9k: Add PID/VID support for AR1111

2012-08-13 Thread Greg Kroah-Hartman
From: Greg KH 

3.4-stable review patch.  If anyone has any objections, please let me know.

--

From: Mohammed Shafi Shajakhan 

commit d4e5979c0da95791aa717c18e162540c7a596360 upstream.

AR is same as AR9485. The h/w
difference between them is quite insignificant,
Felix suggests only very few baseband features
may not be available in AR. The h/w code for
AR9485 is already present, so AR should
work fine with the addition of its PID/VID.

Reported-by: Tim Bentley 
Cc: Felix Bitterli 
Signed-off-by: Mohammed Shafi Shajakhan 
Tested-by: Tim Bentley 
Signed-off-by: John W. Linville 
Signed-off-by: Greg Kroah-Hartman 

---
 drivers/net/wireless/ath/ath9k/hw.c  |1 +
 drivers/net/wireless/ath/ath9k/hw.h  |1 +
 drivers/net/wireless/ath/ath9k/pci.c |1 +
 3 files changed, 3 insertions(+)

--- a/drivers/net/wireless/ath/ath9k/hw.c
+++ b/drivers/net/wireless/ath/ath9k/hw.c
@@ -676,6 +676,7 @@ int ath9k_hw_init(struct ath_hw *ah)
case AR9300_DEVID_AR9340:
case AR9300_DEVID_AR9580:
case AR9300_DEVID_AR9462:
+   case AR9485_DEVID_AR:
break;
default:
if (common->bus_ops->ath_bus_type == ATH_USB)
--- a/drivers/net/wireless/ath/ath9k/hw.h
+++ b/drivers/net/wireless/ath/ath9k/hw.h
@@ -48,6 +48,7 @@
 #define AR9300_DEVID_AR95800x0033
 #define AR9300_DEVID_AR94620x0034
 #define AR9300_DEVID_AR93300x0035
+#define AR9485_DEVID_AR0x0037
 
 #define AR5416_AR9100_DEVID0x000b
 
--- a/drivers/net/wireless/ath/ath9k/pci.c
+++ b/drivers/net/wireless/ath/ath9k/pci.c
@@ -35,6 +35,7 @@ static DEFINE_PCI_DEVICE_TABLE(ath_pci_i
{ PCI_VDEVICE(ATHEROS, 0x0032) }, /* PCI-E  AR9485 */
{ PCI_VDEVICE(ATHEROS, 0x0033) }, /* PCI-E  AR9580 */
{ PCI_VDEVICE(ATHEROS, 0x0034) }, /* PCI-E  AR9462 */
+   { PCI_VDEVICE(ATHEROS, 0x0037) }, /* PCI-E  AR/AR9485 */
{ 0 }
 };
 


--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[ 31/65] random: use lockless techniques in the interrupt path

2012-08-13 Thread Greg Kroah-Hartman
From: Greg KH 

3.4-stable review patch.  If anyone has any objections, please let me know.

--

From: Theodore Ts'o 

commit 902c098a3663de3fa18639efbb71b6080f0bcd3c upstream.

The real-time Linux folks don't like add_interrupt_randomness() taking
a spinlock since it is called in the low-level interrupt routine.
This also allows us to reduce the overhead in the fast path, for the
random driver, which is the interrupt collection path.

Signed-off-by: "Theodore Ts'o" 
Signed-off-by: Greg Kroah-Hartman 

---
 drivers/char/random.c |   78 +-
 1 file changed, 39 insertions(+), 39 deletions(-)

--- a/drivers/char/random.c
+++ b/drivers/char/random.c
@@ -418,9 +418,9 @@ struct entropy_store {
/* read-write data: */
spinlock_t lock;
unsigned add_ptr;
+   unsigned input_rotate;
int entropy_count;
int entropy_total;
-   int input_rotate;
unsigned int initialized:1;
__u8 last_data[EXTRACT_SIZE];
 };
@@ -468,26 +468,24 @@ static __u32 const twist_table[8] = {
  * it's cheap to do so and helps slightly in the expected case where
  * the entropy is concentrated in the low-order bits.
  */
-static void mix_pool_bytes_extract(struct entropy_store *r, const void *in,
-  int nbytes, __u8 out[64])
+static void __mix_pool_bytes(struct entropy_store *r, const void *in,
+int nbytes, __u8 out[64])
 {
unsigned long i, j, tap1, tap2, tap3, tap4, tap5;
int input_rotate;
int wordmask = r->poolinfo->poolwords - 1;
const char *bytes = in;
__u32 w;
-   unsigned long flags;
 
-   /* Taps are constant, so we can load them without holding r->lock.  */
tap1 = r->poolinfo->tap1;
tap2 = r->poolinfo->tap2;
tap3 = r->poolinfo->tap3;
tap4 = r->poolinfo->tap4;
tap5 = r->poolinfo->tap5;
 
-   spin_lock_irqsave(&r->lock, flags);
-   input_rotate = r->input_rotate;
-   i = r->add_ptr;
+   smp_rmb();
+   input_rotate = ACCESS_ONCE(r->input_rotate);
+   i = ACCESS_ONCE(r->add_ptr);
 
/* mix one byte at a time to simplify size handling and churn faster */
while (nbytes--) {
@@ -514,19 +512,23 @@ static void mix_pool_bytes_extract(struc
input_rotate += i ? 7 : 14;
}
 
-   r->input_rotate = input_rotate;
-   r->add_ptr = i;
+   ACCESS_ONCE(r->input_rotate) = input_rotate;
+   ACCESS_ONCE(r->add_ptr) = i;
+   smp_wmb();
 
if (out)
for (j = 0; j < 16; j++)
((__u32 *)out)[j] = r->pool[(i - j) & wordmask];
-
-   spin_unlock_irqrestore(&r->lock, flags);
 }
 
-static void mix_pool_bytes(struct entropy_store *r, const void *in, int bytes)
+static void mix_pool_bytes(struct entropy_store *r, const void *in,
+int nbytes, __u8 out[64])
 {
-   mix_pool_bytes_extract(r, in, bytes, NULL);
+   unsigned long flags;
+
+   spin_lock_irqsave(&r->lock, flags);
+   __mix_pool_bytes(r, in, nbytes, out);
+   spin_unlock_irqrestore(&r->lock, flags);
 }
 
 struct fast_pool {
@@ -564,23 +566,22 @@ static void fast_mix(struct fast_pool *f
  */
 static void credit_entropy_bits(struct entropy_store *r, int nbits)
 {
-   unsigned long flags;
-   int entropy_count;
+   int entropy_count, orig;
 
if (!nbits)
return;
 
-   spin_lock_irqsave(&r->lock, flags);
-
DEBUG_ENT("added %d entropy credits to %s\n", nbits, r->name);
-   entropy_count = r->entropy_count;
+retry:
+   entropy_count = orig = ACCESS_ONCE(r->entropy_count);
entropy_count += nbits;
if (entropy_count < 0) {
DEBUG_ENT("negative entropy/overflow\n");
entropy_count = 0;
} else if (entropy_count > r->poolinfo->POOLBITS)
entropy_count = r->poolinfo->POOLBITS;
-   r->entropy_count = entropy_count;
+   if (cmpxchg(&r->entropy_count, orig, entropy_count) != orig)
+   goto retry;
 
if (!r->initialized && nbits > 0) {
r->entropy_total += nbits;
@@ -593,7 +594,6 @@ static void credit_entropy_bits(struct e
wake_up_interruptible(&random_read_wait);
kill_fasync(&fasync, SIGIO, POLL_IN);
}
-   spin_unlock_irqrestore(&r->lock, flags);
 }
 
 /*
@@ -680,7 +680,7 @@ static void add_timer_randomness(struct
sample.cycles = get_cycles();
 
sample.num = num;
-   mix_pool_bytes(&input_pool, &sample, sizeof(sample));
+   mix_pool_bytes(&input_pool, &sample, sizeof(sample), NULL);
 
/*
 * Calculate number of bits of randomness we probably added.
@@ -764,7 +764,7 @@ void add_interrupt_randomness(int irq, i
fast_pool->last = now;
 
r = nonblocking_pool.i

[ 32/65] random: create add_device_randomness() interface

2012-08-13 Thread Greg Kroah-Hartman
From: Greg KH 

3.4-stable review patch.  If anyone has any objections, please let me know.

--

From: Linus Torvalds 

commit a2080a67abe9e314f9e9c2cc3a4a176e8a8f8793 upstream.

Add a new interface, add_device_randomness() for adding data to the
random pool that is likely to differ between two devices (or possibly
even per boot).  This would be things like MAC addresses or serial
numbers, or the read-out of the RTC. This does *not* add any actual
entropy to the pool, but it initializes the pool to different values
for devices that might otherwise be identical and have very little
entropy available to them (particularly common in the embedded world).

[ Modified by tytso to mix in a timestamp, since there may be some
  variability caused by the time needed to detect/configure the hardware
  in question. ]

Signed-off-by: Linus Torvalds 
Signed-off-by: "Theodore Ts'o" 
Signed-off-by: Greg Kroah-Hartman 

---
 drivers/char/random.c  |   28 
 include/linux/random.h |1 +
 2 files changed, 29 insertions(+)

--- a/drivers/char/random.c
+++ b/drivers/char/random.c
@@ -125,11 +125,20 @@
  * The current exported interfaces for gathering environmental noise
  * from the devices are:
  *
+ * void add_device_randomness(const void *buf, unsigned int size);
  * void add_input_randomness(unsigned int type, unsigned int code,
  *unsigned int value);
  * void add_interrupt_randomness(int irq, int irq_flags);
  * void add_disk_randomness(struct gendisk *disk);
  *
+ * add_device_randomness() is for adding data to the random pool that
+ * is likely to differ between two devices (or possibly even per boot).
+ * This would be things like MAC addresses or serial numbers, or the
+ * read-out of the RTC. This does *not* add any actual entropy to the
+ * pool, but it initializes the pool to different values for devices
+ * that might otherwise be identical and have very little entropy
+ * available to them (particularly common in the embedded world).
+ *
  * add_input_randomness() uses the input layer interrupt timing, as well as
  * the event type information from the hardware.
  *
@@ -646,6 +655,25 @@ static void set_timer_rand_state(unsigne
 }
 #endif
 
+/*
+ * Add device- or boot-specific data to the input and nonblocking
+ * pools to help initialize them to unique values.
+ *
+ * None of this adds any entropy, it is meant to avoid the
+ * problem of the nonblocking pool having similar initial state
+ * across largely identical devices.
+ */
+void add_device_randomness(const void *buf, unsigned int size)
+{
+   unsigned long time = get_cycles() ^ jiffies;
+
+   mix_pool_bytes(&input_pool, buf, size, NULL);
+   mix_pool_bytes(&input_pool, &time, sizeof(time), NULL);
+   mix_pool_bytes(&nonblocking_pool, buf, size, NULL);
+   mix_pool_bytes(&nonblocking_pool, &time, sizeof(time), NULL);
+}
+EXPORT_SYMBOL(add_device_randomness);
+
 static struct timer_rand_state input_timer_state;
 
 /*
--- a/include/linux/random.h
+++ b/include/linux/random.h
@@ -50,6 +50,7 @@ struct rnd_state {
 
 extern void rand_initialize_irq(int irq);
 
+extern void add_device_randomness(const void *, unsigned int);
 extern void add_input_randomness(unsigned int type, unsigned int code,
 unsigned int value);
 extern void add_interrupt_randomness(int irq, int irq_flags);


--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[ 35/65] random: use the arch-specific rng in xfer_secondary_pool

2012-08-13 Thread Greg Kroah-Hartman
From: Greg KH 

3.4-stable review patch.  If anyone has any objections, please let me know.

--

From: Theodore Ts'o 

commit e6d4947b12e8ad947add1032dd754803c6004824 upstream.

If the CPU supports a hardware random number generator, use it in
xfer_secondary_pool(), where it will significantly improve things and
where we can afford it.

Also, remove the use of the arch-specific rng in
add_timer_randomness(), since the call is significantly slower than
get_cycles(), and we're much better off using it in
xfer_secondary_pool() anyway.

Signed-off-by: "Theodore Ts'o" 
Signed-off-by: Greg Kroah-Hartman 

---
 drivers/char/random.c |   25 -
 1 file changed, 16 insertions(+), 9 deletions(-)

--- a/drivers/char/random.c
+++ b/drivers/char/random.c
@@ -254,6 +254,7 @@
 #include 
 #include 
 #include 
+#include 
 
 #ifdef CONFIG_GENERIC_HARDIRQS
 # include 
@@ -702,11 +703,7 @@ static void add_timer_randomness(struct
goto out;
 
sample.jiffies = jiffies;
-
-   /* Use arch random value, fall back to cycles */
-   if (!arch_get_random_int(&sample.cycles))
-   sample.cycles = get_cycles();
-
+   sample.cycles = get_cycles();
sample.num = num;
mix_pool_bytes(&input_pool, &sample, sizeof(sample), NULL);
 
@@ -838,7 +835,11 @@ static ssize_t extract_entropy(struct en
  */
 static void xfer_secondary_pool(struct entropy_store *r, size_t nbytes)
 {
-   __u32 tmp[OUTPUT_POOL_WORDS];
+   union {
+   __u32   tmp[OUTPUT_POOL_WORDS];
+   longhwrand[4];
+   } u;
+   int i;
 
if (r->pull && r->entropy_count < nbytes * 8 &&
r->entropy_count < r->poolinfo->POOLBITS) {
@@ -849,17 +850,23 @@ static void xfer_secondary_pool(struct e
/* pull at least as many as BYTES as wakeup BITS */
bytes = max_t(int, bytes, random_read_wakeup_thresh / 8);
/* but never more than the buffer size */
-   bytes = min_t(int, bytes, sizeof(tmp));
+   bytes = min_t(int, bytes, sizeof(u.tmp));
 
DEBUG_ENT("going to reseed %s with %d bits "
  "(%d of %d requested)\n",
  r->name, bytes * 8, nbytes * 8, r->entropy_count);
 
-   bytes = extract_entropy(r->pull, tmp, bytes,
+   bytes = extract_entropy(r->pull, u.tmp, bytes,
random_read_wakeup_thresh / 8, rsvd);
-   mix_pool_bytes(r, tmp, bytes, NULL);
+   mix_pool_bytes(r, u.tmp, bytes, NULL);
credit_entropy_bits(r, bytes*8);
}
+   kmemcheck_mark_initialized(&u.hwrand, sizeof(u.hwrand));
+   for (i = 0; i < 4; i++)
+   if (arch_get_random_long(&u.hwrand[i]))
+   break;
+   if (i)
+   mix_pool_bytes(r, &u.hwrand, sizeof(u.hwrand), 0);
 }
 
 /*


--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[ 34/65] net: feed /dev/random with the MAC address when registering a device

2012-08-13 Thread Greg Kroah-Hartman
From: Greg KH 

3.4-stable review patch.  If anyone has any objections, please let me know.

--

From: Theodore Ts'o 

commit 7bf2357524408b97fec58344caf7397f8140c3fd upstream.

Signed-off-by: "Theodore Ts'o" 
Cc: David Miller 
Cc: Linus Torvalds 
Signed-off-by: Greg Kroah-Hartman 

---
 net/core/dev.c   |3 +++
 net/core/rtnetlink.c |1 +
 2 files changed, 4 insertions(+)

--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -1173,6 +1173,7 @@ static int __dev_open(struct net_device
net_dmaengine_get();
dev_set_rx_mode(dev);
dev_activate(dev);
+   add_device_randomness(dev->dev_addr, dev->addr_len);
}
 
return ret;
@@ -4765,6 +4766,7 @@ int dev_set_mac_address(struct net_devic
err = ops->ndo_set_mac_address(dev, sa);
if (!err)
call_netdevice_notifiers(NETDEV_CHANGEADDR, dev);
+   add_device_randomness(dev->dev_addr, dev->addr_len);
return err;
 }
 EXPORT_SYMBOL(dev_set_mac_address);
@@ -5543,6 +5545,7 @@ int register_netdevice(struct net_device
dev_init_scheduler(dev);
dev_hold(dev);
list_netdevice(dev);
+   add_device_randomness(dev->dev_addr, dev->addr_len);
 
/* Notify protocols, that a new device appeared. */
ret = call_netdevice_notifiers(NETDEV_REGISTER, dev);
--- a/net/core/rtnetlink.c
+++ b/net/core/rtnetlink.c
@@ -1376,6 +1376,7 @@ static int do_setlink(struct net_device
goto errout;
send_addr_notify = 1;
modified = 1;
+   add_device_randomness(dev->dev_addr, dev->addr_len);
}
 
if (tb[IFLA_MTU]) {


--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[ 25/65] ACPI processor: Fix tick_broadcast_mask online/offline regression

2012-08-13 Thread Greg Kroah-Hartman
From: Greg KH 

3.4-stable review patch.  If anyone has any objections, please let me know.

--

From: Feng Tang 

commit b7db60f45d74497c723dc7ae1370cf0b37dfb0d8 upstream.

In commit 99b725084 "ACPI processor hotplug: Delay acpi_processor_start()
call for hotplugged cores", acpi_processor_hotplug(pr) was wrongly replaced
by acpi_processor_cst_has_changed() inside the acpi_cpu_soft_notify(). This
patch will restore it back, fixing the tick_broadcast_mask regression:
https://lkml.org/lkml/2012/7/30/169

Signed-off-by: Feng Tang 
Cc: Thomas Renninger 
Reviewed-by: Rafael J. Wysocki 
Reviewed-by: Deepthi Dharwar 
Signed-off-by: Len Brown 
Signed-off-by: Greg Kroah-Hartman 

---
 drivers/acpi/processor_driver.c |2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

--- a/drivers/acpi/processor_driver.c
+++ b/drivers/acpi/processor_driver.c
@@ -442,7 +442,7 @@ static int acpi_cpu_soft_notify(struct n
/* Normal CPU soft online event */
} else {
acpi_processor_ppc_has_changed(pr, 0);
-   acpi_processor_cst_has_changed(pr);
+   acpi_processor_hotplug(pr);
acpi_processor_reevaluate_tstate(pr, action);
acpi_processor_tstate_has_changed(pr);
}


--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[ 29/65] x86, nops: Missing break resulting in incorrect selection on Intel

2012-08-13 Thread Greg Kroah-Hartman
From: Greg KH 

3.4-stable review patch.  If anyone has any objections, please let me know.

--

From: Alan Cox 

commit d6250a3f12edb3a86db9598ffeca3de8b4a219e9 upstream.

The Intel case falls through into the generic case which then changes
the values.  For cases like the P6 it doesn't do the right thing so
this seems to be a screwup.

Signed-off-by: Alan Cox 
Link: http://lkml.kernel.org/n/tip-lww2uirad4skzjlmrm0vr...@git.kernel.org
Signed-off-by: H. Peter Anvin 
Signed-off-by: Greg Kroah-Hartman 

---
 arch/x86/kernel/alternative.c |2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

--- a/arch/x86/kernel/alternative.c
+++ b/arch/x86/kernel/alternative.c
@@ -219,7 +219,7 @@ void __init arch_init_ideal_nops(void)
ideal_nops = intel_nops;
 #endif
}
-
+   break;
default:
 #ifdef CONFIG_X86_64
ideal_nops = k8_nops;


--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[ 28/65] wireless: reg: restore previous behaviour of chan->max_power calculations

2012-08-13 Thread Greg Kroah-Hartman
From: Greg KH 

3.4-stable review patch.  If anyone has any objections, please let me know.

--

From: Stanislaw Gruszka 

commit 5e31fc0815a4e2c72b1b495fe7a0d8f9bfb9e4b4 upstream.

commit eccc068e8e84c8fe997115629925e0422a98e4de
Author: Hong Wu 
Date:   Wed Jan 11 20:33:39 2012 +0200

wireless: Save original maximum regulatory transmission power for the 
calucation of the local maximum transmit pow

changed the way we calculate chan->max_power as min(chan->max_power,
chan->max_reg_power). That broke rt2x00 (and perhaps some other
drivers) that do not set chan->max_power. It is not so easy to fix this
problem correctly in rt2x00.

According to commit eccc068e8 changelog, change claim only to save
maximum regulatory power - changing setting of chan->max_power was side
effect. This patch restore previous calculations of chan->max_power and
do not touch chan->max_reg_power.

Signed-off-by: Stanislaw Gruszka 
Acked-by: Luis R. Rodriguez 
Signed-off-by: Johannes Berg 
Signed-off-by: Greg Kroah-Hartman 

---
 net/wireless/reg.c |   16 +++-
 1 file changed, 15 insertions(+), 1 deletion(-)

--- a/net/wireless/reg.c
+++ b/net/wireless/reg.c
@@ -891,7 +891,21 @@ static void handle_channel(struct wiphy
chan->max_antenna_gain = min(chan->orig_mag,
(int) MBI_TO_DBI(power_rule->max_antenna_gain));
chan->max_reg_power = (int) MBM_TO_DBM(power_rule->max_eirp);
-   chan->max_power = min(chan->max_power, chan->max_reg_power);
+   if (chan->orig_mpwr) {
+   /*
+* Devices that have their own custom regulatory domain
+* but also use WIPHY_FLAG_STRICT_REGULATORY will follow the
+* passed country IE power settings.
+*/
+   if (initiator == NL80211_REGDOM_SET_BY_COUNTRY_IE &&
+   wiphy->flags & WIPHY_FLAG_CUSTOM_REGULATORY &&
+   wiphy->flags & WIPHY_FLAG_STRICT_REGULATORY)
+   chan->max_power = chan->max_reg_power;
+   else
+   chan->max_power = min(chan->orig_mpwr,
+ chan->max_reg_power);
+   } else
+   chan->max_power = chan->max_reg_power;
 }
 
 static void handle_band(struct wiphy *wiphy,


--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[ 17/65] ALSA: hda - add dock support for Thinkpad T430s

2012-08-13 Thread Greg Kroah-Hartman
From: Greg KH 

3.4-stable review patch.  If anyone has any objections, please let me know.

--

From: "Philipp A. Mohrenweiser" 

commit 4407be6ba217514b1bc01488f8b56467d309e416 upstream.

Add a model/fixup string "lenovo-dock", for Thinkpad T430s, to allow
sound in docking station.

Tested on Lenovo T430s with ThinkPad Mini Dock Plus Series 3

Signed-off-by: Philipp A. Mohrenweiser 
Signed-off-by: Takashi Iwai 
Signed-off-by: Greg Kroah-Hartman 

---
 sound/pci/hda/patch_realtek.c |1 +
 1 file changed, 1 insertion(+)

--- a/sound/pci/hda/patch_realtek.c
+++ b/sound/pci/hda/patch_realtek.c
@@ -6157,6 +6157,7 @@ static const struct snd_pci_quirk alc269
SND_PCI_QUIRK(0x17aa, 0x21ca, "Thinkpad L412", ALC269_FIXUP_SKU_IGNORE),
SND_PCI_QUIRK(0x17aa, 0x21e9, "Thinkpad Edge 15", 
ALC269_FIXUP_SKU_IGNORE),
SND_PCI_QUIRK(0x17aa, 0x21f6, "Thinkpad T530", 
ALC269_FIXUP_LENOVO_DOCK),
+   SND_PCI_QUIRK(0x17aa, 0x21fb, "Thinkpad T430s", 
ALC269_FIXUP_LENOVO_DOCK),
SND_PCI_QUIRK(0x17aa, 0x2203, "Thinkpad X230 Tablet", 
ALC269_FIXUP_LENOVO_DOCK),
SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_FIXUP_QUANTA_MUTE),
SND_PCI_QUIRK(0x17aa, 0x3bf8, "Lenovo Ideapd", ALC269_FIXUP_PCM_44K),


--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[ 36/65] random: add new get_random_bytes_arch() function

2012-08-13 Thread Greg Kroah-Hartman
From: Greg KH 

3.4-stable review patch.  If anyone has any objections, please let me know.

--

From: Theodore Ts'o 

commit c2557a303ab6712bb6e09447df828c557c710ac9 upstream.

Create a new function, get_random_bytes_arch() which will use the
architecture-specific hardware random number generator if it is
present.  Change get_random_bytes() to not use the HW RNG, even if it
is avaiable.

The reason for this is that the hw random number generator is fast (if
it is present), but it requires that we trust the hardware
manufacturer to have not put in a back door.  (For example, an
increasing counter encrypted by an AES key known to the NSA.)

It's unlikely that Intel (for example) was paid off by the US
Government to do this, but it's impossible for them to prove otherwise
  --- especially since Bull Mountain is documented to use AES as a
whitener.  Hence, the output of an evil, trojan-horse version of
RDRAND is statistically indistinguishable from an RDRAND implemented
to the specifications claimed by Intel.  Short of using a tunnelling
electronic microscope to reverse engineer an Ivy Bridge chip and
disassembling and analyzing the CPU microcode, there's no way for us
to tell for sure.

Since users of get_random_bytes() in the Linux kernel need to be able
to support hardware systems where the HW RNG is not present, most
time-sensitive users of this interface have already created their own
cryptographic RNG interface which uses get_random_bytes() as a seed.
So it's much better to use the HW RNG to improve the existing random
number generator, by mixing in any entropy returned by the HW RNG into
/dev/random's entropy pool, but to always _use_ /dev/random's entropy
pool.

This way we get almost of the benefits of the HW RNG without any
potential liabilities.  The only benefits we forgo is the
speed/performance enhancements --- and generic kernel code can't
depend on depend on get_random_bytes() having the speed of a HW RNG
anyway.

For those places that really want access to the arch-specific HW RNG,
if it is available, we provide get_random_bytes_arch().

Signed-off-by: "Theodore Ts'o" 
Signed-off-by: Greg Kroah-Hartman 


---
 drivers/char/random.c  |   29 -
 include/linux/random.h |1 +
 2 files changed, 25 insertions(+), 5 deletions(-)

--- a/drivers/char/random.c
+++ b/drivers/char/random.c
@@ -1038,17 +1038,34 @@ static ssize_t extract_entropy_user(stru
 
 /*
  * This function is the exported kernel interface.  It returns some
- * number of good random numbers, suitable for seeding TCP sequence
- * numbers, etc.
+ * number of good random numbers, suitable for key generation, seeding
+ * TCP sequence numbers, etc.  It does not use the hw random number
+ * generator, if available; use get_random_bytes_arch() for that.
  */
 void get_random_bytes(void *buf, int nbytes)
 {
+   extract_entropy(&nonblocking_pool, buf, nbytes, 0, 0);
+}
+EXPORT_SYMBOL(get_random_bytes);
+
+/*
+ * This function will use the architecture-specific hardware random
+ * number generator if it is available.  The arch-specific hw RNG will
+ * almost certainly be faster than what we can do in software, but it
+ * is impossible to verify that it is implemented securely (as
+ * opposed, to, say, the AES encryption of a sequence number using a
+ * key known by the NSA).  So it's useful if we need the speed, but
+ * only if we're willing to trust the hardware manufacturer not to
+ * have put in a back door.
+ */
+void get_random_bytes_arch(void *buf, int nbytes)
+{
char *p = buf;
 
while (nbytes) {
unsigned long v;
int chunk = min(nbytes, (int)sizeof(unsigned long));
-   
+
if (!arch_get_random_long(&v))
break;

@@ -1057,9 +1074,11 @@ void get_random_bytes(void *buf, int nby
nbytes -= chunk;
}
 
-   extract_entropy(&nonblocking_pool, p, nbytes, 0, 0);
+   if (nbytes)
+   extract_entropy(&nonblocking_pool, p, nbytes, 0, 0);
 }
-EXPORT_SYMBOL(get_random_bytes);
+EXPORT_SYMBOL(get_random_bytes_arch);
+
 
 /*
  * init_std_data - initialize pool with system data
--- a/include/linux/random.h
+++ b/include/linux/random.h
@@ -56,6 +56,7 @@ extern void add_input_randomness(unsigne
 extern void add_interrupt_randomness(int irq, int irq_flags);
 
 extern void get_random_bytes(void *buf, int nbytes);
+extern void get_random_bytes_arch(void *buf, int nbytes);
 void generate_random_uuid(unsigned char uuid_out[16]);
 
 #ifndef MODULE


--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[ 37/65] random: add tracepoints for easier debugging and verification

2012-08-13 Thread Greg Kroah-Hartman
From: Greg KH 

3.4-stable review patch.  If anyone has any objections, please let me know.

--

From: Theodore Ts'o 

commit 00ce1db1a634746040ace24c09a4e3a7949a3145 upstream.

Signed-off-by: "Theodore Ts'o" 
Signed-off-by: Greg Kroah-Hartman 

---
 drivers/char/random.c |   26 ++--
 include/trace/events/random.h |  134 ++
 2 files changed, 156 insertions(+), 4 deletions(-)

--- a/drivers/char/random.c
+++ b/drivers/char/random.c
@@ -266,6 +266,9 @@
 #include 
 #include 
 
+#define CREATE_TRACE_POINTS
+#include 
+
 /*
  * Configuration information
  */
@@ -478,8 +481,8 @@ static __u32 const twist_table[8] = {
  * it's cheap to do so and helps slightly in the expected case where
  * the entropy is concentrated in the low-order bits.
  */
-static void __mix_pool_bytes(struct entropy_store *r, const void *in,
-int nbytes, __u8 out[64])
+static void _mix_pool_bytes(struct entropy_store *r, const void *in,
+   int nbytes, __u8 out[64])
 {
unsigned long i, j, tap1, tap2, tap3, tap4, tap5;
int input_rotate;
@@ -531,13 +534,21 @@ static void __mix_pool_bytes(struct entr
((__u32 *)out)[j] = r->pool[(i - j) & wordmask];
 }
 
-static void mix_pool_bytes(struct entropy_store *r, const void *in,
+static void __mix_pool_bytes(struct entropy_store *r, const void *in,
 int nbytes, __u8 out[64])
 {
+   trace_mix_pool_bytes_nolock(r->name, nbytes, _RET_IP_);
+   _mix_pool_bytes(r, in, nbytes, out);
+}
+
+static void mix_pool_bytes(struct entropy_store *r, const void *in,
+  int nbytes, __u8 out[64])
+{
unsigned long flags;
 
+   trace_mix_pool_bytes(r->name, nbytes, _RET_IP_);
spin_lock_irqsave(&r->lock, flags);
-   __mix_pool_bytes(r, in, nbytes, out);
+   _mix_pool_bytes(r, in, nbytes, out);
spin_unlock_irqrestore(&r->lock, flags);
 }
 
@@ -585,6 +596,7 @@ static void credit_entropy_bits(struct e
 retry:
entropy_count = orig = ACCESS_ONCE(r->entropy_count);
entropy_count += nbits;
+
if (entropy_count < 0) {
DEBUG_ENT("negative entropy/overflow\n");
entropy_count = 0;
@@ -599,6 +611,9 @@ retry:
r->initialized = 1;
}
 
+   trace_credit_entropy_bits(r->name, nbits, entropy_count,
+ r->entropy_total, _RET_IP_);
+
/* should we wake readers? */
if (r == &input_pool && entropy_count >= random_read_wakeup_thresh) {
wake_up_interruptible(&random_read_wait);
@@ -971,6 +986,7 @@ static ssize_t extract_entropy(struct en
ssize_t ret = 0, i;
__u8 tmp[EXTRACT_SIZE];
 
+   trace_extract_entropy(r->name, nbytes, r->entropy_count, _RET_IP_);
xfer_secondary_pool(r, nbytes);
nbytes = account(r, nbytes, min, reserved);
 
@@ -1005,6 +1021,7 @@ static ssize_t extract_entropy_user(stru
ssize_t ret = 0, i;
__u8 tmp[EXTRACT_SIZE];
 
+   trace_extract_entropy_user(r->name, nbytes, r->entropy_count, _RET_IP_);
xfer_secondary_pool(r, nbytes);
nbytes = account(r, nbytes, 0, 0);
 
@@ -1062,6 +1079,7 @@ void get_random_bytes_arch(void *buf, in
 {
char *p = buf;
 
+   trace_get_random_bytes(nbytes, _RET_IP_);
while (nbytes) {
unsigned long v;
int chunk = min(nbytes, (int)sizeof(unsigned long));
--- /dev/null
+++ b/include/trace/events/random.h
@@ -0,0 +1,134 @@
+#undef TRACE_SYSTEM
+#define TRACE_SYSTEM random
+
+#if !defined(_TRACE_RANDOM_H) || defined(TRACE_HEADER_MULTI_READ)
+#define _TRACE_RANDOM_H
+
+#include 
+#include 
+
+DECLARE_EVENT_CLASS(random__mix_pool_bytes,
+   TP_PROTO(const char *pool_name, int bytes, unsigned long IP),
+
+   TP_ARGS(pool_name, bytes, IP),
+
+   TP_STRUCT__entry(
+   __field( const char *,  pool_name   )
+   __field(  int,  bytes   )
+   __field(unsigned long,  IP  )
+   ),
+
+   TP_fast_assign(
+   __entry->pool_name  = pool_name;
+   __entry->bytes  = bytes;
+   __entry->IP = IP;
+   ),
+
+   TP_printk("%s pool: bytes %d caller %pF",
+ __entry->pool_name, __entry->bytes, (void *)__entry->IP)
+);
+
+DEFINE_EVENT(random__mix_pool_bytes, mix_pool_bytes,
+   TP_PROTO(const char *pool_name, int bytes, unsigned long IP),
+
+   TP_ARGS(pool_name, bytes, IP)
+);
+
+DEFINE_EVENT(random__mix_pool_bytes, mix_pool_bytes_nolock,
+   TP_PROTO(const char *pool_name, int bytes, unsigned long IP),
+
+   TP_ARGS(pool_name, bytes, IP)
+);
+
+TRACE_EVENT(credit_entropy_bits,
+   TP_PROTO(const char *pool_name, int bits, int entropy_count,
+int entropy_total, unsigned long IP),
+
+

[ 41/65] random: remove rand_initialize_irq()

2012-08-13 Thread Greg Kroah-Hartman
From: Greg KH 

3.4-stable review patch.  If anyone has any objections, please let me know.

--

From: Theodore Ts'o 

commit c5857ccf293968348e5eb4ebedc68074de3dcda6 upstream.

With the new interrupt sampling system, we are no longer using the
timer_rand_state structure in the irq descriptor, so we can stop
initializing it now.

[ Merged in fixes from Sedat to find some last missing references to
  rand_initialize_irq() ]

Signed-off-by: "Theodore Ts'o" 
Signed-off-by: Sedat Dilek 
Signed-off-by: Greg Kroah-Hartman 

---
 arch/ia64/kernel/irq_ia64.c |1 
 drivers/char/random.c   |   55 
 drivers/mfd/ab3100-core.c   |3 --
 include/linux/irqdesc.h |1 
 include/linux/random.h  |2 -
 kernel/irq/manage.c |   17 -
 6 files changed, 79 deletions(-)

--- a/arch/ia64/kernel/irq_ia64.c
+++ b/arch/ia64/kernel/irq_ia64.c
@@ -23,7 +23,6 @@
 #include 
 #include 
 #include 
-#include   /* for rand_initialize_irq() */
 #include 
 #include 
 #include 
--- a/drivers/char/random.c
+++ b/drivers/char/random.c
@@ -634,43 +634,6 @@ struct timer_rand_state {
unsigned dont_count_entropy:1;
 };
 
-#ifndef CONFIG_GENERIC_HARDIRQS
-
-static struct timer_rand_state *irq_timer_state[NR_IRQS];
-
-static struct timer_rand_state *get_timer_rand_state(unsigned int irq)
-{
-   return irq_timer_state[irq];
-}
-
-static void set_timer_rand_state(unsigned int irq,
-struct timer_rand_state *state)
-{
-   irq_timer_state[irq] = state;
-}
-
-#else
-
-static struct timer_rand_state *get_timer_rand_state(unsigned int irq)
-{
-   struct irq_desc *desc;
-
-   desc = irq_to_desc(irq);
-
-   return desc->timer_rand_state;
-}
-
-static void set_timer_rand_state(unsigned int irq,
-struct timer_rand_state *state)
-{
-   struct irq_desc *desc;
-
-   desc = irq_to_desc(irq);
-
-   desc->timer_rand_state = state;
-}
-#endif
-
 /*
  * Add device- or boot-specific data to the input and nonblocking
  * pools to help initialize them to unique values.
@@ -1133,24 +1096,6 @@ static int rand_initialize(void)
 }
 module_init(rand_initialize);
 
-void rand_initialize_irq(int irq)
-{
-   struct timer_rand_state *state;
-
-   state = get_timer_rand_state(irq);
-
-   if (state)
-   return;
-
-   /*
-* If kzalloc returns null, we just won't use that entropy
-* source.
-*/
-   state = kzalloc(sizeof(struct timer_rand_state), GFP_KERNEL);
-   if (state)
-   set_timer_rand_state(irq, state);
-}
-
 #ifdef CONFIG_BLOCK
 void rand_initialize_disk(struct gendisk *disk)
 {
--- a/drivers/mfd/ab3100-core.c
+++ b/drivers/mfd/ab3100-core.c
@@ -931,9 +931,6 @@ static int __devinit ab3100_probe(struct
 
err = request_threaded_irq(client->irq, NULL, ab3100_irq_handler,
IRQF_ONESHOT, "ab3100-core", ab3100);
-   /* This real unpredictable IRQ is of course sampled for entropy */
-   rand_initialize_irq(client->irq);
-
if (err)
goto exit_no_irq;
 
--- a/include/linux/irqdesc.h
+++ b/include/linux/irqdesc.h
@@ -39,7 +39,6 @@ struct module;
  */
 struct irq_desc {
struct irq_data irq_data;
-   struct timer_rand_state *timer_rand_state;
unsigned int __percpu   *kstat_irqs;
irq_flow_handler_t  handle_irq;
 #ifdef CONFIG_IRQ_PREFLOW_FASTEOI
--- a/include/linux/random.h
+++ b/include/linux/random.h
@@ -48,8 +48,6 @@ struct rnd_state {
 
 #ifdef __KERNEL__
 
-extern void rand_initialize_irq(int irq);
-
 extern void add_device_randomness(const void *, unsigned int);
 extern void add_input_randomness(unsigned int type, unsigned int code,
 unsigned int value);
--- a/kernel/irq/manage.c
+++ b/kernel/irq/manage.c
@@ -890,22 +890,6 @@ __setup_irq(unsigned int irq, struct irq
return -ENOSYS;
if (!try_module_get(desc->owner))
return -ENODEV;
-   /*
-* Some drivers like serial.c use request_irq() heavily,
-* so we have to be careful not to interfere with a
-* running system.
-*/
-   if (new->flags & IRQF_SAMPLE_RANDOM) {
-   /*
-* This function might sleep, we want to call it first,
-* outside of the atomic block.
-* Yes, this might clear the entropy pool if the wrong
-* driver is attempted to be loaded, without actually
-* installing a new handler, but is this really a problem,
-* only the sysadmin is able to do this.
-*/
-   rand_initialize_irq(irq);
-   }
 
/*
 * Check whether the interrupt nests into another interrupt
@@ -1339,7 +1323,6 @@ EXPORT_SYMBOL(free_irq);
  * Flags:
  *
  * IRQF_SHARED Interrupt is shared
- * IRQ

[ 46/65] HID: add support for Cypress barcode scanner 04B4:ED81

2012-08-13 Thread Greg Kroah-Hartman
From: Greg KH 

3.4-stable review patch.  If anyone has any objections, please let me know.

--

From: Lionel Vaux 

commit 76c9d8fe2c7fc34ffc387d8022c5828d6ff9df48 upstream.

Add yet another device to the list of Cypress barcode scanners
needing the CP_RDESC_SWAPPED_MIN_MAX quirk.

Signed-off-by: Lionel Vaux (iouri) 
Signed-off-by: Jiri Kosina 
Signed-off-by: Greg Kroah-Hartman 

---
 drivers/hid/hid-core.c|1 +
 drivers/hid/hid-cypress.c |2 ++
 drivers/hid/hid-ids.h |1 +
 3 files changed, 4 insertions(+)

--- a/drivers/hid/hid-core.c
+++ b/drivers/hid/hid-core.c
@@ -1410,6 +1410,7 @@ static const struct hid_device_id hid_ha
{ HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, 
USB_DEVICE_ID_CYPRESS_BARCODE_1) },
{ HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, 
USB_DEVICE_ID_CYPRESS_BARCODE_2) },
{ HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, 
USB_DEVICE_ID_CYPRESS_BARCODE_3) },
+   { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, 
USB_DEVICE_ID_CYPRESS_BARCODE_4) },
{ HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_MOUSE) },
{ HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, 
USB_DEVICE_ID_CYPRESS_TRUETOUCH) },
{ HID_USB_DEVICE(USB_VENDOR_ID_DRAGONRISE, 0x0006) },
--- a/drivers/hid/hid-cypress.c
+++ b/drivers/hid/hid-cypress.c
@@ -129,6 +129,8 @@ static const struct hid_device_id cp_dev
.driver_data = CP_RDESC_SWAPPED_MIN_MAX },
{ HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, 
USB_DEVICE_ID_CYPRESS_BARCODE_3),
.driver_data = CP_RDESC_SWAPPED_MIN_MAX },
+   { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, 
USB_DEVICE_ID_CYPRESS_BARCODE_4),
+   .driver_data = CP_RDESC_SWAPPED_MIN_MAX },
{ HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_MOUSE),
.driver_data = CP_2WHEEL_MOUSE_HACK },
{ }
--- a/drivers/hid/hid-ids.h
+++ b/drivers/hid/hid-ids.h
@@ -231,6 +231,7 @@
 #define USB_DEVICE_ID_CYPRESS_BARCODE_10xde61
 #define USB_DEVICE_ID_CYPRESS_BARCODE_20xde64
 #define USB_DEVICE_ID_CYPRESS_BARCODE_30xbca1
+#define USB_DEVICE_ID_CYPRESS_BARCODE_40xed81
 #define USB_DEVICE_ID_CYPRESS_TRUETOUCH0xc001
 
 #define USB_VENDOR_ID_DEALEXTREAME 0x10c5


--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[ 49/65] x86, microcode: Sanitize per-cpu microcode reloading interface

2012-08-13 Thread Greg Kroah-Hartman
From: Greg KH 

3.4-stable review patch.  If anyone has any objections, please let me know.

--

From: Borislav Petkov 

commit c9fc3f778a6a215ace14ee556067c73982b6d40f upstream.

Microcode reloading in a per-core manner is a very bad idea for both
major x86 vendors. And the thing is, we have such interface with which
we can end up with different microcode versions applied on different
cores of an otherwise homogeneous wrt (family,model,stepping) system.

So turn off the possibility of doing that per core and allow it only
system-wide.

This is a minimal fix which we'd like to see in stable too thus the
more-or-less arbitrary decision to allow system-wide reloading only on
the BSP:

$ echo 1 > /sys/devices/system/cpu/cpu0/microcode/reload
...

and disable the interface on the other cores:

$ echo 1 > /sys/devices/system/cpu/cpu23/microcode/reload
-bash: echo: write error: Invalid argument

Also, allowing the reload only from one CPU (the BSP in
that case) doesn't allow the reload procedure to degenerate
into an O(n^2) deal when triggering reloads from all
/sys/devices/system/cpu/cpuX/microcode/reload sysfs nodes
simultaneously.

A more generic fix will follow.

Signed-off-by: Borislav Petkov 
Cc: Henrique de Moraes Holschuh 
Cc: Peter Zijlstra 
Link: http://lkml.kernel.org/r/1340280437-7718-2-git-send-email...@amd64.org
Signed-off-by: H. Peter Anvin 
Signed-off-by: Greg Kroah-Hartman 

---
 arch/x86/kernel/microcode_core.c |   26 +++---
 1 file changed, 19 insertions(+), 7 deletions(-)

--- a/arch/x86/kernel/microcode_core.c
+++ b/arch/x86/kernel/microcode_core.c
@@ -298,19 +298,31 @@ static ssize_t reload_store(struct devic
const char *buf, size_t size)
 {
unsigned long val;
-   int cpu = dev->id;
-   ssize_t ret = 0;
+   int cpu;
+   ssize_t ret = 0, tmp_ret;
+
+   /* allow reload only from the BSP */
+   if (boot_cpu_data.cpu_index != dev->id)
+   return -EINVAL;
 
ret = kstrtoul(buf, 0, &val);
if (ret)
return ret;
 
-   if (val == 1) {
-   get_online_cpus();
-   if (cpu_online(cpu))
-   ret = reload_for_cpu(cpu);
-   put_online_cpus();
+   if (val != 1)
+   return size;
+
+   get_online_cpus();
+   for_each_online_cpu(cpu) {
+   tmp_ret = reload_for_cpu(cpu);
+   if (tmp_ret != 0)
+   pr_warn("Error reloading microcode on CPU %d\n", cpu);
+
+   /* save retval of the first encountered reload error */
+   if (!ret)
+   ret = tmp_ret;
}
+   put_online_cpus();
 
if (!ret)
ret = size;


--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[ 51/65] target: Add range checking to UNMAP emulation

2012-08-13 Thread Greg Kroah-Hartman
From: Greg KH 

3.4-stable review patch.  If anyone has any objections, please let me know.

--

From: Roland Dreier 

commit 2594e29865c291db162313187612cd9f14538f33 upstream.

When processing an UNMAP command, we need to make sure that the number
of blocks we're asked to UNMAP does not exceed our reported maximum
number of blocks per UNMAP, and that the range of blocks we're
unmapping doesn't go past the end of the device.

Signed-off-by: Roland Dreier 
Signed-off-by: Nicholas Bellinger 
[bwh: Backported to 3.2: adjust filename, context]
Signed-off-by: Ben Hutchings 
Signed-off-by: Greg Kroah-Hartman 
---
 drivers/target/target_core_cdb.c |   12 
 1 file changed, 12 insertions(+)

--- a/drivers/target/target_core_cdb.c
+++ b/drivers/target/target_core_cdb.c
@@ -1053,6 +1053,18 @@ int target_emulate_unmap(struct se_task
pr_debug("UNMAP: Using lba: %llu and range: %u\n",
 (unsigned long long)lba, range);
 
+   if (range > dev->se_sub_dev->se_dev_attrib.max_unmap_lba_count) 
{
+   cmd->scsi_sense_reason = TCM_INVALID_PARAMETER_LIST;
+   ret = -EINVAL;
+   goto err;
+   }
+
+   if (lba + range > dev->transport->get_blocks(dev) + 1) {
+   cmd->scsi_sense_reason = TCM_ADDRESS_OUT_OF_RANGE;
+   ret = -EINVAL;
+   goto err;
+   }
+
ret = dev->transport->do_discard(dev, lba, range);
if (ret < 0) {
pr_err("blkdev_issue_discard() failed: %d\n",


--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[ 48/65] x86, microcode: microcode_core.c simple_strtoul cleanup

2012-08-13 Thread Greg Kroah-Hartman
From: Greg KH 

3.4-stable review patch.  If anyone has any objections, please let me know.

--

From: Shuah Khan 

commit e826abd523913f63eb03b59746ffb16153c53dc4 upstream.

Change reload_for_cpu() in kernel/microcode_core.c to call kstrtoul()
instead of calling obsoleted simple_strtoul().

Signed-off-by: Shuah Khan 
Reviewed-by: Borislav Petkov 
Link: http://lkml.kernel.org/r/1336324264.2897.9.camel@lorien2
Signed-off-by: H. Peter Anvin 
Cc: Henrique de Moraes Holschuh 
Signed-off-by: Greg Kroah-Hartman 

---
 arch/x86/kernel/microcode_core.c |9 -
 1 file changed, 4 insertions(+), 5 deletions(-)

--- a/arch/x86/kernel/microcode_core.c
+++ b/arch/x86/kernel/microcode_core.c
@@ -299,12 +299,11 @@ static ssize_t reload_store(struct devic
 {
unsigned long val;
int cpu = dev->id;
-   int ret = 0;
-   char *end;
+   ssize_t ret = 0;
 
-   val = simple_strtoul(buf, &end, 0);
-   if (end == buf)
-   return -EINVAL;
+   ret = kstrtoul(buf, 0, &val);
+   if (ret)
+   return ret;
 
if (val == 1) {
get_online_cpus();


--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[ 47/65] HID: add ASUS AIO keyboard model AK1D

2012-08-13 Thread Greg Kroah-Hartman
From: Greg KH 

3.4-stable review patch.  If anyone has any objections, please let me know.

--

From: Cyrus Lien 

commit 2d8767bb421574dfcf48e4be0751ce7d8f73d5d7 upstream.

Add Asus All-In-One PC keyboard model AK1D.

BugLink: https://bugs.launchpad.net/bugs/1027789

Signed-off-by: Cyrus Lien 
Signed-off-by: Jiri Kosina 
Signed-off-by: Greg Kroah-Hartman 

---
 drivers/hid/hid-chicony.c |1 +
 drivers/hid/hid-core.c|1 +
 drivers/hid/hid-ids.h |1 +
 3 files changed, 3 insertions(+)

--- a/drivers/hid/hid-chicony.c
+++ b/drivers/hid/hid-chicony.c
@@ -60,6 +60,7 @@ static int ch_input_mapping(struct hid_d
 static const struct hid_device_id ch_devices[] = {
{ HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, 
USB_DEVICE_ID_CHICONY_TACTICAL_PAD) },
{ HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, 
USB_DEVICE_ID_CHICONY_WIRELESS2) },
+   { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_AK1D) },
{ }
 };
 MODULE_DEVICE_TABLE(hid, ch_devices);
--- a/drivers/hid/hid-core.c
+++ b/drivers/hid/hid-core.c
@@ -1404,6 +1404,7 @@ static const struct hid_device_id hid_ha
{ HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, 
USB_DEVICE_ID_CHICONY_TACTICAL_PAD) },
{ HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_WIRELESS) 
},
{ HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, 
USB_DEVICE_ID_CHICONY_WIRELESS2) },
+   { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_AK1D) },
{ HID_USB_DEVICE(USB_VENDOR_ID_CHUNGHWAT, 
USB_DEVICE_ID_CHUNGHWAT_MULTITOUCH) },
{ HID_USB_DEVICE(USB_VENDOR_ID_CREATIVELABS, 
USB_DEVICE_ID_PRODIKEYS_PCMIDI) },
{ HID_USB_DEVICE(USB_VENDOR_ID_CVTOUCH, USB_DEVICE_ID_CVTOUCH_SCREEN) },
--- a/drivers/hid/hid-ids.h
+++ b/drivers/hid/hid-ids.h
@@ -202,6 +202,7 @@
 #define USB_DEVICE_ID_CHICONY_MULTI_TOUCH  0xb19d
 #define USB_DEVICE_ID_CHICONY_WIRELESS 0x0618
 #define USB_DEVICE_ID_CHICONY_WIRELESS20x1123
+#define USB_DEVICE_ID_CHICONY_AK1D 0x1125
 
 #define USB_VENDOR_ID_CHUNGHWAT0x2247
 #define USB_DEVICE_ID_CHUNGHWAT_MULTITOUCH 0x0001


--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[ 45/65] HID: multitouch: add support for Novatek touchscreen

2012-08-13 Thread Greg Kroah-Hartman
From: Greg KH 

3.4-stable review patch.  If anyone has any objections, please let me know.

--

From: Austin Hendrix 

commit 4db703ead4535792ea54dba7275fdd1527848e74 upstream.

Add support for a Novatek touchscreen panel as a generic HID multitouch
panel.

Signed-off-by: Austin Hendrix 
Signed-off-by: Jiri Kosina 
Signed-off-by: Greg Kroah-Hartman 

---
 drivers/hid/hid-ids.h|3 +++
 drivers/hid/hid-multitouch.c |5 +
 2 files changed, 8 insertions(+)

--- a/drivers/hid/hid-ids.h
+++ b/drivers/hid/hid-ids.h
@@ -567,6 +567,9 @@
 #define USB_VENDOR_ID_NINTENDO 0x057e
 #define USB_DEVICE_ID_NINTENDO_WIIMOTE 0x0306
 
+#define USB_VENDOR_ID_NOVATEK  0x0603
+#define USB_DEVICE_ID_NOVATEK_PCT  0x0600
+
 #define USB_VENDOR_ID_NTRIG0x1b96
 #define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN   0x0001
 #define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_1   0x0003
--- a/drivers/hid/hid-multitouch.c
+++ b/drivers/hid/hid-multitouch.c
@@ -940,6 +940,11 @@ static const struct hid_device_id mt_dev
HID_USB_DEVICE(USB_VENDOR_ID_PANASONIC,
USB_DEVICE_ID_PANABOARD_UBT880) },
 
+   /* Novatek Panel */
+   { .driver_data = MT_CLS_DEFAULT,
+   HID_USB_DEVICE(USB_VENDOR_ID_NOVATEK,
+   USB_DEVICE_ID_NOVATEK_PCT) },
+
/* PenMount panels */
{ .driver_data = MT_CLS_CONFIDENCE,
HID_USB_DEVICE(USB_VENDOR_ID_PENMOUNT,


--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[ 44/65] random: mix in architectural randomness in extract_buf()

2012-08-13 Thread Greg Kroah-Hartman
From: Greg KH 

3.4-stable review patch.  If anyone has any objections, please let me know.

--

From: "H. Peter Anvin" 

commit d2e7c96af1e54b507ae2a6a7dd2baf588417a7e5 upstream.

Mix in any architectural randomness in extract_buf() instead of
xfer_secondary_buf().  This allows us to mix in more architectural
randomness, and it also makes xfer_secondary_buf() faster, moving a
tiny bit of additional CPU overhead to process which is extracting the
randomness.

[ Commit description modified by tytso to remove an extended
  advertisement for the RDRAND instruction. ]

Signed-off-by: H. Peter Anvin 
Acked-by: Ingo Molnar 
Cc: DJ Johnston 
Signed-off-by: Theodore Ts'o 
Signed-off-by: Greg Kroah-Hartman 

---
 drivers/char/random.c |   56 --
 1 file changed, 32 insertions(+), 24 deletions(-)

--- a/drivers/char/random.c
+++ b/drivers/char/random.c
@@ -277,6 +277,8 @@
 #define SEC_XFER_SIZE 512
 #define EXTRACT_SIZE 10
 
+#define LONGS(x) (((x) + sizeof(unsigned long) - 1)/sizeof(unsigned long))
+
 /*
  * The minimum number of bits of entropy before we wake up a read on
  * /dev/random.  Should be enough to do a significant reseed.
@@ -813,11 +815,7 @@ static ssize_t extract_entropy(struct en
  */
 static void xfer_secondary_pool(struct entropy_store *r, size_t nbytes)
 {
-   union {
-   __u32   tmp[OUTPUT_POOL_WORDS];
-   longhwrand[4];
-   } u;
-   int i;
+   __u32   tmp[OUTPUT_POOL_WORDS];
 
if (r->pull && r->entropy_count < nbytes * 8 &&
r->entropy_count < r->poolinfo->POOLBITS) {
@@ -828,23 +826,17 @@ static void xfer_secondary_pool(struct e
/* pull at least as many as BYTES as wakeup BITS */
bytes = max_t(int, bytes, random_read_wakeup_thresh / 8);
/* but never more than the buffer size */
-   bytes = min_t(int, bytes, sizeof(u.tmp));
+   bytes = min_t(int, bytes, sizeof(tmp));
 
DEBUG_ENT("going to reseed %s with %d bits "
  "(%d of %d requested)\n",
  r->name, bytes * 8, nbytes * 8, r->entropy_count);
 
-   bytes = extract_entropy(r->pull, u.tmp, bytes,
+   bytes = extract_entropy(r->pull, tmp, bytes,
random_read_wakeup_thresh / 8, rsvd);
-   mix_pool_bytes(r, u.tmp, bytes, NULL);
+   mix_pool_bytes(r, tmp, bytes, NULL);
credit_entropy_bits(r, bytes*8);
}
-   kmemcheck_mark_initialized(&u.hwrand, sizeof(u.hwrand));
-   for (i = 0; i < 4; i++)
-   if (arch_get_random_long(&u.hwrand[i]))
-   break;
-   if (i)
-   mix_pool_bytes(r, &u.hwrand, sizeof(u.hwrand), 0);
 }
 
 /*
@@ -901,15 +893,19 @@ static size_t account(struct entropy_sto
 static void extract_buf(struct entropy_store *r, __u8 *out)
 {
int i;
-   __u32 hash[5], workspace[SHA_WORKSPACE_WORDS];
+   union {
+   __u32 w[5];
+   unsigned long l[LONGS(EXTRACT_SIZE)];
+   } hash;
+   __u32 workspace[SHA_WORKSPACE_WORDS];
__u8 extract[64];
unsigned long flags;
 
/* Generate a hash across the pool, 16 words (512 bits) at a time */
-   sha_init(hash);
+   sha_init(hash.w);
spin_lock_irqsave(&r->lock, flags);
for (i = 0; i < r->poolinfo->poolwords; i += 16)
-   sha_transform(hash, (__u8 *)(r->pool + i), workspace);
+   sha_transform(hash.w, (__u8 *)(r->pool + i), workspace);
 
/*
 * We mix the hash back into the pool to prevent backtracking
@@ -920,14 +916,14 @@ static void extract_buf(struct entropy_s
 * brute-forcing the feedback as hard as brute-forcing the
 * hash.
 */
-   __mix_pool_bytes(r, hash, sizeof(hash), extract);
+   __mix_pool_bytes(r, hash.w, sizeof(hash.w), extract);
spin_unlock_irqrestore(&r->lock, flags);
 
/*
 * To avoid duplicates, we atomically extract a portion of the
 * pool while mixing, and hash one final time.
 */
-   sha_transform(hash, extract, workspace);
+   sha_transform(hash.w, extract, workspace);
memset(extract, 0, sizeof(extract));
memset(workspace, 0, sizeof(workspace));
 
@@ -936,11 +932,23 @@ static void extract_buf(struct entropy_s
 * pattern, we fold it in half. Thus, we always feed back
 * twice as much data as we output.
 */
-   hash[0] ^= hash[3];
-   hash[1] ^= hash[4];
-   hash[2] ^= rol32(hash[2], 16);
-   memcpy(out, hash, EXTRACT_SIZE);
-   memset(hash, 0, sizeof(hash));
+   hash.w[0] ^= hash.w[3];
+   hash.w[1] ^= hash.w[4];
+   hash.w[2] ^= rol32(hash.w[2], 16);
+
+   /*
+* If we have a architectural hardware random number
+* generator, mix that in, too.
+*/
+   for 

[ 40/65] mfd: wm831x: Feed the device UUID into device_add_randomness()

2012-08-13 Thread Greg Kroah-Hartman
From: Greg KH 

3.4-stable review patch.  If anyone has any objections, please let me know.

--

From: Mark Brown 

commit 27130f0cc3ab97560384da437e4621fc4e94f21c upstream.

wm831x devices contain a unique ID value. Feed this into the newly added
device_add_randomness() to add some per device seed data to the pool.

Signed-off-by: Mark Brown 
Signed-off-by: Theodore Ts'o 
Signed-off-by: Greg Kroah-Hartman 

---
 drivers/mfd/wm831x-otp.c |8 
 1 file changed, 8 insertions(+)

--- a/drivers/mfd/wm831x-otp.c
+++ b/drivers/mfd/wm831x-otp.c
@@ -18,6 +18,7 @@
 #include 
 #include 
 #include 
+#include 
 
 #include 
 #include 
@@ -66,6 +67,7 @@ static DEVICE_ATTR(unique_id, 0444, wm83
 
 int wm831x_otp_init(struct wm831x *wm831x)
 {
+   char uuid[WM831X_UNIQUE_ID_LEN];
int ret;
 
ret = device_create_file(wm831x->dev, &dev_attr_unique_id);
@@ -73,6 +75,12 @@ int wm831x_otp_init(struct wm831x *wm831
dev_err(wm831x->dev, "Unique ID attribute not created: %d\n",
ret);
 
+   ret = wm831x_unique_id_read(wm831x, uuid);
+   if (ret == 0)
+   add_device_randomness(uuid, sizeof(uuid));
+   else
+   dev_err(wm831x->dev, "Failed to read UUID: %d\n", ret);
+
return ret;
 }
 


--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[ 43/65] dmi: Feed DMI table to /dev/random driver

2012-08-13 Thread Greg Kroah-Hartman
From: Greg KH 

3.4-stable review patch.  If anyone has any objections, please let me know.

--

From: Tony Luck 

commit d114a33387472555188f142ed8e98acdb8181c6d upstream.

Send the entire DMI (SMBIOS) table to the /dev/random driver to
help seed its pools.

Signed-off-by: Tony Luck 
Signed-off-by: Theodore Ts'o 
Signed-off-by: Greg Kroah-Hartman 

---
 drivers/firmware/dmi_scan.c |3 +++
 1 file changed, 3 insertions(+)

--- a/drivers/firmware/dmi_scan.c
+++ b/drivers/firmware/dmi_scan.c
@@ -6,6 +6,7 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 
 /*
@@ -111,6 +112,8 @@ static int __init dmi_walk_early(void (*
 
dmi_table(buf, dmi_len, dmi_num, decode, NULL);
 
+   add_device_randomness(buf, dmi_len);
+
dmi_iounmap(buf, dmi_len);
return 0;
 }


--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[ 39/65] rtc: wm831x: Feed the write counter into device_add_randomness()

2012-08-13 Thread Greg Kroah-Hartman
From: Greg KH 

3.4-stable review patch.  If anyone has any objections, please let me know.

--

From: Mark Brown 

commit 9dccf55f4cb011a7552a8a2749a580662f5ed8ed upstream.

The tamper evident features of the RTC include the "write counter" which
is a pseudo-random number regenerated whenever we set the RTC. Since this
value is unpredictable it should provide some useful seeding to the random
number generator.

Only do this on boot since the goal is to seed the pool rather than add
useful entropy.

Signed-off-by: Mark Brown 
Signed-off-by: Theodore Ts'o 
Signed-off-by: Greg Kroah-Hartman 

---
 drivers/rtc/rtc-wm831x.c |   24 +++-
 1 file changed, 23 insertions(+), 1 deletion(-)

--- a/drivers/rtc/rtc-wm831x.c
+++ b/drivers/rtc/rtc-wm831x.c
@@ -24,7 +24,7 @@
 #include 
 #include 
 #include 
-
+#include 
 
 /*
  * R16416 (0x4020) - RTC Write Counter
@@ -96,6 +96,26 @@ struct wm831x_rtc {
unsigned int alarm_enabled:1;
 };
 
+static void wm831x_rtc_add_randomness(struct wm831x *wm831x)
+{
+   int ret;
+   u16 reg;
+
+   /*
+* The write counter contains a pseudo-random number which is
+* regenerated every time we set the RTC so it should be a
+* useful per-system source of entropy.
+*/
+   ret = wm831x_reg_read(wm831x, WM831X_RTC_WRITE_COUNTER);
+   if (ret >= 0) {
+   reg = ret;
+   add_device_randomness(®, sizeof(reg));
+   } else {
+   dev_warn(wm831x->dev, "Failed to read RTC write counter: %d\n",
+ret);
+   }
+}
+
 /*
  * Read current time and date in RTC
  */
@@ -431,6 +451,8 @@ static int wm831x_rtc_probe(struct platf
alm_irq, ret);
}
 
+   wm831x_rtc_add_randomness(wm831x);
+
return 0;
 
 err:


--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[ 38/65] MAINTAINERS: Theodore Tso is taking over the random driver

2012-08-13 Thread Greg Kroah-Hartman
From: Greg KH 

3.4-stable review patch.  If anyone has any objections, please let me know.

--

From: Theodore Ts'o 

commit 330e0a01d54c2b8606c56816f99af6ebc58ec92c upstream.

Matt Mackall stepped down as the /dev/random driver maintainer last
year, so Theodore Ts'o is taking back the /dev/random driver.

Cc: Matt Mackall 
Signed-off-by: "Theodore Ts'o" 
Signed-off-by: Greg Kroah-Hartman 

---
 MAINTAINERS |2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -5566,7 +5566,7 @@ F:Documentation/blockdev/ramdisk.txt
 F: drivers/block/brd.c
 
 RANDOM NUMBER DRIVER
-M: Matt Mackall 
+M: Theodore Ts'o" 
 S: Maintained
 F: drivers/char/random.c
 


--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[ 52/65] target: Fix reading of data length fields for UNMAP commands

2012-08-13 Thread Greg Kroah-Hartman
From: Greg KH 

3.4-stable review patch.  If anyone has any objections, please let me know.

--

From: Roland Dreier 

commit 1a5fa4576ec8a462313c7516b31d7453481ddbe8 upstream.

The UNMAP DATA LENGTH and UNMAP BLOCK DESCRIPTOR DATA LENGTH fields
are in the unmap descriptor (the payload transferred to our data out
buffer), not in the CDB itself.  Read them from the correct place in
target_emulated_unmap.

Signed-off-by: Roland Dreier 
Signed-off-by: Nicholas Bellinger 
[bwh: Backported to 3.2: adjust filename, context]
Signed-off-by: Ben Hutchings 
Signed-off-by: Greg Kroah-Hartman 
---
 drivers/target/target_core_cdb.c |6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

--- a/drivers/target/target_core_cdb.c
+++ b/drivers/target/target_core_cdb.c
@@ -1022,7 +1022,6 @@ int target_emulate_unmap(struct se_task
struct se_cmd *cmd = task->task_se_cmd;
struct se_device *dev = cmd->se_dev;
unsigned char *buf, *ptr = NULL;
-   unsigned char *cdb = &cmd->t_task_cdb[0];
sector_t lba;
unsigned int size = cmd->data_length, range;
int ret = 0, offset;
@@ -1038,11 +1037,12 @@ int target_emulate_unmap(struct se_task
/* First UNMAP block descriptor starts at 8 byte offset */
offset = 8;
size -= 8;
-   dl = get_unaligned_be16(&cdb[0]);
-   bd_dl = get_unaligned_be16(&cdb[2]);
 
buf = transport_kmap_data_sg(cmd);
 
+   dl = get_unaligned_be16(&buf[0]);
+   bd_dl = get_unaligned_be16(&buf[2]);
+
ptr = &buf[offset];
pr_debug("UNMAP: Sub: %s Using dl: %hu bd_dl: %hu size: %hu"
" ptr: %p\n", dev->transport->name, dl, bd_dl, size, ptr);


--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[ 53/65] target: Fix possible integer underflow in UNMAP emulation

2012-08-13 Thread Greg Kroah-Hartman
From: Greg KH 

3.4-stable review patch.  If anyone has any objections, please let me know.

--

From: Roland Dreier 

commit b7fc7f3777582dea85156a821d78a522a0c083aa upstream.

It's possible for an initiator to send us an UNMAP command with a
descriptor that is less than 8 bytes; in that case it's really bad for
us to set an unsigned int to that value, subtract 8 from it, and then
use that as a limit for our loop (since the value will wrap around to
a huge positive value).

Fix this by making size be signed and only looping if size >= 16 (ie
if we have at least a full descriptor available).

Also remove offset as an obfuscated name for the constant 8.

Signed-off-by: Roland Dreier 
Signed-off-by: Nicholas Bellinger 
[bwh: Backported to 3.2: adjust filename, context]
Signed-off-by: Ben Hutchings 
Signed-off-by: Greg Kroah-Hartman 
---
 drivers/target/target_core_cdb.c |   20 ++--
 1 file changed, 10 insertions(+), 10 deletions(-)

--- a/drivers/target/target_core_cdb.c
+++ b/drivers/target/target_core_cdb.c
@@ -1023,9 +1023,10 @@ int target_emulate_unmap(struct se_task
struct se_device *dev = cmd->se_dev;
unsigned char *buf, *ptr = NULL;
sector_t lba;
-   unsigned int size = cmd->data_length, range;
-   int ret = 0, offset;
-   unsigned short dl, bd_dl;
+   int size = cmd->data_length;
+   u32 range;
+   int ret = 0;
+   int dl, bd_dl;
 
if (!dev->transport->do_discard) {
pr_err("UNMAP emulation not supported for: %s\n",
@@ -1034,20 +1035,19 @@ int target_emulate_unmap(struct se_task
return -ENOSYS;
}
 
-   /* First UNMAP block descriptor starts at 8 byte offset */
-   offset = 8;
-   size -= 8;
-
buf = transport_kmap_data_sg(cmd);
 
dl = get_unaligned_be16(&buf[0]);
bd_dl = get_unaligned_be16(&buf[2]);
 
-   ptr = &buf[offset];
-   pr_debug("UNMAP: Sub: %s Using dl: %hu bd_dl: %hu size: %hu"
+   size = min(size - 8, bd_dl);
+
+   /* First UNMAP block descriptor starts at 8 byte offset */
+   ptr = &buf[8];
+   pr_debug("UNMAP: Sub: %s Using dl: %u bd_dl: %u size: %u"
" ptr: %p\n", dev->transport->name, dl, bd_dl, size, ptr);
 
-   while (size) {
+   while (size >= 16) {
lba = get_unaligned_be64(&ptr[0]);
range = get_unaligned_be32(&ptr[8]);
pr_debug("UNMAP: Using lba: %llu and range: %u\n",


--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[ 58/65] cfg80211: process pending events when unregistering net device

2012-08-13 Thread Greg Kroah-Hartman
From: Greg KH 

3.4-stable review patch.  If anyone has any objections, please let me know.

--

From: Daniel Drake 

commit 1f6fc43e621167492ed4b7f3b4269c584c3d6ccc upstream.

libertas currently calls cfg80211_disconnected() when it is being
brought down. This causes an event to be allocated, but since the
wdev is already removed from the rdev by the time that the event
processing work executes, the event is never processed or freed.
http://article.gmane.org/gmane.linux.kernel.wireless.general/95666

Fix this leak, and other possible situations, by processing the event
queue when a device is being unregistered. Thanks to Johannes Berg for
the suggestion.

Signed-off-by: Daniel Drake 
Reviewed-by: Johannes Berg 
Signed-off-by: John W. Linville 
Signed-off-by: Greg Kroah-Hartman 

---
 net/wireless/core.c |5 +
 net/wireless/core.h |1 +
 net/wireless/util.c |2 +-
 3 files changed, 7 insertions(+), 1 deletion(-)

--- a/net/wireless/core.c
+++ b/net/wireless/core.c
@@ -975,6 +975,11 @@ static int cfg80211_netdev_notifier_call
 */
synchronize_rcu();
INIT_LIST_HEAD(&wdev->list);
+   /*
+* Ensure that all events have been processed and
+* freed.
+*/
+   cfg80211_process_wdev_events(wdev);
break;
case NETDEV_PRE_UP:
if (!(wdev->wiphy->interface_modes & BIT(wdev->iftype)))
--- a/net/wireless/core.h
+++ b/net/wireless/core.h
@@ -426,6 +426,7 @@ int cfg80211_change_iface(struct cfg8021
  struct net_device *dev, enum nl80211_iftype ntype,
  u32 *flags, struct vif_params *params);
 void cfg80211_process_rdev_events(struct cfg80211_registered_device *rdev);
+void cfg80211_process_wdev_events(struct wireless_dev *wdev);
 
 int cfg80211_can_change_interface(struct cfg80211_registered_device *rdev,
  struct wireless_dev *wdev,
--- a/net/wireless/util.c
+++ b/net/wireless/util.c
@@ -717,7 +717,7 @@ void cfg80211_upload_connect_keys(struct
wdev->connect_keys = NULL;
 }
 
-static void cfg80211_process_wdev_events(struct wireless_dev *wdev)
+void cfg80211_process_wdev_events(struct wireless_dev *wdev)
 {
struct cfg80211_event *ev;
unsigned long flags;


--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[ 60/65] tun: dont zeroize sock->file on detach

2012-08-13 Thread Greg Kroah-Hartman
From: Greg KH 

3.4-stable review patch.  If anyone has any objections, please let me know.

--

From: Stanislav Kinsbursky 

commit 66d1b9263a371abd15806c53f486f0645ef31a8f upstream.

This is a fix for bug, introduced in 3.4 kernel by commit
1ab5ecb90cb6a3df1476e052f76a6e8f6511cb3d ("tun: don't hold network
namespace by tun sockets"), which, among other things, replaced simple
sock_put() by sk_release_kernel(). Below is sequence, which leads to
oops for non-persistent devices:

tun_chr_close()
tun_detach()<== tun->socket.file = NULL
tun_free_netdev()
sk_release_sock()
sock_release(sock->file == NULL)
iput(SOCK_INODE(sock))  <== dereference on NULL pointer

This patch just removes zeroing of socket's file from __tun_detach().
sock_release() will do this.

Reported-by: Ruan Zhijie 
Tested-by: Ruan Zhijie 
Acked-by: Al Viro 
Acked-by: Eric Dumazet 
Acked-by: Yuchung Cheng 
Signed-off-by: Stanislav Kinsbursky 
Signed-off-by: David S. Miller 
Signed-off-by: Greg Kroah-Hartman 

---
 drivers/net/tun.c |1 -
 1 file changed, 1 deletion(-)

--- a/drivers/net/tun.c
+++ b/drivers/net/tun.c
@@ -185,7 +185,6 @@ static void __tun_detach(struct tun_stru
netif_tx_lock_bh(tun->dev);
netif_carrier_off(tun->dev);
tun->tfile = NULL;
-   tun->socket.file = NULL;
netif_tx_unlock_bh(tun->dev);
 
/* Drop read queue */


--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[ 50/65] mm: hugetlbfs: close race during teardown of hugetlbfs shared page tables

2012-08-13 Thread Greg Kroah-Hartman
From: Greg KH 

3.4-stable review patch.  If anyone has any objections, please let me know.

--

From: Mel Gorman 

commit d833352a4338dc31295ed832a30c9ccff5c7a183 upstream.

If a process creates a large hugetlbfs mapping that is eligible for page
table sharing and forks heavily with children some of whom fault and
others which destroy the mapping then it is possible for page tables to
get corrupted.  Some teardowns of the mapping encounter a "bad pmd" and
output a message to the kernel log.  The final teardown will trigger a
BUG_ON in mm/filemap.c.

This was reproduced in 3.4 but is known to have existed for a long time
and goes back at least as far as 2.6.37.  It was probably was introduced
in 2.6.20 by [39dde65c: shared page table for hugetlb page].  The messages
look like this;

[  ..] Lots of bad pmd messages followed by this
[  127.164256] mm/memory.c:391: bad pmd 880412e04fe8(8003de4000e7).
[  127.164257] mm/memory.c:391: bad pmd 880412e04ff0(8003de6000e7).
[  127.164258] mm/memory.c:391: bad pmd 880412e04ff8(8003dee7).
[  127.186778] [ cut here ]
[  127.186781] kernel BUG at mm/filemap.c:134!
[  127.186782] invalid opcode:  [#1] SMP
[  127.186783] CPU 7
[  127.186784] Modules linked in: af_packet cpufreq_conservative 
cpufreq_userspace cpufreq_powersave acpi_cpufreq mperf ext3 jbd dm_mod coretemp 
crc32c_intel usb_storage ghash_clmulni_intel aesni_intel i2c_i801 r8169 mii uas 
sr_mod cdrom sg iTCO_wdt iTCO_vendor_support shpchp serio_raw cryptd aes_x86_64 
e1000e pci_hotplug dcdbas aes_generic container microcode ext4 mbcache jbd2 
crc16 sd_mod crc_t10dif i915 drm_kms_helper drm i2c_algo_bit ehci_hcd ahci 
libahci usbcore rtc_cmos usb_common button i2c_core intel_agp video intel_gtt 
fan processor thermal thermal_sys hwmon ata_generic pata_atiixp libata scsi_mod
[  127.186801]
[  127.186802] Pid: 9017, comm: hugetlbfs-test Not tainted 3.4.0-autobuild #53 
Dell Inc. OptiPlex 990/06D7TR
[  127.186804] RIP: 0010:[]  [] 
__delete_from_page_cache+0x15e/0x160
[  127.186809] RSP: :8804144b5c08  EFLAGS: 00010002
[  127.186810] RAX: 0001 RBX: ea000a5c9000 RCX: ffc0
[  127.186811] RDX:  RSI: 0009 RDI: 88042dfdad00
[  127.186812] RBP: 8804144b5c18 R08: 0009 R09: 0003
[  127.186813] R10:  R11: 002d R12: 880412ff83d8
[  127.186814] R13: 880412ff83d8 R14:  R15: 880412ff83d8
[  127.186815] FS:  7fe18ed2c700() GS:88042dce() 
knlGS:
[  127.186816] CS:  0010 DS:  ES:  CR0: 8005003b
[  127.186817] CR2: 7fe34503 CR3: 000417a14000 CR4: 000407e0
[  127.186818] DR0:  DR1:  DR2: 
[  127.186819] DR3:  DR6: 0ff0 DR7: 0400
[  127.186820] Process hugetlbfs-test (pid: 9017, threadinfo 8804144b4000, 
task 880417f803c0)
[  127.186821] Stack:
[  127.186822]  ea000a5c9000  8804144b5c48 
810ed83b
[  127.186824]  8804144b5c48 138a 1387 
8804144b5c98
[  127.186825]  8804144b5d48 811bc925 8804144b5cb8 

[  127.186827] Call Trace:
[  127.186829]  [] delete_from_page_cache+0x3b/0x80
[  127.186832]  [] truncate_hugepages+0x115/0x220
[  127.186834]  [] hugetlbfs_evict_inode+0x13/0x30
[  127.186837]  [] evict+0xa7/0x1b0
[  127.186839]  [] iput_final+0xd3/0x1f0
[  127.186840]  [] iput+0x39/0x50
[  127.186842]  [] d_kill+0xf8/0x130
[  127.186843]  [] dput+0xd2/0x1a0
[  127.186845]  [] __fput+0x170/0x230
[  127.186848]  [] ? rb_erase+0xce/0x150
[  127.186849]  [] fput+0x1d/0x30
[  127.186851]  [] remove_vma+0x37/0x80
[  127.186853]  [] do_munmap+0x2d2/0x360
[  127.186855]  [] sys_shmdt+0xc9/0x170
[  127.186857]  [] system_call_fastpath+0x16/0x1b
[  127.186858] Code: 0f 1f 44 00 00 48 8b 43 08 48 8b 00 48 8b 40 28 8b b0 40 
03 00 00 85 f6 0f 88 df fe ff ff 48 89 df e8 e7 cb 05 00 e9 d2 fe ff ff <0f> 0b 
55 83 e2 fd 48 89 e5 48 83 ec 30 48 89 5d d8 4c 89 65 e0
[  127.186868] RIP  [] __delete_from_page_cache+0x15e/0x160
[  127.186870]  RSP 
[  127.186871] ---[ end trace 7cbac5d1db69f426 ]---

The bug is a race and not always easy to reproduce.  To reproduce it I was
doing the following on a single socket I7-based machine with 16G of RAM.

$ hugeadm --pool-pages-max DEFAULT:13G
$ echo $((18*1048576*1024)) > /proc/sys/kernel/shmmax
$ echo $((18*1048576*1024)) > /proc/sys/kernel/shmall
$ for i in `seq 1 9000`; do ./hugetlbfs-test; done

On my particular machine, it usually triggers within 10 minutes but
enabling debug options can change the timing such that it never hits.
Once the bug is triggered, the machine is in trouble and needs to be
rebooted.  The machine will respond but processes accessing proc like "ps
aux" will hang due to the BUG_ON.  shutdown will a

[ 57/65] ARM: pxa: remove irq_to_gpio from ezx-pcap driver

2012-08-13 Thread Greg Kroah-Hartman
From: Greg KH 

3.4-stable review patch.  If anyone has any objections, please let me know.

--

From: Arnd Bergmann 

commit 59ee93a528b94ef4e81a08db252b0326feff171f upstream.

The irq_to_gpio function was removed from the pxa platform
in linux-3.2, and this driver has been broken since.

There is actually no in-tree user of this driver that adds
this platform device, but the driver can and does get enabled
on some platforms.

Without this patch, building ezx_defconfig results in:

drivers/mfd/ezx-pcap.c: In function 'pcap_isr_work':
drivers/mfd/ezx-pcap.c:205:2: error: implicit declaration of function 
'irq_to_gpio' [-Werror=implicit-function-declaration]

Signed-off-by: Arnd Bergmann 
Acked-by: Haojian Zhuang 
Cc: Samuel Ortiz 
Cc: Daniel Ribeiro 
Signed-off-by: Greg Kroah-Hartman 

---
 drivers/mfd/ezx-pcap.c   |2 +-
 include/linux/mfd/ezx-pcap.h |1 +
 2 files changed, 2 insertions(+), 1 deletion(-)

--- a/drivers/mfd/ezx-pcap.c
+++ b/drivers/mfd/ezx-pcap.c
@@ -202,7 +202,7 @@ static void pcap_isr_work(struct work_st
}
local_irq_enable();
ezx_pcap_write(pcap, PCAP_REG_MSR, pcap->msr);
-   } while (gpio_get_value(irq_to_gpio(pcap->spi->irq)));
+   } while (gpio_get_value(pdata->gpio));
 }
 
 static void pcap_irq_handler(unsigned int irq, struct irq_desc *desc)
--- a/include/linux/mfd/ezx-pcap.h
+++ b/include/linux/mfd/ezx-pcap.h
@@ -16,6 +16,7 @@ struct pcap_subdev {
 struct pcap_platform_data {
unsigned int irq_base;
unsigned int config;
+   int gpio;
void (*init) (void *);  /* board specific init */
int num_subdevs;
struct pcap_subdev *subdevs;


--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[ 56/65] ARM: dts: imx53-ard: add regulators for lan9220

2012-08-13 Thread Greg Kroah-Hartman
From: Greg KH 

3.4-stable review patch.  If anyone has any objections, please let me know.

--

From: Shawn Guo 

commit 1eec0c569523782392b5e6245effddb626213b8c upstream.

Since commit c7e963f (net/smsc911x: Add regulator support), the lan9220
device tree probe fails on imx53-ard board, because the commit makes
VDD33A and VDDVARIO supplies mandatory for the driver.

Add a fixed dummy 3V3 supplying lan9220 to fix the regression.

Signed-off-by: Shawn Guo 
Signed-off-by: Greg Kroah-Hartman 

---
 arch/arm/boot/dts/imx53-ard.dts |   20 
 1 file changed, 20 insertions(+)

--- a/arch/arm/boot/dts/imx53-ard.dts
+++ b/arch/arm/boot/dts/imx53-ard.dts
@@ -70,10 +70,30 @@
interrupt-parent = <&gpio2>;
interrupts = <31>;
reg-io-width = <4>;
+   /*
+* VDD33A and VDDVARIO of LAN9220 are supplied by
+* SW4_3V3 of LTC3589.  Before the regulator driver
+* for this PMIC is available, we use a fixed dummy
+* 3V3 regulator to get LAN9220 driver probing work.
+*/
+   vdd33a-supply = <®_3p3v>;
+   vddvario-supply = <®_3p3v>;
smsc,irq-push-pull;
};
};
 
+   regulators {
+   compatible = "simple-bus";
+
+   reg_3p3v: 3p3v {
+   compatible = "regulator-fixed";
+   regulator-name = "3P3V";
+   regulator-min-microvolt = <330>;
+   regulator-max-microvolt = <330>;
+   regulator-always-on;
+   };
+   };
+
gpio-keys {
compatible = "gpio-keys";
 


--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[ 55/65] ARM: mxs: Remove MMAP_MIN_ADDR setting from mxs_defconfig

2012-08-13 Thread Greg Kroah-Hartman
From: Greg KH 

3.4-stable review patch.  If anyone has any objections, please let me know.

--

From: Marek Vasut 

commit 3bed491c8d28329e34f8a31e3fe64d03f3a350f1 upstream.

The CONFIG_DEFAULT_MMAP_MIN_ADDR was set to 65536 in mxs_defconfig,
this caused severe breakage of userland applications since the upper
limit for ARM is 32768. By default CONFIG_DEFAULT_MMAP_MIN_ADDR is
set to 4096 and can also be changed via /proc/sys/vm/mmap_min_addr
if needed.

Quoting Russell King [1]:

"4096 is also fine for ARM too. There's not much point in having
defconfigs change it - that would just be pure noise in the config
files."

the CONFIG_DEFAULT_MMAP_MIN_ADDR can be removed from the defconfig
altogether.

This problem was introduced by commit cde7c41 (ARM: configs: add
defconfig for mach-mxs).

[1] http://marc.info/?l=linux-arm-kernel&m=134401593807820&w=2

Signed-off-by: Marek Vasut 
Cc: Russell King 
Cc: Wolfgang Denk 
Signed-off-by: Shawn Guo 
Signed-off-by: Greg Kroah-Hartman 

---
 arch/arm/configs/mxs_defconfig |1 -
 1 file changed, 1 deletion(-)

--- a/arch/arm/configs/mxs_defconfig
+++ b/arch/arm/configs/mxs_defconfig
@@ -32,7 +32,6 @@ CONFIG_NO_HZ=y
 CONFIG_HIGH_RES_TIMERS=y
 CONFIG_PREEMPT_VOLUNTARY=y
 CONFIG_AEABI=y
-CONFIG_DEFAULT_MMAP_MIN_ADDR=65536
 CONFIG_AUTO_ZRELADDR=y
 CONFIG_FPE_NWFPE=y
 CONFIG_NET=y


--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[ 54/65] target: Check number of unmap descriptors against our limit

2012-08-13 Thread Greg Kroah-Hartman
From: Greg KH 

3.4-stable review patch.  If anyone has any objections, please let me know.

--

From: Roland Dreier 

commit 7409a6657aebf8be74c21d0eded80709b27275cb upstream.

Fail UNMAP commands that have more than our reported limit on unmap
descriptors.

Signed-off-by: Roland Dreier 
Signed-off-by: Nicholas Bellinger 
[bwh: Backported to 3.2: adjust filename]
Signed-off-by: Ben Hutchings 
Signed-off-by: Greg Kroah-Hartman 
---
 drivers/target/target_core_cdb.c |5 +
 1 file changed, 5 insertions(+)

--- a/drivers/target/target_core_cdb.c
+++ b/drivers/target/target_core_cdb.c
@@ -1041,6 +1041,11 @@ int target_emulate_unmap(struct se_task
bd_dl = get_unaligned_be16(&buf[2]);
 
size = min(size - 8, bd_dl);
+   if (size / 16 > 
dev->se_sub_dev->se_dev_attrib.max_unmap_block_desc_count) {
+   cmd->scsi_sense_reason = TCM_INVALID_PARAMETER_LIST;
+   ret = -EINVAL;
+   goto err;
+   }
 
/* First UNMAP block descriptor starts at 8 byte offset */
ptr = &buf[8];


--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[ 61/65] iwlwifi: disable greenfield transmissions as a workaround

2012-08-13 Thread Greg Kroah-Hartman
From: Greg KH 

3.4-stable review patch.  If anyone has any objections, please let me know.

--

From: Johannes Berg 

commit 50e2a30cf6fcaeb2d27360ba614dd169a10041c5 upstream.

There's a bug that causes the rate scaling to get stuck
when it has to use single-stream rates with a peer that
can do GF and SGI; the two are incompatible so we can't
use them together, but that causes the algorithm to not
work at all, it always rejects updates.

Disable greenfield for now to prevent that problem.

Reviewed-by: Emmanuel Grumbach 
Tested-by: Cesar Eduardo Barros 
Signed-off-by: Johannes Berg 
Signed-off-by: John W. Linville 
Signed-off-by: Greg Kroah-Hartman 

---
 drivers/net/wireless/iwlwifi/iwl-agn-rs.c |   13 -
 1 file changed, 8 insertions(+), 5 deletions(-)

--- a/drivers/net/wireless/iwlwifi/iwl-agn-rs.c
+++ b/drivers/net/wireless/iwlwifi/iwl-agn-rs.c
@@ -709,11 +709,14 @@ static int rs_toggle_antenna(u32 valid_a
  */
 static bool rs_use_green(struct ieee80211_sta *sta)
 {
-   struct iwl_station_priv *sta_priv = (void *)sta->drv_priv;
-   struct iwl_rxon_context *ctx = sta_priv->ctx;
-
-   return (sta->ht_cap.cap & IEEE80211_HT_CAP_GRN_FLD) &&
-   !(ctx->ht.non_gf_sta_present);
+   /*
+* There's a bug somewhere in this code that causes the
+* scaling to get stuck because GF+SGI can't be combined
+* in SISO rates. Until we find that bug, disable GF, it
+* has only limited benefit and we still interoperate with
+* GF APs since we can always receive GF transmissions.
+*/
+   return false;
 }
 
 /**


--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[ 63/65] Input: eeti_ts: pass gpio value instead of IRQ

2012-08-13 Thread Greg Kroah-Hartman
From: Greg KH 

3.4-stable review patch.  If anyone has any objections, please let me know.

--

From: Arnd Bergmann 

commit 4eef6cbfcc03b294d9d334368a851b35b496ce53 upstream.

The EETI touchscreen asserts its IRQ line as soon as it has data in its
internal buffers. The line is automatically deasserted once all data has
been read via I2C. Hence, the driver has to monitor the GPIO line and
cannot simply rely on the interrupt handler reception.

In the current implementation of the driver, irq_to_gpio() is used to
determine the GPIO number from the i2c_client's IRQ value.

As irq_to_gpio() is not available on all platforms, this patch changes
this and makes the driver ignore the passed in IRQ. Instead, a GPIO is
added to the platform_data struct and gpio_to_irq is used to derive the
IRQ from that GPIO. If this fails, bail out. The driver is only able to
work in environments where the touchscreen GPIO can be mapped to an
IRQ.

Without this patch, building raumfeld_defconfig results in:

drivers/input/touchscreen/eeti_ts.c: In function 'eeti_ts_irq_active':
drivers/input/touchscreen/eeti_ts.c:65:2: error: implicit declaration of 
function 'irq_to_gpio' [-Werror=implicit-function-declaration]

Signed-off-by: Daniel Mack 
Signed-off-by: Arnd Bergmann 
Cc: Dmitry Torokhov 
Cc: Sven Neumann 
Cc: linux-in...@vger.kernel.org
Cc: Haojian Zhuang 
Signed-off-by: Greg Kroah-Hartman 

---
 arch/arm/mach-pxa/raumfeld.c|2 +-
 drivers/input/touchscreen/eeti_ts.c |   21 +
 include/linux/input/eeti_ts.h   |1 +
 3 files changed, 15 insertions(+), 9 deletions(-)

--- a/arch/arm/mach-pxa/raumfeld.c
+++ b/arch/arm/mach-pxa/raumfeld.c
@@ -953,12 +953,12 @@ static struct i2c_board_info raumfeld_co
 
 static struct eeti_ts_platform_data eeti_ts_pdata = {
.irq_active_high = 1,
+   .irq_gpio = GPIO_TOUCH_IRQ,
 };
 
 static struct i2c_board_info raumfeld_controller_i2c_board_info __initdata = {
.type   = "eeti_ts",
.addr   = 0x0a,
-   .irq= PXA_GPIO_TO_IRQ(GPIO_TOUCH_IRQ),
.platform_data = &eeti_ts_pdata,
 };
 
--- a/drivers/input/touchscreen/eeti_ts.c
+++ b/drivers/input/touchscreen/eeti_ts.c
@@ -48,7 +48,7 @@ struct eeti_ts_priv {
struct input_dev *input;
struct work_struct work;
struct mutex mutex;
-   int irq, irq_active_high;
+   int irq_gpio, irq, irq_active_high;
 };
 
 #define EETI_TS_BITDEPTH   (11)
@@ -62,7 +62,7 @@ struct eeti_ts_priv {
 
 static inline int eeti_ts_irq_active(struct eeti_ts_priv *priv)
 {
-   return gpio_get_value(irq_to_gpio(priv->irq)) == priv->irq_active_high;
+   return gpio_get_value(priv->irq_gpio) == priv->irq_active_high;
 }
 
 static void eeti_ts_read(struct work_struct *work)
@@ -157,7 +157,7 @@ static void eeti_ts_close(struct input_d
 static int __devinit eeti_ts_probe(struct i2c_client *client,
   const struct i2c_device_id *idp)
 {
-   struct eeti_ts_platform_data *pdata;
+   struct eeti_ts_platform_data *pdata = client->dev.platform_data;
struct eeti_ts_priv *priv;
struct input_dev *input;
unsigned int irq_flags;
@@ -199,9 +199,12 @@ static int __devinit eeti_ts_probe(struc
 
priv->client = client;
priv->input = input;
-   priv->irq = client->irq;
+   priv->irq_gpio = pdata->irq_gpio;
+   priv->irq = gpio_to_irq(pdata->irq_gpio);
 
-   pdata = client->dev.platform_data;
+   err = gpio_request_one(pdata->irq_gpio, GPIOF_IN, client->name);
+   if (err < 0)
+   goto err1;
 
if (pdata)
priv->irq_active_high = pdata->irq_active_high;
@@ -215,13 +218,13 @@ static int __devinit eeti_ts_probe(struc
 
err = input_register_device(input);
if (err)
-   goto err1;
+   goto err2;
 
err = request_irq(priv->irq, eeti_ts_isr, irq_flags,
  client->name, priv);
if (err) {
dev_err(&client->dev, "Unable to request touchscreen IRQ.\n");
-   goto err2;
+   goto err3;
}
 
/*
@@ -233,9 +236,11 @@ static int __devinit eeti_ts_probe(struc
device_init_wakeup(&client->dev, 0);
return 0;
 
-err2:
+err3:
input_unregister_device(input);
input = NULL; /* so we dont try to free it below */
+err2:
+   gpio_free(pdata->irq_gpio);
 err1:
input_free_device(input);
kfree(priv);
--- a/include/linux/input/eeti_ts.h
+++ b/include/linux/input/eeti_ts.h
@@ -2,6 +2,7 @@
 #define LINUX_INPUT_EETI_TS_H
 
 struct eeti_ts_platform_data {
+   int irq_gpio;
unsigned int irq_active_high;
 };
 


--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[ 62/65] e1000e: NIC goes up and immediately goes down

2012-08-13 Thread Greg Kroah-Hartman
From: Greg KH 

3.4-stable review patch.  If anyone has any objections, please let me know.

--

From: Tushar Dave 

commit b7ec70be01a87f2c85df3ae11046e74f9b67e323 upstream.

Found that commit d478eb44 was a bad commit.
If the link partner is transmitting codeword (even if NULL codeword),
then the RXCW.C bit will be set so check for RXCW.CW is unnecessary.
Ref: RH BZ 840642

Reported-by: Fabio Futigami 
Signed-off-by: Tushar Dave 
CC: Marcelo Ricardo Leitner 
Tested-by: Aaron Brown 
Signed-off-by: Peter P Waskiewicz Jr 
Signed-off-by: Greg Kroah-Hartman 

---
 drivers/net/ethernet/intel/e1000e/82571.c |4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

--- a/drivers/net/ethernet/intel/e1000e/82571.c
+++ b/drivers/net/ethernet/intel/e1000e/82571.c
@@ -1582,10 +1582,8 @@ static s32 e1000_check_for_serdes_link_8
 * auto-negotiation in the TXCW register and disable
 * forced link in the Device Control register in an
 * attempt to auto-negotiate with our link partner.
-* If the partner code word is null, stop forcing
-* and restart auto negotiation.
 */
-   if ((rxcw & E1000_RXCW_C) || !(rxcw & E1000_RXCW_CW))  {
+   if (rxcw & E1000_RXCW_C) {
/* Enable autoneg, and unforce link up */
ew32(TXCW, mac->txcw);
ew32(CTRL, (ctrl & ~E1000_CTRL_SLU));


--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[ 64/65] Input: wacom - Bamboo One 1024 pressure fix

2012-08-13 Thread Greg Kroah-Hartman
From: Greg KH 

3.4-stable review patch.  If anyone has any objections, please let me know.

--

From: Chris Bagwell 

commit 6dc463511d4a690f01a9248df3b384db717e0b1c upstream.

Bamboo One's with ID of 0x6a and 0x6b were added with correct
indication of 1024 pressure levels but the Graphire packet routine
was only looking at 9 bits.  Increased to 10 bits.

This bug caused these devices to roll over to zero pressure at half
way mark.

The other devices using this routine only support 256 or 512 range
and look to fix unused bits at zero.

Signed-off-by: Chris Bagwell 
Reported-by: Tushant Mirchandani 
Reviewed-by: Ping Cheng 
Signed-off-by: Dmitry Torokhov 
Signed-off-by: Greg Kroah-Hartman 

---
 drivers/input/tablet/wacom_wac.c |2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

--- a/drivers/input/tablet/wacom_wac.c
+++ b/drivers/input/tablet/wacom_wac.c
@@ -243,7 +243,7 @@ static int wacom_graphire_irq(struct wac
input_report_abs(input, ABS_X, le16_to_cpup((__le16 
*)&data[2]));
input_report_abs(input, ABS_Y, le16_to_cpup((__le16 
*)&data[4]));
if (wacom->tool[0] != BTN_TOOL_MOUSE) {
-   input_report_abs(input, ABS_PRESSURE, data[6] | 
((data[7] & 0x01) << 8));
+   input_report_abs(input, ABS_PRESSURE, data[6] | 
((data[7] & 0x03) << 8));
input_report_key(input, BTN_TOUCH, data[1] & 0x01);
input_report_key(input, BTN_STYLUS, data[1] & 0x02);
input_report_key(input, BTN_STYLUS2, data[1] & 0x04);


--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[ 59/65] cfg80211: fix interface combinations check for ADHOC(IBSS)

2012-08-13 Thread Greg Kroah-Hartman
From: Greg KH 

3.4-stable review patch.  If anyone has any objections, please let me know.

--


From: Liang Li 

partial of commit 8e8b41f9d8c8e63fc92f899ace8da91a490ac573 upstream.

As part of commit 463454b5dbd8 ("cfg80211: fix interface
combinations check"), this extra check was introduced:

   if ((all_iftypes & used_iftypes) != used_iftypes)
   goto cont;

However, most wireless NIC drivers did not advertise ADHOC in
wiphy.iface_combinations[i].limits[] and hence we'll get -EBUSY
when we bring up a ADHOC wlan with commands similar to:

 # iwconfig wlan0 mode ad-hoc && ifconfig wlan0 up

In commit 8e8b41f9d8c8e ("cfg80211: enforce lack of interface
combinations"), the change below fixes the issue:

   if (total == 1)
   return 0;

But it also introduces other dependencies for stable. For example,
a full cherry pick of 8e8b41f9d8c8e would introduce additional
regressions unless we also start cherry picking driver specific
fixes like the following:

  9b4760e  ath5k: add possible wiphy interface combinations
  1ae2fc2  mac80211_hwsim: advertise interface combinations
  20c8e8d  ath9k: add possible wiphy interface combinations

And the purpose of the 'if (total == 1)' is to cover the specific
use case (IBSS, adhoc) that was mentioned above. So we just pick
the specific part out from 8e8b41f9d8c8e here.

Doing so gives stable kernels a way to fix the change introduced
by 463454b5dbd8, without having to make cherry picks specific to
various NIC drivers.

Signed-off-by: Liang Li 
Signed-off-by: Paul Gortmaker 
Signed-off-by: Greg Kroah-Hartman 

---
 net/wireless/util.c |3 +++
 1 file changed, 3 insertions(+)

--- a/net/wireless/util.c
+++ b/net/wireless/util.c
@@ -974,6 +974,9 @@ int cfg80211_can_change_interface(struct
}
mutex_unlock(&rdev->devlist_mtx);
 
+   if (total == 1)
+   return 0;
+
for (i = 0; i < rdev->wiphy.n_iface_combinations; i++) {
const struct ieee80211_iface_combination *c;
struct ieee80211_iface_limit *limits;


--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[ 65/65] rt61pci: fix NULL pointer dereference in config_lna_gain

2012-08-13 Thread Greg Kroah-Hartman
From: Greg KH 

3.4-stable review patch.  If anyone has any objections, please let me know.

--

From: Stanislaw Gruszka 

commit deee0214def5d8a32b8112f11d9c2b1696e9c0cb upstream.

We can not pass NULL libconf->conf->channel to rt61pci_config() as it
is dereferenced unconditionally in rt61pci_config_lna_gain() subroutine.

Resolves:
https://bugzilla.kernel.org/show_bug.cgi?id=44361

Reported-and-tested-by: 
Signed-off-by: Stanislaw Gruszka 
Signed-off-by: John W. Linville 
Signed-off-by: Greg Kroah-Hartman 

---
 drivers/net/wireless/rt2x00/rt61pci.c |3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

--- a/drivers/net/wireless/rt2x00/rt61pci.c
+++ b/drivers/net/wireless/rt2x00/rt61pci.c
@@ -2243,8 +2243,7 @@ static void rt61pci_txdone(struct rt2x00
 
 static void rt61pci_wakeup(struct rt2x00_dev *rt2x00dev)
 {
-   struct ieee80211_conf conf = { .flags = 0 };
-   struct rt2x00lib_conf libconf = { .conf = &conf };
+   struct rt2x00lib_conf libconf = { .conf = &rt2x00dev->hw->conf };
 
rt61pci_config(rt2x00dev, &libconf, IEEE80211_CONF_CHANGE_PS);
 }


--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[ 42/65] random: Add comment to random_initialize()

2012-08-13 Thread Greg Kroah-Hartman
From: Greg KH 

3.4-stable review patch.  If anyone has any objections, please let me know.

--

From: Tony Luck 

commit cbc96b7594b5691d61eba2db8b2ea723645be9ca upstream.

Many platforms have per-machine instance data (serial numbers,
asset tags, etc.) squirreled away in areas that are accessed
during early system bringup. Mixing this data into the random
pools has a very high value in providing better random data,
so we should allow (and even encourage) architecture code to
call add_device_randomness() from the setup_arch() paths.

However, this limits our options for internal structure of
the random driver since random_initialize() is not called
until long after setup_arch().

Add a big fat comment to rand_initialize() spelling out
this requirement.

Suggested-by: Theodore Ts'o 
Signed-off-by: Tony Luck 
Signed-off-by: Theodore Ts'o 
Signed-off-by: Greg Kroah-Hartman 

---
 drivers/char/random.c |   10 ++
 1 file changed, 10 insertions(+)

--- a/drivers/char/random.c
+++ b/drivers/char/random.c
@@ -1087,6 +1087,16 @@ static void init_std_data(struct entropy
mix_pool_bytes(r, utsname(), sizeof(*(utsname())), NULL);
 }
 
+/*
+ * Note that setup_arch() may call add_device_randomness()
+ * long before we get here. This allows seeding of the pools
+ * with some platform dependent data very early in the boot
+ * process. But it limits our options here. We must use
+ * statically allocated structures that already have all
+ * initializations complete at compile time. We should also
+ * take care not to overwrite the precious per platform data
+ * we were given.
+ */
 static int rand_initialize(void)
 {
init_std_data(&input_pool);


--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[ 33/65] usb: feed USB device information to the /dev/random driver

2012-08-13 Thread Greg Kroah-Hartman
From: Greg KH 

3.4-stable review patch.  If anyone has any objections, please let me know.

--

From: Theodore Ts'o 

commit b04b3156a20d395a7faa8eed98698d1e17a36000 upstream.

Send the USB device's serial, product, and manufacturer strings to the
/dev/random driver to help seed its pools.

Cc: Linus Torvalds 
Acked-by: Greg KH 
Signed-off-by: "Theodore Ts'o" 
Signed-off-by: Greg Kroah-Hartman 

---
 drivers/usb/core/hub.c |9 +
 1 file changed, 9 insertions(+)

--- a/drivers/usb/core/hub.c
+++ b/drivers/usb/core/hub.c
@@ -24,6 +24,7 @@
 #include 
 #include 
 #include 
+#include 
 
 #include 
 #include 
@@ -1951,6 +1952,14 @@ int usb_new_device(struct usb_device *ud
/* Tell the world! */
announce_device(udev);
 
+   if (udev->serial)
+   add_device_randomness(udev->serial, strlen(udev->serial));
+   if (udev->product)
+   add_device_randomness(udev->product, strlen(udev->product));
+   if (udev->manufacturer)
+   add_device_randomness(udev->manufacturer,
+ strlen(udev->manufacturer));
+
device_enable_async_suspend(&udev->dev);
 
/*


--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[ 30/65] random: make add_interrupt_randomness() do something sane

2012-08-13 Thread Greg Kroah-Hartman
From: Greg KH 

3.4-stable review patch.  If anyone has any objections, please let me know.

--

From: Theodore Ts'o 

commit 775f4b297b780601e61787b766f306ed3e1d23eb upstream.

We've been moving away from add_interrupt_randomness() for various
reasons: it's too expensive to do on every interrupt, and flooding the
CPU with interrupts could theoretically cause bogus floods of entropy
from a somewhat externally controllable source.

This solves both problems by limiting the actual randomness addition
to just once a second or after 64 interrupts, whicever comes first.
During that time, the interrupt cycle data is buffered up in a per-cpu
pool.  Also, we make sure the the nonblocking pool used by urandom is
initialized before we start feeding the normal input pool.  This
assures that /dev/urandom is returning unpredictable data as soon as
possible.

(Based on an original patch by Linus, but significantly modified by
tytso.)

Tested-by: Eric Wustrow 
Reported-by: Eric Wustrow 
Reported-by: Nadia Heninger 
Reported-by: Zakir Durumeric 
Reported-by: J. Alex Halderman 
Signed-off-by: Linus Torvalds 
Signed-off-by: "Theodore Ts'o" 
Signed-off-by: Greg Kroah-Hartman 

---
 drivers/char/random.c |  103 ++
 drivers/mfd/ab3100-core.c |2 
 include/linux/random.h|2 
 kernel/irq/handle.c   |7 +--
 4 files changed, 90 insertions(+), 24 deletions(-)

--- a/drivers/char/random.c
+++ b/drivers/char/random.c
@@ -127,19 +127,15 @@
  *
  * void add_input_randomness(unsigned int type, unsigned int code,
  *unsigned int value);
- * void add_interrupt_randomness(int irq);
+ * void add_interrupt_randomness(int irq, int irq_flags);
  * void add_disk_randomness(struct gendisk *disk);
  *
  * add_input_randomness() uses the input layer interrupt timing, as well as
  * the event type information from the hardware.
  *
- * add_interrupt_randomness() uses the inter-interrupt timing as random
- * inputs to the entropy pool.  Note that not all interrupts are good
- * sources of randomness!  For example, the timer interrupts is not a
- * good choice, because the periodicity of the interrupts is too
- * regular, and hence predictable to an attacker.  Network Interface
- * Controller interrupts are a better measure, since the timing of the
- * NIC interrupts are more unpredictable.
+ * add_interrupt_randomness() uses the interrupt timing as random
+ * inputs to the entropy pool. Using the cycle counters and the irq source
+ * as inputs, it feeds the randomness roughly once a second.
  *
  * add_disk_randomness() uses what amounts to the seek time of block
  * layer request events, on a per-disk_devt basis, as input to the
@@ -248,6 +244,7 @@
 #include 
 #include 
 #include 
+#include 
 
 #ifdef CONFIG_GENERIC_HARDIRQS
 # include 
@@ -256,6 +253,7 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 
 /*
@@ -421,7 +419,9 @@ struct entropy_store {
spinlock_t lock;
unsigned add_ptr;
int entropy_count;
+   int entropy_total;
int input_rotate;
+   unsigned int initialized:1;
__u8 last_data[EXTRACT_SIZE];
 };
 
@@ -454,6 +454,10 @@ static struct entropy_store nonblocking_
.pool = nonblocking_pool_data
 };
 
+static __u32 const twist_table[8] = {
+   0x, 0x3b6e20c8, 0x76dc4190, 0x4db26158,
+   0xedb88320, 0xd6d6a3e8, 0x9b64c2b0, 0xa00ae278 };
+
 /*
  * This function adds bytes into the entropy "pool".  It does not
  * update the entropy estimate.  The caller should call
@@ -467,9 +471,6 @@ static struct entropy_store nonblocking_
 static void mix_pool_bytes_extract(struct entropy_store *r, const void *in,
   int nbytes, __u8 out[64])
 {
-   static __u32 const twist_table[8] = {
-   0x, 0x3b6e20c8, 0x76dc4190, 0x4db26158,
-   0xedb88320, 0xd6d6a3e8, 0x9b64c2b0, 0xa00ae278 };
unsigned long i, j, tap1, tap2, tap3, tap4, tap5;
int input_rotate;
int wordmask = r->poolinfo->poolwords - 1;
@@ -528,6 +529,36 @@ static void mix_pool_bytes(struct entrop
mix_pool_bytes_extract(r, in, bytes, NULL);
 }
 
+struct fast_pool {
+   __u32   pool[4];
+   unsigned long   last;
+   unsigned short  count;
+   unsigned char   rotate;
+   unsigned char   last_timer_intr;
+};
+
+/*
+ * This is a fast mixing routine used by the interrupt randomness
+ * collector.  It's hardcoded for an 128 bit pool and assumes that any
+ * locks that might be needed are taken by the caller.
+ */
+static void fast_mix(struct fast_pool *f, const void *in, int nbytes)
+{
+   const char  *bytes = in;
+   __u32   w;
+   unsignedi = f->count;
+   unsignedinput_rotate = f->rotate;
+
+   while (nbytes--) {
+   w = rol32(*bytes++, input_rotate & 31) ^ f->pool[i & 3] ^
+   f->pool[(i + 1) & 3

[ 26/65] mac80211: cancel mesh path timer

2012-08-13 Thread Greg Kroah-Hartman
From: Greg KH 

3.4-stable review patch.  If anyone has any objections, please let me know.

--

From: Johannes Berg 

commit dd4c9260e7f23f2e951cbfb2726e468c6d30306c upstream.

The mesh path timer needs to be canceled when
leaving the mesh as otherwise it could fire
after the interface has been removed already.

Signed-off-by: Johannes Berg 
Signed-off-by: Greg Kroah-Hartman 

---
 net/mac80211/mesh.c |1 +
 1 file changed, 1 insertion(+)

--- a/net/mac80211/mesh.c
+++ b/net/mac80211/mesh.c
@@ -595,6 +595,7 @@ void ieee80211_stop_mesh(struct ieee8021
 
del_timer_sync(&sdata->u.mesh.housekeeping_timer);
del_timer_sync(&sdata->u.mesh.mesh_path_root_timer);
+   del_timer_sync(&sdata->u.mesh.mesh_path_timer);
/*
 * If the timer fired while we waited for it, it will have
 * requeued the work. Now the work will be running again


--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[ 23/65] video/smscufx: fix line counting in fb_write

2012-08-13 Thread Greg Kroah-Hartman
From: Greg KH 

3.4-stable review patch.  If anyone has any objections, please let me know.

--

From: Alexander Holler 

commit 2fe2d9f47cfe1a3e66e7d087368b3d7155b04c15 upstream.

Line 0 and 1 were both written to line 0 (on the display) and all subsequent
lines had an offset of -1. The result was that the last line on the display
was never overwritten by writes to /dev/fbN.

The origin of this bug seems to have been udlfb.

Signed-off-by: Alexander Holler 
Signed-off-by: Florian Tobias Schandinat 
Signed-off-by: Greg Kroah-Hartman 

---
 drivers/video/smscufx.c |2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

--- a/drivers/video/smscufx.c
+++ b/drivers/video/smscufx.c
@@ -904,7 +904,7 @@ static ssize_t ufx_ops_write(struct fb_i
result = fb_sys_write(info, buf, count, ppos);
 
if (result > 0) {
-   int start = max((int)(offset / info->fix.line_length) - 1, 0);
+   int start = max((int)(offset / info->fix.line_length), 0);
int lines = min((u32)((result / info->fix.line_length) + 1),
(u32)info->var.yres);
 


--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[ 08/65] mm: fix wrong argument of migrate_huge_pages() in soft_offline_huge_page()

2012-08-13 Thread Greg Kroah-Hartman
From: Greg KH 

3.4-stable review patch.  If anyone has any objections, please let me know.

--

From: Joonsoo Kim 

commit dc32f63453f56d07a1073a697dcd843dd3098c09 upstream.

Commit a6bc32b89922 ("mm: compaction: introduce sync-light migration for
use by compaction") changed the declaration of migrate_pages() and
migrate_huge_pages().

But it missed changing the argument of migrate_huge_pages() in
soft_offline_huge_page().  In this case, we should call
migrate_huge_pages() with MIGRATE_SYNC.

Additionally, there is a mismatch between type the of argument and the
function declaration for migrate_pages().

Signed-off-by: Joonsoo Kim 
Cc: Christoph Lameter 
Cc: Mel Gorman 
Acked-by: David Rientjes 
Cc: "Aneesh Kumar K.V" 
Signed-off-by: Andrew Morton 
Signed-off-by: Linus Torvalds 
Signed-off-by: Greg Kroah-Hartman 

---
 mm/memory-failure.c |6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

--- a/mm/memory-failure.c
+++ b/mm/memory-failure.c
@@ -1433,8 +1433,8 @@ static int soft_offline_huge_page(struct
/* Keep page count to indicate a given hugepage is isolated. */
 
list_add(&hpage->lru, &pagelist);
-   ret = migrate_huge_pages(&pagelist, new_page, MPOL_MF_MOVE_ALL, 0,
-   true);
+   ret = migrate_huge_pages(&pagelist, new_page, MPOL_MF_MOVE_ALL, false,
+   MIGRATE_SYNC);
if (ret) {
struct page *page1, *page2;
list_for_each_entry_safe(page1, page2, &pagelist, lru)
@@ -1563,7 +1563,7 @@ int soft_offline_page(struct page *page,
page_is_file_cache(page));
list_add(&page->lru, &pagelist);
ret = migrate_pages(&pagelist, new_page, MPOL_MF_MOVE_ALL,
-   0, MIGRATE_SYNC);
+   false, MIGRATE_SYNC);
if (ret) {
putback_lru_pages(&pagelist);
pr_info("soft offline: %#lx: migration failed %d, type 
%lx\n",


--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[ 12/44] mac80211: cancel mesh path timer

2012-08-13 Thread Greg Kroah-Hartman
From: Greg KH 

3.0-stable review patch.  If anyone has any objections, please let me know.

--

From: Johannes Berg 

commit dd4c9260e7f23f2e951cbfb2726e468c6d30306c upstream.

The mesh path timer needs to be canceled when
leaving the mesh as otherwise it could fire
after the interface has been removed already.

Signed-off-by: Johannes Berg 
Signed-off-by: Greg Kroah-Hartman 

---
 net/mac80211/mesh.c |1 +
 1 file changed, 1 insertion(+)

--- a/net/mac80211/mesh.c
+++ b/net/mac80211/mesh.c
@@ -490,6 +490,7 @@ void ieee80211_stop_mesh(struct ieee8021
 
del_timer_sync(&sdata->u.mesh.housekeeping_timer);
del_timer_sync(&sdata->u.mesh.mesh_path_root_timer);
+   del_timer_sync(&sdata->u.mesh.mesh_path_timer);
/*
 * If the timer fired while we waited for it, it will have
 * requeued the work. Now the work will be running again


--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[ 09/44] ARM: 7479/1: mm: avoid NULL dereference when flushing gate_vma with VIVT caches

2012-08-13 Thread Greg Kroah-Hartman
From: Greg KH 

3.0-stable review patch.  If anyone has any objections, please let me know.

--

From: Will Deacon 

commit b74253f78400f9a4b42da84bb1de7540b88ce7c4 upstream.

The vivt_flush_cache_{range,page} functions check that the mm_struct
of the VMA being flushed has been active on the current CPU before
performing the cache maintenance.

The gate_vma has a NULL mm_struct pointer and, as such, will cause a
kernel fault if we try to flush it with the above operations. This
happens during ELF core dumps, which include the gate_vma as it may be
useful for debugging purposes.

This patch adds checks to the VIVT cache flushing functions so that VMAs
with a NULL mm_struct are flushed unconditionally (the vectors page may
be dirty if we use it to store the current TLS pointer).

Reported-by: Gilles Chanteperdrix 
Tested-by: Uros Bizjak 
Signed-off-by: Will Deacon 
Signed-off-by: Russell King 
Signed-off-by: Greg Kroah-Hartman 

---
 arch/arm/include/asm/cacheflush.h |8 ++--
 1 file changed, 6 insertions(+), 2 deletions(-)

--- a/arch/arm/include/asm/cacheflush.h
+++ b/arch/arm/include/asm/cacheflush.h
@@ -215,7 +215,9 @@ static inline void vivt_flush_cache_mm(s
 static inline void
 vivt_flush_cache_range(struct vm_area_struct *vma, unsigned long start, 
unsigned long end)
 {
-   if (cpumask_test_cpu(smp_processor_id(), mm_cpumask(vma->vm_mm)))
+   struct mm_struct *mm = vma->vm_mm;
+
+   if (!mm || cpumask_test_cpu(smp_processor_id(), mm_cpumask(mm)))
__cpuc_flush_user_range(start & PAGE_MASK, PAGE_ALIGN(end),
vma->vm_flags);
 }
@@ -223,7 +225,9 @@ vivt_flush_cache_range(struct vm_area_st
 static inline void
 vivt_flush_cache_page(struct vm_area_struct *vma, unsigned long user_addr, 
unsigned long pfn)
 {
-   if (cpumask_test_cpu(smp_processor_id(), mm_cpumask(vma->vm_mm))) {
+   struct mm_struct *mm = vma->vm_mm;
+
+   if (!mm || cpumask_test_cpu(smp_processor_id(), mm_cpumask(mm))) {
unsigned long addr = user_addr & PAGE_MASK;
__cpuc_flush_user_range(addr, addr + PAGE_SIZE, vma->vm_flags);
}


--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[ 15/44] fix typo/thinko in get_random_bytes()

2012-08-13 Thread Greg Kroah-Hartman
From: Greg KH 

3.0-stable review patch.  If anyone has any objections, please let me know.

--

From: "Luck, Tony" 

commit bd29e568a4cb6465f6e5ec7c1c1f3ae7d99cbec1 upstream.

If there is an architecture-specific random number generator we use it
to acquire randomness one "long" at a time.  We should put these random
words into consecutive words in the result buffer - not just overwrite
the first word again and again.

Signed-off-by: Tony Luck 
Acked-by: H. Peter Anvin 
Acked-by: Thomas Gleixner 
Signed-off-by: Linus Torvalds 
Signed-off-by: Greg Kroah-Hartman 

---
 drivers/char/random.c |2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

--- a/drivers/char/random.c
+++ b/drivers/char/random.c
@@ -941,7 +941,7 @@ void get_random_bytes(void *buf, int nby
if (!arch_get_random_long(&v))
break;
 
-   memcpy(buf, &v, chunk);
+   memcpy(p, &v, chunk);
p += chunk;
nbytes -= chunk;
}


--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[ 14/44] random: Add support for architectural random hooks

2012-08-13 Thread Greg Kroah-Hartman
From: Greg KH 

3.0-stable review patch.  If anyone has any objections, please let me know.

--

From: "H. Peter Anvin" 

commit 63d77173266c1791f1553e9e8ccea65dc87c4485 upstream.

Add support for architecture-specific hooks into the kernel-directed
random number generator interfaces.  This patchset does not use the
architecture random number generator interfaces for the
userspace-directed interfaces (/dev/random and /dev/urandom), thus
eliminating the need to distinguish between them based on a pool
pointer.

Changes in version 3:
- Moved the hooks from extract_entropy() to get_random_bytes().
- Changes the hooks to inlines.

Signed-off-by: H. Peter Anvin 
Cc: Fenghua Yu 
Cc: Matt Mackall 
Cc: Herbert Xu 
Cc: "Theodore Ts'o" 
Signed-off-by: Greg Kroah-Hartman 

---
 drivers/char/random.c  |   23 +--
 include/linux/random.h |   13 +
 2 files changed, 34 insertions(+), 2 deletions(-)

--- a/drivers/char/random.c
+++ b/drivers/char/random.c
@@ -932,7 +932,21 @@ static ssize_t extract_entropy_user(stru
  */
 void get_random_bytes(void *buf, int nbytes)
 {
-   extract_entropy(&nonblocking_pool, buf, nbytes, 0, 0);
+   char *p = buf;
+
+   while (nbytes) {
+   unsigned long v;
+   int chunk = min(nbytes, (int)sizeof(unsigned long));
+
+   if (!arch_get_random_long(&v))
+   break;
+
+   memcpy(buf, &v, chunk);
+   p += chunk;
+   nbytes -= chunk;
+   }
+
+   extract_entropy(&nonblocking_pool, p, nbytes, 0, 0);
 }
 EXPORT_SYMBOL(get_random_bytes);
 
@@ -1318,9 +1332,14 @@ late_initcall(random_int_secret_init);
 DEFINE_PER_CPU(__u32 [MD5_DIGEST_WORDS], get_random_int_hash);
 unsigned int get_random_int(void)
 {
-   __u32 *hash = get_cpu_var(get_random_int_hash);
+   __u32 *hash;
unsigned int ret;
 
+   if (arch_get_random_int(&ret))
+   return ret;
+
+   hash = get_cpu_var(get_random_int_hash);
+
hash[0] += current->pid + jiffies + get_cycles();
md5_transform(hash, random_int_secret);
ret = hash[0];
--- a/include/linux/random.h
+++ b/include/linux/random.h
@@ -91,6 +91,19 @@ static inline void prandom32_seed(struct
state->s3 = __seed(i, 15);
 }
 
+#ifdef CONFIG_ARCH_RANDOM
+# include 
+#else
+static inline int arch_get_random_long(unsigned long *v)
+{
+   return 0;
+}
+static inline int arch_get_random_int(unsigned int *v)
+{
+   return 0;
+}
+#endif
+
 #endif /* __KERNEL___ */
 
 #endif /* _LINUX_RANDOM_H */


--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[ 13/44] x86, nops: Missing break resulting in incorrect selection on Intel

2012-08-13 Thread Greg Kroah-Hartman
From: Greg KH 

3.0-stable review patch.  If anyone has any objections, please let me know.

--

From: Alan Cox 

commit d6250a3f12edb3a86db9598ffeca3de8b4a219e9 upstream.

The Intel case falls through into the generic case which then changes
the values.  For cases like the P6 it doesn't do the right thing so
this seems to be a screwup.

Signed-off-by: Alan Cox 
Link: http://lkml.kernel.org/n/tip-lww2uirad4skzjlmrm0vr...@git.kernel.org
Signed-off-by: H. Peter Anvin 
Signed-off-by: Greg Kroah-Hartman 

---
 arch/x86/kernel/alternative.c |2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

--- a/arch/x86/kernel/alternative.c
+++ b/arch/x86/kernel/alternative.c
@@ -220,7 +220,7 @@ void __init arch_init_ideal_nops(void)
ideal_nops = intel_nops;
 #endif
}
-
+   break;
default:
 #ifdef CONFIG_X86_64
ideal_nops = k8_nops;


--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[ 20/44] random: make add_interrupt_randomness() do something sane

2012-08-13 Thread Greg Kroah-Hartman
From: Greg KH 

3.0-stable review patch.  If anyone has any objections, please let me know.

--

From: Theodore Ts'o 

commit 775f4b297b780601e61787b766f306ed3e1d23eb upstream.

We've been moving away from add_interrupt_randomness() for various
reasons: it's too expensive to do on every interrupt, and flooding the
CPU with interrupts could theoretically cause bogus floods of entropy
from a somewhat externally controllable source.

This solves both problems by limiting the actual randomness addition
to just once a second or after 64 interrupts, whicever comes first.
During that time, the interrupt cycle data is buffered up in a per-cpu
pool.  Also, we make sure the the nonblocking pool used by urandom is
initialized before we start feeding the normal input pool.  This
assures that /dev/urandom is returning unpredictable data as soon as
possible.

(Based on an original patch by Linus, but significantly modified by
tytso.)

Tested-by: Eric Wustrow 
Reported-by: Eric Wustrow 
Reported-by: Nadia Heninger 
Reported-by: Zakir Durumeric 
Reported-by: J. Alex Halderman 
Signed-off-by: Linus Torvalds 
Signed-off-by: "Theodore Ts'o" 
Signed-off-by: Greg Kroah-Hartman 

---
 drivers/char/random.c |  103 ++
 drivers/mfd/ab3100-core.c |2 
 include/linux/random.h|2 
 kernel/irq/handle.c   |7 +--
 4 files changed, 90 insertions(+), 24 deletions(-)

--- a/drivers/char/random.c
+++ b/drivers/char/random.c
@@ -127,19 +127,15 @@
  *
  * void add_input_randomness(unsigned int type, unsigned int code,
  *unsigned int value);
- * void add_interrupt_randomness(int irq);
+ * void add_interrupt_randomness(int irq, int irq_flags);
  * void add_disk_randomness(struct gendisk *disk);
  *
  * add_input_randomness() uses the input layer interrupt timing, as well as
  * the event type information from the hardware.
  *
- * add_interrupt_randomness() uses the inter-interrupt timing as random
- * inputs to the entropy pool.  Note that not all interrupts are good
- * sources of randomness!  For example, the timer interrupts is not a
- * good choice, because the periodicity of the interrupts is too
- * regular, and hence predictable to an attacker.  Network Interface
- * Controller interrupts are a better measure, since the timing of the
- * NIC interrupts are more unpredictable.
+ * add_interrupt_randomness() uses the interrupt timing as random
+ * inputs to the entropy pool. Using the cycle counters and the irq source
+ * as inputs, it feeds the randomness roughly once a second.
  *
  * add_disk_randomness() uses what amounts to the seek time of block
  * layer request events, on a per-disk_devt basis, as input to the
@@ -248,6 +244,7 @@
 #include 
 #include 
 #include 
+#include 
 
 #ifdef CONFIG_GENERIC_HARDIRQS
 # include 
@@ -256,6 +253,7 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 
 /*
@@ -421,7 +419,9 @@ struct entropy_store {
spinlock_t lock;
unsigned add_ptr;
int entropy_count;
+   int entropy_total;
int input_rotate;
+   unsigned int initialized:1;
__u8 last_data[EXTRACT_SIZE];
 };
 
@@ -454,6 +454,10 @@ static struct entropy_store nonblocking_
.pool = nonblocking_pool_data
 };
 
+static __u32 const twist_table[8] = {
+   0x, 0x3b6e20c8, 0x76dc4190, 0x4db26158,
+   0xedb88320, 0xd6d6a3e8, 0x9b64c2b0, 0xa00ae278 };
+
 /*
  * This function adds bytes into the entropy "pool".  It does not
  * update the entropy estimate.  The caller should call
@@ -467,9 +471,6 @@ static struct entropy_store nonblocking_
 static void mix_pool_bytes_extract(struct entropy_store *r, const void *in,
   int nbytes, __u8 out[64])
 {
-   static __u32 const twist_table[8] = {
-   0x, 0x3b6e20c8, 0x76dc4190, 0x4db26158,
-   0xedb88320, 0xd6d6a3e8, 0x9b64c2b0, 0xa00ae278 };
unsigned long i, j, tap1, tap2, tap3, tap4, tap5;
int input_rotate;
int wordmask = r->poolinfo->poolwords - 1;
@@ -528,6 +529,36 @@ static void mix_pool_bytes(struct entrop
mix_pool_bytes_extract(r, in, bytes, NULL);
 }
 
+struct fast_pool {
+   __u32   pool[4];
+   unsigned long   last;
+   unsigned short  count;
+   unsigned char   rotate;
+   unsigned char   last_timer_intr;
+};
+
+/*
+ * This is a fast mixing routine used by the interrupt randomness
+ * collector.  It's hardcoded for an 128 bit pool and assumes that any
+ * locks that might be needed are taken by the caller.
+ */
+static void fast_mix(struct fast_pool *f, const void *in, int nbytes)
+{
+   const char  *bytes = in;
+   __u32   w;
+   unsignedi = f->count;
+   unsignedinput_rotate = f->rotate;
+
+   while (nbytes--) {
+   w = rol32(*bytes++, input_rotate & 31) ^ f->pool[i & 3] ^
+   f->pool[(i + 1) & 3

  1   2   3   >