mirror of
https://github.com/Fishwaldo/build.git
synced 2025-03-27 09:11:49 +00:00
1260 lines
42 KiB
Diff
1260 lines
42 KiB
Diff
diff --git a/Makefile b/Makefile
|
|
index 2d084a418789..8045c75414ae 100644
|
|
--- a/Makefile
|
|
+++ b/Makefile
|
|
@@ -1,6 +1,6 @@
|
|
VERSION = 3
|
|
PATCHLEVEL = 4
|
|
-SUBLEVEL = 75
|
|
+SUBLEVEL = 76
|
|
EXTRAVERSION =
|
|
NAME = Saber-toothed Squirrel
|
|
|
|
diff --git a/arch/powerpc/include/asm/exception-64s.h b/arch/powerpc/include/asm/exception-64s.h
|
|
index 6afb13ad1611..241d2f305307 100644
|
|
--- a/arch/powerpc/include/asm/exception-64s.h
|
|
+++ b/arch/powerpc/include/asm/exception-64s.h
|
|
@@ -163,7 +163,7 @@ do_kvm_##n: \
|
|
subi r1,r1,INT_FRAME_SIZE; /* alloc frame on kernel stack */ \
|
|
beq- 1f; \
|
|
ld r1,PACAKSAVE(r13); /* kernel stack to use */ \
|
|
-1: cmpdi cr1,r1,0; /* check if r1 is in userspace */ \
|
|
+1: cmpdi cr1,r1,-INT_FRAME_SIZE; /* check if r1 is in userspace */ \
|
|
blt+ cr1,3f; /* abort if it is */ \
|
|
li r1,(n); /* will be reloaded later */ \
|
|
sth r1,PACA_TRAP_SAVE(r13); \
|
|
diff --git a/arch/powerpc/kernel/head_64.S b/arch/powerpc/kernel/head_64.S
|
|
index 1a3607b96635..1a5b6878ac61 100644
|
|
--- a/arch/powerpc/kernel/head_64.S
|
|
+++ b/arch/powerpc/kernel/head_64.S
|
|
@@ -447,6 +447,7 @@ _STATIC(__after_prom_start)
|
|
mtctr r8
|
|
bctr
|
|
|
|
+.balign 8
|
|
p_end: .llong _end - _stext
|
|
|
|
4: /* Now copy the rest of the kernel up to _end */
|
|
diff --git a/arch/powerpc/kvm/book3s_64_mmu_hv.c b/arch/powerpc/kvm/book3s_64_mmu_hv.c
|
|
index c3beaeef3f60..87135be08687 100644
|
|
--- a/arch/powerpc/kvm/book3s_64_mmu_hv.c
|
|
+++ b/arch/powerpc/kvm/book3s_64_mmu_hv.c
|
|
@@ -393,11 +393,14 @@ static int kvmppc_mmu_book3s_64_hv_xlate(struct kvm_vcpu *vcpu, gva_t eaddr,
|
|
slb_v = vcpu->kvm->arch.vrma_slb_v;
|
|
}
|
|
|
|
+ preempt_disable();
|
|
/* Find the HPTE in the hash table */
|
|
index = kvmppc_hv_find_lock_hpte(kvm, eaddr, slb_v,
|
|
HPTE_V_VALID | HPTE_V_ABSENT);
|
|
- if (index < 0)
|
|
+ if (index < 0) {
|
|
+ preempt_enable();
|
|
return -ENOENT;
|
|
+ }
|
|
hptep = (unsigned long *)(kvm->arch.hpt_virt + (index << 4));
|
|
v = hptep[0] & ~HPTE_V_HVLOCK;
|
|
gr = kvm->arch.revmap[index].guest_rpte;
|
|
@@ -405,6 +408,7 @@ static int kvmppc_mmu_book3s_64_hv_xlate(struct kvm_vcpu *vcpu, gva_t eaddr,
|
|
/* Unlock the HPTE */
|
|
asm volatile("lwsync" : : : "memory");
|
|
hptep[0] = v;
|
|
+ preempt_enable();
|
|
|
|
gpte->eaddr = eaddr;
|
|
gpte->vpage = ((v & HPTE_V_AVPN) << 4) | ((eaddr >> 12) & 0xfff);
|
|
diff --git a/arch/powerpc/kvm/book3s_hv_rm_mmu.c b/arch/powerpc/kvm/book3s_hv_rm_mmu.c
|
|
index cec4daddbf31..eacf164eabb2 100644
|
|
--- a/arch/powerpc/kvm/book3s_hv_rm_mmu.c
|
|
+++ b/arch/powerpc/kvm/book3s_hv_rm_mmu.c
|
|
@@ -649,6 +649,10 @@ static int slb_base_page_shift[4] = {
|
|
20, /* 1M, unsupported */
|
|
};
|
|
|
|
+/* When called from virtmode, this func should be protected by
|
|
+ * preempt_disable(), otherwise, the holding of HPTE_V_HVLOCK
|
|
+ * can trigger deadlock issue.
|
|
+ */
|
|
long kvmppc_hv_find_lock_hpte(struct kvm *kvm, gva_t eaddr, unsigned long slb_v,
|
|
unsigned long valid)
|
|
{
|
|
diff --git a/arch/sh/lib/Makefile b/arch/sh/lib/Makefile
|
|
index 7b95f29e3174..3baff31e58cf 100644
|
|
--- a/arch/sh/lib/Makefile
|
|
+++ b/arch/sh/lib/Makefile
|
|
@@ -6,7 +6,7 @@ lib-y = delay.o memmove.o memchr.o \
|
|
checksum.o strlen.o div64.o div64-generic.o
|
|
|
|
# Extracted from libgcc
|
|
-lib-y += movmem.o ashldi3.o ashrdi3.o lshrdi3.o \
|
|
+obj-y += movmem.o ashldi3.o ashrdi3.o lshrdi3.o \
|
|
ashlsi3.o ashrsi3.o ashiftrt.o lshrsi3.o \
|
|
udiv_qrnnd.o
|
|
|
|
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c
|
|
index cd20cf1ef3ed..400b8c6eb8eb 100644
|
|
--- a/drivers/ata/libata-core.c
|
|
+++ b/drivers/ata/libata-core.c
|
|
@@ -4104,6 +4104,9 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = {
|
|
{ "ST3320[68]13AS", "SD1[5-9]", ATA_HORKAGE_NONCQ |
|
|
ATA_HORKAGE_FIRMWARE_WARN },
|
|
|
|
+ /* Seagate Momentus SpinPoint M8 seem to have FPMDA_AA issues */
|
|
+ { "ST1000LM024 HN-M101MBB", "2AR10001", ATA_HORKAGE_BROKEN_FPDMA_AA },
|
|
+
|
|
/* Blacklist entries taken from Silicon Image 3124/3132
|
|
Windows driver .inf file - also several Linux problem reports */
|
|
{ "HTS541060G9SA00", "MB3OC60D", ATA_HORKAGE_NONCQ, },
|
|
diff --git a/drivers/dma/Kconfig b/drivers/dma/Kconfig
|
|
index ef378b5b17e4..7de7a656c50b 100644
|
|
--- a/drivers/dma/Kconfig
|
|
+++ b/drivers/dma/Kconfig
|
|
@@ -269,6 +269,7 @@ config NET_DMA
|
|
bool "Network: TCP receive copy offload"
|
|
depends on DMA_ENGINE && NET
|
|
default (INTEL_IOATDMA || FSL_DMA)
|
|
+ depends on BROKEN
|
|
help
|
|
This enables the use of DMA engines in the network stack to
|
|
offload receive copy-to-user operations, freeing CPU cycles.
|
|
diff --git a/drivers/gpio/gpio-msm-v2.c b/drivers/gpio/gpio-msm-v2.c
|
|
index 5cb1227d69cf..3104502611f1 100644
|
|
--- a/drivers/gpio/gpio-msm-v2.c
|
|
+++ b/drivers/gpio/gpio-msm-v2.c
|
|
@@ -249,7 +249,7 @@ static void msm_gpio_irq_mask(struct irq_data *d)
|
|
|
|
spin_lock_irqsave(&tlmm_lock, irq_flags);
|
|
writel(TARGET_PROC_NONE, GPIO_INTR_CFG_SU(gpio));
|
|
- clear_gpio_bits(INTR_RAW_STATUS_EN | INTR_ENABLE, GPIO_INTR_CFG(gpio));
|
|
+ clear_gpio_bits(BIT(INTR_RAW_STATUS_EN) | BIT(INTR_ENABLE), GPIO_INTR_CFG(gpio));
|
|
__clear_bit(gpio, msm_gpio.enabled_irqs);
|
|
spin_unlock_irqrestore(&tlmm_lock, irq_flags);
|
|
}
|
|
@@ -261,7 +261,7 @@ static void msm_gpio_irq_unmask(struct irq_data *d)
|
|
|
|
spin_lock_irqsave(&tlmm_lock, irq_flags);
|
|
__set_bit(gpio, msm_gpio.enabled_irqs);
|
|
- set_gpio_bits(INTR_RAW_STATUS_EN | INTR_ENABLE, GPIO_INTR_CFG(gpio));
|
|
+ set_gpio_bits(BIT(INTR_RAW_STATUS_EN) | BIT(INTR_ENABLE), GPIO_INTR_CFG(gpio));
|
|
writel(TARGET_PROC_SCORPION, GPIO_INTR_CFG_SU(gpio));
|
|
spin_unlock_irqrestore(&tlmm_lock, irq_flags);
|
|
}
|
|
diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
|
|
index efe172f33602..d75dccb562f3 100644
|
|
--- a/drivers/gpu/drm/drm_edid.c
|
|
+++ b/drivers/gpu/drm/drm_edid.c
|
|
@@ -68,6 +68,8 @@
|
|
#define EDID_QUIRK_DETAILED_SYNC_PP (1 << 6)
|
|
/* Force reduced-blanking timings for detailed modes */
|
|
#define EDID_QUIRK_FORCE_REDUCED_BLANKING (1 << 7)
|
|
+/* Force 8bpc */
|
|
+#define EDID_QUIRK_FORCE_8BPC (1 << 8)
|
|
|
|
struct detailed_mode_closure {
|
|
struct drm_connector *connector;
|
|
@@ -128,6 +130,9 @@ static struct edid_quirk {
|
|
|
|
/* Medion MD 30217 PG */
|
|
{ "MED", 0x7b8, EDID_QUIRK_PREFER_LARGE_75 },
|
|
+
|
|
+ /* Panel in Samsung NP700G7A-S01PL notebook reports 6bpc */
|
|
+ { "SEC", 0xd033, EDID_QUIRK_FORCE_8BPC },
|
|
};
|
|
|
|
/*** DDC fetch and block validation ***/
|
|
@@ -1782,6 +1787,9 @@ int drm_add_edid_modes(struct drm_connector *connector, struct edid *edid)
|
|
|
|
drm_add_display_info(edid, &connector->display_info);
|
|
|
|
+ if (quirks & EDID_QUIRK_FORCE_8BPC)
|
|
+ connector->display_info.bpc = 8;
|
|
+
|
|
return num_modes;
|
|
}
|
|
EXPORT_SYMBOL(drm_add_edid_modes);
|
|
diff --git a/drivers/gpu/drm/radeon/ni.c b/drivers/gpu/drm/radeon/ni.c
|
|
index f5387b3e699f..f481da3a4f29 100644
|
|
--- a/drivers/gpu/drm/radeon/ni.c
|
|
+++ b/drivers/gpu/drm/radeon/ni.c
|
|
@@ -672,6 +672,10 @@ static void cayman_gpu_init(struct radeon_device *rdev)
|
|
(rdev->pdev->device == 0x999C)) {
|
|
rdev->config.cayman.max_simds_per_se = 6;
|
|
rdev->config.cayman.max_backends_per_se = 2;
|
|
+ rdev->config.cayman.max_hw_contexts = 8;
|
|
+ rdev->config.cayman.sx_max_export_size = 256;
|
|
+ rdev->config.cayman.sx_max_export_pos_size = 64;
|
|
+ rdev->config.cayman.sx_max_export_smx_size = 192;
|
|
} else if ((rdev->pdev->device == 0x9903) ||
|
|
(rdev->pdev->device == 0x9904) ||
|
|
(rdev->pdev->device == 0x990A) ||
|
|
@@ -682,6 +686,10 @@ static void cayman_gpu_init(struct radeon_device *rdev)
|
|
(rdev->pdev->device == 0x999D)) {
|
|
rdev->config.cayman.max_simds_per_se = 4;
|
|
rdev->config.cayman.max_backends_per_se = 2;
|
|
+ rdev->config.cayman.max_hw_contexts = 8;
|
|
+ rdev->config.cayman.sx_max_export_size = 256;
|
|
+ rdev->config.cayman.sx_max_export_pos_size = 64;
|
|
+ rdev->config.cayman.sx_max_export_smx_size = 192;
|
|
} else if ((rdev->pdev->device == 0x9919) ||
|
|
(rdev->pdev->device == 0x9990) ||
|
|
(rdev->pdev->device == 0x9991) ||
|
|
@@ -692,9 +700,17 @@ static void cayman_gpu_init(struct radeon_device *rdev)
|
|
(rdev->pdev->device == 0x99A0)) {
|
|
rdev->config.cayman.max_simds_per_se = 3;
|
|
rdev->config.cayman.max_backends_per_se = 1;
|
|
+ rdev->config.cayman.max_hw_contexts = 4;
|
|
+ rdev->config.cayman.sx_max_export_size = 128;
|
|
+ rdev->config.cayman.sx_max_export_pos_size = 32;
|
|
+ rdev->config.cayman.sx_max_export_smx_size = 96;
|
|
} else {
|
|
rdev->config.cayman.max_simds_per_se = 2;
|
|
rdev->config.cayman.max_backends_per_se = 1;
|
|
+ rdev->config.cayman.max_hw_contexts = 4;
|
|
+ rdev->config.cayman.sx_max_export_size = 128;
|
|
+ rdev->config.cayman.sx_max_export_pos_size = 32;
|
|
+ rdev->config.cayman.sx_max_export_smx_size = 96;
|
|
}
|
|
rdev->config.cayman.max_texture_channel_caches = 2;
|
|
rdev->config.cayman.max_gprs = 256;
|
|
@@ -702,10 +718,6 @@ static void cayman_gpu_init(struct radeon_device *rdev)
|
|
rdev->config.cayman.max_gs_threads = 32;
|
|
rdev->config.cayman.max_stack_entries = 512;
|
|
rdev->config.cayman.sx_num_of_sets = 8;
|
|
- rdev->config.cayman.sx_max_export_size = 256;
|
|
- rdev->config.cayman.sx_max_export_pos_size = 64;
|
|
- rdev->config.cayman.sx_max_export_smx_size = 192;
|
|
- rdev->config.cayman.max_hw_contexts = 8;
|
|
rdev->config.cayman.sq_num_cf_insts = 2;
|
|
|
|
rdev->config.cayman.sc_prim_fifo_size = 0x40;
|
|
diff --git a/drivers/hwmon/w83l786ng.c b/drivers/hwmon/w83l786ng.c
|
|
index a97a62063356..284d469af326 100644
|
|
--- a/drivers/hwmon/w83l786ng.c
|
|
+++ b/drivers/hwmon/w83l786ng.c
|
|
@@ -481,9 +481,11 @@ store_pwm(struct device *dev, struct device_attribute *attr,
|
|
if (err)
|
|
return err;
|
|
val = SENSORS_LIMIT(val, 0, 255);
|
|
+ val = DIV_ROUND_CLOSEST(val, 0x11);
|
|
|
|
mutex_lock(&data->update_lock);
|
|
- data->pwm[nr] = val;
|
|
+ data->pwm[nr] = val * 0x11;
|
|
+ val |= w83l786ng_read_value(client, W83L786NG_REG_PWM[nr]) & 0xf0;
|
|
w83l786ng_write_value(client, W83L786NG_REG_PWM[nr], val);
|
|
mutex_unlock(&data->update_lock);
|
|
return count;
|
|
@@ -782,8 +784,9 @@ static struct w83l786ng_data *w83l786ng_update_device(struct device *dev)
|
|
? 0 : 1;
|
|
data->pwm_enable[i] =
|
|
((pwmcfg >> W83L786NG_PWM_ENABLE_SHIFT[i]) & 3) + 1;
|
|
- data->pwm[i] = w83l786ng_read_value(client,
|
|
- W83L786NG_REG_PWM[i]);
|
|
+ data->pwm[i] =
|
|
+ (w83l786ng_read_value(client, W83L786NG_REG_PWM[i])
|
|
+ & 0x0f) * 0x11;
|
|
}
|
|
|
|
|
|
diff --git a/drivers/idle/intel_idle.c b/drivers/idle/intel_idle.c
|
|
index d0f59c3f87ef..8d1ebd332292 100644
|
|
--- a/drivers/idle/intel_idle.c
|
|
+++ b/drivers/idle/intel_idle.c
|
|
@@ -169,6 +169,38 @@ static struct cpuidle_state snb_cstates[MWAIT_MAX_NUM_CSTATES] = {
|
|
.enter = &intel_idle },
|
|
};
|
|
|
|
+static struct cpuidle_state ivb_cstates[MWAIT_MAX_NUM_CSTATES] = {
|
|
+ { /* MWAIT C0 */ },
|
|
+ { /* MWAIT C1 */
|
|
+ .name = "C1-IVB",
|
|
+ .desc = "MWAIT 0x00",
|
|
+ .flags = CPUIDLE_FLAG_TIME_VALID,
|
|
+ .exit_latency = 1,
|
|
+ .target_residency = 1,
|
|
+ .enter = &intel_idle },
|
|
+ { /* MWAIT C2 */
|
|
+ .name = "C3-IVB",
|
|
+ .desc = "MWAIT 0x10",
|
|
+ .flags = CPUIDLE_FLAG_TIME_VALID | CPUIDLE_FLAG_TLB_FLUSHED,
|
|
+ .exit_latency = 59,
|
|
+ .target_residency = 156,
|
|
+ .enter = &intel_idle },
|
|
+ { /* MWAIT C3 */
|
|
+ .name = "C6-IVB",
|
|
+ .desc = "MWAIT 0x20",
|
|
+ .flags = CPUIDLE_FLAG_TIME_VALID | CPUIDLE_FLAG_TLB_FLUSHED,
|
|
+ .exit_latency = 80,
|
|
+ .target_residency = 300,
|
|
+ .enter = &intel_idle },
|
|
+ { /* MWAIT C4 */
|
|
+ .name = "C7-IVB",
|
|
+ .desc = "MWAIT 0x30",
|
|
+ .flags = CPUIDLE_FLAG_TIME_VALID | CPUIDLE_FLAG_TLB_FLUSHED,
|
|
+ .exit_latency = 87,
|
|
+ .target_residency = 300,
|
|
+ .enter = &intel_idle },
|
|
+};
|
|
+
|
|
static struct cpuidle_state atom_cstates[MWAIT_MAX_NUM_CSTATES] = {
|
|
{ /* MWAIT C0 */ },
|
|
{ /* MWAIT C1 */
|
|
@@ -347,6 +379,10 @@ static const struct idle_cpu idle_cpu_snb = {
|
|
.state_table = snb_cstates,
|
|
};
|
|
|
|
+static const struct idle_cpu idle_cpu_ivb = {
|
|
+ .state_table = ivb_cstates,
|
|
+};
|
|
+
|
|
#define ICPU(model, cpu) \
|
|
{ X86_VENDOR_INTEL, 6, model, X86_FEATURE_MWAIT, (unsigned long)&cpu }
|
|
|
|
@@ -362,6 +398,8 @@ static const struct x86_cpu_id intel_idle_ids[] = {
|
|
ICPU(0x2f, idle_cpu_nehalem),
|
|
ICPU(0x2a, idle_cpu_snb),
|
|
ICPU(0x2d, idle_cpu_snb),
|
|
+ ICPU(0x3a, idle_cpu_ivb),
|
|
+ ICPU(0x3e, idle_cpu_ivb),
|
|
{}
|
|
};
|
|
MODULE_DEVICE_TABLE(x86cpu, intel_idle_ids);
|
|
diff --git a/drivers/input/input.c b/drivers/input/input.c
|
|
index 8921c6180c51..d56c407aa096 100644
|
|
--- a/drivers/input/input.c
|
|
+++ b/drivers/input/input.c
|
|
@@ -1707,6 +1707,10 @@ void input_set_capability(struct input_dev *dev, unsigned int type, unsigned int
|
|
break;
|
|
|
|
case EV_ABS:
|
|
+ input_alloc_absinfo(dev);
|
|
+ if (!dev->absinfo)
|
|
+ return;
|
|
+
|
|
__set_bit(code, dev->absbit);
|
|
break;
|
|
|
|
diff --git a/drivers/net/usb/dm9601.c b/drivers/net/usb/dm9601.c
|
|
index 905b16faee41..17851833f839 100644
|
|
--- a/drivers/net/usb/dm9601.c
|
|
+++ b/drivers/net/usb/dm9601.c
|
|
@@ -445,7 +445,12 @@ static int dm9601_bind(struct usbnet *dev, struct usb_interface *intf)
|
|
dev->net->ethtool_ops = &dm9601_ethtool_ops;
|
|
dev->net->hard_header_len += DM_TX_OVERHEAD;
|
|
dev->hard_mtu = dev->net->mtu + dev->net->hard_header_len;
|
|
- dev->rx_urb_size = dev->net->mtu + ETH_HLEN + DM_RX_OVERHEAD;
|
|
+
|
|
+ /* dm9620/21a require room for 4 byte padding, even in dm9601
|
|
+ * mode, so we need +1 to be able to receive full size
|
|
+ * ethernet frames.
|
|
+ */
|
|
+ dev->rx_urb_size = dev->net->mtu + ETH_HLEN + DM_RX_OVERHEAD + 1;
|
|
|
|
dev->mii.dev = dev->net;
|
|
dev->mii.mdio_read = dm9601_mdio_read;
|
|
@@ -531,7 +536,7 @@ static int dm9601_rx_fixup(struct usbnet *dev, struct sk_buff *skb)
|
|
static struct sk_buff *dm9601_tx_fixup(struct usbnet *dev, struct sk_buff *skb,
|
|
gfp_t flags)
|
|
{
|
|
- int len;
|
|
+ int len, pad;
|
|
|
|
/* format:
|
|
b1: packet length low
|
|
@@ -539,12 +544,23 @@ static struct sk_buff *dm9601_tx_fixup(struct usbnet *dev, struct sk_buff *skb,
|
|
b3..n: packet data
|
|
*/
|
|
|
|
- len = skb->len;
|
|
+ len = skb->len + DM_TX_OVERHEAD;
|
|
|
|
- if (skb_headroom(skb) < DM_TX_OVERHEAD) {
|
|
+ /* workaround for dm962x errata with tx fifo getting out of
|
|
+ * sync if a USB bulk transfer retry happens right after a
|
|
+ * packet with odd / maxpacket length by adding up to 3 bytes
|
|
+ * padding.
|
|
+ */
|
|
+ while ((len & 1) || !(len % dev->maxpacket))
|
|
+ len++;
|
|
+
|
|
+ len -= DM_TX_OVERHEAD; /* hw header doesn't count as part of length */
|
|
+ pad = len - skb->len;
|
|
+
|
|
+ if (skb_headroom(skb) < DM_TX_OVERHEAD || skb_tailroom(skb) < pad) {
|
|
struct sk_buff *skb2;
|
|
|
|
- skb2 = skb_copy_expand(skb, DM_TX_OVERHEAD, 0, flags);
|
|
+ skb2 = skb_copy_expand(skb, DM_TX_OVERHEAD, pad, flags);
|
|
dev_kfree_skb_any(skb);
|
|
skb = skb2;
|
|
if (!skb)
|
|
@@ -553,10 +569,10 @@ static struct sk_buff *dm9601_tx_fixup(struct usbnet *dev, struct sk_buff *skb,
|
|
|
|
__skb_push(skb, DM_TX_OVERHEAD);
|
|
|
|
- /* usbnet adds padding if length is a multiple of packet size
|
|
- if so, adjust length value in header */
|
|
- if ((skb->len % dev->maxpacket) == 0)
|
|
- len++;
|
|
+ if (pad) {
|
|
+ memset(skb->data + skb->len, 0, pad);
|
|
+ __skb_put(skb, pad);
|
|
+ }
|
|
|
|
skb->data[0] = len;
|
|
skb->data[1] = len >> 8;
|
|
diff --git a/drivers/net/wireless/ath/ath9k/ar9002_mac.c b/drivers/net/wireless/ath/ath9k/ar9002_mac.c
|
|
index aa2abaf31cba..fa7581a50495 100644
|
|
--- a/drivers/net/wireless/ath/ath9k/ar9002_mac.c
|
|
+++ b/drivers/net/wireless/ath/ath9k/ar9002_mac.c
|
|
@@ -76,9 +76,16 @@ static bool ar9002_hw_get_isr(struct ath_hw *ah, enum ath9k_int *masked)
|
|
mask2 |= ATH9K_INT_CST;
|
|
if (isr2 & AR_ISR_S2_TSFOOR)
|
|
mask2 |= ATH9K_INT_TSFOOR;
|
|
+
|
|
+ if (!(pCap->hw_caps & ATH9K_HW_CAP_RAC_SUPPORTED)) {
|
|
+ REG_WRITE(ah, AR_ISR_S2, isr2);
|
|
+ isr &= ~AR_ISR_BCNMISC;
|
|
+ }
|
|
}
|
|
|
|
- isr = REG_READ(ah, AR_ISR_RAC);
|
|
+ if (pCap->hw_caps & ATH9K_HW_CAP_RAC_SUPPORTED)
|
|
+ isr = REG_READ(ah, AR_ISR_RAC);
|
|
+
|
|
if (isr == 0xffffffff) {
|
|
*masked = 0;
|
|
return false;
|
|
@@ -97,11 +104,23 @@ static bool ar9002_hw_get_isr(struct ath_hw *ah, enum ath9k_int *masked)
|
|
|
|
*masked |= ATH9K_INT_TX;
|
|
|
|
- s0_s = REG_READ(ah, AR_ISR_S0_S);
|
|
+ if (pCap->hw_caps & ATH9K_HW_CAP_RAC_SUPPORTED) {
|
|
+ s0_s = REG_READ(ah, AR_ISR_S0_S);
|
|
+ s1_s = REG_READ(ah, AR_ISR_S1_S);
|
|
+ } else {
|
|
+ s0_s = REG_READ(ah, AR_ISR_S0);
|
|
+ REG_WRITE(ah, AR_ISR_S0, s0_s);
|
|
+ s1_s = REG_READ(ah, AR_ISR_S1);
|
|
+ REG_WRITE(ah, AR_ISR_S1, s1_s);
|
|
+
|
|
+ isr &= ~(AR_ISR_TXOK |
|
|
+ AR_ISR_TXDESC |
|
|
+ AR_ISR_TXERR |
|
|
+ AR_ISR_TXEOL);
|
|
+ }
|
|
+
|
|
ah->intr_txqs |= MS(s0_s, AR_ISR_S0_QCU_TXOK);
|
|
ah->intr_txqs |= MS(s0_s, AR_ISR_S0_QCU_TXDESC);
|
|
-
|
|
- s1_s = REG_READ(ah, AR_ISR_S1_S);
|
|
ah->intr_txqs |= MS(s1_s, AR_ISR_S1_QCU_TXERR);
|
|
ah->intr_txqs |= MS(s1_s, AR_ISR_S1_QCU_TXEOL);
|
|
}
|
|
@@ -114,13 +133,15 @@ static bool ar9002_hw_get_isr(struct ath_hw *ah, enum ath9k_int *masked)
|
|
*masked |= mask2;
|
|
}
|
|
|
|
- if (AR_SREV_9100(ah))
|
|
- return true;
|
|
-
|
|
- if (isr & AR_ISR_GENTMR) {
|
|
+ if (!AR_SREV_9100(ah) && (isr & AR_ISR_GENTMR)) {
|
|
u32 s5_s;
|
|
|
|
- s5_s = REG_READ(ah, AR_ISR_S5_S);
|
|
+ if (pCap->hw_caps & ATH9K_HW_CAP_RAC_SUPPORTED) {
|
|
+ s5_s = REG_READ(ah, AR_ISR_S5_S);
|
|
+ } else {
|
|
+ s5_s = REG_READ(ah, AR_ISR_S5);
|
|
+ }
|
|
+
|
|
ah->intr_gen_timer_trigger =
|
|
MS(s5_s, AR_ISR_S5_GENTIMER_TRIG);
|
|
|
|
@@ -133,8 +154,21 @@ static bool ar9002_hw_get_isr(struct ath_hw *ah, enum ath9k_int *masked)
|
|
if ((s5_s & AR_ISR_S5_TIM_TIMER) &&
|
|
!(pCap->hw_caps & ATH9K_HW_CAP_AUTOSLEEP))
|
|
*masked |= ATH9K_INT_TIM_TIMER;
|
|
+
|
|
+ if (!(pCap->hw_caps & ATH9K_HW_CAP_RAC_SUPPORTED)) {
|
|
+ REG_WRITE(ah, AR_ISR_S5, s5_s);
|
|
+ isr &= ~AR_ISR_GENTMR;
|
|
+ }
|
|
}
|
|
|
|
+ if (!(pCap->hw_caps & ATH9K_HW_CAP_RAC_SUPPORTED)) {
|
|
+ REG_WRITE(ah, AR_ISR, isr);
|
|
+ REG_READ(ah, AR_ISR);
|
|
+ }
|
|
+
|
|
+ if (AR_SREV_9100(ah))
|
|
+ return true;
|
|
+
|
|
if (sync_cause) {
|
|
fatal_int =
|
|
(sync_cause &
|
|
diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_main.c b/drivers/net/wireless/ath/ath9k/htc_drv_main.c
|
|
index abbd6effd60d..204619e29a17 100644
|
|
--- a/drivers/net/wireless/ath/ath9k/htc_drv_main.c
|
|
+++ b/drivers/net/wireless/ath/ath9k/htc_drv_main.c
|
|
@@ -139,21 +139,26 @@ static void ath9k_htc_bssid_iter(void *data, u8 *mac, struct ieee80211_vif *vif)
|
|
struct ath9k_vif_iter_data *iter_data = data;
|
|
int i;
|
|
|
|
- for (i = 0; i < ETH_ALEN; i++)
|
|
- iter_data->mask[i] &= ~(iter_data->hw_macaddr[i] ^ mac[i]);
|
|
+ if (iter_data->hw_macaddr != NULL) {
|
|
+ for (i = 0; i < ETH_ALEN; i++)
|
|
+ iter_data->mask[i] &= ~(iter_data->hw_macaddr[i] ^ mac[i]);
|
|
+ } else {
|
|
+ iter_data->hw_macaddr = mac;
|
|
+ }
|
|
}
|
|
|
|
-static void ath9k_htc_set_bssid_mask(struct ath9k_htc_priv *priv,
|
|
+static void ath9k_htc_set_mac_bssid_mask(struct ath9k_htc_priv *priv,
|
|
struct ieee80211_vif *vif)
|
|
{
|
|
struct ath_common *common = ath9k_hw_common(priv->ah);
|
|
struct ath9k_vif_iter_data iter_data;
|
|
|
|
/*
|
|
- * Use the hardware MAC address as reference, the hardware uses it
|
|
- * together with the BSSID mask when matching addresses.
|
|
+ * Pick the MAC address of the first interface as the new hardware
|
|
+ * MAC address. The hardware will use it together with the BSSID mask
|
|
+ * when matching addresses.
|
|
*/
|
|
- iter_data.hw_macaddr = common->macaddr;
|
|
+ iter_data.hw_macaddr = NULL;
|
|
memset(&iter_data.mask, 0xff, ETH_ALEN);
|
|
|
|
if (vif)
|
|
@@ -164,6 +169,10 @@ static void ath9k_htc_set_bssid_mask(struct ath9k_htc_priv *priv,
|
|
&iter_data);
|
|
|
|
memcpy(common->bssidmask, iter_data.mask, ETH_ALEN);
|
|
+
|
|
+ if (iter_data.hw_macaddr)
|
|
+ memcpy(common->macaddr, iter_data.hw_macaddr, ETH_ALEN);
|
|
+
|
|
ath_hw_setbssidmask(common);
|
|
}
|
|
|
|
@@ -1091,7 +1100,7 @@ static int ath9k_htc_add_interface(struct ieee80211_hw *hw,
|
|
goto out;
|
|
}
|
|
|
|
- ath9k_htc_set_bssid_mask(priv, vif);
|
|
+ ath9k_htc_set_mac_bssid_mask(priv, vif);
|
|
|
|
priv->vif_slot |= (1 << avp->index);
|
|
priv->nvifs++;
|
|
@@ -1154,7 +1163,7 @@ static void ath9k_htc_remove_interface(struct ieee80211_hw *hw,
|
|
|
|
ath9k_htc_set_opmode(priv);
|
|
|
|
- ath9k_htc_set_bssid_mask(priv, vif);
|
|
+ ath9k_htc_set_mac_bssid_mask(priv, vif);
|
|
|
|
/*
|
|
* Stop ANI only if there are no associated station interfaces.
|
|
diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c
|
|
index f6a095f8ffcd..b6d1ac9fb326 100644
|
|
--- a/drivers/net/wireless/ath/ath9k/main.c
|
|
+++ b/drivers/net/wireless/ath/ath9k/main.c
|
|
@@ -1290,8 +1290,9 @@ void ath9k_calculate_iter_data(struct ieee80211_hw *hw,
|
|
struct ath_common *common = ath9k_hw_common(ah);
|
|
|
|
/*
|
|
- * Use the hardware MAC address as reference, the hardware uses it
|
|
- * together with the BSSID mask when matching addresses.
|
|
+ * Pick the MAC address of the first interface as the new hardware
|
|
+ * MAC address. The hardware will use it together with the BSSID mask
|
|
+ * when matching addresses.
|
|
*/
|
|
memset(iter_data, 0, sizeof(*iter_data));
|
|
iter_data->hw_macaddr = common->macaddr;
|
|
diff --git a/drivers/net/wireless/rtlwifi/pci.c b/drivers/net/wireless/rtlwifi/pci.c
|
|
index 67f9430ee197..5c1379c43d1a 100644
|
|
--- a/drivers/net/wireless/rtlwifi/pci.c
|
|
+++ b/drivers/net/wireless/rtlwifi/pci.c
|
|
@@ -678,6 +678,8 @@ static void _rtl_pci_rx_interrupt(struct ieee80211_hw *hw)
|
|
};
|
|
int index = rtlpci->rx_ring[rx_queue_idx].idx;
|
|
|
|
+ if (rtlpci->driver_is_goingto_unload)
|
|
+ return;
|
|
/*RX NORMAL PKT */
|
|
while (count--) {
|
|
/*rx descriptor */
|
|
@@ -1553,6 +1555,7 @@ static void rtl_pci_stop(struct ieee80211_hw *hw)
|
|
*/
|
|
set_hal_stop(rtlhal);
|
|
|
|
+ rtlpci->driver_is_goingto_unload = true;
|
|
rtlpriv->cfg->ops->disable_interrupt(hw);
|
|
cancel_work_sync(&rtlpriv->works.lps_leave_work);
|
|
|
|
@@ -1570,7 +1573,6 @@ static void rtl_pci_stop(struct ieee80211_hw *hw)
|
|
ppsc->rfchange_inprogress = true;
|
|
spin_unlock_irqrestore(&rtlpriv->locks.rf_ps_lock, flags);
|
|
|
|
- rtlpci->driver_is_goingto_unload = true;
|
|
rtlpriv->cfg->ops->hw_disable(hw);
|
|
/* some things are not needed if firmware not available */
|
|
if (!rtlpriv->max_fw_size)
|
|
diff --git a/drivers/tty/serial/pmac_zilog.c b/drivers/tty/serial/pmac_zilog.c
|
|
index 333c8d012b0e..3f93c47d50bb 100644
|
|
--- a/drivers/tty/serial/pmac_zilog.c
|
|
+++ b/drivers/tty/serial/pmac_zilog.c
|
|
@@ -2051,6 +2051,9 @@ static int __init pmz_console_init(void)
|
|
/* Probe ports */
|
|
pmz_probe();
|
|
|
|
+ if (pmz_ports_count == 0)
|
|
+ return -ENODEV;
|
|
+
|
|
/* TODO: Autoprobe console based on OF */
|
|
/* pmz_console.index = i; */
|
|
register_console(&pmz_console);
|
|
diff --git a/drivers/usb/class/cdc-wdm.c b/drivers/usb/class/cdc-wdm.c
|
|
index 1434ee9ecb31..e5fa34e5423f 100644
|
|
--- a/drivers/usb/class/cdc-wdm.c
|
|
+++ b/drivers/usb/class/cdc-wdm.c
|
|
@@ -822,13 +822,11 @@ static int wdm_manage_power(struct usb_interface *intf, int on)
|
|
{
|
|
/* need autopm_get/put here to ensure the usbcore sees the new value */
|
|
int rv = usb_autopm_get_interface(intf);
|
|
- if (rv < 0)
|
|
- goto err;
|
|
|
|
intf->needs_remote_wakeup = on;
|
|
- usb_autopm_put_interface(intf);
|
|
-err:
|
|
- return rv;
|
|
+ if (!rv)
|
|
+ usb_autopm_put_interface(intf);
|
|
+ return 0;
|
|
}
|
|
|
|
static int wdm_probe(struct usb_interface *intf, const struct usb_device_id *id)
|
|
diff --git a/drivers/usb/serial/generic.c b/drivers/usb/serial/generic.c
|
|
index 664deb63807c..546177fa7cfe 100644
|
|
--- a/drivers/usb/serial/generic.c
|
|
+++ b/drivers/usb/serial/generic.c
|
|
@@ -223,14 +223,7 @@ retry:
|
|
return result;
|
|
}
|
|
|
|
- /* Try sending off another urb, unless in irq context (in which case
|
|
- * there will be no free urb). */
|
|
- if (!in_irq())
|
|
- goto retry;
|
|
-
|
|
- clear_bit_unlock(USB_SERIAL_WRITE_BUSY, &port->flags);
|
|
-
|
|
- return 0;
|
|
+ goto retry; /* try sending off another urb */
|
|
}
|
|
|
|
/**
|
|
diff --git a/fs/ceph/addr.c b/fs/ceph/addr.c
|
|
index bb01881cb1f2..9fdc0513fb4c 100644
|
|
--- a/fs/ceph/addr.c
|
|
+++ b/fs/ceph/addr.c
|
|
@@ -213,9 +213,13 @@ static int readpage_nounlock(struct file *filp, struct page *page)
|
|
if (err < 0) {
|
|
SetPageError(page);
|
|
goto out;
|
|
- } else if (err < PAGE_CACHE_SIZE) {
|
|
+ } else {
|
|
+ if (err < PAGE_CACHE_SIZE) {
|
|
/* zero fill remainder of page */
|
|
- zero_user_segment(page, err, PAGE_CACHE_SIZE);
|
|
+ zero_user_segment(page, err, PAGE_CACHE_SIZE);
|
|
+ } else {
|
|
+ flush_dcache_page(page);
|
|
+ }
|
|
}
|
|
SetPageUptodate(page);
|
|
|
|
diff --git a/fs/ceph/mds_client.c b/fs/ceph/mds_client.c
|
|
index cf1b9e043b08..ae3ca035bad3 100644
|
|
--- a/fs/ceph/mds_client.c
|
|
+++ b/fs/ceph/mds_client.c
|
|
@@ -609,6 +609,8 @@ static void __unregister_request(struct ceph_mds_client *mdsc,
|
|
req->r_unsafe_dir = NULL;
|
|
}
|
|
|
|
+ complete_all(&req->r_safe_completion);
|
|
+
|
|
ceph_mdsc_put_request(req);
|
|
}
|
|
|
|
@@ -1815,8 +1817,11 @@ static int __do_request(struct ceph_mds_client *mdsc,
|
|
int mds = -1;
|
|
int err = -EAGAIN;
|
|
|
|
- if (req->r_err || req->r_got_result)
|
|
+ if (req->r_err || req->r_got_result) {
|
|
+ if (req->r_aborted)
|
|
+ __unregister_request(mdsc, req);
|
|
goto out;
|
|
+ }
|
|
|
|
if (req->r_timeout &&
|
|
time_after_eq(jiffies, req->r_started + req->r_timeout)) {
|
|
@@ -2129,7 +2134,6 @@ static void handle_reply(struct ceph_mds_session *session, struct ceph_msg *msg)
|
|
if (head->safe) {
|
|
req->r_got_safe = true;
|
|
__unregister_request(mdsc, req);
|
|
- complete_all(&req->r_safe_completion);
|
|
|
|
if (req->r_got_unsafe) {
|
|
/*
|
|
diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c
|
|
index b9a3726ea048..c883561e9b61 100644
|
|
--- a/fs/ext4/extents.c
|
|
+++ b/fs/ext4/extents.c
|
|
@@ -317,8 +317,10 @@ static int ext4_valid_extent(struct inode *inode, struct ext4_extent *ext)
|
|
{
|
|
ext4_fsblk_t block = ext4_ext_pblock(ext);
|
|
int len = ext4_ext_get_actual_len(ext);
|
|
+ ext4_lblk_t lblock = le32_to_cpu(ext->ee_block);
|
|
+ ext4_lblk_t last = lblock + len - 1;
|
|
|
|
- if (len == 0)
|
|
+ if (lblock > last)
|
|
return 0;
|
|
return ext4_data_block_valid(EXT4_SB(inode->i_sb), block, len);
|
|
}
|
|
@@ -344,11 +346,26 @@ static int ext4_valid_extent_entries(struct inode *inode,
|
|
if (depth == 0) {
|
|
/* leaf entries */
|
|
struct ext4_extent *ext = EXT_FIRST_EXTENT(eh);
|
|
+ struct ext4_super_block *es = EXT4_SB(inode->i_sb)->s_es;
|
|
+ ext4_fsblk_t pblock = 0;
|
|
+ ext4_lblk_t lblock = 0;
|
|
+ ext4_lblk_t prev = 0;
|
|
+ int len = 0;
|
|
while (entries) {
|
|
if (!ext4_valid_extent(inode, ext))
|
|
return 0;
|
|
+
|
|
+ /* Check for overlapping extents */
|
|
+ lblock = le32_to_cpu(ext->ee_block);
|
|
+ len = ext4_ext_get_actual_len(ext);
|
|
+ if ((lblock <= prev) && prev) {
|
|
+ pblock = ext4_ext_pblock(ext);
|
|
+ es->s_last_error_block = cpu_to_le64(pblock);
|
|
+ return 0;
|
|
+ }
|
|
ext++;
|
|
entries--;
|
|
+ prev = lblock + len - 1;
|
|
}
|
|
} else {
|
|
struct ext4_extent_idx *ext_idx = EXT_FIRST_INDEX(eh);
|
|
diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c
|
|
index 878484256a6f..2941ee6ef24f 100644
|
|
--- a/fs/ext4/mballoc.c
|
|
+++ b/fs/ext4/mballoc.c
|
|
@@ -3326,6 +3326,9 @@ static void ext4_mb_pa_callback(struct rcu_head *head)
|
|
{
|
|
struct ext4_prealloc_space *pa;
|
|
pa = container_of(head, struct ext4_prealloc_space, u.pa_rcu);
|
|
+
|
|
+ BUG_ON(atomic_read(&pa->pa_count));
|
|
+ BUG_ON(pa->pa_deleted == 0);
|
|
kmem_cache_free(ext4_pspace_cachep, pa);
|
|
}
|
|
|
|
@@ -3339,11 +3342,13 @@ static void ext4_mb_put_pa(struct ext4_allocation_context *ac,
|
|
ext4_group_t grp;
|
|
ext4_fsblk_t grp_blk;
|
|
|
|
- if (!atomic_dec_and_test(&pa->pa_count) || pa->pa_free != 0)
|
|
- return;
|
|
-
|
|
/* in this short window concurrent discard can set pa_deleted */
|
|
spin_lock(&pa->pa_lock);
|
|
+ if (!atomic_dec_and_test(&pa->pa_count) || pa->pa_free != 0) {
|
|
+ spin_unlock(&pa->pa_lock);
|
|
+ return;
|
|
+ }
|
|
+
|
|
if (pa->pa_deleted == 1) {
|
|
spin_unlock(&pa->pa_lock);
|
|
return;
|
|
diff --git a/fs/gfs2/aops.c b/fs/gfs2/aops.c
|
|
index 9b2ff0e851b1..40bd9999250b 100644
|
|
--- a/fs/gfs2/aops.c
|
|
+++ b/fs/gfs2/aops.c
|
|
@@ -1012,6 +1012,7 @@ static ssize_t gfs2_direct_IO(int rw, struct kiocb *iocb,
|
|
{
|
|
struct file *file = iocb->ki_filp;
|
|
struct inode *inode = file->f_mapping->host;
|
|
+ struct address_space *mapping = inode->i_mapping;
|
|
struct gfs2_inode *ip = GFS2_I(inode);
|
|
struct gfs2_holder gh;
|
|
int rv;
|
|
@@ -1032,6 +1033,35 @@ static ssize_t gfs2_direct_IO(int rw, struct kiocb *iocb,
|
|
if (rv != 1)
|
|
goto out; /* dio not valid, fall back to buffered i/o */
|
|
|
|
+ /*
|
|
+ * Now since we are holding a deferred (CW) lock at this point, you
|
|
+ * might be wondering why this is ever needed. There is a case however
|
|
+ * where we've granted a deferred local lock against a cached exclusive
|
|
+ * glock. That is ok provided all granted local locks are deferred, but
|
|
+ * it also means that it is possible to encounter pages which are
|
|
+ * cached and possibly also mapped. So here we check for that and sort
|
|
+ * them out ahead of the dio. The glock state machine will take care of
|
|
+ * everything else.
|
|
+ *
|
|
+ * If in fact the cached glock state (gl->gl_state) is deferred (CW) in
|
|
+ * the first place, mapping->nr_pages will always be zero.
|
|
+ */
|
|
+ if (mapping->nrpages) {
|
|
+ loff_t lstart = offset & (PAGE_CACHE_SIZE - 1);
|
|
+ loff_t len = iov_length(iov, nr_segs);
|
|
+ loff_t end = PAGE_ALIGN(offset + len) - 1;
|
|
+
|
|
+ rv = 0;
|
|
+ if (len == 0)
|
|
+ goto out;
|
|
+ if (test_and_clear_bit(GIF_SW_PAGED, &ip->i_flags))
|
|
+ unmap_shared_mapping_range(ip->i_inode.i_mapping, offset, len);
|
|
+ rv = filemap_write_and_wait_range(mapping, lstart, end);
|
|
+ if (rv)
|
|
+ return rv;
|
|
+ truncate_inode_pages_range(mapping, lstart, end);
|
|
+ }
|
|
+
|
|
rv = __blockdev_direct_IO(rw, iocb, inode, inode->i_sb->s_bdev, iov,
|
|
offset, nr_segs, gfs2_get_block_direct,
|
|
NULL, NULL, 0);
|
|
diff --git a/fs/gfs2/ops_fstype.c b/fs/gfs2/ops_fstype.c
|
|
index 6f3a18f9e176..c0c529dc34aa 100644
|
|
--- a/fs/gfs2/ops_fstype.c
|
|
+++ b/fs/gfs2/ops_fstype.c
|
|
@@ -1298,8 +1298,18 @@ static struct dentry *gfs2_mount(struct file_system_type *fs_type, int flags,
|
|
if (IS_ERR(s))
|
|
goto error_bdev;
|
|
|
|
- if (s->s_root)
|
|
+ if (s->s_root) {
|
|
+ /*
|
|
+ * s_umount nests inside bd_mutex during
|
|
+ * __invalidate_device(). blkdev_put() acquires
|
|
+ * bd_mutex and can't be called under s_umount. Drop
|
|
+ * s_umount temporarily. This is safe as we're
|
|
+ * holding an active reference.
|
|
+ */
|
|
+ up_write(&s->s_umount);
|
|
blkdev_put(bdev, mode);
|
|
+ down_write(&s->s_umount);
|
|
+ }
|
|
|
|
memset(&args, 0, sizeof(args));
|
|
args.ar_quota = GFS2_QUOTA_DEFAULT;
|
|
diff --git a/fs/jbd2/transaction.c b/fs/jbd2/transaction.c
|
|
index f5671271b5ba..f512c690d38e 100644
|
|
--- a/fs/jbd2/transaction.c
|
|
+++ b/fs/jbd2/transaction.c
|
|
@@ -1126,7 +1126,10 @@ int jbd2_journal_dirty_metadata(handle_t *handle, struct buffer_head *bh)
|
|
* once a transaction -bzzz
|
|
*/
|
|
jh->b_modified = 1;
|
|
- J_ASSERT_JH(jh, handle->h_buffer_credits > 0);
|
|
+ if (handle->h_buffer_credits <= 0) {
|
|
+ ret = -ENOSPC;
|
|
+ goto out_unlock_bh;
|
|
+ }
|
|
handle->h_buffer_credits--;
|
|
}
|
|
|
|
@@ -1209,7 +1212,6 @@ out_unlock_bh:
|
|
jbd2_journal_put_journal_head(jh);
|
|
out:
|
|
JBUFFER_TRACE(jh, "exit");
|
|
- WARN_ON(ret); /* All errors are bugs, so dump the stack */
|
|
return ret;
|
|
}
|
|
|
|
diff --git a/include/drm/drm_pciids.h b/include/drm/drm_pciids.h
|
|
index 1a13caac89d9..757f98066d6b 100644
|
|
--- a/include/drm/drm_pciids.h
|
|
+++ b/include/drm/drm_pciids.h
|
|
@@ -544,7 +544,7 @@
|
|
{0x1002, 0x9645, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SUMO2|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \
|
|
{0x1002, 0x9647, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SUMO|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP},\
|
|
{0x1002, 0x9648, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SUMO|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP},\
|
|
- {0x1002, 0x9649, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SUMO|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP},\
|
|
+ {0x1002, 0x9649, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SUMO2|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP},\
|
|
{0x1002, 0x964a, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SUMO|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \
|
|
{0x1002, 0x964b, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SUMO|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \
|
|
{0x1002, 0x964c, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SUMO|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \
|
|
diff --git a/kernel/sched/debug.c b/kernel/sched/debug.c
|
|
index 09acaa15161d..2f9ac8ff1e80 100644
|
|
--- a/kernel/sched/debug.c
|
|
+++ b/kernel/sched/debug.c
|
|
@@ -215,6 +215,14 @@ void print_cfs_rq(struct seq_file *m, int cpu, struct cfs_rq *cfs_rq)
|
|
SEQ_printf(m, " .%-30s: %d\n", "load_tg",
|
|
atomic_read(&cfs_rq->tg->load_weight));
|
|
#endif
|
|
+#ifdef CONFIG_CFS_BANDWIDTH
|
|
+ SEQ_printf(m, " .%-30s: %d\n", "tg->cfs_bandwidth.timer_active",
|
|
+ cfs_rq->tg->cfs_bandwidth.timer_active);
|
|
+ SEQ_printf(m, " .%-30s: %d\n", "throttled",
|
|
+ cfs_rq->throttled);
|
|
+ SEQ_printf(m, " .%-30s: %d\n", "throttle_count",
|
|
+ cfs_rq->throttle_count);
|
|
+#endif
|
|
|
|
print_cfs_group_stats(m, cpu, cfs_rq->tg);
|
|
#endif
|
|
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
|
|
index 33c8b6038002..efe9253bd235 100644
|
|
--- a/kernel/sched/fair.c
|
|
+++ b/kernel/sched/fair.c
|
|
@@ -1655,6 +1655,8 @@ static void throttle_cfs_rq(struct cfs_rq *cfs_rq)
|
|
cfs_rq->throttled_timestamp = rq->clock;
|
|
raw_spin_lock(&cfs_b->lock);
|
|
list_add_tail_rcu(&cfs_rq->throttled_list, &cfs_b->throttled_cfs_rq);
|
|
+ if (!cfs_b->timer_active)
|
|
+ __start_cfs_bandwidth(cfs_b);
|
|
raw_spin_unlock(&cfs_b->lock);
|
|
}
|
|
|
|
diff --git a/kernel/sched/rt.c b/kernel/sched/rt.c
|
|
index ead0336007be..580d05b1784d 100644
|
|
--- a/kernel/sched/rt.c
|
|
+++ b/kernel/sched/rt.c
|
|
@@ -942,6 +942,13 @@ inc_rt_prio_smp(struct rt_rq *rt_rq, int prio, int prev_prio)
|
|
{
|
|
struct rq *rq = rq_of_rt_rq(rt_rq);
|
|
|
|
+#ifdef CONFIG_RT_GROUP_SCHED
|
|
+ /*
|
|
+ * Change rq's cpupri only if rt_rq is the top queue.
|
|
+ */
|
|
+ if (&rq->rt != rt_rq)
|
|
+ return;
|
|
+#endif
|
|
if (rq->online && prio < prev_prio)
|
|
cpupri_set(&rq->rd->cpupri, rq->cpu, prio);
|
|
}
|
|
@@ -951,6 +958,13 @@ dec_rt_prio_smp(struct rt_rq *rt_rq, int prio, int prev_prio)
|
|
{
|
|
struct rq *rq = rq_of_rt_rq(rt_rq);
|
|
|
|
+#ifdef CONFIG_RT_GROUP_SCHED
|
|
+ /*
|
|
+ * Change rq's cpupri only if rt_rq is the top queue.
|
|
+ */
|
|
+ if (&rq->rt != rt_rq)
|
|
+ return;
|
|
+#endif
|
|
if (rq->online && rt_rq->highest_prio.curr != prev_prio)
|
|
cpupri_set(&rq->rd->cpupri, rq->cpu, rt_rq->highest_prio.curr);
|
|
}
|
|
diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c
|
|
index 8c8169bf5020..f0e76e93aee5 100644
|
|
--- a/kernel/trace/ftrace.c
|
|
+++ b/kernel/trace/ftrace.c
|
|
@@ -688,7 +688,7 @@ static int ftrace_profile_init(void)
|
|
int cpu;
|
|
int ret = 0;
|
|
|
|
- for_each_online_cpu(cpu) {
|
|
+ for_each_possible_cpu(cpu) {
|
|
ret = ftrace_profile_init_cpu(cpu);
|
|
if (ret)
|
|
break;
|
|
diff --git a/mm/rmap.c b/mm/rmap.c
|
|
index bfca52c96999..f02c862fab69 100644
|
|
--- a/mm/rmap.c
|
|
+++ b/mm/rmap.c
|
|
@@ -623,7 +623,11 @@ pte_t *__page_check_address(struct page *page, struct mm_struct *mm,
|
|
spinlock_t *ptl;
|
|
|
|
if (unlikely(PageHuge(page))) {
|
|
+ /* when pud is not present, pte will be NULL */
|
|
pte = huge_pte_offset(mm, address);
|
|
+ if (!pte)
|
|
+ return NULL;
|
|
+
|
|
ptl = &mm->page_table_lock;
|
|
goto check;
|
|
}
|
|
diff --git a/net/wireless/radiotap.c b/net/wireless/radiotap.c
|
|
index 617a310025b1..60549a4a2f98 100644
|
|
--- a/net/wireless/radiotap.c
|
|
+++ b/net/wireless/radiotap.c
|
|
@@ -122,6 +122,10 @@ int ieee80211_radiotap_iterator_init(
|
|
/* find payload start allowing for extended bitmap(s) */
|
|
|
|
if (iterator->_bitmap_shifter & (1<<IEEE80211_RADIOTAP_EXT)) {
|
|
+ if ((unsigned long)iterator->_arg -
|
|
+ (unsigned long)iterator->_rtheader + sizeof(uint32_t) >
|
|
+ (unsigned long)iterator->_max_length)
|
|
+ return -EINVAL;
|
|
while (get_unaligned_le32(iterator->_arg) &
|
|
(1 << IEEE80211_RADIOTAP_EXT)) {
|
|
iterator->_arg += sizeof(uint32_t);
|
|
diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c
|
|
index d32db4140aa0..9f6380ec1305 100644
|
|
--- a/security/selinux/hooks.c
|
|
+++ b/security/selinux/hooks.c
|
|
@@ -3720,7 +3720,7 @@ static int selinux_skb_peerlbl_sid(struct sk_buff *skb, u16 family, u32 *sid)
|
|
u32 nlbl_sid;
|
|
u32 nlbl_type;
|
|
|
|
- selinux_skb_xfrm_sid(skb, &xfrm_sid);
|
|
+ selinux_xfrm_skb_sid(skb, &xfrm_sid);
|
|
selinux_netlbl_skbuff_getsid(skb, family, &nlbl_type, &nlbl_sid);
|
|
|
|
err = security_net_peersid_resolve(nlbl_sid, nlbl_type, xfrm_sid, sid);
|
|
@@ -4240,8 +4240,10 @@ static int selinux_socket_sock_rcv_skb(struct sock *sk, struct sk_buff *skb)
|
|
}
|
|
err = avc_has_perm(sk_sid, peer_sid, SECCLASS_PEER,
|
|
PEER__RECV, &ad);
|
|
- if (err)
|
|
+ if (err) {
|
|
selinux_netlbl_err(skb, err, 0);
|
|
+ return err;
|
|
+ }
|
|
}
|
|
|
|
if (secmark_active) {
|
|
@@ -4727,22 +4729,32 @@ static unsigned int selinux_ip_postroute(struct sk_buff *skb, int ifindex,
|
|
* as fast and as clean as possible. */
|
|
if (!selinux_policycap_netpeer)
|
|
return selinux_ip_postroute_compat(skb, ifindex, family);
|
|
+
|
|
+ secmark_active = selinux_secmark_enabled();
|
|
+ peerlbl_active = netlbl_enabled() || selinux_xfrm_enabled();
|
|
+ if (!secmark_active && !peerlbl_active)
|
|
+ return NF_ACCEPT;
|
|
+
|
|
+ sk = skb->sk;
|
|
+
|
|
#ifdef CONFIG_XFRM
|
|
/* If skb->dst->xfrm is non-NULL then the packet is undergoing an IPsec
|
|
* packet transformation so allow the packet to pass without any checks
|
|
* since we'll have another chance to perform access control checks
|
|
* when the packet is on it's final way out.
|
|
* NOTE: there appear to be some IPv6 multicast cases where skb->dst
|
|
- * is NULL, in this case go ahead and apply access control. */
|
|
- if (skb_dst(skb) != NULL && skb_dst(skb)->xfrm != NULL)
|
|
+ * is NULL, in this case go ahead and apply access control.
|
|
+ * is NULL, in this case go ahead and apply access control.
|
|
+ * NOTE: if this is a local socket (skb->sk != NULL) that is in the
|
|
+ * TCP listening state we cannot wait until the XFRM processing
|
|
+ * is done as we will miss out on the SA label if we do;
|
|
+ * unfortunately, this means more work, but it is only once per
|
|
+ * connection. */
|
|
+ if (skb_dst(skb) != NULL && skb_dst(skb)->xfrm != NULL &&
|
|
+ !(sk != NULL && sk->sk_state == TCP_LISTEN))
|
|
return NF_ACCEPT;
|
|
#endif
|
|
- secmark_active = selinux_secmark_enabled();
|
|
- peerlbl_active = netlbl_enabled() || selinux_xfrm_enabled();
|
|
- if (!secmark_active && !peerlbl_active)
|
|
- return NF_ACCEPT;
|
|
|
|
- sk = skb->sk;
|
|
if (sk == NULL) {
|
|
/* Without an associated socket the packet is either coming
|
|
* from the kernel or it is being forwarded; check the packet
|
|
@@ -4770,6 +4782,25 @@ static unsigned int selinux_ip_postroute(struct sk_buff *skb, int ifindex,
|
|
struct sk_security_struct *sksec = sk->sk_security;
|
|
if (selinux_skb_peerlbl_sid(skb, family, &skb_sid))
|
|
return NF_DROP;
|
|
+ /* At this point, if the returned skb peerlbl is SECSID_NULL
|
|
+ * and the packet has been through at least one XFRM
|
|
+ * transformation then we must be dealing with the "final"
|
|
+ * form of labeled IPsec packet; since we've already applied
|
|
+ * all of our access controls on this packet we can safely
|
|
+ * pass the packet. */
|
|
+ if (skb_sid == SECSID_NULL) {
|
|
+ switch (family) {
|
|
+ case PF_INET:
|
|
+ if (IPCB(skb)->flags & IPSKB_XFRM_TRANSFORMED)
|
|
+ return NF_ACCEPT;
|
|
+ break;
|
|
+ case PF_INET6:
|
|
+ if (IP6CB(skb)->flags & IP6SKB_XFRM_TRANSFORMED)
|
|
+ return NF_ACCEPT;
|
|
+ default:
|
|
+ return NF_DROP_ERR(-ECONNREFUSED);
|
|
+ }
|
|
+ }
|
|
if (selinux_conn_sid(sksec->sid, skb_sid, &peer_sid))
|
|
return NF_DROP;
|
|
secmark_perm = PACKET__SEND;
|
|
@@ -5443,11 +5474,11 @@ static int selinux_setprocattr(struct task_struct *p,
|
|
/* Check for ptracing, and update the task SID if ok.
|
|
Otherwise, leave SID unchanged and fail. */
|
|
ptsid = 0;
|
|
- task_lock(p);
|
|
+ rcu_read_lock();
|
|
tracer = ptrace_parent(p);
|
|
if (tracer)
|
|
ptsid = task_sid(tracer);
|
|
- task_unlock(p);
|
|
+ rcu_read_unlock();
|
|
|
|
if (tracer) {
|
|
error = avc_has_perm(ptsid, sid, SECCLASS_PROCESS,
|
|
diff --git a/security/selinux/include/xfrm.h b/security/selinux/include/xfrm.h
|
|
index c220f314709c..d1c980cee5d1 100644
|
|
--- a/security/selinux/include/xfrm.h
|
|
+++ b/security/selinux/include/xfrm.h
|
|
@@ -47,6 +47,7 @@ int selinux_xfrm_sock_rcv_skb(u32 sid, struct sk_buff *skb,
|
|
int selinux_xfrm_postroute_last(u32 isec_sid, struct sk_buff *skb,
|
|
struct common_audit_data *ad, u8 proto);
|
|
int selinux_xfrm_decode_session(struct sk_buff *skb, u32 *sid, int ckall);
|
|
+int selinux_xfrm_skb_sid(struct sk_buff *skb, u32 *sid);
|
|
|
|
static inline void selinux_xfrm_notify_policyload(void)
|
|
{
|
|
@@ -79,12 +80,12 @@ static inline int selinux_xfrm_decode_session(struct sk_buff *skb, u32 *sid, int
|
|
static inline void selinux_xfrm_notify_policyload(void)
|
|
{
|
|
}
|
|
-#endif
|
|
|
|
-static inline void selinux_skb_xfrm_sid(struct sk_buff *skb, u32 *sid)
|
|
+static inline int selinux_xfrm_skb_sid(struct sk_buff *skb, u32 *sid)
|
|
{
|
|
- int err = selinux_xfrm_decode_session(skb, sid, 0);
|
|
- BUG_ON(err);
|
|
+ *sid = SECSID_NULL;
|
|
+ return 0;
|
|
}
|
|
+#endif
|
|
|
|
#endif /* _SELINUX_XFRM_H_ */
|
|
diff --git a/security/selinux/xfrm.c b/security/selinux/xfrm.c
|
|
index 8ab295154517..1552b910d9e2 100644
|
|
--- a/security/selinux/xfrm.c
|
|
+++ b/security/selinux/xfrm.c
|
|
@@ -152,21 +152,13 @@ int selinux_xfrm_state_pol_flow_match(struct xfrm_state *x, struct xfrm_policy *
|
|
return rc;
|
|
}
|
|
|
|
-/*
|
|
- * LSM hook implementation that checks and/or returns the xfrm sid for the
|
|
- * incoming packet.
|
|
- */
|
|
-
|
|
-int selinux_xfrm_decode_session(struct sk_buff *skb, u32 *sid, int ckall)
|
|
+static int selinux_xfrm_skb_sid_ingress(struct sk_buff *skb,
|
|
+ u32 *sid, int ckall)
|
|
{
|
|
- struct sec_path *sp;
|
|
+ struct sec_path *sp = skb->sp;
|
|
|
|
*sid = SECSID_NULL;
|
|
|
|
- if (skb == NULL)
|
|
- return 0;
|
|
-
|
|
- sp = skb->sp;
|
|
if (sp) {
|
|
int i, sid_set = 0;
|
|
|
|
@@ -190,6 +182,45 @@ int selinux_xfrm_decode_session(struct sk_buff *skb, u32 *sid, int ckall)
|
|
return 0;
|
|
}
|
|
|
|
+static u32 selinux_xfrm_skb_sid_egress(struct sk_buff *skb)
|
|
+{
|
|
+ struct dst_entry *dst = skb_dst(skb);
|
|
+ struct xfrm_state *x;
|
|
+
|
|
+ if (dst == NULL)
|
|
+ return SECSID_NULL;
|
|
+ x = dst->xfrm;
|
|
+ if (x == NULL || !selinux_authorizable_xfrm(x))
|
|
+ return SECSID_NULL;
|
|
+
|
|
+ return x->security->ctx_sid;
|
|
+}
|
|
+
|
|
+/*
|
|
+ * LSM hook implementation that checks and/or returns the xfrm sid for the
|
|
+ * incoming packet.
|
|
+ */
|
|
+
|
|
+int selinux_xfrm_decode_session(struct sk_buff *skb, u32 *sid, int ckall)
|
|
+{
|
|
+ if (skb == NULL) {
|
|
+ *sid = SECSID_NULL;
|
|
+ return 0;
|
|
+ }
|
|
+ return selinux_xfrm_skb_sid_ingress(skb, sid, ckall);
|
|
+}
|
|
+
|
|
+int selinux_xfrm_skb_sid(struct sk_buff *skb, u32 *sid)
|
|
+{
|
|
+ int rc;
|
|
+
|
|
+ rc = selinux_xfrm_skb_sid_ingress(skb, sid, 0);
|
|
+ if (rc == 0 && *sid == SECSID_NULL)
|
|
+ *sid = selinux_xfrm_skb_sid_egress(skb);
|
|
+
|
|
+ return rc;
|
|
+}
|
|
+
|
|
/*
|
|
* Security blob allocation for xfrm_policy and xfrm_state
|
|
* CTX does not have a meaningful value on input
|
|
diff --git a/sound/core/pcm_lib.c b/sound/core/pcm_lib.c
|
|
index 4d18941178e6..370fc56d2de7 100644
|
|
--- a/sound/core/pcm_lib.c
|
|
+++ b/sound/core/pcm_lib.c
|
|
@@ -1847,6 +1847,8 @@ static int wait_for_avail(struct snd_pcm_substream *substream,
|
|
case SNDRV_PCM_STATE_DISCONNECTED:
|
|
err = -EBADFD;
|
|
goto _endloop;
|
|
+ case SNDRV_PCM_STATE_PAUSED:
|
|
+ continue;
|
|
}
|
|
if (!tout) {
|
|
snd_printd("%s write error (DMA or IRQ trouble?)\n",
|
|
diff --git a/sound/soc/codecs/wm8904.c b/sound/soc/codecs/wm8904.c
|
|
index 4e190b5950ba..c93e360b6706 100644
|
|
--- a/sound/soc/codecs/wm8904.c
|
|
+++ b/sound/soc/codecs/wm8904.c
|
|
@@ -1456,7 +1456,7 @@ static int wm8904_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
|
|
|
|
switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
|
|
case SND_SOC_DAIFMT_DSP_B:
|
|
- aif1 |= WM8904_AIF_LRCLK_INV;
|
|
+ aif1 |= 0x3 | WM8904_AIF_LRCLK_INV;
|
|
case SND_SOC_DAIFMT_DSP_A:
|
|
aif1 |= 0x3;
|
|
break;
|
|
diff --git a/tools/power/cpupower/utils/cpupower-set.c b/tools/power/cpupower/utils/cpupower-set.c
|
|
index dc4de3762111..bcf1d2f0b791 100644
|
|
--- a/tools/power/cpupower/utils/cpupower-set.c
|
|
+++ b/tools/power/cpupower/utils/cpupower-set.c
|
|
@@ -18,9 +18,9 @@
|
|
#include "helpers/bitmask.h"
|
|
|
|
static struct option set_opts[] = {
|
|
- { .name = "perf-bias", .has_arg = optional_argument, .flag = NULL, .val = 'b'},
|
|
- { .name = "sched-mc", .has_arg = optional_argument, .flag = NULL, .val = 'm'},
|
|
- { .name = "sched-smt", .has_arg = optional_argument, .flag = NULL, .val = 's'},
|
|
+ { .name = "perf-bias", .has_arg = required_argument, .flag = NULL, .val = 'b'},
|
|
+ { .name = "sched-mc", .has_arg = required_argument, .flag = NULL, .val = 'm'},
|
|
+ { .name = "sched-smt", .has_arg = required_argument, .flag = NULL, .val = 's'},
|
|
{ },
|
|
};
|
|
|