mirror of
https://github.com/LibreELEC/LibreELEC.tv.git
synced 2025-07-24 11:16:51 +00:00
linux-imx6: update to latest stable/linux-3.14.y - Linux 3.14.36
Signed-off-by: Paolo Pisati <p.pisati@gmail.com>
This commit is contained in:
parent
a46d773acb
commit
f9e4c0b900
2603
projects/imx6/patches/linux/linux-000-patch-3.14.25-26.patch
Normal file
2603
projects/imx6/patches/linux/linux-000-patch-3.14.25-26.patch
Normal file
File diff suppressed because it is too large
Load Diff
914
projects/imx6/patches/linux/linux-000-patch-3.14.26-27.patch
Normal file
914
projects/imx6/patches/linux/linux-000-patch-3.14.26-27.patch
Normal file
@ -0,0 +1,914 @@
|
||||
diff --git a/Makefile b/Makefile
|
||||
index 63a5ee8..944db23 100644
|
||||
--- a/Makefile
|
||||
+++ b/Makefile
|
||||
@@ -1,6 +1,6 @@
|
||||
VERSION = 3
|
||||
PATCHLEVEL = 14
|
||||
-SUBLEVEL = 26
|
||||
+SUBLEVEL = 27
|
||||
EXTRAVERSION =
|
||||
NAME = Remembering Coco
|
||||
|
||||
diff --git a/arch/powerpc/kernel/vdso32/getcpu.S b/arch/powerpc/kernel/vdso32/getcpu.S
|
||||
index 47afd08..fe7e97a 100644
|
||||
--- a/arch/powerpc/kernel/vdso32/getcpu.S
|
||||
+++ b/arch/powerpc/kernel/vdso32/getcpu.S
|
||||
@@ -30,8 +30,8 @@
|
||||
V_FUNCTION_BEGIN(__kernel_getcpu)
|
||||
.cfi_startproc
|
||||
mfspr r5,SPRN_USPRG3
|
||||
- cmpdi cr0,r3,0
|
||||
- cmpdi cr1,r4,0
|
||||
+ cmpwi cr0,r3,0
|
||||
+ cmpwi cr1,r4,0
|
||||
clrlwi r6,r5,16
|
||||
rlwinm r7,r5,16,31-15,31-0
|
||||
beq cr0,1f
|
||||
diff --git a/arch/x86/boot/compressed/Makefile b/arch/x86/boot/compressed/Makefile
|
||||
index 14fe7cb..b5bb498 100644
|
||||
--- a/arch/x86/boot/compressed/Makefile
|
||||
+++ b/arch/x86/boot/compressed/Makefile
|
||||
@@ -75,7 +75,7 @@ suffix-$(CONFIG_KERNEL_XZ) := xz
|
||||
suffix-$(CONFIG_KERNEL_LZO) := lzo
|
||||
suffix-$(CONFIG_KERNEL_LZ4) := lz4
|
||||
|
||||
-RUN_SIZE = $(shell objdump -h vmlinux | \
|
||||
+RUN_SIZE = $(shell $(OBJDUMP) -h vmlinux | \
|
||||
perl $(srctree)/arch/x86/tools/calc_run_size.pl)
|
||||
quiet_cmd_mkpiggy = MKPIGGY $@
|
||||
cmd_mkpiggy = $(obj)/mkpiggy $< $(RUN_SIZE) > $@ || ( rm -f $@ ; false )
|
||||
diff --git a/arch/x86/kernel/cpu/perf_event.c b/arch/x86/kernel/cpu/perf_event.c
|
||||
index 79f9f84..fb345c4 100644
|
||||
--- a/arch/x86/kernel/cpu/perf_event.c
|
||||
+++ b/arch/x86/kernel/cpu/perf_event.c
|
||||
@@ -118,6 +118,9 @@ static int x86_pmu_extra_regs(u64 config, struct perf_event *event)
|
||||
continue;
|
||||
if (event->attr.config1 & ~er->valid_mask)
|
||||
return -EINVAL;
|
||||
+ /* Check if the extra msrs can be safely accessed*/
|
||||
+ if (!er->extra_msr_access)
|
||||
+ return -ENXIO;
|
||||
|
||||
reg->idx = er->idx;
|
||||
reg->config = event->attr.config1;
|
||||
diff --git a/arch/x86/kernel/cpu/perf_event.h b/arch/x86/kernel/cpu/perf_event.h
|
||||
index 4972c24..7876c34 100644
|
||||
--- a/arch/x86/kernel/cpu/perf_event.h
|
||||
+++ b/arch/x86/kernel/cpu/perf_event.h
|
||||
@@ -293,14 +293,16 @@ struct extra_reg {
|
||||
u64 config_mask;
|
||||
u64 valid_mask;
|
||||
int idx; /* per_xxx->regs[] reg index */
|
||||
+ bool extra_msr_access;
|
||||
};
|
||||
|
||||
#define EVENT_EXTRA_REG(e, ms, m, vm, i) { \
|
||||
- .event = (e), \
|
||||
- .msr = (ms), \
|
||||
- .config_mask = (m), \
|
||||
- .valid_mask = (vm), \
|
||||
- .idx = EXTRA_REG_##i, \
|
||||
+ .event = (e), \
|
||||
+ .msr = (ms), \
|
||||
+ .config_mask = (m), \
|
||||
+ .valid_mask = (vm), \
|
||||
+ .idx = EXTRA_REG_##i, \
|
||||
+ .extra_msr_access = true, \
|
||||
}
|
||||
|
||||
#define INTEL_EVENT_EXTRA_REG(event, msr, vm, idx) \
|
||||
diff --git a/arch/x86/kernel/cpu/perf_event_intel.c b/arch/x86/kernel/cpu/perf_event_intel.c
|
||||
index 5ee8064..d4c0a0e 100644
|
||||
--- a/arch/x86/kernel/cpu/perf_event_intel.c
|
||||
+++ b/arch/x86/kernel/cpu/perf_event_intel.c
|
||||
@@ -2183,6 +2183,41 @@ static void intel_snb_check_microcode(void)
|
||||
}
|
||||
}
|
||||
|
||||
+/*
|
||||
+ * Under certain circumstances, access certain MSR may cause #GP.
|
||||
+ * The function tests if the input MSR can be safely accessed.
|
||||
+ */
|
||||
+static bool check_msr(unsigned long msr, u64 mask)
|
||||
+{
|
||||
+ u64 val_old, val_new, val_tmp;
|
||||
+
|
||||
+ /*
|
||||
+ * Read the current value, change it and read it back to see if it
|
||||
+ * matches, this is needed to detect certain hardware emulators
|
||||
+ * (qemu/kvm) that don't trap on the MSR access and always return 0s.
|
||||
+ */
|
||||
+ if (rdmsrl_safe(msr, &val_old))
|
||||
+ return false;
|
||||
+
|
||||
+ /*
|
||||
+ * Only change the bits which can be updated by wrmsrl.
|
||||
+ */
|
||||
+ val_tmp = val_old ^ mask;
|
||||
+ if (wrmsrl_safe(msr, val_tmp) ||
|
||||
+ rdmsrl_safe(msr, &val_new))
|
||||
+ return false;
|
||||
+
|
||||
+ if (val_new != val_tmp)
|
||||
+ return false;
|
||||
+
|
||||
+ /* Here it's sure that the MSR can be safely accessed.
|
||||
+ * Restore the old value and return.
|
||||
+ */
|
||||
+ wrmsrl(msr, val_old);
|
||||
+
|
||||
+ return true;
|
||||
+}
|
||||
+
|
||||
static __init void intel_sandybridge_quirk(void)
|
||||
{
|
||||
x86_pmu.check_microcode = intel_snb_check_microcode;
|
||||
@@ -2272,7 +2307,8 @@ __init int intel_pmu_init(void)
|
||||
union cpuid10_ebx ebx;
|
||||
struct event_constraint *c;
|
||||
unsigned int unused;
|
||||
- int version;
|
||||
+ struct extra_reg *er;
|
||||
+ int version, i;
|
||||
|
||||
if (!cpu_has(&boot_cpu_data, X86_FEATURE_ARCH_PERFMON)) {
|
||||
switch (boot_cpu_data.x86) {
|
||||
@@ -2578,6 +2614,34 @@ __init int intel_pmu_init(void)
|
||||
}
|
||||
}
|
||||
|
||||
+ /*
|
||||
+ * Access LBR MSR may cause #GP under certain circumstances.
|
||||
+ * E.g. KVM doesn't support LBR MSR
|
||||
+ * Check all LBT MSR here.
|
||||
+ * Disable LBR access if any LBR MSRs can not be accessed.
|
||||
+ */
|
||||
+ if (x86_pmu.lbr_nr && !check_msr(x86_pmu.lbr_tos, 0x3UL))
|
||||
+ x86_pmu.lbr_nr = 0;
|
||||
+ for (i = 0; i < x86_pmu.lbr_nr; i++) {
|
||||
+ if (!(check_msr(x86_pmu.lbr_from + i, 0xffffUL) &&
|
||||
+ check_msr(x86_pmu.lbr_to + i, 0xffffUL)))
|
||||
+ x86_pmu.lbr_nr = 0;
|
||||
+ }
|
||||
+
|
||||
+ /*
|
||||
+ * Access extra MSR may cause #GP under certain circumstances.
|
||||
+ * E.g. KVM doesn't support offcore event
|
||||
+ * Check all extra_regs here.
|
||||
+ */
|
||||
+ if (x86_pmu.extra_regs) {
|
||||
+ for (er = x86_pmu.extra_regs; er->msr; er++) {
|
||||
+ er->extra_msr_access = check_msr(er->msr, 0x1ffUL);
|
||||
+ /* Disable LBR select mapping */
|
||||
+ if ((er->idx == EXTRA_REG_LBR) && !er->extra_msr_access)
|
||||
+ x86_pmu.lbr_sel_map = NULL;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
/* Support full width counters using alternative MSR range */
|
||||
if (x86_pmu.intel_cap.full_width_write) {
|
||||
x86_pmu.max_period = x86_pmu.cntval_mask;
|
||||
diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c
|
||||
index e662f14..cc5f102 100644
|
||||
--- a/drivers/ata/ahci.c
|
||||
+++ b/drivers/ata/ahci.c
|
||||
@@ -322,6 +322,9 @@ static const struct pci_device_id ahci_pci_tbl[] = {
|
||||
{ PCI_VDEVICE(INTEL, 0x8c87), board_ahci }, /* 9 Series RAID */
|
||||
{ PCI_VDEVICE(INTEL, 0x8c8e), board_ahci }, /* 9 Series RAID */
|
||||
{ PCI_VDEVICE(INTEL, 0x8c8f), board_ahci }, /* 9 Series RAID */
|
||||
+ { PCI_VDEVICE(INTEL, 0x9d03), board_ahci }, /* Sunrise Point-LP AHCI */
|
||||
+ { PCI_VDEVICE(INTEL, 0x9d05), board_ahci }, /* Sunrise Point-LP RAID */
|
||||
+ { PCI_VDEVICE(INTEL, 0x9d07), board_ahci }, /* Sunrise Point-LP RAID */
|
||||
{ PCI_VDEVICE(INTEL, 0xa103), board_ahci }, /* Sunrise Point-H AHCI */
|
||||
{ PCI_VDEVICE(INTEL, 0xa103), board_ahci }, /* Sunrise Point-H RAID */
|
||||
{ PCI_VDEVICE(INTEL, 0xa105), board_ahci }, /* Sunrise Point-H RAID */
|
||||
@@ -493,6 +496,7 @@ static const struct pci_device_id ahci_pci_tbl[] = {
|
||||
* enabled. https://bugzilla.kernel.org/show_bug.cgi?id=60731
|
||||
*/
|
||||
{ PCI_VDEVICE(SAMSUNG, 0x1600), board_ahci_nomsi },
|
||||
+ { PCI_VDEVICE(SAMSUNG, 0xa800), board_ahci_nomsi },
|
||||
|
||||
/* Enmotus */
|
||||
{ PCI_DEVICE(0x1c44, 0x8000), board_ahci },
|
||||
diff --git a/drivers/ata/sata_fsl.c b/drivers/ata/sata_fsl.c
|
||||
index fb0b40a..ee2780d 100644
|
||||
--- a/drivers/ata/sata_fsl.c
|
||||
+++ b/drivers/ata/sata_fsl.c
|
||||
@@ -1503,7 +1503,7 @@ static int sata_fsl_probe(struct platform_device *ofdev)
|
||||
host_priv->csr_base = csr_base;
|
||||
|
||||
irq = irq_of_parse_and_map(ofdev->dev.of_node, 0);
|
||||
- if (irq < 0) {
|
||||
+ if (!irq) {
|
||||
dev_err(&ofdev->dev, "invalid irq from platform\n");
|
||||
goto error_exit_with_cleanup;
|
||||
}
|
||||
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
|
||||
index b6fb3eb..c514690 100644
|
||||
--- a/drivers/gpu/drm/i915/intel_display.c
|
||||
+++ b/drivers/gpu/drm/i915/intel_display.c
|
||||
@@ -3817,7 +3817,6 @@ static void ironlake_crtc_disable(struct drm_crtc *crtc)
|
||||
ironlake_fdi_disable(crtc);
|
||||
|
||||
ironlake_disable_pch_transcoder(dev_priv, pipe);
|
||||
- intel_set_pch_fifo_underrun_reporting(dev, pipe, true);
|
||||
|
||||
if (HAS_PCH_CPT(dev)) {
|
||||
/* disable TRANS_DP_CTL */
|
||||
@@ -3883,7 +3882,6 @@ static void haswell_crtc_disable(struct drm_crtc *crtc)
|
||||
|
||||
if (intel_crtc->config.has_pch_encoder) {
|
||||
lpt_disable_pch_transcoder(dev_priv);
|
||||
- intel_set_pch_fifo_underrun_reporting(dev, TRANSCODER_A, true);
|
||||
intel_ddi_fdi_disable(crtc);
|
||||
}
|
||||
|
||||
diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c
|
||||
index 67c9ff3..af49b24 100644
|
||||
--- a/drivers/gpu/drm/i915/intel_lvds.c
|
||||
+++ b/drivers/gpu/drm/i915/intel_lvds.c
|
||||
@@ -905,6 +905,17 @@ void intel_lvds_init(struct drm_device *dev)
|
||||
int pipe;
|
||||
u8 pin;
|
||||
|
||||
+ /*
|
||||
+ * Unlock registers and just leave them unlocked. Do this before
|
||||
+ * checking quirk lists to avoid bogus WARNINGs.
|
||||
+ */
|
||||
+ if (HAS_PCH_SPLIT(dev)) {
|
||||
+ I915_WRITE(PCH_PP_CONTROL,
|
||||
+ I915_READ(PCH_PP_CONTROL) | PANEL_UNLOCK_REGS);
|
||||
+ } else {
|
||||
+ I915_WRITE(PP_CONTROL,
|
||||
+ I915_READ(PP_CONTROL) | PANEL_UNLOCK_REGS);
|
||||
+ }
|
||||
if (!intel_lvds_supported(dev))
|
||||
return;
|
||||
|
||||
@@ -1099,17 +1110,6 @@ out:
|
||||
DRM_DEBUG_KMS("detected %s-link lvds configuration\n",
|
||||
lvds_encoder->is_dual_link ? "dual" : "single");
|
||||
|
||||
- /*
|
||||
- * Unlock registers and just
|
||||
- * leave them unlocked
|
||||
- */
|
||||
- if (HAS_PCH_SPLIT(dev)) {
|
||||
- I915_WRITE(PCH_PP_CONTROL,
|
||||
- I915_READ(PCH_PP_CONTROL) | PANEL_UNLOCK_REGS);
|
||||
- } else {
|
||||
- I915_WRITE(PP_CONTROL,
|
||||
- I915_READ(PP_CONTROL) | PANEL_UNLOCK_REGS);
|
||||
- }
|
||||
lvds_connector->lid_notifier.notifier_call = intel_lid_notify;
|
||||
if (acpi_lid_notifier_register(&lvds_connector->lid_notifier)) {
|
||||
DRM_DEBUG_KMS("lid notifier registration failed\n");
|
||||
diff --git a/drivers/gpu/drm/radeon/radeon_kms.c b/drivers/gpu/drm/radeon/radeon_kms.c
|
||||
index 0bc9106..6bffe82 100644
|
||||
--- a/drivers/gpu/drm/radeon/radeon_kms.c
|
||||
+++ b/drivers/gpu/drm/radeon/radeon_kms.c
|
||||
@@ -740,6 +740,8 @@ int radeon_get_vblank_timestamp_kms(struct drm_device *dev, int crtc,
|
||||
|
||||
/* Get associated drm_crtc: */
|
||||
drmcrtc = &rdev->mode_info.crtcs[crtc]->base;
|
||||
+ if (!drmcrtc)
|
||||
+ return -EINVAL;
|
||||
|
||||
/* Helper routine in DRM core does all the work: */
|
||||
return drm_calc_vbltimestamp_from_scanoutpos(dev, crtc, max_error,
|
||||
diff --git a/drivers/i2c/busses/i2c-davinci.c b/drivers/i2c/busses/i2c-davinci.c
|
||||
index af0b583..e3c6a96 100644
|
||||
--- a/drivers/i2c/busses/i2c-davinci.c
|
||||
+++ b/drivers/i2c/busses/i2c-davinci.c
|
||||
@@ -411,11 +411,9 @@ i2c_davinci_xfer_msg(struct i2c_adapter *adap, struct i2c_msg *msg, int stop)
|
||||
if (dev->cmd_err & DAVINCI_I2C_STR_NACK) {
|
||||
if (msg->flags & I2C_M_IGNORE_NAK)
|
||||
return msg->len;
|
||||
- if (stop) {
|
||||
- w = davinci_i2c_read_reg(dev, DAVINCI_I2C_MDR_REG);
|
||||
- w |= DAVINCI_I2C_MDR_STP;
|
||||
- davinci_i2c_write_reg(dev, DAVINCI_I2C_MDR_REG, w);
|
||||
- }
|
||||
+ w = davinci_i2c_read_reg(dev, DAVINCI_I2C_MDR_REG);
|
||||
+ w |= DAVINCI_I2C_MDR_STP;
|
||||
+ davinci_i2c_write_reg(dev, DAVINCI_I2C_MDR_REG, w);
|
||||
return -EREMOTEIO;
|
||||
}
|
||||
return -EIO;
|
||||
diff --git a/drivers/i2c/busses/i2c-omap.c b/drivers/i2c/busses/i2c-omap.c
|
||||
index 90dcc2e..a686057 100644
|
||||
--- a/drivers/i2c/busses/i2c-omap.c
|
||||
+++ b/drivers/i2c/busses/i2c-omap.c
|
||||
@@ -926,14 +926,12 @@ omap_i2c_isr_thread(int this_irq, void *dev_id)
|
||||
if (stat & OMAP_I2C_STAT_NACK) {
|
||||
err |= OMAP_I2C_STAT_NACK;
|
||||
omap_i2c_ack_stat(dev, OMAP_I2C_STAT_NACK);
|
||||
- break;
|
||||
}
|
||||
|
||||
if (stat & OMAP_I2C_STAT_AL) {
|
||||
dev_err(dev->dev, "Arbitration lost\n");
|
||||
err |= OMAP_I2C_STAT_AL;
|
||||
omap_i2c_ack_stat(dev, OMAP_I2C_STAT_AL);
|
||||
- break;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -958,11 +956,13 @@ omap_i2c_isr_thread(int this_irq, void *dev_id)
|
||||
if (dev->fifo_size)
|
||||
num_bytes = dev->buf_len;
|
||||
|
||||
- omap_i2c_receive_data(dev, num_bytes, true);
|
||||
-
|
||||
- if (dev->errata & I2C_OMAP_ERRATA_I207)
|
||||
+ if (dev->errata & I2C_OMAP_ERRATA_I207) {
|
||||
i2c_omap_errata_i207(dev, stat);
|
||||
+ num_bytes = (omap_i2c_read_reg(dev,
|
||||
+ OMAP_I2C_BUFSTAT_REG) >> 8) & 0x3F;
|
||||
+ }
|
||||
|
||||
+ omap_i2c_receive_data(dev, num_bytes, true);
|
||||
omap_i2c_ack_stat(dev, OMAP_I2C_STAT_RDR);
|
||||
continue;
|
||||
}
|
||||
diff --git a/drivers/media/i2c/smiapp/smiapp-core.c b/drivers/media/i2c/smiapp/smiapp-core.c
|
||||
index 8741cae..7026ab0 100644
|
||||
--- a/drivers/media/i2c/smiapp/smiapp-core.c
|
||||
+++ b/drivers/media/i2c/smiapp/smiapp-core.c
|
||||
@@ -2138,7 +2138,7 @@ static int smiapp_set_selection(struct v4l2_subdev *subdev,
|
||||
ret = smiapp_set_compose(subdev, fh, sel);
|
||||
break;
|
||||
default:
|
||||
- BUG();
|
||||
+ ret = -EINVAL;
|
||||
}
|
||||
|
||||
mutex_unlock(&sensor->mutex);
|
||||
diff --git a/drivers/net/ethernet/broadcom/tg3.c b/drivers/net/ethernet/broadcom/tg3.c
|
||||
index 9373f1f..086eac5 100644
|
||||
--- a/drivers/net/ethernet/broadcom/tg3.c
|
||||
+++ b/drivers/net/ethernet/broadcom/tg3.c
|
||||
@@ -8548,7 +8548,8 @@ static int tg3_init_rings(struct tg3 *tp)
|
||||
if (tnapi->rx_rcb)
|
||||
memset(tnapi->rx_rcb, 0, TG3_RX_RCB_RING_BYTES(tp));
|
||||
|
||||
- if (tg3_rx_prodring_alloc(tp, &tnapi->prodring)) {
|
||||
+ if (tnapi->prodring.rx_std &&
|
||||
+ tg3_rx_prodring_alloc(tp, &tnapi->prodring)) {
|
||||
tg3_free_rings(tp);
|
||||
return -ENOMEM;
|
||||
}
|
||||
diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c
|
||||
index 5ca8c47..206e79d 100644
|
||||
--- a/drivers/net/ethernet/intel/igb/igb_main.c
|
||||
+++ b/drivers/net/ethernet/intel/igb/igb_main.c
|
||||
@@ -1613,6 +1613,8 @@ void igb_power_up_link(struct igb_adapter *adapter)
|
||||
igb_power_up_phy_copper(&adapter->hw);
|
||||
else
|
||||
igb_power_up_serdes_link_82575(&adapter->hw);
|
||||
+
|
||||
+ igb_setup_link(&adapter->hw);
|
||||
}
|
||||
|
||||
/**
|
||||
diff --git a/drivers/net/ethernet/marvell/mvneta.c b/drivers/net/ethernet/marvell/mvneta.c
|
||||
index c4c00d9f..96fc7fe 100644
|
||||
--- a/drivers/net/ethernet/marvell/mvneta.c
|
||||
+++ b/drivers/net/ethernet/marvell/mvneta.c
|
||||
@@ -213,7 +213,7 @@
|
||||
/* Various constants */
|
||||
|
||||
/* Coalescing */
|
||||
-#define MVNETA_TXDONE_COAL_PKTS 16
|
||||
+#define MVNETA_TXDONE_COAL_PKTS 1
|
||||
#define MVNETA_RX_COAL_PKTS 32
|
||||
#define MVNETA_RX_COAL_USEC 100
|
||||
|
||||
@@ -1612,6 +1612,7 @@ static int mvneta_tx(struct sk_buff *skb, struct net_device *dev)
|
||||
u16 txq_id = skb_get_queue_mapping(skb);
|
||||
struct mvneta_tx_queue *txq = &pp->txqs[txq_id];
|
||||
struct mvneta_tx_desc *tx_desc;
|
||||
+ int len = skb->len;
|
||||
struct netdev_queue *nq;
|
||||
int frags = 0;
|
||||
u32 tx_cmd;
|
||||
@@ -1675,7 +1676,7 @@ out:
|
||||
|
||||
u64_stats_update_begin(&stats->syncp);
|
||||
stats->tx_packets++;
|
||||
- stats->tx_bytes += skb->len;
|
||||
+ stats->tx_bytes += len;
|
||||
u64_stats_update_end(&stats->syncp);
|
||||
} else {
|
||||
dev->stats.tx_dropped++;
|
||||
diff --git a/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c b/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c
|
||||
index 57428a0..1e8a4b4 100644
|
||||
--- a/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c
|
||||
+++ b/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c
|
||||
@@ -1456,7 +1456,7 @@ static int qp_alloc_res(struct mlx4_dev *dev, int slave, int op, int cmd,
|
||||
|
||||
switch (op) {
|
||||
case RES_OP_RESERVE:
|
||||
- count = get_param_l(&in_param);
|
||||
+ count = get_param_l(&in_param) & 0xffffff;
|
||||
align = get_param_h(&in_param);
|
||||
err = mlx4_grant_resource(dev, slave, RES_QP, count, 0);
|
||||
if (err)
|
||||
diff --git a/drivers/net/vxlan.c b/drivers/net/vxlan.c
|
||||
index 5441b49..5988910 100644
|
||||
--- a/drivers/net/vxlan.c
|
||||
+++ b/drivers/net/vxlan.c
|
||||
@@ -2106,9 +2106,8 @@ static int vxlan_init(struct net_device *dev)
|
||||
spin_lock(&vn->sock_lock);
|
||||
vs = vxlan_find_sock(dev_net(dev), ipv6 ? AF_INET6 : AF_INET,
|
||||
vxlan->dst_port);
|
||||
- if (vs) {
|
||||
+ if (vs && atomic_add_unless(&vs->refcnt, 1, 0)) {
|
||||
/* If we have a socket with same port already, reuse it */
|
||||
- atomic_inc(&vs->refcnt);
|
||||
vxlan_vs_add_dev(vs, vxlan);
|
||||
} else {
|
||||
/* otherwise make new socket outside of RTNL */
|
||||
@@ -2574,12 +2573,9 @@ struct vxlan_sock *vxlan_sock_add(struct net *net, __be16 port,
|
||||
|
||||
spin_lock(&vn->sock_lock);
|
||||
vs = vxlan_find_sock(net, ipv6 ? AF_INET6 : AF_INET, port);
|
||||
- if (vs) {
|
||||
- if (vs->rcv == rcv)
|
||||
- atomic_inc(&vs->refcnt);
|
||||
- else
|
||||
+ if (vs && ((vs->rcv != rcv) ||
|
||||
+ !atomic_add_unless(&vs->refcnt, 1, 0)))
|
||||
vs = ERR_PTR(-EBUSY);
|
||||
- }
|
||||
spin_unlock(&vn->sock_lock);
|
||||
|
||||
if (!vs)
|
||||
diff --git a/drivers/net/xen-netfront.c b/drivers/net/xen-netfront.c
|
||||
index e30d800..19db057 100644
|
||||
--- a/drivers/net/xen-netfront.c
|
||||
+++ b/drivers/net/xen-netfront.c
|
||||
@@ -469,9 +469,6 @@ static void xennet_make_frags(struct sk_buff *skb, struct net_device *dev,
|
||||
len = skb_frag_size(frag);
|
||||
offset = frag->page_offset;
|
||||
|
||||
- /* Data must not cross a page boundary. */
|
||||
- BUG_ON(len + offset > PAGE_SIZE<<compound_order(page));
|
||||
-
|
||||
/* Skip unused frames from start of page */
|
||||
page += offset >> PAGE_SHIFT;
|
||||
offset &= ~PAGE_MASK;
|
||||
@@ -479,8 +476,6 @@ static void xennet_make_frags(struct sk_buff *skb, struct net_device *dev,
|
||||
while (len > 0) {
|
||||
unsigned long bytes;
|
||||
|
||||
- BUG_ON(offset >= PAGE_SIZE);
|
||||
-
|
||||
bytes = PAGE_SIZE - offset;
|
||||
if (bytes > len)
|
||||
bytes = len;
|
||||
diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c
|
||||
index 1710a86..faa8b98 100644
|
||||
--- a/drivers/usb/host/xhci-ring.c
|
||||
+++ b/drivers/usb/host/xhci-ring.c
|
||||
@@ -1998,22 +1998,13 @@ static int finish_td(struct xhci_hcd *xhci, struct xhci_td *td,
|
||||
ep->stopped_td = td;
|
||||
return 0;
|
||||
} else {
|
||||
- if (trb_comp_code == COMP_STALL) {
|
||||
- /* The transfer is completed from the driver's
|
||||
- * perspective, but we need to issue a set dequeue
|
||||
- * command for this stalled endpoint to move the dequeue
|
||||
- * pointer past the TD. We can't do that here because
|
||||
- * the halt condition must be cleared first. Let the
|
||||
- * USB class driver clear the stall later.
|
||||
- */
|
||||
- ep->stopped_td = td;
|
||||
- ep->stopped_stream = ep_ring->stream_id;
|
||||
- } else if (xhci_requires_manual_halt_cleanup(xhci,
|
||||
- ep_ctx, trb_comp_code)) {
|
||||
- /* Other types of errors halt the endpoint, but the
|
||||
- * class driver doesn't call usb_reset_endpoint() unless
|
||||
- * the error is -EPIPE. Clear the halted status in the
|
||||
- * xHCI hardware manually.
|
||||
+ if (trb_comp_code == COMP_STALL ||
|
||||
+ xhci_requires_manual_halt_cleanup(xhci, ep_ctx,
|
||||
+ trb_comp_code)) {
|
||||
+ /* Issue a reset endpoint command to clear the host side
|
||||
+ * halt, followed by a set dequeue command to move the
|
||||
+ * dequeue pointer past the TD.
|
||||
+ * The class driver clears the device side halt later.
|
||||
*/
|
||||
xhci_cleanup_halted_endpoint(xhci,
|
||||
slot_id, ep_index, ep_ring->stream_id,
|
||||
@@ -2133,9 +2124,7 @@ static int process_ctrl_td(struct xhci_hcd *xhci, struct xhci_td *td,
|
||||
else
|
||||
td->urb->actual_length = 0;
|
||||
|
||||
- xhci_cleanup_halted_endpoint(xhci,
|
||||
- slot_id, ep_index, 0, td, event_trb);
|
||||
- return finish_td(xhci, td, event_trb, event, ep, status, true);
|
||||
+ return finish_td(xhci, td, event_trb, event, ep, status, false);
|
||||
}
|
||||
/*
|
||||
* Did we transfer any data, despite the errors that might have
|
||||
@@ -2689,17 +2678,8 @@ cleanup:
|
||||
if (ret) {
|
||||
urb = td->urb;
|
||||
urb_priv = urb->hcpriv;
|
||||
- /* Leave the TD around for the reset endpoint function
|
||||
- * to use(but only if it's not a control endpoint,
|
||||
- * since we already queued the Set TR dequeue pointer
|
||||
- * command for stalled control endpoints).
|
||||
- */
|
||||
- if (usb_endpoint_xfer_control(&urb->ep->desc) ||
|
||||
- (trb_comp_code != COMP_STALL &&
|
||||
- trb_comp_code != COMP_BABBLE))
|
||||
- xhci_urb_free_priv(xhci, urb_priv);
|
||||
- else
|
||||
- kfree(urb_priv);
|
||||
+
|
||||
+ xhci_urb_free_priv(xhci, urb_priv);
|
||||
|
||||
usb_hcd_unlink_urb_from_ep(bus_to_hcd(urb->dev->bus), urb);
|
||||
if ((urb->actual_length != urb->transfer_buffer_length &&
|
||||
diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c
|
||||
index 17e3987..16f4f8d 100644
|
||||
--- a/drivers/usb/host/xhci.c
|
||||
+++ b/drivers/usb/host/xhci.c
|
||||
@@ -2925,63 +2925,33 @@ void xhci_cleanup_stalled_ring(struct xhci_hcd *xhci,
|
||||
}
|
||||
}
|
||||
|
||||
-/* Deal with stalled endpoints. The core should have sent the control message
|
||||
- * to clear the halt condition. However, we need to make the xHCI hardware
|
||||
- * reset its sequence number, since a device will expect a sequence number of
|
||||
- * zero after the halt condition is cleared.
|
||||
+/* Called when clearing halted device. The core should have sent the control
|
||||
+ * message to clear the device halt condition. The host side of the halt should
|
||||
+ * already be cleared with a reset endpoint command issued when the STALL tx
|
||||
+ * event was received.
|
||||
+ *
|
||||
* Context: in_interrupt
|
||||
*/
|
||||
+
|
||||
void xhci_endpoint_reset(struct usb_hcd *hcd,
|
||||
struct usb_host_endpoint *ep)
|
||||
{
|
||||
struct xhci_hcd *xhci;
|
||||
- struct usb_device *udev;
|
||||
- unsigned int ep_index;
|
||||
- unsigned long flags;
|
||||
- int ret;
|
||||
- struct xhci_virt_ep *virt_ep;
|
||||
|
||||
xhci = hcd_to_xhci(hcd);
|
||||
- udev = (struct usb_device *) ep->hcpriv;
|
||||
- /* Called with a root hub endpoint (or an endpoint that wasn't added
|
||||
- * with xhci_add_endpoint()
|
||||
- */
|
||||
- if (!ep->hcpriv)
|
||||
- return;
|
||||
- ep_index = xhci_get_endpoint_index(&ep->desc);
|
||||
- virt_ep = &xhci->devs[udev->slot_id]->eps[ep_index];
|
||||
- if (!virt_ep->stopped_td) {
|
||||
- xhci_dbg_trace(xhci, trace_xhci_dbg_reset_ep,
|
||||
- "Endpoint 0x%x not halted, refusing to reset.",
|
||||
- ep->desc.bEndpointAddress);
|
||||
- return;
|
||||
- }
|
||||
- if (usb_endpoint_xfer_control(&ep->desc)) {
|
||||
- xhci_dbg_trace(xhci, trace_xhci_dbg_reset_ep,
|
||||
- "Control endpoint stall already handled.");
|
||||
- return;
|
||||
- }
|
||||
|
||||
- xhci_dbg_trace(xhci, trace_xhci_dbg_reset_ep,
|
||||
- "Queueing reset endpoint command");
|
||||
- spin_lock_irqsave(&xhci->lock, flags);
|
||||
- ret = xhci_queue_reset_ep(xhci, udev->slot_id, ep_index);
|
||||
/*
|
||||
- * Can't change the ring dequeue pointer until it's transitioned to the
|
||||
- * stopped state, which is only upon a successful reset endpoint
|
||||
- * command. Better hope that last command worked!
|
||||
+ * We might need to implement the config ep cmd in xhci 4.8.1 note:
|
||||
+ * The Reset Endpoint Command may only be issued to endpoints in the
|
||||
+ * Halted state. If software wishes reset the Data Toggle or Sequence
|
||||
+ * Number of an endpoint that isn't in the Halted state, then software
|
||||
+ * may issue a Configure Endpoint Command with the Drop and Add bits set
|
||||
+ * for the target endpoint. that is in the Stopped state.
|
||||
*/
|
||||
- if (!ret) {
|
||||
- xhci_cleanup_stalled_ring(xhci, udev, ep_index);
|
||||
- kfree(virt_ep->stopped_td);
|
||||
- xhci_ring_cmd_db(xhci);
|
||||
- }
|
||||
- virt_ep->stopped_td = NULL;
|
||||
- virt_ep->stopped_stream = 0;
|
||||
- spin_unlock_irqrestore(&xhci->lock, flags);
|
||||
|
||||
- if (ret)
|
||||
- xhci_warn(xhci, "FIXME allocate a new ring segment\n");
|
||||
+ /* For now just print debug to follow the situation */
|
||||
+ xhci_dbg(xhci, "Endpoint 0x%x ep reset callback called\n",
|
||||
+ ep->desc.bEndpointAddress);
|
||||
}
|
||||
|
||||
static int xhci_check_streams_endpoint(struct xhci_hcd *xhci,
|
||||
diff --git a/mm/frontswap.c b/mm/frontswap.c
|
||||
index c30eec5..f2a3571 100644
|
||||
--- a/mm/frontswap.c
|
||||
+++ b/mm/frontswap.c
|
||||
@@ -244,8 +244,10 @@ int __frontswap_store(struct page *page)
|
||||
the (older) page from frontswap
|
||||
*/
|
||||
inc_frontswap_failed_stores();
|
||||
- if (dup)
|
||||
+ if (dup) {
|
||||
__frontswap_clear(sis, offset);
|
||||
+ frontswap_ops->invalidate_page(type, offset);
|
||||
+ }
|
||||
}
|
||||
if (frontswap_writethrough_enabled)
|
||||
/* report failure so swap also writes to swap device */
|
||||
diff --git a/mm/memory.c b/mm/memory.c
|
||||
index 492e36f..48d7365 100644
|
||||
--- a/mm/memory.c
|
||||
+++ b/mm/memory.c
|
||||
@@ -808,20 +808,20 @@ copy_one_pte(struct mm_struct *dst_mm, struct mm_struct *src_mm,
|
||||
if (!pte_file(pte)) {
|
||||
swp_entry_t entry = pte_to_swp_entry(pte);
|
||||
|
||||
- if (swap_duplicate(entry) < 0)
|
||||
- return entry.val;
|
||||
-
|
||||
- /* make sure dst_mm is on swapoff's mmlist. */
|
||||
- if (unlikely(list_empty(&dst_mm->mmlist))) {
|
||||
- spin_lock(&mmlist_lock);
|
||||
- if (list_empty(&dst_mm->mmlist))
|
||||
- list_add(&dst_mm->mmlist,
|
||||
- &src_mm->mmlist);
|
||||
- spin_unlock(&mmlist_lock);
|
||||
- }
|
||||
- if (likely(!non_swap_entry(entry)))
|
||||
+ if (likely(!non_swap_entry(entry))) {
|
||||
+ if (swap_duplicate(entry) < 0)
|
||||
+ return entry.val;
|
||||
+
|
||||
+ /* make sure dst_mm is on swapoff's mmlist. */
|
||||
+ if (unlikely(list_empty(&dst_mm->mmlist))) {
|
||||
+ spin_lock(&mmlist_lock);
|
||||
+ if (list_empty(&dst_mm->mmlist))
|
||||
+ list_add(&dst_mm->mmlist,
|
||||
+ &src_mm->mmlist);
|
||||
+ spin_unlock(&mmlist_lock);
|
||||
+ }
|
||||
rss[MM_SWAPENTS]++;
|
||||
- else if (is_migration_entry(entry)) {
|
||||
+ } else if (is_migration_entry(entry)) {
|
||||
page = migration_entry_to_page(entry);
|
||||
|
||||
if (PageAnon(page))
|
||||
diff --git a/mm/mmap.c b/mm/mmap.c
|
||||
index dfe90657..b91ac80 100644
|
||||
--- a/mm/mmap.c
|
||||
+++ b/mm/mmap.c
|
||||
@@ -745,8 +745,11 @@ again: remove_next = 1 + (end > next->vm_end);
|
||||
* shrinking vma had, to cover any anon pages imported.
|
||||
*/
|
||||
if (exporter && exporter->anon_vma && !importer->anon_vma) {
|
||||
- if (anon_vma_clone(importer, exporter))
|
||||
- return -ENOMEM;
|
||||
+ int error;
|
||||
+
|
||||
+ error = anon_vma_clone(importer, exporter);
|
||||
+ if (error)
|
||||
+ return error;
|
||||
importer->anon_vma = exporter->anon_vma;
|
||||
}
|
||||
}
|
||||
@@ -2428,7 +2431,8 @@ static int __split_vma(struct mm_struct * mm, struct vm_area_struct * vma,
|
||||
if (err)
|
||||
goto out_free_vma;
|
||||
|
||||
- if (anon_vma_clone(new, vma))
|
||||
+ err = anon_vma_clone(new, vma);
|
||||
+ if (err)
|
||||
goto out_free_mpol;
|
||||
|
||||
if (new->vm_file)
|
||||
diff --git a/mm/rmap.c b/mm/rmap.c
|
||||
index cdbd312..cab9820 100644
|
||||
--- a/mm/rmap.c
|
||||
+++ b/mm/rmap.c
|
||||
@@ -274,6 +274,7 @@ int anon_vma_fork(struct vm_area_struct *vma, struct vm_area_struct *pvma)
|
||||
{
|
||||
struct anon_vma_chain *avc;
|
||||
struct anon_vma *anon_vma;
|
||||
+ int error;
|
||||
|
||||
/* Don't bother if the parent process has no anon_vma here. */
|
||||
if (!pvma->anon_vma)
|
||||
@@ -283,8 +284,9 @@ int anon_vma_fork(struct vm_area_struct *vma, struct vm_area_struct *pvma)
|
||||
* First, attach the new VMA to the parent VMA's anon_vmas,
|
||||
* so rmap can find non-COWed pages in child processes.
|
||||
*/
|
||||
- if (anon_vma_clone(vma, pvma))
|
||||
- return -ENOMEM;
|
||||
+ error = anon_vma_clone(vma, pvma);
|
||||
+ if (error)
|
||||
+ return error;
|
||||
|
||||
/* Then add our own anon_vma. */
|
||||
anon_vma = anon_vma_alloc();
|
||||
diff --git a/mm/vmpressure.c b/mm/vmpressure.c
|
||||
index d4042e7..c5afd57 100644
|
||||
--- a/mm/vmpressure.c
|
||||
+++ b/mm/vmpressure.c
|
||||
@@ -165,6 +165,7 @@ static void vmpressure_work_fn(struct work_struct *work)
|
||||
unsigned long scanned;
|
||||
unsigned long reclaimed;
|
||||
|
||||
+ spin_lock(&vmpr->sr_lock);
|
||||
/*
|
||||
* Several contexts might be calling vmpressure(), so it is
|
||||
* possible that the work was rescheduled again before the old
|
||||
@@ -173,11 +174,12 @@ static void vmpressure_work_fn(struct work_struct *work)
|
||||
* here. No need for any locks here since we don't care if
|
||||
* vmpr->reclaimed is in sync.
|
||||
*/
|
||||
- if (!vmpr->scanned)
|
||||
+ scanned = vmpr->scanned;
|
||||
+ if (!scanned) {
|
||||
+ spin_unlock(&vmpr->sr_lock);
|
||||
return;
|
||||
+ }
|
||||
|
||||
- spin_lock(&vmpr->sr_lock);
|
||||
- scanned = vmpr->scanned;
|
||||
reclaimed = vmpr->reclaimed;
|
||||
vmpr->scanned = 0;
|
||||
vmpr->reclaimed = 0;
|
||||
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c
|
||||
index b0db904..4617586 100644
|
||||
--- a/net/core/rtnetlink.c
|
||||
+++ b/net/core/rtnetlink.c
|
||||
@@ -1453,6 +1453,7 @@ static int do_setlink(const struct sk_buff *skb,
|
||||
goto errout;
|
||||
}
|
||||
if (!netlink_ns_capable(skb, net->user_ns, CAP_NET_ADMIN)) {
|
||||
+ put_net(net);
|
||||
err = -EPERM;
|
||||
goto errout;
|
||||
}
|
||||
diff --git a/net/ipv4/gre_offload.c b/net/ipv4/gre_offload.c
|
||||
index 8c8493e..278836f 100644
|
||||
--- a/net/ipv4/gre_offload.c
|
||||
+++ b/net/ipv4/gre_offload.c
|
||||
@@ -271,6 +271,9 @@ static int gre_gro_complete(struct sk_buff *skb, int nhoff)
|
||||
err = ptype->callbacks.gro_complete(skb, nhoff + grehlen);
|
||||
|
||||
rcu_read_unlock();
|
||||
+
|
||||
+ skb_set_inner_mac_header(skb, nhoff + grehlen);
|
||||
+
|
||||
return err;
|
||||
}
|
||||
|
||||
diff --git a/net/ipv4/ip_vti.c b/net/ipv4/ip_vti.c
|
||||
index e4a8f76..b0a9cb4 100644
|
||||
--- a/net/ipv4/ip_vti.c
|
||||
+++ b/net/ipv4/ip_vti.c
|
||||
@@ -369,6 +369,7 @@ static struct rtnl_link_ops vti_link_ops __read_mostly = {
|
||||
.validate = vti_tunnel_validate,
|
||||
.newlink = vti_newlink,
|
||||
.changelink = vti_changelink,
|
||||
+ .dellink = ip_tunnel_dellink,
|
||||
.get_size = vti_get_size,
|
||||
.fill_info = vti_fill_info,
|
||||
};
|
||||
diff --git a/net/ipv6/ip6_gre.c b/net/ipv6/ip6_gre.c
|
||||
index b27f6d3..4a230b1 100644
|
||||
--- a/net/ipv6/ip6_gre.c
|
||||
+++ b/net/ipv6/ip6_gre.c
|
||||
@@ -508,11 +508,11 @@ static int ip6gre_rcv(struct sk_buff *skb)
|
||||
|
||||
skb->protocol = gre_proto;
|
||||
/* WCCP version 1 and 2 protocol decoding.
|
||||
- * - Change protocol to IP
|
||||
+ * - Change protocol to IPv6
|
||||
* - When dealing with WCCPv2, Skip extra 4 bytes in GRE header
|
||||
*/
|
||||
if (flags == 0 && gre_proto == htons(ETH_P_WCCP)) {
|
||||
- skb->protocol = htons(ETH_P_IP);
|
||||
+ skb->protocol = htons(ETH_P_IPV6);
|
||||
if ((*(h + offset) & 0xF0) != 0x40)
|
||||
offset += 4;
|
||||
}
|
||||
diff --git a/net/ipv6/ip6_vti.c b/net/ipv6/ip6_vti.c
|
||||
index 9a5339f..28456c9 100644
|
||||
--- a/net/ipv6/ip6_vti.c
|
||||
+++ b/net/ipv6/ip6_vti.c
|
||||
@@ -825,6 +825,15 @@ static int vti6_newlink(struct net *src_net, struct net_device *dev,
|
||||
return vti6_tnl_create2(dev);
|
||||
}
|
||||
|
||||
+static void vti6_dellink(struct net_device *dev, struct list_head *head)
|
||||
+{
|
||||
+ struct net *net = dev_net(dev);
|
||||
+ struct vti6_net *ip6n = net_generic(net, vti6_net_id);
|
||||
+
|
||||
+ if (dev != ip6n->fb_tnl_dev)
|
||||
+ unregister_netdevice_queue(dev, head);
|
||||
+}
|
||||
+
|
||||
static int vti6_changelink(struct net_device *dev, struct nlattr *tb[],
|
||||
struct nlattr *data[])
|
||||
{
|
||||
@@ -900,6 +909,7 @@ static struct rtnl_link_ops vti6_link_ops __read_mostly = {
|
||||
.setup = vti6_dev_setup,
|
||||
.validate = vti6_validate,
|
||||
.newlink = vti6_newlink,
|
||||
+ .dellink = vti6_dellink,
|
||||
.changelink = vti6_changelink,
|
||||
.get_size = vti6_get_size,
|
||||
.fill_info = vti6_fill_info,
|
||||
@@ -945,6 +955,7 @@ static int __net_init vti6_init_net(struct net *net)
|
||||
if (!ip6n->fb_tnl_dev)
|
||||
goto err_alloc_dev;
|
||||
dev_net_set(ip6n->fb_tnl_dev, net);
|
||||
+ ip6n->fb_tnl_dev->rtnl_link_ops = &vti6_link_ops;
|
||||
|
||||
err = vti6_fb_tnl_dev_init(ip6n->fb_tnl_dev);
|
||||
if (err < 0)
|
||||
diff --git a/net/mac80211/aes_ccm.c b/net/mac80211/aes_ccm.c
|
||||
index 7c7df47..f056f9ed 100644
|
||||
--- a/net/mac80211/aes_ccm.c
|
||||
+++ b/net/mac80211/aes_ccm.c
|
||||
@@ -54,6 +54,9 @@ int ieee80211_aes_ccm_decrypt(struct crypto_aead *tfm, u8 *b_0, u8 *aad,
|
||||
|
||||
memset(&aead_req, 0, sizeof(aead_req));
|
||||
|
||||
+ if (data_len == 0)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
sg_init_one(&pt, data, data_len);
|
||||
sg_init_one(&assoc, &aad[2], be16_to_cpup((__be16 *)aad));
|
||||
sg_init_table(ct, 2);
|
||||
diff --git a/net/sctp/output.c b/net/sctp/output.c
|
||||
index 8267b06..740ca5f 100644
|
||||
--- a/net/sctp/output.c
|
||||
+++ b/net/sctp/output.c
|
||||
@@ -401,12 +401,12 @@ int sctp_packet_transmit(struct sctp_packet *packet)
|
||||
sk = chunk->skb->sk;
|
||||
|
||||
/* Allocate the new skb. */
|
||||
- nskb = alloc_skb(packet->size + LL_MAX_HEADER, GFP_ATOMIC);
|
||||
+ nskb = alloc_skb(packet->size + MAX_HEADER, GFP_ATOMIC);
|
||||
if (!nskb)
|
||||
goto nomem;
|
||||
|
||||
/* Make sure the outbound skb has enough header room reserved. */
|
||||
- skb_reserve(nskb, packet->overhead + LL_MAX_HEADER);
|
||||
+ skb_reserve(nskb, packet->overhead + MAX_HEADER);
|
||||
|
||||
/* Set the owning socket so that we know where to get the
|
||||
* destination IP address.
|
||||
diff --git a/sound/pci/hda/patch_analog.c b/sound/pci/hda/patch_analog.c
|
||||
index eaf64ea..1a05efa 100644
|
||||
--- a/sound/pci/hda/patch_analog.c
|
||||
+++ b/sound/pci/hda/patch_analog.c
|
||||
@@ -333,6 +333,7 @@ static const struct hda_fixup ad1986a_fixups[] = {
|
||||
|
||||
static const struct snd_pci_quirk ad1986a_fixup_tbl[] = {
|
||||
SND_PCI_QUIRK(0x103c, 0x30af, "HP B2800", AD1986A_FIXUP_LAPTOP_IMIC),
|
||||
+ SND_PCI_QUIRK(0x1043, 0x1443, "ASUS Z99He", AD1986A_FIXUP_EAPD),
|
||||
SND_PCI_QUIRK(0x1043, 0x1447, "ASUS A8JN", AD1986A_FIXUP_EAPD),
|
||||
SND_PCI_QUIRK_MASK(0x1043, 0xff00, 0x8100, "ASUS P5", AD1986A_FIXUP_3STACK),
|
||||
SND_PCI_QUIRK_MASK(0x1043, 0xff00, 0x8200, "ASUS M2", AD1986A_FIXUP_3STACK),
|
||||
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
|
||||
index 4c826a4..910f2db 100644
|
||||
--- a/sound/pci/hda/patch_realtek.c
|
||||
+++ b/sound/pci/hda/patch_realtek.c
|
||||
@@ -4554,6 +4554,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
||||
SND_PCI_QUIRK(0x17aa, 0x2212, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
|
||||
SND_PCI_QUIRK(0x17aa, 0x2214, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
|
||||
SND_PCI_QUIRK(0x17aa, 0x2215, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
|
||||
+ SND_PCI_QUIRK(0x17aa, 0x3977, "IdeaPad S210", ALC283_FIXUP_INT_MIC),
|
||||
SND_PCI_QUIRK(0x17aa, 0x3978, "IdeaPad Y410P", ALC269_FIXUP_NO_SHUTUP),
|
||||
SND_PCI_QUIRK(0x17aa, 0x5013, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
|
||||
SND_PCI_QUIRK(0x17aa, 0x501a, "Thinkpad", ALC283_FIXUP_INT_MIC),
|
||||
diff --git a/sound/usb/midi.c b/sound/usb/midi.c
|
||||
index b901f46..c7aa71e 100644
|
||||
--- a/sound/usb/midi.c
|
||||
+++ b/sound/usb/midi.c
|
||||
@@ -364,6 +364,8 @@ static void snd_usbmidi_error_timer(unsigned long data)
|
||||
if (in && in->error_resubmit) {
|
||||
in->error_resubmit = 0;
|
||||
for (j = 0; j < INPUT_URBS; ++j) {
|
||||
+ if (atomic_read(&in->urbs[j]->use_count))
|
||||
+ continue;
|
||||
in->urbs[j]->dev = umidi->dev;
|
||||
snd_usbmidi_submit_urb(in->urbs[j], GFP_ATOMIC);
|
||||
}
|
1961
projects/imx6/patches/linux/linux-000-patch-3.14.27-28.patch
Normal file
1961
projects/imx6/patches/linux/linux-000-patch-3.14.27-28.patch
Normal file
File diff suppressed because it is too large
Load Diff
2545
projects/imx6/patches/linux/linux-000-patch-3.14.28-29.patch
Normal file
2545
projects/imx6/patches/linux/linux-000-patch-3.14.28-29.patch
Normal file
File diff suppressed because it is too large
Load Diff
4387
projects/imx6/patches/linux/linux-000-patch-3.14.29-30.patch
Normal file
4387
projects/imx6/patches/linux/linux-000-patch-3.14.29-30.patch
Normal file
File diff suppressed because it is too large
Load Diff
5731
projects/imx6/patches/linux/linux-000-patch-3.14.30-31.patch
Normal file
5731
projects/imx6/patches/linux/linux-000-patch-3.14.30-31.patch
Normal file
File diff suppressed because it is too large
Load Diff
1098
projects/imx6/patches/linux/linux-000-patch-3.14.31-32.patch
Normal file
1098
projects/imx6/patches/linux/linux-000-patch-3.14.31-32.patch
Normal file
File diff suppressed because it is too large
Load Diff
942
projects/imx6/patches/linux/linux-000-patch-3.14.32-33.patch
Normal file
942
projects/imx6/patches/linux/linux-000-patch-3.14.32-33.patch
Normal file
@ -0,0 +1,942 @@
|
||||
diff --git a/Makefile b/Makefile
|
||||
index 00fffa3..b0963ca 100644
|
||||
--- a/Makefile
|
||||
+++ b/Makefile
|
||||
@@ -1,6 +1,6 @@
|
||||
VERSION = 3
|
||||
PATCHLEVEL = 14
|
||||
-SUBLEVEL = 32
|
||||
+SUBLEVEL = 33
|
||||
EXTRAVERSION =
|
||||
NAME = Remembering Coco
|
||||
|
||||
diff --git a/arch/arm/mm/context.c b/arch/arm/mm/context.c
|
||||
index 6eb97b3..4370933 100644
|
||||
--- a/arch/arm/mm/context.c
|
||||
+++ b/arch/arm/mm/context.c
|
||||
@@ -144,21 +144,17 @@ static void flush_context(unsigned int cpu)
|
||||
/* Update the list of reserved ASIDs and the ASID bitmap. */
|
||||
bitmap_clear(asid_map, 0, NUM_USER_ASIDS);
|
||||
for_each_possible_cpu(i) {
|
||||
- if (i == cpu) {
|
||||
- asid = 0;
|
||||
- } else {
|
||||
- asid = atomic64_xchg(&per_cpu(active_asids, i), 0);
|
||||
- /*
|
||||
- * If this CPU has already been through a
|
||||
- * rollover, but hasn't run another task in
|
||||
- * the meantime, we must preserve its reserved
|
||||
- * ASID, as this is the only trace we have of
|
||||
- * the process it is still running.
|
||||
- */
|
||||
- if (asid == 0)
|
||||
- asid = per_cpu(reserved_asids, i);
|
||||
- __set_bit(asid & ~ASID_MASK, asid_map);
|
||||
- }
|
||||
+ asid = atomic64_xchg(&per_cpu(active_asids, i), 0);
|
||||
+ /*
|
||||
+ * If this CPU has already been through a
|
||||
+ * rollover, but hasn't run another task in
|
||||
+ * the meantime, we must preserve its reserved
|
||||
+ * ASID, as this is the only trace we have of
|
||||
+ * the process it is still running.
|
||||
+ */
|
||||
+ if (asid == 0)
|
||||
+ asid = per_cpu(reserved_asids, i);
|
||||
+ __set_bit(asid & ~ASID_MASK, asid_map);
|
||||
per_cpu(reserved_asids, i) = asid;
|
||||
}
|
||||
|
||||
diff --git a/arch/arm64/include/asm/cputype.h b/arch/arm64/include/asm/cputype.h
|
||||
index c404fb0..64bc6c6 100644
|
||||
--- a/arch/arm64/include/asm/cputype.h
|
||||
+++ b/arch/arm64/include/asm/cputype.h
|
||||
@@ -77,6 +77,8 @@ static inline u32 __attribute_const__ read_cpuid_cachetype(void)
|
||||
return read_cpuid(CTR_EL0);
|
||||
}
|
||||
|
||||
+void cpuinfo_store_cpu(void);
|
||||
+
|
||||
#endif /* __ASSEMBLY__ */
|
||||
|
||||
#endif
|
||||
diff --git a/arch/arm64/kernel/setup.c b/arch/arm64/kernel/setup.c
|
||||
index 071c382..1e01d80 100644
|
||||
--- a/arch/arm64/kernel/setup.c
|
||||
+++ b/arch/arm64/kernel/setup.c
|
||||
@@ -41,6 +41,7 @@
|
||||
#include <linux/memblock.h>
|
||||
#include <linux/of_fdt.h>
|
||||
#include <linux/of_platform.h>
|
||||
+#include <linux/personality.h>
|
||||
|
||||
#include <asm/cputype.h>
|
||||
#include <asm/elf.h>
|
||||
@@ -73,7 +74,6 @@ unsigned int compat_elf_hwcap __read_mostly = COMPAT_ELF_HWCAP_DEFAULT;
|
||||
#endif
|
||||
|
||||
static const char *cpu_name;
|
||||
-static const char *machine_name;
|
||||
phys_addr_t __fdt_pointer __initdata;
|
||||
|
||||
/*
|
||||
@@ -193,6 +193,19 @@ static void __init smp_build_mpidr_hash(void)
|
||||
}
|
||||
#endif
|
||||
|
||||
+struct cpuinfo_arm64 {
|
||||
+ struct cpu cpu;
|
||||
+ u32 reg_midr;
|
||||
+};
|
||||
+
|
||||
+static DEFINE_PER_CPU(struct cpuinfo_arm64, cpu_data);
|
||||
+
|
||||
+void cpuinfo_store_cpu(void)
|
||||
+{
|
||||
+ struct cpuinfo_arm64 *info = this_cpu_ptr(&cpu_data);
|
||||
+ info->reg_midr = read_cpuid_id();
|
||||
+}
|
||||
+
|
||||
static void __init setup_processor(void)
|
||||
{
|
||||
struct cpu_info *cpu_info;
|
||||
@@ -213,6 +226,8 @@ static void __init setup_processor(void)
|
||||
sprintf(init_utsname()->machine, ELF_PLATFORM);
|
||||
elf_hwcap = 0;
|
||||
|
||||
+ cpuinfo_store_cpu();
|
||||
+
|
||||
/*
|
||||
* ID_AA64ISAR0_EL1 contains 4-bit wide signed feature blocks.
|
||||
* The blocks we test below represent incremental functionality
|
||||
@@ -257,8 +272,6 @@ static void __init setup_machine_fdt(phys_addr_t dt_phys)
|
||||
while (true)
|
||||
cpu_relax();
|
||||
}
|
||||
-
|
||||
- machine_name = of_flat_dt_get_machine_name();
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -363,14 +376,12 @@ static int __init arm64_device_init(void)
|
||||
}
|
||||
arch_initcall(arm64_device_init);
|
||||
|
||||
-static DEFINE_PER_CPU(struct cpu, cpu_data);
|
||||
-
|
||||
static int __init topology_init(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
for_each_possible_cpu(i) {
|
||||
- struct cpu *cpu = &per_cpu(cpu_data, i);
|
||||
+ struct cpu *cpu = &per_cpu(cpu_data.cpu, i);
|
||||
cpu->hotpluggable = 1;
|
||||
register_cpu(cpu, i);
|
||||
}
|
||||
@@ -391,14 +402,41 @@ static const char *hwcap_str[] = {
|
||||
NULL
|
||||
};
|
||||
|
||||
+#ifdef CONFIG_COMPAT
|
||||
+static const char *compat_hwcap_str[] = {
|
||||
+ "swp",
|
||||
+ "half",
|
||||
+ "thumb",
|
||||
+ "26bit",
|
||||
+ "fastmult",
|
||||
+ "fpa",
|
||||
+ "vfp",
|
||||
+ "edsp",
|
||||
+ "java",
|
||||
+ "iwmmxt",
|
||||
+ "crunch",
|
||||
+ "thumbee",
|
||||
+ "neon",
|
||||
+ "vfpv3",
|
||||
+ "vfpv3d16",
|
||||
+ "tls",
|
||||
+ "vfpv4",
|
||||
+ "idiva",
|
||||
+ "idivt",
|
||||
+ "vfpd32",
|
||||
+ "lpae",
|
||||
+ "evtstrm"
|
||||
+};
|
||||
+#endif /* CONFIG_COMPAT */
|
||||
+
|
||||
static int c_show(struct seq_file *m, void *v)
|
||||
{
|
||||
- int i;
|
||||
-
|
||||
- seq_printf(m, "Processor\t: %s rev %d (%s)\n",
|
||||
- cpu_name, read_cpuid_id() & 15, ELF_PLATFORM);
|
||||
+ int i, j;
|
||||
|
||||
for_each_online_cpu(i) {
|
||||
+ struct cpuinfo_arm64 *cpuinfo = &per_cpu(cpu_data, i);
|
||||
+ u32 midr = cpuinfo->reg_midr;
|
||||
+
|
||||
/*
|
||||
* glibc reads /proc/cpuinfo to determine the number of
|
||||
* online processors, looking for lines beginning with
|
||||
@@ -407,24 +445,33 @@ static int c_show(struct seq_file *m, void *v)
|
||||
#ifdef CONFIG_SMP
|
||||
seq_printf(m, "processor\t: %d\n", i);
|
||||
#endif
|
||||
- }
|
||||
-
|
||||
- /* dump out the processor features */
|
||||
- seq_puts(m, "Features\t: ");
|
||||
-
|
||||
- for (i = 0; hwcap_str[i]; i++)
|
||||
- if (elf_hwcap & (1 << i))
|
||||
- seq_printf(m, "%s ", hwcap_str[i]);
|
||||
|
||||
- seq_printf(m, "\nCPU implementer\t: 0x%02x\n", read_cpuid_id() >> 24);
|
||||
- seq_printf(m, "CPU architecture: AArch64\n");
|
||||
- seq_printf(m, "CPU variant\t: 0x%x\n", (read_cpuid_id() >> 20) & 15);
|
||||
- seq_printf(m, "CPU part\t: 0x%03x\n", (read_cpuid_id() >> 4) & 0xfff);
|
||||
- seq_printf(m, "CPU revision\t: %d\n", read_cpuid_id() & 15);
|
||||
-
|
||||
- seq_puts(m, "\n");
|
||||
+ /*
|
||||
+ * Dump out the common processor features in a single line.
|
||||
+ * Userspace should read the hwcaps with getauxval(AT_HWCAP)
|
||||
+ * rather than attempting to parse this, but there's a body of
|
||||
+ * software which does already (at least for 32-bit).
|
||||
+ */
|
||||
+ seq_puts(m, "Features\t:");
|
||||
+ if (personality(current->personality) == PER_LINUX32) {
|
||||
+#ifdef CONFIG_COMPAT
|
||||
+ for (j = 0; compat_hwcap_str[j]; j++)
|
||||
+ if (compat_elf_hwcap & (1 << j))
|
||||
+ seq_printf(m, " %s", compat_hwcap_str[j]);
|
||||
+#endif /* CONFIG_COMPAT */
|
||||
+ } else {
|
||||
+ for (j = 0; hwcap_str[j]; j++)
|
||||
+ if (elf_hwcap & (1 << j))
|
||||
+ seq_printf(m, " %s", hwcap_str[j]);
|
||||
+ }
|
||||
+ seq_puts(m, "\n");
|
||||
|
||||
- seq_printf(m, "Hardware\t: %s\n", machine_name);
|
||||
+ seq_printf(m, "CPU implementer\t: 0x%02x\n", (midr >> 24));
|
||||
+ seq_printf(m, "CPU architecture: 8\n");
|
||||
+ seq_printf(m, "CPU variant\t: 0x%x\n", ((midr >> 20) & 0xf));
|
||||
+ seq_printf(m, "CPU part\t: 0x%03x\n", ((midr >> 4) & 0xfff));
|
||||
+ seq_printf(m, "CPU revision\t: %d\n\n", (midr & 0xf));
|
||||
+ }
|
||||
|
||||
return 0;
|
||||
}
|
||||
diff --git a/arch/arm64/kernel/smp.c b/arch/arm64/kernel/smp.c
|
||||
index 7cfb92a..7b9542b 100644
|
||||
--- a/arch/arm64/kernel/smp.c
|
||||
+++ b/arch/arm64/kernel/smp.c
|
||||
@@ -148,6 +148,11 @@ asmlinkage void secondary_start_kernel(void)
|
||||
cpu_ops[cpu]->cpu_postboot();
|
||||
|
||||
/*
|
||||
+ * Log the CPU info before it is marked online and might get read.
|
||||
+ */
|
||||
+ cpuinfo_store_cpu();
|
||||
+
|
||||
+ /*
|
||||
* Enable GIC and timers.
|
||||
*/
|
||||
notify_cpu_starting(cpu);
|
||||
diff --git a/arch/mips/cavium-octeon/smp.c b/arch/mips/cavium-octeon/smp.c
|
||||
index 67a078f..34467ac 100644
|
||||
--- a/arch/mips/cavium-octeon/smp.c
|
||||
+++ b/arch/mips/cavium-octeon/smp.c
|
||||
@@ -263,9 +263,7 @@ static int octeon_cpu_disable(void)
|
||||
|
||||
set_cpu_online(cpu, false);
|
||||
cpu_clear(cpu, cpu_callin_map);
|
||||
- local_irq_disable();
|
||||
octeon_fixup_irqs();
|
||||
- local_irq_enable();
|
||||
|
||||
flush_cache_all();
|
||||
local_flush_tlb_all();
|
||||
diff --git a/arch/mips/kernel/irq_cpu.c b/arch/mips/kernel/irq_cpu.c
|
||||
index e498f2b..f5598e2 100644
|
||||
--- a/arch/mips/kernel/irq_cpu.c
|
||||
+++ b/arch/mips/kernel/irq_cpu.c
|
||||
@@ -56,6 +56,8 @@ static struct irq_chip mips_cpu_irq_controller = {
|
||||
.irq_mask_ack = mask_mips_irq,
|
||||
.irq_unmask = unmask_mips_irq,
|
||||
.irq_eoi = unmask_mips_irq,
|
||||
+ .irq_disable = mask_mips_irq,
|
||||
+ .irq_enable = unmask_mips_irq,
|
||||
};
|
||||
|
||||
/*
|
||||
@@ -92,6 +94,8 @@ static struct irq_chip mips_mt_cpu_irq_controller = {
|
||||
.irq_mask_ack = mips_mt_cpu_irq_ack,
|
||||
.irq_unmask = unmask_mips_irq,
|
||||
.irq_eoi = unmask_mips_irq,
|
||||
+ .irq_disable = mask_mips_irq,
|
||||
+ .irq_enable = unmask_mips_irq,
|
||||
};
|
||||
|
||||
void __init mips_cpu_irq_init(void)
|
||||
diff --git a/arch/mips/kernel/smp.c b/arch/mips/kernel/smp.c
|
||||
index 0a022ee..18ed112 100644
|
||||
--- a/arch/mips/kernel/smp.c
|
||||
+++ b/arch/mips/kernel/smp.c
|
||||
@@ -109,10 +109,10 @@ asmlinkage void start_secondary(void)
|
||||
else
|
||||
#endif /* CONFIG_MIPS_MT_SMTC */
|
||||
cpu_probe();
|
||||
- cpu_report();
|
||||
per_cpu_trap_init(false);
|
||||
mips_clockevent_init();
|
||||
mp_ops->init_secondary();
|
||||
+ cpu_report();
|
||||
|
||||
/*
|
||||
* XXX parity protection should be folded in here when it's converted
|
||||
diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
|
||||
index de42688..80c22a3 100644
|
||||
--- a/arch/x86/kvm/vmx.c
|
||||
+++ b/arch/x86/kvm/vmx.c
|
||||
@@ -441,6 +441,7 @@ struct vcpu_vmx {
|
||||
#endif
|
||||
int gs_ldt_reload_needed;
|
||||
int fs_reload_needed;
|
||||
+ unsigned long vmcs_host_cr4; /* May not match real cr4 */
|
||||
} host_state;
|
||||
struct {
|
||||
int vm86_active;
|
||||
@@ -4165,11 +4166,16 @@ static void vmx_set_constant_host_state(struct vcpu_vmx *vmx)
|
||||
u32 low32, high32;
|
||||
unsigned long tmpl;
|
||||
struct desc_ptr dt;
|
||||
+ unsigned long cr4;
|
||||
|
||||
vmcs_writel(HOST_CR0, read_cr0() & ~X86_CR0_TS); /* 22.2.3 */
|
||||
- vmcs_writel(HOST_CR4, read_cr4()); /* 22.2.3, 22.2.5 */
|
||||
vmcs_writel(HOST_CR3, read_cr3()); /* 22.2.3 FIXME: shadow tables */
|
||||
|
||||
+ /* Save the most likely value for this task's CR4 in the VMCS. */
|
||||
+ cr4 = read_cr4();
|
||||
+ vmcs_writel(HOST_CR4, cr4); /* 22.2.3, 22.2.5 */
|
||||
+ vmx->host_state.vmcs_host_cr4 = cr4;
|
||||
+
|
||||
vmcs_write16(HOST_CS_SELECTOR, __KERNEL_CS); /* 22.2.4 */
|
||||
#ifdef CONFIG_X86_64
|
||||
/*
|
||||
@@ -7196,7 +7202,7 @@ static void atomic_switch_perf_msrs(struct vcpu_vmx *vmx)
|
||||
static void __noclone vmx_vcpu_run(struct kvm_vcpu *vcpu)
|
||||
{
|
||||
struct vcpu_vmx *vmx = to_vmx(vcpu);
|
||||
- unsigned long debugctlmsr;
|
||||
+ unsigned long debugctlmsr, cr4;
|
||||
|
||||
/* Record the guest's net vcpu time for enforced NMI injections. */
|
||||
if (unlikely(!cpu_has_virtual_nmis() && vmx->soft_vnmi_blocked))
|
||||
@@ -7217,6 +7223,12 @@ static void __noclone vmx_vcpu_run(struct kvm_vcpu *vcpu)
|
||||
if (test_bit(VCPU_REGS_RIP, (unsigned long *)&vcpu->arch.regs_dirty))
|
||||
vmcs_writel(GUEST_RIP, vcpu->arch.regs[VCPU_REGS_RIP]);
|
||||
|
||||
+ cr4 = read_cr4();
|
||||
+ if (unlikely(cr4 != vmx->host_state.vmcs_host_cr4)) {
|
||||
+ vmcs_writel(HOST_CR4, cr4);
|
||||
+ vmx->host_state.vmcs_host_cr4 = cr4;
|
||||
+ }
|
||||
+
|
||||
/* When single-stepping over STI and MOV SS, we must clear the
|
||||
* corresponding interruptibility bits in the guest state. Otherwise
|
||||
* vmentry fails as it then expects bit 14 (BS) in pending debug
|
||||
diff --git a/arch/x86/pci/common.c b/arch/x86/pci/common.c
|
||||
index 981c2db..88f143d 100644
|
||||
--- a/arch/x86/pci/common.c
|
||||
+++ b/arch/x86/pci/common.c
|
||||
@@ -448,6 +448,22 @@ static const struct dmi_system_id pciprobe_dmi_table[] = {
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "ftServer"),
|
||||
},
|
||||
},
|
||||
+ {
|
||||
+ .callback = set_scan_all,
|
||||
+ .ident = "Stratus/NEC ftServer",
|
||||
+ .matches = {
|
||||
+ DMI_MATCH(DMI_SYS_VENDOR, "NEC"),
|
||||
+ DMI_MATCH(DMI_PRODUCT_NAME, "Express5800/R32"),
|
||||
+ },
|
||||
+ },
|
||||
+ {
|
||||
+ .callback = set_scan_all,
|
||||
+ .ident = "Stratus/NEC ftServer",
|
||||
+ .matches = {
|
||||
+ DMI_MATCH(DMI_SYS_VENDOR, "NEC"),
|
||||
+ DMI_MATCH(DMI_PRODUCT_NAME, "Express5800/R31"),
|
||||
+ },
|
||||
+ },
|
||||
{}
|
||||
};
|
||||
|
||||
diff --git a/crypto/crc32c.c b/crypto/crc32c.c
|
||||
index 06f7018..238f0e6 100644
|
||||
--- a/crypto/crc32c.c
|
||||
+++ b/crypto/crc32c.c
|
||||
@@ -170,3 +170,4 @@ module_exit(crc32c_mod_fini);
|
||||
MODULE_AUTHOR("Clay Haapala <chaapala@cisco.com>");
|
||||
MODULE_DESCRIPTION("CRC32c (Castagnoli) calculations wrapper for lib/crc32c");
|
||||
MODULE_LICENSE("GPL");
|
||||
+MODULE_ALIAS_CRYPTO("crc32c");
|
||||
diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c
|
||||
index ccbffd0..8f42bd7 100644
|
||||
--- a/drivers/gpio/gpiolib.c
|
||||
+++ b/drivers/gpio/gpiolib.c
|
||||
@@ -911,6 +911,7 @@ int gpiod_export_link(struct device *dev, const char *name,
|
||||
if (tdev != NULL) {
|
||||
status = sysfs_create_link(&dev->kobj, &tdev->kobj,
|
||||
name);
|
||||
+ put_device(tdev);
|
||||
} else {
|
||||
status = -ENODEV;
|
||||
}
|
||||
@@ -958,7 +959,7 @@ int gpiod_sysfs_set_active_low(struct gpio_desc *desc, int value)
|
||||
}
|
||||
|
||||
status = sysfs_set_active_low(desc, dev, value);
|
||||
-
|
||||
+ put_device(dev);
|
||||
unlock:
|
||||
mutex_unlock(&sysfs_lock);
|
||||
|
||||
diff --git a/fs/cifs/file.c b/fs/cifs/file.c
|
||||
index d375322..0218a9b 100644
|
||||
--- a/fs/cifs/file.c
|
||||
+++ b/fs/cifs/file.c
|
||||
@@ -366,6 +366,7 @@ void cifsFileInfo_put(struct cifsFileInfo *cifs_file)
|
||||
struct cifsLockInfo *li, *tmp;
|
||||
struct cifs_fid fid;
|
||||
struct cifs_pending_open open;
|
||||
+ bool oplock_break_cancelled;
|
||||
|
||||
spin_lock(&cifs_file_list_lock);
|
||||
if (--cifs_file->count > 0) {
|
||||
@@ -397,7 +398,7 @@ void cifsFileInfo_put(struct cifsFileInfo *cifs_file)
|
||||
}
|
||||
spin_unlock(&cifs_file_list_lock);
|
||||
|
||||
- cancel_work_sync(&cifs_file->oplock_break);
|
||||
+ oplock_break_cancelled = cancel_work_sync(&cifs_file->oplock_break);
|
||||
|
||||
if (!tcon->need_reconnect && !cifs_file->invalidHandle) {
|
||||
struct TCP_Server_Info *server = tcon->ses->server;
|
||||
@@ -409,6 +410,9 @@ void cifsFileInfo_put(struct cifsFileInfo *cifs_file)
|
||||
_free_xid(xid);
|
||||
}
|
||||
|
||||
+ if (oplock_break_cancelled)
|
||||
+ cifs_done_oplock_break(cifsi);
|
||||
+
|
||||
cifs_del_pending_open(&open);
|
||||
|
||||
/*
|
||||
diff --git a/fs/ext4/file.c b/fs/ext4/file.c
|
||||
index 2a8b2e1..589117e 100644
|
||||
--- a/fs/ext4/file.c
|
||||
+++ b/fs/ext4/file.c
|
||||
@@ -100,7 +100,7 @@ ext4_file_dio_write(struct kiocb *iocb, const struct iovec *iov,
|
||||
struct blk_plug plug;
|
||||
int unaligned_aio = 0;
|
||||
ssize_t ret;
|
||||
- int overwrite = 0;
|
||||
+ int *overwrite = iocb->private;
|
||||
size_t length = iov_length(iov, nr_segs);
|
||||
|
||||
if (ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS) &&
|
||||
@@ -118,8 +118,6 @@ ext4_file_dio_write(struct kiocb *iocb, const struct iovec *iov,
|
||||
mutex_lock(&inode->i_mutex);
|
||||
blk_start_plug(&plug);
|
||||
|
||||
- iocb->private = &overwrite;
|
||||
-
|
||||
/* check whether we do a DIO overwrite or not */
|
||||
if (ext4_should_dioread_nolock(inode) && !unaligned_aio &&
|
||||
!file->f_mapping->nrpages && pos + length <= i_size_read(inode)) {
|
||||
@@ -143,7 +141,7 @@ ext4_file_dio_write(struct kiocb *iocb, const struct iovec *iov,
|
||||
* So we should check these two conditions.
|
||||
*/
|
||||
if (err == len && (map.m_flags & EXT4_MAP_MAPPED))
|
||||
- overwrite = 1;
|
||||
+ *overwrite = 1;
|
||||
}
|
||||
|
||||
ret = __generic_file_aio_write(iocb, iov, nr_segs, &iocb->ki_pos);
|
||||
@@ -170,6 +168,7 @@ ext4_file_write(struct kiocb *iocb, const struct iovec *iov,
|
||||
{
|
||||
struct inode *inode = file_inode(iocb->ki_filp);
|
||||
ssize_t ret;
|
||||
+ int overwrite = 0;
|
||||
|
||||
/*
|
||||
* If we have encountered a bitmap-format file, the size limit
|
||||
@@ -190,6 +189,7 @@ ext4_file_write(struct kiocb *iocb, const struct iovec *iov,
|
||||
}
|
||||
}
|
||||
|
||||
+ iocb->private = &overwrite;
|
||||
if (unlikely(iocb->ki_filp->f_flags & O_DIRECT))
|
||||
ret = ext4_file_dio_write(iocb, iov, nr_segs, pos);
|
||||
else
|
||||
diff --git a/fs/nilfs2/nilfs.h b/fs/nilfs2/nilfs.h
|
||||
index 9bc72de..b02c202 100644
|
||||
--- a/fs/nilfs2/nilfs.h
|
||||
+++ b/fs/nilfs2/nilfs.h
|
||||
@@ -141,7 +141,6 @@ enum {
|
||||
* @ti_save: Backup of journal_info field of task_struct
|
||||
* @ti_flags: Flags
|
||||
* @ti_count: Nest level
|
||||
- * @ti_garbage: List of inode to be put when releasing semaphore
|
||||
*/
|
||||
struct nilfs_transaction_info {
|
||||
u32 ti_magic;
|
||||
@@ -150,7 +149,6 @@ struct nilfs_transaction_info {
|
||||
one of other filesystems has a bug. */
|
||||
unsigned short ti_flags;
|
||||
unsigned short ti_count;
|
||||
- struct list_head ti_garbage;
|
||||
};
|
||||
|
||||
/* ti_magic */
|
||||
diff --git a/fs/nilfs2/segment.c b/fs/nilfs2/segment.c
|
||||
index a1a1916..5bee816 100644
|
||||
--- a/fs/nilfs2/segment.c
|
||||
+++ b/fs/nilfs2/segment.c
|
||||
@@ -305,7 +305,6 @@ static void nilfs_transaction_lock(struct super_block *sb,
|
||||
ti->ti_count = 0;
|
||||
ti->ti_save = cur_ti;
|
||||
ti->ti_magic = NILFS_TI_MAGIC;
|
||||
- INIT_LIST_HEAD(&ti->ti_garbage);
|
||||
current->journal_info = ti;
|
||||
|
||||
for (;;) {
|
||||
@@ -332,8 +331,6 @@ static void nilfs_transaction_unlock(struct super_block *sb)
|
||||
|
||||
up_write(&nilfs->ns_segctor_sem);
|
||||
current->journal_info = ti->ti_save;
|
||||
- if (!list_empty(&ti->ti_garbage))
|
||||
- nilfs_dispose_list(nilfs, &ti->ti_garbage, 0);
|
||||
}
|
||||
|
||||
static void *nilfs_segctor_map_segsum_entry(struct nilfs_sc_info *sci,
|
||||
@@ -746,6 +743,15 @@ static void nilfs_dispose_list(struct the_nilfs *nilfs,
|
||||
}
|
||||
}
|
||||
|
||||
+static void nilfs_iput_work_func(struct work_struct *work)
|
||||
+{
|
||||
+ struct nilfs_sc_info *sci = container_of(work, struct nilfs_sc_info,
|
||||
+ sc_iput_work);
|
||||
+ struct the_nilfs *nilfs = sci->sc_super->s_fs_info;
|
||||
+
|
||||
+ nilfs_dispose_list(nilfs, &sci->sc_iput_queue, 0);
|
||||
+}
|
||||
+
|
||||
static int nilfs_test_metadata_dirty(struct the_nilfs *nilfs,
|
||||
struct nilfs_root *root)
|
||||
{
|
||||
@@ -1899,8 +1905,8 @@ static int nilfs_segctor_collect_dirty_files(struct nilfs_sc_info *sci,
|
||||
static void nilfs_segctor_drop_written_files(struct nilfs_sc_info *sci,
|
||||
struct the_nilfs *nilfs)
|
||||
{
|
||||
- struct nilfs_transaction_info *ti = current->journal_info;
|
||||
struct nilfs_inode_info *ii, *n;
|
||||
+ int defer_iput = false;
|
||||
|
||||
spin_lock(&nilfs->ns_inode_lock);
|
||||
list_for_each_entry_safe(ii, n, &sci->sc_dirty_files, i_dirty) {
|
||||
@@ -1911,9 +1917,24 @@ static void nilfs_segctor_drop_written_files(struct nilfs_sc_info *sci,
|
||||
clear_bit(NILFS_I_BUSY, &ii->i_state);
|
||||
brelse(ii->i_bh);
|
||||
ii->i_bh = NULL;
|
||||
- list_move_tail(&ii->i_dirty, &ti->ti_garbage);
|
||||
+ list_del_init(&ii->i_dirty);
|
||||
+ if (!ii->vfs_inode.i_nlink) {
|
||||
+ /*
|
||||
+ * Defer calling iput() to avoid a deadlock
|
||||
+ * over I_SYNC flag for inodes with i_nlink == 0
|
||||
+ */
|
||||
+ list_add_tail(&ii->i_dirty, &sci->sc_iput_queue);
|
||||
+ defer_iput = true;
|
||||
+ } else {
|
||||
+ spin_unlock(&nilfs->ns_inode_lock);
|
||||
+ iput(&ii->vfs_inode);
|
||||
+ spin_lock(&nilfs->ns_inode_lock);
|
||||
+ }
|
||||
}
|
||||
spin_unlock(&nilfs->ns_inode_lock);
|
||||
+
|
||||
+ if (defer_iput)
|
||||
+ schedule_work(&sci->sc_iput_work);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -2580,6 +2601,8 @@ static struct nilfs_sc_info *nilfs_segctor_new(struct super_block *sb,
|
||||
INIT_LIST_HEAD(&sci->sc_segbufs);
|
||||
INIT_LIST_HEAD(&sci->sc_write_logs);
|
||||
INIT_LIST_HEAD(&sci->sc_gc_inodes);
|
||||
+ INIT_LIST_HEAD(&sci->sc_iput_queue);
|
||||
+ INIT_WORK(&sci->sc_iput_work, nilfs_iput_work_func);
|
||||
init_timer(&sci->sc_timer);
|
||||
|
||||
sci->sc_interval = HZ * NILFS_SC_DEFAULT_TIMEOUT;
|
||||
@@ -2606,6 +2629,8 @@ static void nilfs_segctor_write_out(struct nilfs_sc_info *sci)
|
||||
ret = nilfs_segctor_construct(sci, SC_LSEG_SR);
|
||||
nilfs_transaction_unlock(sci->sc_super);
|
||||
|
||||
+ flush_work(&sci->sc_iput_work);
|
||||
+
|
||||
} while (ret && retrycount-- > 0);
|
||||
}
|
||||
|
||||
@@ -2630,6 +2655,9 @@ static void nilfs_segctor_destroy(struct nilfs_sc_info *sci)
|
||||
|| sci->sc_seq_request != sci->sc_seq_done);
|
||||
spin_unlock(&sci->sc_state_lock);
|
||||
|
||||
+ if (flush_work(&sci->sc_iput_work))
|
||||
+ flag = true;
|
||||
+
|
||||
if (flag || !nilfs_segctor_confirm(sci))
|
||||
nilfs_segctor_write_out(sci);
|
||||
|
||||
@@ -2639,6 +2667,12 @@ static void nilfs_segctor_destroy(struct nilfs_sc_info *sci)
|
||||
nilfs_dispose_list(nilfs, &sci->sc_dirty_files, 1);
|
||||
}
|
||||
|
||||
+ if (!list_empty(&sci->sc_iput_queue)) {
|
||||
+ nilfs_warning(sci->sc_super, __func__,
|
||||
+ "iput queue is not empty\n");
|
||||
+ nilfs_dispose_list(nilfs, &sci->sc_iput_queue, 1);
|
||||
+ }
|
||||
+
|
||||
WARN_ON(!list_empty(&sci->sc_segbufs));
|
||||
WARN_ON(!list_empty(&sci->sc_write_logs));
|
||||
|
||||
diff --git a/fs/nilfs2/segment.h b/fs/nilfs2/segment.h
|
||||
index 38a1d00..a48d6de 100644
|
||||
--- a/fs/nilfs2/segment.h
|
||||
+++ b/fs/nilfs2/segment.h
|
||||
@@ -26,6 +26,7 @@
|
||||
#include <linux/types.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/buffer_head.h>
|
||||
+#include <linux/workqueue.h>
|
||||
#include <linux/nilfs2_fs.h>
|
||||
#include "nilfs.h"
|
||||
|
||||
@@ -92,6 +93,8 @@ struct nilfs_segsum_pointer {
|
||||
* @sc_nblk_inc: Block count of current generation
|
||||
* @sc_dirty_files: List of files to be written
|
||||
* @sc_gc_inodes: List of GC inodes having blocks to be written
|
||||
+ * @sc_iput_queue: list of inodes for which iput should be done
|
||||
+ * @sc_iput_work: work struct to defer iput call
|
||||
* @sc_freesegs: array of segment numbers to be freed
|
||||
* @sc_nfreesegs: number of segments on @sc_freesegs
|
||||
* @sc_dsync_inode: inode whose data pages are written for a sync operation
|
||||
@@ -135,6 +138,8 @@ struct nilfs_sc_info {
|
||||
|
||||
struct list_head sc_dirty_files;
|
||||
struct list_head sc_gc_inodes;
|
||||
+ struct list_head sc_iput_queue;
|
||||
+ struct work_struct sc_iput_work;
|
||||
|
||||
__u64 *sc_freesegs;
|
||||
size_t sc_nfreesegs;
|
||||
diff --git a/include/sound/ak4113.h b/include/sound/ak4113.h
|
||||
index 2609048..3a34f6e 100644
|
||||
--- a/include/sound/ak4113.h
|
||||
+++ b/include/sound/ak4113.h
|
||||
@@ -286,7 +286,7 @@ struct ak4113 {
|
||||
ak4113_write_t *write;
|
||||
ak4113_read_t *read;
|
||||
void *private_data;
|
||||
- unsigned int init:1;
|
||||
+ atomic_t wq_processing;
|
||||
spinlock_t lock;
|
||||
unsigned char regmap[AK4113_WRITABLE_REGS];
|
||||
struct snd_kcontrol *kctls[AK4113_CONTROLS];
|
||||
diff --git a/include/sound/ak4114.h b/include/sound/ak4114.h
|
||||
index 52f02a6..069299a 100644
|
||||
--- a/include/sound/ak4114.h
|
||||
+++ b/include/sound/ak4114.h
|
||||
@@ -168,7 +168,7 @@ struct ak4114 {
|
||||
ak4114_write_t * write;
|
||||
ak4114_read_t * read;
|
||||
void * private_data;
|
||||
- unsigned int init: 1;
|
||||
+ atomic_t wq_processing;
|
||||
spinlock_t lock;
|
||||
unsigned char regmap[6];
|
||||
unsigned char txcsb[5];
|
||||
diff --git a/kernel/smpboot.c b/kernel/smpboot.c
|
||||
index eb89e18..60d35ac5 100644
|
||||
--- a/kernel/smpboot.c
|
||||
+++ b/kernel/smpboot.c
|
||||
@@ -279,6 +279,7 @@ int smpboot_register_percpu_thread(struct smp_hotplug_thread *plug_thread)
|
||||
unsigned int cpu;
|
||||
int ret = 0;
|
||||
|
||||
+ get_online_cpus();
|
||||
mutex_lock(&smpboot_threads_lock);
|
||||
for_each_online_cpu(cpu) {
|
||||
ret = __smpboot_create_thread(plug_thread, cpu);
|
||||
@@ -291,6 +292,7 @@ int smpboot_register_percpu_thread(struct smp_hotplug_thread *plug_thread)
|
||||
list_add(&plug_thread->list, &hotplug_threads);
|
||||
out:
|
||||
mutex_unlock(&smpboot_threads_lock);
|
||||
+ put_online_cpus();
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(smpboot_register_percpu_thread);
|
||||
diff --git a/lib/checksum.c b/lib/checksum.c
|
||||
index 129775e..8b39e86 100644
|
||||
--- a/lib/checksum.c
|
||||
+++ b/lib/checksum.c
|
||||
@@ -181,6 +181,15 @@ csum_partial_copy(const void *src, void *dst, int len, __wsum sum)
|
||||
EXPORT_SYMBOL(csum_partial_copy);
|
||||
|
||||
#ifndef csum_tcpudp_nofold
|
||||
+static inline u32 from64to32(u64 x)
|
||||
+{
|
||||
+ /* add up 32-bit and 32-bit for 32+c bit */
|
||||
+ x = (x & 0xffffffff) + (x >> 32);
|
||||
+ /* add up carry.. */
|
||||
+ x = (x & 0xffffffff) + (x >> 32);
|
||||
+ return (u32)x;
|
||||
+}
|
||||
+
|
||||
__wsum csum_tcpudp_nofold(__be32 saddr, __be32 daddr,
|
||||
unsigned short len,
|
||||
unsigned short proto,
|
||||
@@ -195,8 +204,7 @@ __wsum csum_tcpudp_nofold(__be32 saddr, __be32 daddr,
|
||||
#else
|
||||
s += (proto + len) << 8;
|
||||
#endif
|
||||
- s += (s >> 32);
|
||||
- return (__force __wsum)s;
|
||||
+ return (__force __wsum)from64to32(s);
|
||||
}
|
||||
EXPORT_SYMBOL(csum_tcpudp_nofold);
|
||||
#endif
|
||||
diff --git a/mm/pagewalk.c b/mm/pagewalk.c
|
||||
index 2beeabf..9056d22 100644
|
||||
--- a/mm/pagewalk.c
|
||||
+++ b/mm/pagewalk.c
|
||||
@@ -199,7 +199,10 @@ int walk_page_range(unsigned long addr, unsigned long end,
|
||||
*/
|
||||
if ((vma->vm_start <= addr) &&
|
||||
(vma->vm_flags & VM_PFNMAP)) {
|
||||
- next = vma->vm_end;
|
||||
+ if (walk->pte_hole)
|
||||
+ err = walk->pte_hole(addr, next, walk);
|
||||
+ if (err)
|
||||
+ break;
|
||||
pgd = pgd_offset(walk->mm, next);
|
||||
continue;
|
||||
}
|
||||
diff --git a/scripts/kconfig/menu.c b/scripts/kconfig/menu.c
|
||||
index db1512a..f53542b 100644
|
||||
--- a/scripts/kconfig/menu.c
|
||||
+++ b/scripts/kconfig/menu.c
|
||||
@@ -545,7 +545,7 @@ static void get_prompt_str(struct gstr *r, struct property *prop,
|
||||
{
|
||||
int i, j;
|
||||
struct menu *submenu[8], *menu, *location = NULL;
|
||||
- struct jump_key *jump;
|
||||
+ struct jump_key *jump = NULL;
|
||||
|
||||
str_printf(r, _("Prompt: %s\n"), _(prop->text));
|
||||
menu = prop->menu->parent;
|
||||
@@ -583,7 +583,7 @@ static void get_prompt_str(struct gstr *r, struct property *prop,
|
||||
str_printf(r, _(" Location:\n"));
|
||||
for (j = 4; --i >= 0; j += 2) {
|
||||
menu = submenu[i];
|
||||
- if (head && location && menu == location)
|
||||
+ if (jump && menu == location)
|
||||
jump->offset = strlen(r->s);
|
||||
str_printf(r, "%*c-> %s", j, ' ',
|
||||
_(menu_get_prompt(menu)));
|
||||
diff --git a/sound/i2c/other/ak4113.c b/sound/i2c/other/ak4113.c
|
||||
index e04e750..7a9149b 100644
|
||||
--- a/sound/i2c/other/ak4113.c
|
||||
+++ b/sound/i2c/other/ak4113.c
|
||||
@@ -56,8 +56,7 @@ static inline unsigned char reg_read(struct ak4113 *ak4113, unsigned char reg)
|
||||
|
||||
static void snd_ak4113_free(struct ak4113 *chip)
|
||||
{
|
||||
- chip->init = 1; /* don't schedule new work */
|
||||
- mb();
|
||||
+ atomic_inc(&chip->wq_processing); /* don't schedule new work */
|
||||
cancel_delayed_work_sync(&chip->work);
|
||||
kfree(chip);
|
||||
}
|
||||
@@ -89,6 +88,7 @@ int snd_ak4113_create(struct snd_card *card, ak4113_read_t *read,
|
||||
chip->write = write;
|
||||
chip->private_data = private_data;
|
||||
INIT_DELAYED_WORK(&chip->work, ak4113_stats);
|
||||
+ atomic_set(&chip->wq_processing, 0);
|
||||
|
||||
for (reg = 0; reg < AK4113_WRITABLE_REGS ; reg++)
|
||||
chip->regmap[reg] = pgm[reg];
|
||||
@@ -139,13 +139,11 @@ static void ak4113_init_regs(struct ak4113 *chip)
|
||||
|
||||
void snd_ak4113_reinit(struct ak4113 *chip)
|
||||
{
|
||||
- chip->init = 1;
|
||||
- mb();
|
||||
- flush_delayed_work(&chip->work);
|
||||
+ if (atomic_inc_return(&chip->wq_processing) == 1)
|
||||
+ cancel_delayed_work_sync(&chip->work);
|
||||
ak4113_init_regs(chip);
|
||||
/* bring up statistics / event queing */
|
||||
- chip->init = 0;
|
||||
- if (chip->kctls[0])
|
||||
+ if (atomic_dec_and_test(&chip->wq_processing))
|
||||
schedule_delayed_work(&chip->work, HZ / 10);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_ak4113_reinit);
|
||||
@@ -632,8 +630,9 @@ static void ak4113_stats(struct work_struct *work)
|
||||
{
|
||||
struct ak4113 *chip = container_of(work, struct ak4113, work.work);
|
||||
|
||||
- if (!chip->init)
|
||||
+ if (atomic_inc_return(&chip->wq_processing) == 1)
|
||||
snd_ak4113_check_rate_and_errors(chip, chip->check_flags);
|
||||
|
||||
- schedule_delayed_work(&chip->work, HZ / 10);
|
||||
+ if (atomic_dec_and_test(&chip->wq_processing))
|
||||
+ schedule_delayed_work(&chip->work, HZ / 10);
|
||||
}
|
||||
diff --git a/sound/i2c/other/ak4114.c b/sound/i2c/other/ak4114.c
|
||||
index 15ae025..bf515db 100644
|
||||
--- a/sound/i2c/other/ak4114.c
|
||||
+++ b/sound/i2c/other/ak4114.c
|
||||
@@ -66,8 +66,7 @@ static void reg_dump(struct ak4114 *ak4114)
|
||||
|
||||
static void snd_ak4114_free(struct ak4114 *chip)
|
||||
{
|
||||
- chip->init = 1; /* don't schedule new work */
|
||||
- mb();
|
||||
+ atomic_inc(&chip->wq_processing); /* don't schedule new work */
|
||||
cancel_delayed_work_sync(&chip->work);
|
||||
kfree(chip);
|
||||
}
|
||||
@@ -100,6 +99,7 @@ int snd_ak4114_create(struct snd_card *card,
|
||||
chip->write = write;
|
||||
chip->private_data = private_data;
|
||||
INIT_DELAYED_WORK(&chip->work, ak4114_stats);
|
||||
+ atomic_set(&chip->wq_processing, 0);
|
||||
|
||||
for (reg = 0; reg < 6; reg++)
|
||||
chip->regmap[reg] = pgm[reg];
|
||||
@@ -152,13 +152,11 @@ static void ak4114_init_regs(struct ak4114 *chip)
|
||||
|
||||
void snd_ak4114_reinit(struct ak4114 *chip)
|
||||
{
|
||||
- chip->init = 1;
|
||||
- mb();
|
||||
- flush_delayed_work(&chip->work);
|
||||
+ if (atomic_inc_return(&chip->wq_processing) == 1)
|
||||
+ cancel_delayed_work_sync(&chip->work);
|
||||
ak4114_init_regs(chip);
|
||||
/* bring up statistics / event queing */
|
||||
- chip->init = 0;
|
||||
- if (chip->kctls[0])
|
||||
+ if (atomic_dec_and_test(&chip->wq_processing))
|
||||
schedule_delayed_work(&chip->work, HZ / 10);
|
||||
}
|
||||
|
||||
@@ -612,10 +610,10 @@ static void ak4114_stats(struct work_struct *work)
|
||||
{
|
||||
struct ak4114 *chip = container_of(work, struct ak4114, work.work);
|
||||
|
||||
- if (!chip->init)
|
||||
+ if (atomic_inc_return(&chip->wq_processing) == 1)
|
||||
snd_ak4114_check_rate_and_errors(chip, chip->check_flags);
|
||||
-
|
||||
- schedule_delayed_work(&chip->work, HZ / 10);
|
||||
+ if (atomic_dec_and_test(&chip->wq_processing))
|
||||
+ schedule_delayed_work(&chip->work, HZ / 10);
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(snd_ak4114_create);
|
||||
diff --git a/sound/soc/atmel/atmel_ssc_dai.c b/sound/soc/atmel/atmel_ssc_dai.c
|
||||
index 1ead3c9..f20e703 100644
|
||||
--- a/sound/soc/atmel/atmel_ssc_dai.c
|
||||
+++ b/sound/soc/atmel/atmel_ssc_dai.c
|
||||
@@ -344,7 +344,6 @@ static int atmel_ssc_hw_params(struct snd_pcm_substream *substream,
|
||||
struct atmel_pcm_dma_params *dma_params;
|
||||
int dir, channels, bits;
|
||||
u32 tfmr, rfmr, tcmr, rcmr;
|
||||
- int start_event;
|
||||
int ret;
|
||||
|
||||
/*
|
||||
@@ -451,19 +450,10 @@ static int atmel_ssc_hw_params(struct snd_pcm_substream *substream,
|
||||
* The SSC transmit clock is obtained from the BCLK signal on
|
||||
* on the TK line, and the SSC receive clock is
|
||||
* generated from the transmit clock.
|
||||
- *
|
||||
- * For single channel data, one sample is transferred
|
||||
- * on the falling edge of the LRC clock.
|
||||
- * For two channel data, one sample is
|
||||
- * transferred on both edges of the LRC clock.
|
||||
*/
|
||||
- start_event = ((channels == 1)
|
||||
- ? SSC_START_FALLING_RF
|
||||
- : SSC_START_EDGE_RF);
|
||||
-
|
||||
rcmr = SSC_BF(RCMR_PERIOD, 0)
|
||||
| SSC_BF(RCMR_STTDLY, START_DELAY)
|
||||
- | SSC_BF(RCMR_START, start_event)
|
||||
+ | SSC_BF(RCMR_START, SSC_START_FALLING_RF)
|
||||
| SSC_BF(RCMR_CKI, SSC_CKI_RISING)
|
||||
| SSC_BF(RCMR_CKO, SSC_CKO_NONE)
|
||||
| SSC_BF(RCMR_CKS, SSC_CKS_CLOCK);
|
||||
@@ -471,14 +461,14 @@ static int atmel_ssc_hw_params(struct snd_pcm_substream *substream,
|
||||
rfmr = SSC_BF(RFMR_FSEDGE, SSC_FSEDGE_POSITIVE)
|
||||
| SSC_BF(RFMR_FSOS, SSC_FSOS_NONE)
|
||||
| SSC_BF(RFMR_FSLEN, 0)
|
||||
- | SSC_BF(RFMR_DATNB, 0)
|
||||
+ | SSC_BF(RFMR_DATNB, (channels - 1))
|
||||
| SSC_BIT(RFMR_MSBF)
|
||||
| SSC_BF(RFMR_LOOP, 0)
|
||||
| SSC_BF(RFMR_DATLEN, (bits - 1));
|
||||
|
||||
tcmr = SSC_BF(TCMR_PERIOD, 0)
|
||||
| SSC_BF(TCMR_STTDLY, START_DELAY)
|
||||
- | SSC_BF(TCMR_START, start_event)
|
||||
+ | SSC_BF(TCMR_START, SSC_START_FALLING_RF)
|
||||
| SSC_BF(TCMR_CKI, SSC_CKI_FALLING)
|
||||
| SSC_BF(TCMR_CKO, SSC_CKO_NONE)
|
||||
| SSC_BF(TCMR_CKS, SSC_CKS_PIN);
|
||||
@@ -487,7 +477,7 @@ static int atmel_ssc_hw_params(struct snd_pcm_substream *substream,
|
||||
| SSC_BF(TFMR_FSDEN, 0)
|
||||
| SSC_BF(TFMR_FSOS, SSC_FSOS_NONE)
|
||||
| SSC_BF(TFMR_FSLEN, 0)
|
||||
- | SSC_BF(TFMR_DATNB, 0)
|
||||
+ | SSC_BF(TFMR_DATNB, (channels - 1))
|
||||
| SSC_BIT(TFMR_MSBF)
|
||||
| SSC_BF(TFMR_DATDEF, 0)
|
||||
| SSC_BF(TFMR_DATLEN, (bits - 1));
|
||||
diff --git a/sound/soc/codecs/sgtl5000.c b/sound/soc/codecs/sgtl5000.c
|
||||
index 12528e9..715589f 100644
|
||||
--- a/sound/soc/codecs/sgtl5000.c
|
||||
+++ b/sound/soc/codecs/sgtl5000.c
|
||||
@@ -1521,6 +1521,9 @@ static int sgtl5000_i2c_probe(struct i2c_client *client,
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
+ /* Need 8 clocks before I2C accesses */
|
||||
+ udelay(1);
|
||||
+
|
||||
/* read chip information */
|
||||
ret = regmap_read(sgtl5000->regmap, SGTL5000_CHIP_ID, ®);
|
||||
if (ret)
|
584
projects/imx6/patches/linux/linux-000-patch-3.14.33-34.patch
Normal file
584
projects/imx6/patches/linux/linux-000-patch-3.14.33-34.patch
Normal file
@ -0,0 +1,584 @@
|
||||
diff --git a/Makefile b/Makefile
|
||||
index b0963ca..5443481 100644
|
||||
--- a/Makefile
|
||||
+++ b/Makefile
|
||||
@@ -1,6 +1,6 @@
|
||||
VERSION = 3
|
||||
PATCHLEVEL = 14
|
||||
-SUBLEVEL = 33
|
||||
+SUBLEVEL = 34
|
||||
EXTRAVERSION =
|
||||
NAME = Remembering Coco
|
||||
|
||||
diff --git a/drivers/media/rc/ir-lirc-codec.c b/drivers/media/rc/ir-lirc-codec.c
|
||||
index ed2c8a1..98893a8 100644
|
||||
--- a/drivers/media/rc/ir-lirc-codec.c
|
||||
+++ b/drivers/media/rc/ir-lirc-codec.c
|
||||
@@ -42,11 +42,17 @@ static int ir_lirc_decode(struct rc_dev *dev, struct ir_raw_event ev)
|
||||
return -EINVAL;
|
||||
|
||||
/* Packet start */
|
||||
- if (ev.reset)
|
||||
- return 0;
|
||||
+ if (ev.reset) {
|
||||
+ /* Userspace expects a long space event before the start of
|
||||
+ * the signal to use as a sync. This may be done with repeat
|
||||
+ * packets and normal samples. But if a reset has been sent
|
||||
+ * then we assume that a long time has passed, so we send a
|
||||
+ * space with the maximum time value. */
|
||||
+ sample = LIRC_SPACE(LIRC_VALUE_MASK);
|
||||
+ IR_dprintk(2, "delivering reset sync space to lirc_dev\n");
|
||||
|
||||
/* Carrier reports */
|
||||
- if (ev.carrier_report) {
|
||||
+ } else if (ev.carrier_report) {
|
||||
sample = LIRC_FREQUENCY(ev.carrier);
|
||||
IR_dprintk(2, "carrier report (freq: %d)\n", sample);
|
||||
|
||||
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c
|
||||
index afa4a1f..a830d42 100644
|
||||
--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c
|
||||
+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c
|
||||
@@ -3131,7 +3131,7 @@ static int bnx2x_poll(struct napi_struct *napi, int budget)
|
||||
}
|
||||
#endif
|
||||
if (!bnx2x_fp_lock_napi(fp))
|
||||
- return work_done;
|
||||
+ return budget;
|
||||
|
||||
for_each_cos_in_tx_queue(fp, cos)
|
||||
if (bnx2x_tx_queue_has_work(fp->txdata_ptr[cos]))
|
||||
diff --git a/drivers/net/ethernet/qlogic/netxen/netxen_nic_main.c b/drivers/net/ethernet/qlogic/netxen/netxen_nic_main.c
|
||||
index 70849de..5fa076f 100644
|
||||
--- a/drivers/net/ethernet/qlogic/netxen/netxen_nic_main.c
|
||||
+++ b/drivers/net/ethernet/qlogic/netxen/netxen_nic_main.c
|
||||
@@ -2390,7 +2390,10 @@ static int netxen_nic_poll(struct napi_struct *napi, int budget)
|
||||
|
||||
work_done = netxen_process_rcv_ring(sds_ring, budget);
|
||||
|
||||
- if ((work_done < budget) && tx_complete) {
|
||||
+ if (!tx_complete)
|
||||
+ work_done = budget;
|
||||
+
|
||||
+ if (work_done < budget) {
|
||||
napi_complete(&sds_ring->napi);
|
||||
if (test_bit(__NX_DEV_UP, &adapter->state))
|
||||
netxen_nic_enable_int(sds_ring);
|
||||
diff --git a/drivers/net/ppp/ppp_deflate.c b/drivers/net/ppp/ppp_deflate.c
|
||||
index 602c625..b5edc7f 100644
|
||||
--- a/drivers/net/ppp/ppp_deflate.c
|
||||
+++ b/drivers/net/ppp/ppp_deflate.c
|
||||
@@ -246,7 +246,7 @@ static int z_compress(void *arg, unsigned char *rptr, unsigned char *obuf,
|
||||
/*
|
||||
* See if we managed to reduce the size of the packet.
|
||||
*/
|
||||
- if (olen < isize) {
|
||||
+ if (olen < isize && olen <= osize) {
|
||||
state->stats.comp_bytes += olen;
|
||||
state->stats.comp_packets++;
|
||||
} else {
|
||||
diff --git a/include/net/ip.h b/include/net/ip.h
|
||||
index 937f196..3446cdd 100644
|
||||
--- a/include/net/ip.h
|
||||
+++ b/include/net/ip.h
|
||||
@@ -38,11 +38,12 @@ struct inet_skb_parm {
|
||||
struct ip_options opt; /* Compiled IP options */
|
||||
unsigned char flags;
|
||||
|
||||
-#define IPSKB_FORWARDED 1
|
||||
-#define IPSKB_XFRM_TUNNEL_SIZE 2
|
||||
-#define IPSKB_XFRM_TRANSFORMED 4
|
||||
-#define IPSKB_FRAG_COMPLETE 8
|
||||
-#define IPSKB_REROUTED 16
|
||||
+#define IPSKB_FORWARDED BIT(0)
|
||||
+#define IPSKB_XFRM_TUNNEL_SIZE BIT(1)
|
||||
+#define IPSKB_XFRM_TRANSFORMED BIT(2)
|
||||
+#define IPSKB_FRAG_COMPLETE BIT(3)
|
||||
+#define IPSKB_REROUTED BIT(4)
|
||||
+#define IPSKB_DOREDIRECT BIT(5)
|
||||
|
||||
u16 frag_max_size;
|
||||
};
|
||||
@@ -174,7 +175,7 @@ static inline __u8 ip_reply_arg_flowi_flags(const struct ip_reply_arg *arg)
|
||||
return (arg->flags & IP_REPLY_ARG_NOSRCCHECK) ? FLOWI_FLAG_ANYSRC : 0;
|
||||
}
|
||||
|
||||
-void ip_send_unicast_reply(struct net *net, struct sk_buff *skb, __be32 daddr,
|
||||
+void ip_send_unicast_reply(struct sock *sk, struct sk_buff *skb, __be32 daddr,
|
||||
__be32 saddr, const struct ip_reply_arg *arg,
|
||||
unsigned int len);
|
||||
|
||||
diff --git a/include/net/netns/ipv4.h b/include/net/netns/ipv4.h
|
||||
index 80f500a..57c2da9 100644
|
||||
--- a/include/net/netns/ipv4.h
|
||||
+++ b/include/net/netns/ipv4.h
|
||||
@@ -47,6 +47,7 @@ struct netns_ipv4 {
|
||||
struct inet_peer_base *peers;
|
||||
struct tcpm_hash_bucket *tcp_metrics_hash;
|
||||
unsigned int tcp_metrics_hash_log;
|
||||
+ struct sock * __percpu *tcp_sk;
|
||||
struct netns_frags frags;
|
||||
#ifdef CONFIG_NETFILTER
|
||||
struct xt_table *iptable_filter;
|
||||
diff --git a/net/core/dev.c b/net/core/dev.c
|
||||
index 86bb9cc..4ed77d7 100644
|
||||
--- a/net/core/dev.c
|
||||
+++ b/net/core/dev.c
|
||||
@@ -6812,10 +6812,20 @@ static int dev_cpu_callback(struct notifier_block *nfb,
|
||||
oldsd->output_queue = NULL;
|
||||
oldsd->output_queue_tailp = &oldsd->output_queue;
|
||||
}
|
||||
- /* Append NAPI poll list from offline CPU. */
|
||||
- if (!list_empty(&oldsd->poll_list)) {
|
||||
- list_splice_init(&oldsd->poll_list, &sd->poll_list);
|
||||
- raise_softirq_irqoff(NET_RX_SOFTIRQ);
|
||||
+ /* Append NAPI poll list from offline CPU, with one exception :
|
||||
+ * process_backlog() must be called by cpu owning percpu backlog.
|
||||
+ * We properly handle process_queue & input_pkt_queue later.
|
||||
+ */
|
||||
+ while (!list_empty(&oldsd->poll_list)) {
|
||||
+ struct napi_struct *napi = list_first_entry(&oldsd->poll_list,
|
||||
+ struct napi_struct,
|
||||
+ poll_list);
|
||||
+
|
||||
+ list_del_init(&napi->poll_list);
|
||||
+ if (napi->poll == process_backlog)
|
||||
+ napi->state = 0;
|
||||
+ else
|
||||
+ ____napi_schedule(sd, napi);
|
||||
}
|
||||
|
||||
raise_softirq_irqoff(NET_TX_SOFTIRQ);
|
||||
@@ -6826,7 +6836,7 @@ static int dev_cpu_callback(struct notifier_block *nfb,
|
||||
netif_rx_internal(skb);
|
||||
input_queue_head_incr(oldsd);
|
||||
}
|
||||
- while ((skb = __skb_dequeue(&oldsd->input_pkt_queue))) {
|
||||
+ while ((skb = skb_dequeue(&oldsd->input_pkt_queue))) {
|
||||
netif_rx_internal(skb);
|
||||
input_queue_head_incr(oldsd);
|
||||
}
|
||||
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c
|
||||
index 4617586..a6613ff 100644
|
||||
--- a/net/core/rtnetlink.c
|
||||
+++ b/net/core/rtnetlink.c
|
||||
@@ -2649,12 +2649,16 @@ static int rtnl_bridge_notify(struct net_device *dev, u16 flags)
|
||||
goto errout;
|
||||
}
|
||||
|
||||
+ if (!skb->len)
|
||||
+ goto errout;
|
||||
+
|
||||
rtnl_notify(skb, net, 0, RTNLGRP_LINK, NULL, GFP_ATOMIC);
|
||||
return 0;
|
||||
errout:
|
||||
WARN_ON(err == -EMSGSIZE);
|
||||
kfree_skb(skb);
|
||||
- rtnl_set_sk_err(net, RTNLGRP_LINK, err);
|
||||
+ if (err)
|
||||
+ rtnl_set_sk_err(net, RTNLGRP_LINK, err);
|
||||
return err;
|
||||
}
|
||||
|
||||
diff --git a/net/ipv4/ip_forward.c b/net/ipv4/ip_forward.c
|
||||
index 1c6bd43..ecb34b5 100644
|
||||
--- a/net/ipv4/ip_forward.c
|
||||
+++ b/net/ipv4/ip_forward.c
|
||||
@@ -178,7 +178,8 @@ int ip_forward(struct sk_buff *skb)
|
||||
* We now generate an ICMP HOST REDIRECT giving the route
|
||||
* we calculated.
|
||||
*/
|
||||
- if (rt->rt_flags&RTCF_DOREDIRECT && !opt->srr && !skb_sec_path(skb))
|
||||
+ if (IPCB(skb)->flags & IPSKB_DOREDIRECT && !opt->srr &&
|
||||
+ !skb_sec_path(skb))
|
||||
ip_rt_send_redirect(skb);
|
||||
|
||||
skb->priority = rt_tos2priority(iph->tos);
|
||||
diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c
|
||||
index 844323b..dd637fc 100644
|
||||
--- a/net/ipv4/ip_output.c
|
||||
+++ b/net/ipv4/ip_output.c
|
||||
@@ -1460,23 +1460,8 @@ static int ip_reply_glue_bits(void *dptr, char *to, int offset,
|
||||
/*
|
||||
* Generic function to send a packet as reply to another packet.
|
||||
* Used to send some TCP resets/acks so far.
|
||||
- *
|
||||
- * Use a fake percpu inet socket to avoid false sharing and contention.
|
||||
*/
|
||||
-static DEFINE_PER_CPU(struct inet_sock, unicast_sock) = {
|
||||
- .sk = {
|
||||
- .__sk_common = {
|
||||
- .skc_refcnt = ATOMIC_INIT(1),
|
||||
- },
|
||||
- .sk_wmem_alloc = ATOMIC_INIT(1),
|
||||
- .sk_allocation = GFP_ATOMIC,
|
||||
- .sk_flags = (1UL << SOCK_USE_WRITE_QUEUE),
|
||||
- },
|
||||
- .pmtudisc = IP_PMTUDISC_WANT,
|
||||
- .uc_ttl = -1,
|
||||
-};
|
||||
-
|
||||
-void ip_send_unicast_reply(struct net *net, struct sk_buff *skb, __be32 daddr,
|
||||
+void ip_send_unicast_reply(struct sock *sk, struct sk_buff *skb, __be32 daddr,
|
||||
__be32 saddr, const struct ip_reply_arg *arg,
|
||||
unsigned int len)
|
||||
{
|
||||
@@ -1484,9 +1469,8 @@ void ip_send_unicast_reply(struct net *net, struct sk_buff *skb, __be32 daddr,
|
||||
struct ipcm_cookie ipc;
|
||||
struct flowi4 fl4;
|
||||
struct rtable *rt = skb_rtable(skb);
|
||||
+ struct net *net = sock_net(sk);
|
||||
struct sk_buff *nskb;
|
||||
- struct sock *sk;
|
||||
- struct inet_sock *inet;
|
||||
int err;
|
||||
|
||||
if (ip_options_echo(&replyopts.opt.opt, skb))
|
||||
@@ -1516,15 +1500,11 @@ void ip_send_unicast_reply(struct net *net, struct sk_buff *skb, __be32 daddr,
|
||||
if (IS_ERR(rt))
|
||||
return;
|
||||
|
||||
- inet = &get_cpu_var(unicast_sock);
|
||||
+ inet_sk(sk)->tos = arg->tos;
|
||||
|
||||
- inet->tos = arg->tos;
|
||||
- sk = &inet->sk;
|
||||
sk->sk_priority = skb->priority;
|
||||
sk->sk_protocol = ip_hdr(skb)->protocol;
|
||||
sk->sk_bound_dev_if = arg->bound_dev_if;
|
||||
- sock_net_set(sk, net);
|
||||
- __skb_queue_head_init(&sk->sk_write_queue);
|
||||
sk->sk_sndbuf = sysctl_wmem_default;
|
||||
err = ip_append_data(sk, &fl4, ip_reply_glue_bits, arg->iov->iov_base,
|
||||
len, 0, &ipc, &rt, MSG_DONTWAIT);
|
||||
@@ -1540,13 +1520,10 @@ void ip_send_unicast_reply(struct net *net, struct sk_buff *skb, __be32 daddr,
|
||||
arg->csumoffset) = csum_fold(csum_add(nskb->csum,
|
||||
arg->csum));
|
||||
nskb->ip_summed = CHECKSUM_NONE;
|
||||
- skb_orphan(nskb);
|
||||
skb_set_queue_mapping(nskb, skb_get_queue_mapping(skb));
|
||||
ip_push_pending_frames(sk, &fl4);
|
||||
}
|
||||
out:
|
||||
- put_cpu_var(unicast_sock);
|
||||
-
|
||||
ip_rt_put(rt);
|
||||
}
|
||||
|
||||
diff --git a/net/ipv4/ip_sockglue.c b/net/ipv4/ip_sockglue.c
|
||||
index 580dd96..135045e 100644
|
||||
--- a/net/ipv4/ip_sockglue.c
|
||||
+++ b/net/ipv4/ip_sockglue.c
|
||||
@@ -426,15 +426,11 @@ int ip_recv_error(struct sock *sk, struct msghdr *msg, int len, int *addr_len)
|
||||
|
||||
memcpy(&errhdr.ee, &serr->ee, sizeof(struct sock_extended_err));
|
||||
sin = &errhdr.offender;
|
||||
- sin->sin_family = AF_UNSPEC;
|
||||
+ memset(sin, 0, sizeof(*sin));
|
||||
if (serr->ee.ee_origin == SO_EE_ORIGIN_ICMP) {
|
||||
- struct inet_sock *inet = inet_sk(sk);
|
||||
-
|
||||
sin->sin_family = AF_INET;
|
||||
sin->sin_addr.s_addr = ip_hdr(skb)->saddr;
|
||||
- sin->sin_port = 0;
|
||||
- memset(&sin->sin_zero, 0, sizeof(sin->sin_zero));
|
||||
- if (inet->cmsg_flags)
|
||||
+ if (inet_sk(sk)->cmsg_flags)
|
||||
ip_cmsg_recv(msg, skb);
|
||||
}
|
||||
|
||||
diff --git a/net/ipv4/ping.c b/net/ipv4/ping.c
|
||||
index 0d33f94..04ce671 100644
|
||||
--- a/net/ipv4/ping.c
|
||||
+++ b/net/ipv4/ping.c
|
||||
@@ -973,8 +973,11 @@ void ping_rcv(struct sk_buff *skb)
|
||||
|
||||
sk = ping_lookup(net, skb, ntohs(icmph->un.echo.id));
|
||||
if (sk != NULL) {
|
||||
+ struct sk_buff *skb2 = skb_clone(skb, GFP_ATOMIC);
|
||||
+
|
||||
pr_debug("rcv on socket %p\n", sk);
|
||||
- ping_queue_rcv_skb(sk, skb_get(skb));
|
||||
+ if (skb2)
|
||||
+ ping_queue_rcv_skb(sk, skb2);
|
||||
sock_put(sk);
|
||||
return;
|
||||
}
|
||||
diff --git a/net/ipv4/route.c b/net/ipv4/route.c
|
||||
index 487bb62..b64330f 100644
|
||||
--- a/net/ipv4/route.c
|
||||
+++ b/net/ipv4/route.c
|
||||
@@ -1554,11 +1554,10 @@ static int __mkroute_input(struct sk_buff *skb,
|
||||
|
||||
do_cache = res->fi && !itag;
|
||||
if (out_dev == in_dev && err && IN_DEV_TX_REDIRECTS(out_dev) &&
|
||||
+ skb->protocol == htons(ETH_P_IP) &&
|
||||
(IN_DEV_SHARED_MEDIA(out_dev) ||
|
||||
- inet_addr_onlink(out_dev, saddr, FIB_RES_GW(*res)))) {
|
||||
- flags |= RTCF_DOREDIRECT;
|
||||
- do_cache = false;
|
||||
- }
|
||||
+ inet_addr_onlink(out_dev, saddr, FIB_RES_GW(*res))))
|
||||
+ IPCB(skb)->flags |= IPSKB_DOREDIRECT;
|
||||
|
||||
if (skb->protocol != htons(ETH_P_IP)) {
|
||||
/* Not IP (i.e. ARP). Do not create route, if it is
|
||||
@@ -2305,6 +2304,8 @@ static int rt_fill_info(struct net *net, __be32 dst, __be32 src,
|
||||
r->rtm_flags = (rt->rt_flags & ~0xFFFF) | RTM_F_CLONED;
|
||||
if (rt->rt_flags & RTCF_NOTIFY)
|
||||
r->rtm_flags |= RTM_F_NOTIFY;
|
||||
+ if (IPCB(skb)->flags & IPSKB_DOREDIRECT)
|
||||
+ r->rtm_flags |= RTCF_DOREDIRECT;
|
||||
|
||||
if (nla_put_be32(skb, RTA_DST, dst))
|
||||
goto nla_put_failure;
|
||||
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c
|
||||
index a782d5b..b7effad 100644
|
||||
--- a/net/ipv4/tcp_ipv4.c
|
||||
+++ b/net/ipv4/tcp_ipv4.c
|
||||
@@ -691,7 +691,8 @@ static void tcp_v4_send_reset(struct sock *sk, struct sk_buff *skb)
|
||||
|
||||
net = dev_net(skb_dst(skb)->dev);
|
||||
arg.tos = ip_hdr(skb)->tos;
|
||||
- ip_send_unicast_reply(net, skb, ip_hdr(skb)->saddr,
|
||||
+ ip_send_unicast_reply(*this_cpu_ptr(net->ipv4.tcp_sk),
|
||||
+ skb, ip_hdr(skb)->saddr,
|
||||
ip_hdr(skb)->daddr, &arg, arg.iov[0].iov_len);
|
||||
|
||||
TCP_INC_STATS_BH(net, TCP_MIB_OUTSEGS);
|
||||
@@ -774,7 +775,8 @@ static void tcp_v4_send_ack(struct sk_buff *skb, u32 seq, u32 ack,
|
||||
if (oif)
|
||||
arg.bound_dev_if = oif;
|
||||
arg.tos = tos;
|
||||
- ip_send_unicast_reply(net, skb, ip_hdr(skb)->saddr,
|
||||
+ ip_send_unicast_reply(*this_cpu_ptr(net->ipv4.tcp_sk),
|
||||
+ skb, ip_hdr(skb)->saddr,
|
||||
ip_hdr(skb)->daddr, &arg, arg.iov[0].iov_len);
|
||||
|
||||
TCP_INC_STATS_BH(net, TCP_MIB_OUTSEGS);
|
||||
@@ -2769,14 +2771,39 @@ struct proto tcp_prot = {
|
||||
};
|
||||
EXPORT_SYMBOL(tcp_prot);
|
||||
|
||||
+static void __net_exit tcp_sk_exit(struct net *net)
|
||||
+{
|
||||
+ int cpu;
|
||||
+
|
||||
+ for_each_possible_cpu(cpu)
|
||||
+ inet_ctl_sock_destroy(*per_cpu_ptr(net->ipv4.tcp_sk, cpu));
|
||||
+ free_percpu(net->ipv4.tcp_sk);
|
||||
+}
|
||||
+
|
||||
static int __net_init tcp_sk_init(struct net *net)
|
||||
{
|
||||
+ int res, cpu;
|
||||
+
|
||||
+ net->ipv4.tcp_sk = alloc_percpu(struct sock *);
|
||||
+ if (!net->ipv4.tcp_sk)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ for_each_possible_cpu(cpu) {
|
||||
+ struct sock *sk;
|
||||
+
|
||||
+ res = inet_ctl_sock_create(&sk, PF_INET, SOCK_RAW,
|
||||
+ IPPROTO_TCP, net);
|
||||
+ if (res)
|
||||
+ goto fail;
|
||||
+ *per_cpu_ptr(net->ipv4.tcp_sk, cpu) = sk;
|
||||
+ }
|
||||
net->ipv4.sysctl_tcp_ecn = 2;
|
||||
return 0;
|
||||
-}
|
||||
|
||||
-static void __net_exit tcp_sk_exit(struct net *net)
|
||||
-{
|
||||
+fail:
|
||||
+ tcp_sk_exit(net);
|
||||
+
|
||||
+ return res;
|
||||
}
|
||||
|
||||
static void __net_exit tcp_sk_exit_batch(struct list_head *net_exit_list)
|
||||
diff --git a/net/ipv4/udp_diag.c b/net/ipv4/udp_diag.c
|
||||
index 7927db0..4a000f1 100644
|
||||
--- a/net/ipv4/udp_diag.c
|
||||
+++ b/net/ipv4/udp_diag.c
|
||||
@@ -99,11 +99,13 @@ static void udp_dump(struct udp_table *table, struct sk_buff *skb, struct netlin
|
||||
s_slot = cb->args[0];
|
||||
num = s_num = cb->args[1];
|
||||
|
||||
- for (slot = s_slot; slot <= table->mask; num = s_num = 0, slot++) {
|
||||
+ for (slot = s_slot; slot <= table->mask; s_num = 0, slot++) {
|
||||
struct sock *sk;
|
||||
struct hlist_nulls_node *node;
|
||||
struct udp_hslot *hslot = &table->hash[slot];
|
||||
|
||||
+ num = 0;
|
||||
+
|
||||
if (hlist_nulls_empty(&hslot->head))
|
||||
continue;
|
||||
|
||||
diff --git a/net/ipv6/datagram.c b/net/ipv6/datagram.c
|
||||
index c3bf2d2..841cfa2 100644
|
||||
--- a/net/ipv6/datagram.c
|
||||
+++ b/net/ipv6/datagram.c
|
||||
@@ -382,11 +382,10 @@ int ipv6_recv_error(struct sock *sk, struct msghdr *msg, int len, int *addr_len)
|
||||
|
||||
memcpy(&errhdr.ee, &serr->ee, sizeof(struct sock_extended_err));
|
||||
sin = &errhdr.offender;
|
||||
- sin->sin6_family = AF_UNSPEC;
|
||||
+ memset(sin, 0, sizeof(*sin));
|
||||
+
|
||||
if (serr->ee.ee_origin != SO_EE_ORIGIN_LOCAL) {
|
||||
sin->sin6_family = AF_INET6;
|
||||
- sin->sin6_flowinfo = 0;
|
||||
- sin->sin6_port = 0;
|
||||
if (np->rxopt.all)
|
||||
ip6_datagram_recv_common_ctl(sk, msg, skb);
|
||||
if (skb->protocol == htons(ETH_P_IPV6)) {
|
||||
@@ -397,12 +396,9 @@ int ipv6_recv_error(struct sock *sk, struct msghdr *msg, int len, int *addr_len)
|
||||
ipv6_iface_scope_id(&sin->sin6_addr,
|
||||
IP6CB(skb)->iif);
|
||||
} else {
|
||||
- struct inet_sock *inet = inet_sk(sk);
|
||||
-
|
||||
ipv6_addr_set_v4mapped(ip_hdr(skb)->saddr,
|
||||
&sin->sin6_addr);
|
||||
- sin->sin6_scope_id = 0;
|
||||
- if (inet->cmsg_flags)
|
||||
+ if (inet_sk(sk)->cmsg_flags)
|
||||
ip_cmsg_recv(msg, skb);
|
||||
}
|
||||
}
|
||||
diff --git a/net/ipv6/ip6_fib.c b/net/ipv6/ip6_fib.c
|
||||
index 1e55f5e..7daaeaf 100644
|
||||
--- a/net/ipv6/ip6_fib.c
|
||||
+++ b/net/ipv6/ip6_fib.c
|
||||
@@ -638,6 +638,29 @@ static inline bool rt6_qualify_for_ecmp(struct rt6_info *rt)
|
||||
RTF_GATEWAY;
|
||||
}
|
||||
|
||||
+static void fib6_purge_rt(struct rt6_info *rt, struct fib6_node *fn,
|
||||
+ struct net *net)
|
||||
+{
|
||||
+ if (atomic_read(&rt->rt6i_ref) != 1) {
|
||||
+ /* This route is used as dummy address holder in some split
|
||||
+ * nodes. It is not leaked, but it still holds other resources,
|
||||
+ * which must be released in time. So, scan ascendant nodes
|
||||
+ * and replace dummy references to this route with references
|
||||
+ * to still alive ones.
|
||||
+ */
|
||||
+ while (fn) {
|
||||
+ if (!(fn->fn_flags & RTN_RTINFO) && fn->leaf == rt) {
|
||||
+ fn->leaf = fib6_find_prefix(net, fn);
|
||||
+ atomic_inc(&fn->leaf->rt6i_ref);
|
||||
+ rt6_release(rt);
|
||||
+ }
|
||||
+ fn = fn->parent;
|
||||
+ }
|
||||
+ /* No more references are possible at this point. */
|
||||
+ BUG_ON(atomic_read(&rt->rt6i_ref) != 1);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
/*
|
||||
* Insert routing information in a node.
|
||||
*/
|
||||
@@ -775,11 +798,12 @@ add:
|
||||
rt->dst.rt6_next = iter->dst.rt6_next;
|
||||
atomic_inc(&rt->rt6i_ref);
|
||||
inet6_rt_notify(RTM_NEWROUTE, rt, info);
|
||||
- rt6_release(iter);
|
||||
if (!(fn->fn_flags & RTN_RTINFO)) {
|
||||
info->nl_net->ipv6.rt6_stats->fib_route_nodes++;
|
||||
fn->fn_flags |= RTN_RTINFO;
|
||||
}
|
||||
+ fib6_purge_rt(iter, fn, info->nl_net);
|
||||
+ rt6_release(iter);
|
||||
}
|
||||
|
||||
return 0;
|
||||
@@ -1284,24 +1308,7 @@ static void fib6_del_route(struct fib6_node *fn, struct rt6_info **rtp,
|
||||
fn = fib6_repair_tree(net, fn);
|
||||
}
|
||||
|
||||
- if (atomic_read(&rt->rt6i_ref) != 1) {
|
||||
- /* This route is used as dummy address holder in some split
|
||||
- * nodes. It is not leaked, but it still holds other resources,
|
||||
- * which must be released in time. So, scan ascendant nodes
|
||||
- * and replace dummy references to this route with references
|
||||
- * to still alive ones.
|
||||
- */
|
||||
- while (fn) {
|
||||
- if (!(fn->fn_flags & RTN_RTINFO) && fn->leaf == rt) {
|
||||
- fn->leaf = fib6_find_prefix(net, fn);
|
||||
- atomic_inc(&fn->leaf->rt6i_ref);
|
||||
- rt6_release(rt);
|
||||
- }
|
||||
- fn = fn->parent;
|
||||
- }
|
||||
- /* No more references are possible at this point. */
|
||||
- BUG_ON(atomic_read(&rt->rt6i_ref) != 1);
|
||||
- }
|
||||
+ fib6_purge_rt(rt, fn, net);
|
||||
|
||||
inet6_rt_notify(RTM_DELROUTE, rt, info);
|
||||
rt6_release(rt);
|
||||
diff --git a/net/ipv6/route.c b/net/ipv6/route.c
|
||||
index 7cc1102..6f1b850 100644
|
||||
--- a/net/ipv6/route.c
|
||||
+++ b/net/ipv6/route.c
|
||||
@@ -1160,12 +1160,9 @@ static void ip6_rt_update_pmtu(struct dst_entry *dst, struct sock *sk,
|
||||
struct net *net = dev_net(dst->dev);
|
||||
|
||||
rt6->rt6i_flags |= RTF_MODIFIED;
|
||||
- if (mtu < IPV6_MIN_MTU) {
|
||||
- u32 features = dst_metric(dst, RTAX_FEATURES);
|
||||
+ if (mtu < IPV6_MIN_MTU)
|
||||
mtu = IPV6_MIN_MTU;
|
||||
- features |= RTAX_FEATURE_ALLFRAG;
|
||||
- dst_metric_set(dst, RTAX_FEATURES, features);
|
||||
- }
|
||||
+
|
||||
dst_metric_set(dst, RTAX_MTU, mtu);
|
||||
rt6_update_expires(rt6, net->ipv6.sysctl.ip6_rt_mtu_expires);
|
||||
}
|
||||
diff --git a/net/sctp/associola.c b/net/sctp/associola.c
|
||||
index d477d47..abc0922 100644
|
||||
--- a/net/sctp/associola.c
|
||||
+++ b/net/sctp/associola.c
|
||||
@@ -1235,7 +1235,6 @@ void sctp_assoc_update(struct sctp_association *asoc,
|
||||
asoc->peer.peer_hmacs = new->peer.peer_hmacs;
|
||||
new->peer.peer_hmacs = NULL;
|
||||
|
||||
- sctp_auth_key_put(asoc->asoc_shared_key);
|
||||
sctp_auth_asoc_init_active_key(asoc, GFP_ATOMIC);
|
||||
}
|
||||
|
||||
diff --git a/net/sctp/sm_make_chunk.c b/net/sctp/sm_make_chunk.c
|
||||
index 43abb64..df06b13 100644
|
||||
--- a/net/sctp/sm_make_chunk.c
|
||||
+++ b/net/sctp/sm_make_chunk.c
|
||||
@@ -2608,7 +2608,7 @@ do_addr_param:
|
||||
|
||||
addr_param = param.v + sizeof(sctp_addip_param_t);
|
||||
|
||||
- af = sctp_get_af_specific(param_type2af(param.p->type));
|
||||
+ af = sctp_get_af_specific(param_type2af(addr_param->p.type));
|
||||
if (af == NULL)
|
||||
break;
|
||||
|
||||
diff --git a/net/socket.c b/net/socket.c
|
||||
index a19ae19..1b2c2d6 100644
|
||||
--- a/net/socket.c
|
||||
+++ b/net/socket.c
|
||||
@@ -886,9 +886,6 @@ static ssize_t sock_splice_read(struct file *file, loff_t *ppos,
|
||||
static struct sock_iocb *alloc_sock_iocb(struct kiocb *iocb,
|
||||
struct sock_iocb *siocb)
|
||||
{
|
||||
- if (!is_sync_kiocb(iocb))
|
||||
- BUG();
|
||||
-
|
||||
siocb->kiocb = iocb;
|
||||
iocb->private = siocb;
|
||||
return siocb;
|
2036
projects/imx6/patches/linux/linux-000-patch-3.14.34-35.patch
Normal file
2036
projects/imx6/patches/linux/linux-000-patch-3.14.34-35.patch
Normal file
File diff suppressed because it is too large
Load Diff
3448
projects/imx6/patches/linux/linux-000-patch-3.14.35-36.patch
Normal file
3448
projects/imx6/patches/linux/linux-000-patch-3.14.35-36.patch
Normal file
File diff suppressed because it is too large
Load Diff
@ -1,12 +0,0 @@
|
||||
diff -uNr linux-3.6.4-orig/arch/x86/kernel/tsc.c linux-3.6.4-new/arch/x86/kernel/tsc.c
|
||||
--- linux-3.6.4-orig/arch/x86/kernel/tsc.c 2012-11-03 14:19:55.000000000 +0100
|
||||
+++ linux-3.6.4-new/arch/x86/kernel/tsc.c 2012-11-03 14:23:05.000000000 +0100
|
||||
@@ -374,7 +374,7 @@
|
||||
goto success;
|
||||
}
|
||||
}
|
||||
- pr_err("Fast TSC calibration failed\n");
|
||||
+ pr_info("Fast TSC calibration failed\n");
|
||||
return 0;
|
||||
|
||||
success:
|
Loading…
x
Reference in New Issue
Block a user