diff options
author | Leonardo Arena <rnalrd@alpinelinux.org> | 2013-08-03 10:25:53 +0000 |
---|---|---|
committer | Leonardo Arena <rnalrd@alpinelinux.org> | 2013-08-03 10:26:07 +0000 |
commit | 10a5acfaf661d81a2eccec1328322ed02922d316 (patch) | |
tree | 7dc7b19527248f414eb7f83371d011431981fc36 /main | |
parent | 85d0cc1dd04e91ec345c01dce43b83b147dbe0e5 (diff) | |
download | aports-10a5acfaf661d81a2eccec1328322ed02922d316.tar.bz2 aports-10a5acfaf661d81a2eccec1328322ed02922d316.tar.xz |
main/linux-virt-grsec: merge in stable fixes from 3.10.4 and 3.4.55
Diffstat (limited to 'main')
-rw-r--r-- | main/linux-virt-grsec/APKBUILD | 10 | ||||
-rw-r--r-- | main/linux-virt-grsec/grsecurity-2.9.1-3.9.11-unofficial-2.patch (renamed from main/linux-virt-grsec/grsecurity-2.9.1-3.9.11-unofficial-1.patch) | 1901 |
2 files changed, 1873 insertions, 38 deletions
diff --git a/main/linux-virt-grsec/APKBUILD b/main/linux-virt-grsec/APKBUILD index a94f25ba3..85d171911 100644 --- a/main/linux-virt-grsec/APKBUILD +++ b/main/linux-virt-grsec/APKBUILD @@ -8,7 +8,7 @@ case $pkgver in *.*.*) _kernver=${pkgver%.*};; *.*) _kernver=${pkgver};; esac -pkgrel=0 +pkgrel=2 pkgdesc="Linux kernel for virtual guests with grsecurity" url="http://grsecurity.net" depends="mkinitfs linux-firmware" @@ -18,7 +18,7 @@ _config=${config:-kernelconfig.${CARCH}} install= source="http://ftp.kernel.org/pub/linux/kernel/v3.x/linux-$_kernver.tar.xz http://ftp.kernel.org/pub/linux/kernel/v3.x/patch-$pkgver.xz - grsecurity-2.9.1-3.9.11-unofficial-1.patch + grsecurity-2.9.1-3.9.11-unofficial-2.patch 0001-net-inform-NETDEV_CHANGE-callbacks-which-flags-were-.patch 0002-arp-flush-arp-cache-on-IFF_NOARP-change.patch 0003-ipv4-properly-refresh-rtable-entries-on-pmtu-redirec.patch @@ -149,7 +149,7 @@ dev() { md5sums="4348c9b6b2eb3144d601e87c19d5d909 linux-3.9.tar.xz 552146435b7ecc414bf8e3cd8bb6ac4a patch-3.9.11.xz -0888981bb55e0d27b6ed39edcc7ee45a grsecurity-2.9.1-3.9.11-unofficial-1.patch +808e4e5dd176692d62ccfbf5988a88fa grsecurity-2.9.1-3.9.11-unofficial-2.patch a16f11b12381efb3bec79b9bfb329836 0001-net-inform-NETDEV_CHANGE-callbacks-which-flags-were-.patch 656ae7b10dd2f18dbfa1011041d08d60 0002-arp-flush-arp-cache-on-IFF_NOARP-change.patch aa454ffb96428586447775c21449e284 0003-ipv4-properly-refresh-rtable-entries-on-pmtu-redirec.patch @@ -160,7 +160,7 @@ aa454ffb96428586447775c21449e284 0003-ipv4-properly-refresh-rtable-entries-on-p 3fa1281098783b061581f6c1122edd77 kernelconfig.x86_64" sha256sums="60bc3e64ee5dc778de2cd7cd7640abf518a4c9d4f31b8ed624e16fad53f54541 linux-3.9.tar.xz 29be11d16ef152ae1858d567cbf45f0da0193adf364826f5e3fa8b2fcd839682 patch-3.9.11.xz -fa2223e87b38e225568a36ee2eb00976f74bc109e2ccc21c93abed676f58e3ad grsecurity-2.9.1-3.9.11-unofficial-1.patch +bd672d212020b5a7a00b3e0f6df39efbba6d0a1cbad88e0bf65cbaf8f8045204 grsecurity-2.9.1-3.9.11-unofficial-2.patch 6af3757ac36a6cd3cda7b0a71b08143726383b19261294a569ad7f4042c72df3 0001-net-inform-NETDEV_CHANGE-callbacks-which-flags-were-.patch dc8e82108615657f1fb9d641efd42255a5761c06edde1b00a41ae0d314d548f0 0002-arp-flush-arp-cache-on-IFF_NOARP-change.patch 0985caa0f3ee8ed0959aeaa4214f5f8057ae8e61d50dcae39194912d31e14892 0003-ipv4-properly-refresh-rtable-entries-on-pmtu-redirec.patch @@ -171,7 +171,7 @@ ca83354dfd4d2938bad03bd05aa25d6ab7228b289eabd43f10dab5c571f0ec07 kernelconfig.x 8e64c024e2f8d7d67198ad8c331cd3ef8df40015c85a0b5ef4c2487274404abb kernelconfig.x86_64" sha512sums="77fa521f42380409f8ab400c26f7b00e225cb075ef40834bb263325cfdcc3e65aef8511ec2fc2b50bbf4f50e226fb5ab07d7a479aaf09162adbbf318325d0790 linux-3.9.tar.xz c3a0be102d816ae06d7dfdd2738915fc2114cb9bb488b03b34e4f52f2367dcba4d8cb8ba203687bf694c2dcad36d70bb9d3121ac739a28e2c7fb2c44f08a9c71 patch-3.9.11.xz -59e34764fca125d097d1826042dce0e6fb0bf53eb97935b591e57674fb755491d78b1180a6db6253a869ffe56f7ceddf2e80f24812319e2b2f623d3e100aaa00 grsecurity-2.9.1-3.9.11-unofficial-1.patch +730e24dffc70250945d873358a2fbe19f1c9249befeaba6e53ce8c1b4ebb19583d51d6a437b6d9a39b705f48001f4a645f92560ef6b4db88ee8fbf9f17bafd41 grsecurity-2.9.1-3.9.11-unofficial-2.patch 81e78593288e8b0fd2c03ea9fc1450323887707f087e911f172450a122bc9b591ee83394836789730d951aeec13d0b75a64e1c05f04364abf8f80d883ddc4a02 0001-net-inform-NETDEV_CHANGE-callbacks-which-flags-were-.patch 51ecb15b669f6a82940a13a38939116e003bf5dfd24496771c8279e907b72adcc63d607f0340a2940d757e12ddadb7d45c7af78ae311d284935a6296dbcac00c 0002-arp-flush-arp-cache-on-IFF_NOARP-change.patch 57d0a8bd35d19cf657ded58efe24517d2252aec6984040713ba173a34edb5887ececaa2985076bc6a149eaa57639fd98a042c1c2d226ed4ad8dd5ed0e230717e 0003-ipv4-properly-refresh-rtable-entries-on-pmtu-redirec.patch diff --git a/main/linux-virt-grsec/grsecurity-2.9.1-3.9.11-unofficial-1.patch b/main/linux-virt-grsec/grsecurity-2.9.1-3.9.11-unofficial-2.patch index 932805c95..cb0d943df 100644 --- a/main/linux-virt-grsec/grsecurity-2.9.1-3.9.11-unofficial-1.patch +++ b/main/linux-virt-grsec/grsecurity-2.9.1-3.9.11-unofficial-2.patch @@ -34724,8 +34724,42 @@ index b70709b..1d8d02a 100644 .notifier_call = sh_dmae_nmi_handler, /* Run before NMI debug handler and KGDB */ +diff --git a/drivers/edac/edac_mc.c b/drivers/edac/edac_mc.c +index 27e86d9..89e1090 100644 +--- a/drivers/edac/edac_mc.c ++++ b/drivers/edac/edac_mc.c +@@ -48,6 +48,8 @@ static LIST_HEAD(mc_devices); + */ + static void const *edac_mc_owner; + ++static struct bus_type mc_bus[EDAC_MAX_MCS]; ++ + unsigned edac_dimm_info_location(struct dimm_info *dimm, char *buf, + unsigned len) + { +@@ -723,6 +725,11 @@ int edac_mc_add_mc(struct mem_ctl_info *mci) + int ret = -EINVAL; + edac_dbg(0, "\n"); + ++ if (mci->mc_idx >= EDAC_MAX_MCS) { ++ pr_warn_once("Too many memory controllers: %d\n", mci->mc_idx); ++ return -ENODEV; ++ } ++ + #ifdef CONFIG_EDAC_DEBUG + if (edac_debug_level >= 3) + edac_mc_dump_mci(mci); +@@ -762,6 +769,8 @@ int edac_mc_add_mc(struct mem_ctl_info *mci) + /* set load time so that error rate can be tracked */ + mci->start_time = jiffies; + ++ mci->bus = &mc_bus[mci->mc_idx]; ++ + if (edac_create_sysfs_mci_device(mci)) { + edac_mc_printk(mci, KERN_WARNING, + "failed to create sysfs device\n"); diff --git a/drivers/edac/edac_mc_sysfs.c b/drivers/edac/edac_mc_sysfs.c -index 769d92e..a3dcc1e 100644 +index 769d92e..8baa11a 100644 --- a/drivers/edac/edac_mc_sysfs.c +++ b/drivers/edac/edac_mc_sysfs.c @@ -148,7 +148,7 @@ static const char *edac_caps[] = { @@ -34737,7 +34771,60 @@ index 769d92e..a3dcc1e 100644 #define DEVICE_CHANNEL(_name, _mode, _show, _store, _var) \ struct dev_ch_attribute dev_attr_legacy_##_name = \ -@@ -1003,14 +1003,16 @@ int edac_create_sysfs_mci_device(struct mem_ctl_info *mci) +@@ -370,7 +370,7 @@ static int edac_create_csrow_object(struct mem_ctl_info *mci, + return -ENODEV; + + csrow->dev.type = &csrow_attr_type; +- csrow->dev.bus = &mci->bus; ++ csrow->dev.bus = mci->bus; + device_initialize(&csrow->dev); + csrow->dev.parent = &mci->dev; + csrow->mci = mci; +@@ -605,7 +605,7 @@ static int edac_create_dimm_object(struct mem_ctl_info *mci, + dimm->mci = mci; + + dimm->dev.type = &dimm_attr_type; +- dimm->dev.bus = &mci->bus; ++ dimm->dev.bus = mci->bus; + device_initialize(&dimm->dev); + + dimm->dev.parent = &mci->dev; +@@ -975,11 +975,13 @@ int edac_create_sysfs_mci_device(struct mem_ctl_info *mci) + * The memory controller needs its own bus, in order to avoid + * namespace conflicts at /sys/bus/edac. + */ +- mci->bus.name = kasprintf(GFP_KERNEL, "mc%d", mci->mc_idx); +- if (!mci->bus.name) ++ mci->bus->name = kasprintf(GFP_KERNEL, "mc%d", mci->mc_idx); ++ if (!mci->bus->name) + return -ENOMEM; +- edac_dbg(0, "creating bus %s\n", mci->bus.name); +- err = bus_register(&mci->bus); ++ ++ edac_dbg(0, "creating bus %s\n", mci->bus->name); ++ ++ err = bus_register(mci->bus); + if (err < 0) + return err; + +@@ -988,7 +990,7 @@ int edac_create_sysfs_mci_device(struct mem_ctl_info *mci) + device_initialize(&mci->dev); + + mci->dev.parent = mci_pdev; +- mci->dev.bus = &mci->bus; ++ mci->dev.bus = mci->bus; + dev_set_name(&mci->dev, "mc%d", mci->mc_idx); + dev_set_drvdata(&mci->dev, mci); + pm_runtime_forbid(&mci->dev); +@@ -997,20 +999,22 @@ int edac_create_sysfs_mci_device(struct mem_ctl_info *mci) + err = device_add(&mci->dev); + if (err < 0) { + edac_dbg(1, "failure: create device %s\n", dev_name(&mci->dev)); +- bus_unregister(&mci->bus); +- kfree(mci->bus.name); ++ bus_unregister(mci->bus); ++ kfree(mci->bus->name); + return err; } if (mci->set_sdram_scrub_rate || mci->get_sdram_scrub_rate) { @@ -34758,6 +34845,28 @@ index 769d92e..a3dcc1e 100644 err = device_create_file(&mci->dev, &dev_attr_sdram_scrub_rate); if (err) { +@@ -1064,8 +1068,8 @@ fail: + } + fail2: + device_unregister(&mci->dev); +- bus_unregister(&mci->bus); +- kfree(mci->bus.name); ++ bus_unregister(mci->bus); ++ kfree(mci->bus->name); + return err; + } + +@@ -1098,8 +1102,8 @@ void edac_unregister_sysfs(struct mem_ctl_info *mci) + { + edac_dbg(1, "Unregistering device %s\n", dev_name(&mci->dev)); + device_unregister(&mci->dev); +- bus_unregister(&mci->bus); +- kfree(mci->bus.name); ++ bus_unregister(mci->bus); ++ kfree(mci->bus->name); + } + + static void mc_attr_release(struct device *dev) diff --git a/drivers/edac/edac_pci_sysfs.c b/drivers/edac/edac_pci_sysfs.c index e8658e4..22746d6 100644 --- a/drivers/edac/edac_pci_sysfs.c @@ -34854,6 +34963,19 @@ index e8658e4..22746d6 100644 panic("EDAC: PCI Parity Error"); } } +diff --git a/drivers/edac/i5100_edac.c b/drivers/edac/i5100_edac.c +index 1b63517..157b934 100644 +--- a/drivers/edac/i5100_edac.c ++++ b/drivers/edac/i5100_edac.c +@@ -974,7 +974,7 @@ static int i5100_setup_debugfs(struct mem_ctl_info *mci) + if (!i5100_debugfs) + return -ENODEV; + +- priv->debugfs = debugfs_create_dir(mci->bus.name, i5100_debugfs); ++ priv->debugfs = debugfs_create_dir(mci->bus->name, i5100_debugfs); + + if (!priv->debugfs) + return -ENOMEM; diff --git a/drivers/edac/mce_amd.h b/drivers/edac/mce_amd.h index 51b7e3a..aa8a3e8 100644 --- a/drivers/edac/mce_amd.h @@ -38670,6 +38792,20 @@ index bc78354..42c9459 100644 module_param_array(video_nr, int, NULL, 0444); module_param_array(vbi_nr, int, NULL, 0444); +diff --git a/drivers/media/pci/saa7134/saa7134-alsa.c b/drivers/media/pci/saa7134/saa7134-alsa.c +index 10460fd..dbcdfbf 100644 +--- a/drivers/media/pci/saa7134/saa7134-alsa.c ++++ b/drivers/media/pci/saa7134/saa7134-alsa.c +@@ -172,7 +172,9 @@ static void saa7134_irq_alsa_done(struct saa7134_dev *dev, + dprintk("irq: overrun [full=%d/%d] - Blocks in %d\n",dev->dmasound.read_count, + dev->dmasound.bufsize, dev->dmasound.blocks); + spin_unlock(&dev->slock); ++ snd_pcm_stream_lock(dev->dmasound.substream); + snd_pcm_stop(dev->dmasound.substream,SNDRV_PCM_STATE_XRUN); ++ snd_pcm_stream_unlock(dev->dmasound.substream); + return; + } + diff --git a/drivers/media/platform/omap/omap_vout.c b/drivers/media/platform/omap/omap_vout.c index 96c4a17..1305a79 100644 --- a/drivers/media/platform/omap/omap_vout.c @@ -39835,6 +39971,28 @@ index dbbea0e..3f4a0b1 100644 #ifdef CONFIG_NET_POLL_CONTROLLER /* +diff --git a/drivers/net/dummy.c b/drivers/net/dummy.c +index 42aa54a..b710c6b 100644 +--- a/drivers/net/dummy.c ++++ b/drivers/net/dummy.c +@@ -185,6 +185,8 @@ static int __init dummy_init_module(void) + + rtnl_lock(); + err = __rtnl_link_register(&dummy_link_ops); ++ if (err < 0) ++ goto out; + + for (i = 0; i < numdummies && !err; i++) { + err = dummy_init_one(); +@@ -192,6 +194,8 @@ static int __init dummy_init_module(void) + } + if (err < 0) + __rtnl_link_unregister(&dummy_link_ops); ++ ++out: + rtnl_unlock(); + + return err; diff --git a/drivers/net/ethernet/8390/ax88796.c b/drivers/net/ethernet/8390/ax88796.c index e1d2643..7f4133b 100644 --- a/drivers/net/ethernet/8390/ax88796.c @@ -39852,6 +40010,112 @@ index e1d2643..7f4133b 100644 } if (!request_mem_region(mem->start, mem_size, pdev->name)) { +diff --git a/drivers/net/ethernet/atheros/atl1e/atl1e_main.c b/drivers/net/ethernet/atheros/atl1e/atl1e_main.c +index ac25f05..35c9d1a 100644 +--- a/drivers/net/ethernet/atheros/atl1e/atl1e_main.c ++++ b/drivers/net/ethernet/atheros/atl1e/atl1e_main.c +@@ -1667,8 +1667,8 @@ check_sum: + return 0; + } + +-static void atl1e_tx_map(struct atl1e_adapter *adapter, +- struct sk_buff *skb, struct atl1e_tpd_desc *tpd) ++static int atl1e_tx_map(struct atl1e_adapter *adapter, ++ struct sk_buff *skb, struct atl1e_tpd_desc *tpd) + { + struct atl1e_tpd_desc *use_tpd = NULL; + struct atl1e_tx_buffer *tx_buffer = NULL; +@@ -1679,6 +1679,8 @@ static void atl1e_tx_map(struct atl1e_adapter *adapter, + u16 nr_frags; + u16 f; + int segment; ++ int ring_start = adapter->tx_ring.next_to_use; ++ int ring_end; + + nr_frags = skb_shinfo(skb)->nr_frags; + segment = (tpd->word3 >> TPD_SEGMENT_EN_SHIFT) & TPD_SEGMENT_EN_MASK; +@@ -1691,6 +1693,9 @@ static void atl1e_tx_map(struct atl1e_adapter *adapter, + tx_buffer->length = map_len; + tx_buffer->dma = pci_map_single(adapter->pdev, + skb->data, hdr_len, PCI_DMA_TODEVICE); ++ if (dma_mapping_error(&adapter->pdev->dev, tx_buffer->dma)) ++ return -ENOSPC; ++ + ATL1E_SET_PCIMAP_TYPE(tx_buffer, ATL1E_TX_PCIMAP_SINGLE); + mapped_len += map_len; + use_tpd->buffer_addr = cpu_to_le64(tx_buffer->dma); +@@ -1717,6 +1722,22 @@ static void atl1e_tx_map(struct atl1e_adapter *adapter, + tx_buffer->dma = + pci_map_single(adapter->pdev, skb->data + mapped_len, + map_len, PCI_DMA_TODEVICE); ++ ++ if (dma_mapping_error(&adapter->pdev->dev, tx_buffer->dma)) { ++ /* We need to unwind the mappings we've done */ ++ ring_end = adapter->tx_ring.next_to_use; ++ adapter->tx_ring.next_to_use = ring_start; ++ while (adapter->tx_ring.next_to_use != ring_end) { ++ tpd = atl1e_get_tpd(adapter); ++ tx_buffer = atl1e_get_tx_buffer(adapter, tpd); ++ pci_unmap_single(adapter->pdev, tx_buffer->dma, ++ tx_buffer->length, PCI_DMA_TODEVICE); ++ } ++ /* Reset the tx rings next pointer */ ++ adapter->tx_ring.next_to_use = ring_start; ++ return -ENOSPC; ++ } ++ + ATL1E_SET_PCIMAP_TYPE(tx_buffer, ATL1E_TX_PCIMAP_SINGLE); + mapped_len += map_len; + use_tpd->buffer_addr = cpu_to_le64(tx_buffer->dma); +@@ -1752,6 +1773,23 @@ static void atl1e_tx_map(struct atl1e_adapter *adapter, + (i * MAX_TX_BUF_LEN), + tx_buffer->length, + DMA_TO_DEVICE); ++ ++ if (dma_mapping_error(&adapter->pdev->dev, tx_buffer->dma)) { ++ /* We need to unwind the mappings we've done */ ++ ring_end = adapter->tx_ring.next_to_use; ++ adapter->tx_ring.next_to_use = ring_start; ++ while (adapter->tx_ring.next_to_use != ring_end) { ++ tpd = atl1e_get_tpd(adapter); ++ tx_buffer = atl1e_get_tx_buffer(adapter, tpd); ++ dma_unmap_page(&adapter->pdev->dev, tx_buffer->dma, ++ tx_buffer->length, DMA_TO_DEVICE); ++ } ++ ++ /* Reset the ring next to use pointer */ ++ adapter->tx_ring.next_to_use = ring_start; ++ return -ENOSPC; ++ } ++ + ATL1E_SET_PCIMAP_TYPE(tx_buffer, ATL1E_TX_PCIMAP_PAGE); + use_tpd->buffer_addr = cpu_to_le64(tx_buffer->dma); + use_tpd->word2 = (use_tpd->word2 & (~TPD_BUFLEN_MASK)) | +@@ -1769,6 +1807,7 @@ static void atl1e_tx_map(struct atl1e_adapter *adapter, + /* The last buffer info contain the skb address, + so it will be free after unmap */ + tx_buffer->skb = skb; ++ return 0; + } + + static void atl1e_tx_queue(struct atl1e_adapter *adapter, u16 count, +@@ -1836,10 +1875,15 @@ static netdev_tx_t atl1e_xmit_frame(struct sk_buff *skb, + return NETDEV_TX_OK; + } + +- atl1e_tx_map(adapter, skb, tpd); ++ if (atl1e_tx_map(adapter, skb, tpd)) { ++ dev_kfree_skb_any(skb); ++ goto out; ++ } ++ + atl1e_tx_queue(adapter, tpd_req, tpd); + + netdev->trans_start = jiffies; /* NETIF_F_LLTX driver :( */ ++out: + spin_unlock_irqrestore(&adapter->tx_lock, flags); + return NETDEV_TX_OK; + } diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.h b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.h index aee7671..3ca2651 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.h @@ -40166,6 +40430,61 @@ index 54fd2ef..33c8a4f 100644 int (*set_speed)(struct net_device *, u8 aneg, u16 sp, u8 dpx, u32 adv); int (*get_settings)(struct net_device *, struct ethtool_cmd *); +diff --git a/drivers/net/ethernet/renesas/sh_eth.c b/drivers/net/ethernet/renesas/sh_eth.c +index 8791999..68caa85 100644 +--- a/drivers/net/ethernet/renesas/sh_eth.c ++++ b/drivers/net/ethernet/renesas/sh_eth.c +@@ -172,8 +172,9 @@ static struct sh_eth_cpu_data sh_eth_my_cpu_data = { + .rmcr_value = 0x00000001, + + .tx_check = EESR_FTC | EESR_CND | EESR_DLC | EESR_CD | EESR_RTO, +- .eesr_err_check = EESR_TWB | EESR_TABT | EESR_RABT | EESR_RDE | +- EESR_RFRMER | EESR_TFE | EESR_TDE | EESR_ECI, ++ .eesr_err_check = EESR_TWB | EESR_TABT | EESR_RABT | EESR_RFE | ++ EESR_RDE | EESR_RFRMER | EESR_TFE | EESR_TDE | ++ EESR_ECI, + .tx_error_check = EESR_TWB | EESR_TABT | EESR_TDE | EESR_TFE, + + .apr = 1, +@@ -286,9 +287,9 @@ static struct sh_eth_cpu_data sh_eth_my_cpu_data_giga = { + .eesipr_value = DMAC_M_RFRMER | DMAC_M_ECI | 0x003fffff, + + .tx_check = EESR_TC1 | EESR_FTC, +- .eesr_err_check = EESR_TWB1 | EESR_TWB | EESR_TABT | EESR_RABT | \ +- EESR_RDE | EESR_RFRMER | EESR_TFE | EESR_TDE | \ +- EESR_ECI, ++ .eesr_err_check = EESR_TWB1 | EESR_TWB | EESR_TABT | EESR_RABT | ++ EESR_RFE | EESR_RDE | EESR_RFRMER | EESR_TFE | ++ EESR_TDE | EESR_ECI, + .tx_error_check = EESR_TWB1 | EESR_TWB | EESR_TABT | EESR_TDE | \ + EESR_TFE, + .fdr_value = 0x0000072f, +@@ -505,9 +506,9 @@ static struct sh_eth_cpu_data sh_eth_my_cpu_data = { + .eesipr_value = DMAC_M_RFRMER | DMAC_M_ECI | 0x003fffff, + + .tx_check = EESR_TC1 | EESR_FTC, +- .eesr_err_check = EESR_TWB1 | EESR_TWB | EESR_TABT | EESR_RABT | \ +- EESR_RDE | EESR_RFRMER | EESR_TFE | EESR_TDE | \ +- EESR_ECI, ++ .eesr_err_check = EESR_TWB1 | EESR_TWB | EESR_TABT | EESR_RABT | ++ EESR_RFE | EESR_RDE | EESR_RFRMER | EESR_TFE | ++ EESR_TDE | EESR_ECI, + .tx_error_check = EESR_TWB1 | EESR_TWB | EESR_TABT | EESR_TDE | \ + EESR_TFE, + +diff --git a/drivers/net/ethernet/renesas/sh_eth.h b/drivers/net/ethernet/renesas/sh_eth.h +index 828be45..832be11 100644 +--- a/drivers/net/ethernet/renesas/sh_eth.h ++++ b/drivers/net/ethernet/renesas/sh_eth.h +@@ -472,7 +472,7 @@ enum EESR_BIT { + + #define DEFAULT_TX_CHECK (EESR_FTC | EESR_CND | EESR_DLC | EESR_CD | \ + EESR_RTO) +-#define DEFAULT_EESR_ERR_CHECK (EESR_TWB | EESR_TABT | EESR_RABT | \ ++#define DEFAULT_EESR_ERR_CHECK (EESR_TWB | EESR_TABT | EESR_RABT | EESR_RFE | \ + EESR_RDE | EESR_RFRMER | EESR_ADE | \ + EESR_TFE | EESR_TDE | EESR_ECI) + #define DEFAULT_TX_ERROR_CHECK (EESR_TWB | EESR_TABT | EESR_ADE | EESR_TDE | \ diff --git a/drivers/net/ethernet/sfc/ptp.c b/drivers/net/ethernet/sfc/ptp.c index 3f93624..cf01144 100644 --- a/drivers/net/ethernet/sfc/ptp.c @@ -40194,6 +40513,19 @@ index 50617c5..b13724c 100644 } /* To mask all all interrupts.*/ +diff --git a/drivers/net/ethernet/sun/sunvnet.c b/drivers/net/ethernet/sun/sunvnet.c +index 1df0ff3..3df5684 100644 +--- a/drivers/net/ethernet/sun/sunvnet.c ++++ b/drivers/net/ethernet/sun/sunvnet.c +@@ -1239,6 +1239,8 @@ static int vnet_port_remove(struct vio_dev *vdev) + dev_set_drvdata(&vdev->dev, NULL); + + kfree(port); ++ ++ unregister_netdev(vp->dev); + } + return 0; + } diff --git a/drivers/net/hyperv/hyperv_net.h b/drivers/net/hyperv/hyperv_net.h index e6fe0d8..2b7d752 100644 --- a/drivers/net/hyperv/hyperv_net.h @@ -40242,6 +40574,29 @@ index 8f1c256..a2991d1 100644 priv = netdev_priv(dev); priv->phy = phy; +diff --git a/drivers/net/ifb.c b/drivers/net/ifb.c +index 8216438..c51944d 100644 +--- a/drivers/net/ifb.c ++++ b/drivers/net/ifb.c +@@ -290,11 +290,17 @@ static int __init ifb_init_module(void) + + rtnl_lock(); + err = __rtnl_link_register(&ifb_link_ops); ++ if (err < 0) ++ goto out; + +- for (i = 0; i < numifbs && !err; i++) ++ for (i = 0; i < numifbs && !err; i++) { + err = ifb_init_one(i); ++ cond_resched(); ++ } + if (err) + __rtnl_link_unregister(&ifb_link_ops); ++ ++out: + rtnl_unlock(); + + return err; diff --git a/drivers/net/macvlan.c b/drivers/net/macvlan.c index 011062e..ada88e9 100644 --- a/drivers/net/macvlan.c @@ -40279,7 +40634,7 @@ index 011062e..ada88e9 100644 }; diff --git a/drivers/net/macvtap.c b/drivers/net/macvtap.c -index acf6450..8f771b7 100644 +index acf6450..d880503 100644 --- a/drivers/net/macvtap.c +++ b/drivers/net/macvtap.c @@ -525,8 +525,10 @@ static int zerocopy_sg_from_iovec(struct sk_buff *skb, const struct iovec *from, @@ -40295,7 +40650,105 @@ index acf6450..8f771b7 100644 return -EFAULT; } truesize = size * PAGE_SIZE; -@@ -1099,7 +1101,7 @@ static int macvtap_device_event(struct notifier_block *unused, +@@ -632,6 +634,28 @@ static int macvtap_skb_to_vnet_hdr(const struct sk_buff *skb, + return 0; + } + ++static unsigned long iov_pages(const struct iovec *iv, int offset, ++ unsigned long nr_segs) ++{ ++ unsigned long seg, base; ++ int pages = 0, len, size; ++ ++ while (nr_segs && (offset >= iv->iov_len)) { ++ offset -= iv->iov_len; ++ ++iv; ++ --nr_segs; ++ } ++ ++ for (seg = 0; seg < nr_segs; seg++) { ++ base = (unsigned long)iv[seg].iov_base + offset; ++ len = iv[seg].iov_len - offset; ++ size = ((base & ~PAGE_MASK) + len + ~PAGE_MASK) >> PAGE_SHIFT; ++ pages += size; ++ offset = 0; ++ } ++ ++ return pages; ++} + + /* Get packet from user space buffer */ + static ssize_t macvtap_get_user(struct macvtap_queue *q, struct msghdr *m, +@@ -647,6 +671,7 @@ static ssize_t macvtap_get_user(struct macvtap_queue *q, struct msghdr *m, + int copylen = 0; + bool zerocopy = false; + struct flow_keys keys; ++ size_t linear; + + if (q->flags & IFF_VNET_HDR) { + vnet_hdr_len = q->vnet_hdr_sz; +@@ -678,42 +703,35 @@ static ssize_t macvtap_get_user(struct macvtap_queue *q, struct msghdr *m, + if (unlikely(count > UIO_MAXIOV)) + goto err; + +- if (m && m->msg_control && sock_flag(&q->sk, SOCK_ZEROCOPY)) +- zerocopy = true; ++ if (m && m->msg_control && sock_flag(&q->sk, SOCK_ZEROCOPY)) { ++ copylen = vnet_hdr.hdr_len ? vnet_hdr.hdr_len : GOODCOPY_LEN; ++ linear = copylen; ++ if (iov_pages(iv, vnet_hdr_len + copylen, count) ++ <= MAX_SKB_FRAGS) ++ zerocopy = true; ++ } + +- if (zerocopy) { +- /* Userspace may produce vectors with count greater than +- * MAX_SKB_FRAGS, so we need to linearize parts of the skb +- * to let the rest of data to be fit in the frags. +- */ +- if (count > MAX_SKB_FRAGS) { +- copylen = iov_length(iv, count - MAX_SKB_FRAGS); +- if (copylen < vnet_hdr_len) +- copylen = 0; +- else +- copylen -= vnet_hdr_len; +- } +- /* There are 256 bytes to be copied in skb, so there is enough +- * room for skb expand head in case it is used. +- * The rest buffer is mapped from userspace. +- */ +- if (copylen < vnet_hdr.hdr_len) +- copylen = vnet_hdr.hdr_len; +- if (!copylen) +- copylen = GOODCOPY_LEN; +- } else ++ if (!zerocopy) { + copylen = len; ++ linear = vnet_hdr.hdr_len; ++ } + + skb = macvtap_alloc_skb(&q->sk, NET_IP_ALIGN, copylen, +- vnet_hdr.hdr_len, noblock, &err); ++ linear, noblock, &err); + if (!skb) + goto err; + + if (zerocopy) + err = zerocopy_sg_from_iovec(skb, iv, vnet_hdr_len, count); +- else ++ else { + err = skb_copy_datagram_from_iovec(skb, 0, iv, vnet_hdr_len, + len); ++ if (!err && m && m->msg_control) { ++ struct ubuf_info *uarg = m->msg_control; ++ uarg->callback(uarg, false); ++ } ++ } ++ + if (err) + goto err_kfree; + +@@ -1099,7 +1117,7 @@ static int macvtap_device_event(struct notifier_block *unused, return NOTIFY_DONE; } @@ -40365,7 +40818,7 @@ index 0017b67..ab8f595 100644 }; diff --git a/drivers/net/tun.c b/drivers/net/tun.c -index 8ad822e..eb895f1 100644 +index 8ad822e..9bf0655 100644 --- a/drivers/net/tun.c +++ b/drivers/net/tun.c @@ -1013,8 +1013,10 @@ static int zerocopy_sg_from_iovec(struct sk_buff *skb, const struct iovec *from, @@ -40381,7 +40834,109 @@ index 8ad822e..eb895f1 100644 return -EFAULT; } truesize = size * PAGE_SIZE; -@@ -1859,7 +1861,7 @@ unlock: +@@ -1038,6 +1040,29 @@ static int zerocopy_sg_from_iovec(struct sk_buff *skb, const struct iovec *from, + return 0; + } + ++static unsigned long iov_pages(const struct iovec *iv, int offset, ++ unsigned long nr_segs) ++{ ++ unsigned long seg, base; ++ int pages = 0, len, size; ++ ++ while (nr_segs && (offset >= iv->iov_len)) { ++ offset -= iv->iov_len; ++ ++iv; ++ --nr_segs; ++ } ++ ++ for (seg = 0; seg < nr_segs; seg++) { ++ base = (unsigned long)iv[seg].iov_base + offset; ++ len = iv[seg].iov_len - offset; ++ size = ((base & ~PAGE_MASK) + len + ~PAGE_MASK) >> PAGE_SHIFT; ++ pages += size; ++ offset = 0; ++ } ++ ++ return pages; ++} ++ + /* Get packet from user space buffer */ + static ssize_t tun_get_user(struct tun_struct *tun, struct tun_file *tfile, + void *msg_control, const struct iovec *iv, +@@ -1045,7 +1070,7 @@ static ssize_t tun_get_user(struct tun_struct *tun, struct tun_file *tfile, + { + struct tun_pi pi = { 0, cpu_to_be16(ETH_P_IP) }; + struct sk_buff *skb; +- size_t len = total_len, align = NET_SKB_PAD; ++ size_t len = total_len, align = NET_SKB_PAD, linear; + struct virtio_net_hdr gso = { 0 }; + int offset = 0; + int copylen; +@@ -1086,34 +1111,23 @@ static ssize_t tun_get_user(struct tun_struct *tun, struct tun_file *tfile, + return -EINVAL; + } + +- if (msg_control) +- zerocopy = true; +- +- if (zerocopy) { +- /* Userspace may produce vectors with count greater than +- * MAX_SKB_FRAGS, so we need to linearize parts of the skb +- * to let the rest of data to be fit in the frags. +- */ +- if (count > MAX_SKB_FRAGS) { +- copylen = iov_length(iv, count - MAX_SKB_FRAGS); +- if (copylen < offset) +- copylen = 0; +- else +- copylen -= offset; +- } else +- copylen = 0; +- /* There are 256 bytes to be copied in skb, so there is enough +- * room for skb expand head in case it is used. ++ if (msg_control) { ++ /* There are 256 bytes to be copied in skb, so there is ++ * enough room for skb expand head in case it is used. + * The rest of the buffer is mapped from userspace. + */ +- if (copylen < gso.hdr_len) +- copylen = gso.hdr_len; +- if (!copylen) +- copylen = GOODCOPY_LEN; +- } else ++ copylen = gso.hdr_len ? gso.hdr_len : GOODCOPY_LEN; ++ linear = copylen; ++ if (iov_pages(iv, offset + copylen, count) <= MAX_SKB_FRAGS) ++ zerocopy = true; ++ } ++ ++ if (!zerocopy) { + copylen = len; ++ linear = gso.hdr_len; ++ } + +- skb = tun_alloc_skb(tfile, align, copylen, gso.hdr_len, noblock); ++ skb = tun_alloc_skb(tfile, align, copylen, linear, noblock); + if (IS_ERR(skb)) { + if (PTR_ERR(skb) != -EAGAIN) + tun->dev->stats.rx_dropped++; +@@ -1122,8 +1136,13 @@ static ssize_t tun_get_user(struct tun_struct *tun, struct tun_file *tfile, + + if (zerocopy) + err = zerocopy_sg_from_iovec(skb, iv, offset, count); +- else ++ else { + err = skb_copy_datagram_from_iovec(skb, 0, iv, offset, len); ++ if (!err && msg_control) { ++ struct ubuf_info *uarg = msg_control; ++ uarg->callback(uarg, false); ++ } ++ } + + if (err) { + tun->dev->stats.rx_dropped++; +@@ -1859,7 +1878,7 @@ unlock: } static long __tun_chr_ioctl(struct file *file, unsigned int cmd, @@ -40390,7 +40945,7 @@ index 8ad822e..eb895f1 100644 { struct tun_file *tfile = file->private_data; struct tun_struct *tun; -@@ -1871,6 +1873,9 @@ static long __tun_chr_ioctl(struct file *file, unsigned int cmd, +@@ -1871,6 +1890,9 @@ static long __tun_chr_ioctl(struct file *file, unsigned int cmd, int vnet_hdr_sz; int ret; @@ -42566,6 +43121,131 @@ index 98af07c..7625fb5 100644 } /** +diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c b/drivers/scsi/megaraid/megaraid_sas_base.c +index 9d53540..e5a5746 100644 +--- a/drivers/scsi/megaraid/megaraid_sas_base.c ++++ b/drivers/scsi/megaraid/megaraid_sas_base.c +@@ -4852,10 +4852,12 @@ megasas_mgmt_fw_ioctl(struct megasas_instance *instance, + sense, sense_handle); + } + +- for (i = 0; i < ioc->sge_count && kbuff_arr[i]; i++) { +- dma_free_coherent(&instance->pdev->dev, +- kern_sge32[i].length, +- kbuff_arr[i], kern_sge32[i].phys_addr); ++ for (i = 0; i < ioc->sge_count; i++) { ++ if (kbuff_arr[i]) ++ dma_free_coherent(&instance->pdev->dev, ++ kern_sge32[i].length, ++ kbuff_arr[i], ++ kern_sge32[i].phys_addr); + } + + megasas_return_cmd(instance, cmd); +diff --git a/drivers/scsi/mpt3sas/mpt3sas_scsih.c b/drivers/scsi/mpt3sas/mpt3sas_scsih.c +index dcbf7c8..f8c4b85 100644 +--- a/drivers/scsi/mpt3sas/mpt3sas_scsih.c ++++ b/drivers/scsi/mpt3sas/mpt3sas_scsih.c +@@ -1273,6 +1273,7 @@ _scsih_slave_alloc(struct scsi_device *sdev) + struct MPT3SAS_DEVICE *sas_device_priv_data; + struct scsi_target *starget; + struct _raid_device *raid_device; ++ struct _sas_device *sas_device; + unsigned long flags; + + sas_device_priv_data = kzalloc(sizeof(struct scsi_device), GFP_KERNEL); +@@ -1301,6 +1302,19 @@ _scsih_slave_alloc(struct scsi_device *sdev) + spin_unlock_irqrestore(&ioc->raid_device_lock, flags); + } + ++ if (!(sas_target_priv_data->flags & MPT_TARGET_FLAGS_VOLUME)) { ++ spin_lock_irqsave(&ioc->sas_device_lock, flags); ++ sas_device = mpt3sas_scsih_sas_device_find_by_sas_address(ioc, ++ sas_target_priv_data->sas_address); ++ if (sas_device && (sas_device->starget == NULL)) { ++ sdev_printk(KERN_INFO, sdev, ++ "%s : sas_device->starget set to starget @ %d\n", ++ __func__, __LINE__); ++ sas_device->starget = starget; ++ } ++ spin_unlock_irqrestore(&ioc->sas_device_lock, flags); ++ } ++ + return 0; + } + +@@ -6392,7 +6406,7 @@ _scsih_search_responding_sas_devices(struct MPT3SAS_ADAPTER *ioc) + handle))) { + ioc_status = le16_to_cpu(mpi_reply.IOCStatus) & + MPI2_IOCSTATUS_MASK; +- if (ioc_status == MPI2_IOCSTATUS_CONFIG_INVALID_PAGE) ++ if (ioc_status != MPI2_IOCSTATUS_SUCCESS) + break; + handle = le16_to_cpu(sas_device_pg0.DevHandle); + device_info = le32_to_cpu(sas_device_pg0.DeviceInfo); +@@ -6494,7 +6508,7 @@ _scsih_search_responding_raid_devices(struct MPT3SAS_ADAPTER *ioc) + &volume_pg1, MPI2_RAID_VOLUME_PGAD_FORM_GET_NEXT_HANDLE, handle))) { + ioc_status = le16_to_cpu(mpi_reply.IOCStatus) & + MPI2_IOCSTATUS_MASK; +- if (ioc_status == MPI2_IOCSTATUS_CONFIG_INVALID_PAGE) ++ if (ioc_status != MPI2_IOCSTATUS_SUCCESS) + break; + handle = le16_to_cpu(volume_pg1.DevHandle); + +@@ -6518,7 +6532,7 @@ _scsih_search_responding_raid_devices(struct MPT3SAS_ADAPTER *ioc) + phys_disk_num))) { + ioc_status = le16_to_cpu(mpi_reply.IOCStatus) & + MPI2_IOCSTATUS_MASK; +- if (ioc_status == MPI2_IOCSTATUS_CONFIG_INVALID_PAGE) ++ if (ioc_status != MPI2_IOCSTATUS_SUCCESS) + break; + phys_disk_num = pd_pg0.PhysDiskNum; + handle = le16_to_cpu(pd_pg0.DevHandle); +@@ -6597,7 +6611,7 @@ _scsih_search_responding_expanders(struct MPT3SAS_ADAPTER *ioc) + + ioc_status = le16_to_cpu(mpi_reply.IOCStatus) & + MPI2_IOCSTATUS_MASK; +- if (ioc_status == MPI2_IOCSTATUS_CONFIG_INVALID_PAGE) ++ if (ioc_status != MPI2_IOCSTATUS_SUCCESS) + break; + + handle = le16_to_cpu(expander_pg0.DevHandle); +@@ -6742,8 +6756,6 @@ _scsih_scan_for_devices_after_reset(struct MPT3SAS_ADAPTER *ioc) + MPI2_SAS_EXPAND_PGAD_FORM_GET_NEXT_HNDL, handle))) { + ioc_status = le16_to_cpu(mpi_reply.IOCStatus) & + MPI2_IOCSTATUS_MASK; +- if (ioc_status == MPI2_IOCSTATUS_CONFIG_INVALID_PAGE) +- break; + if (ioc_status != MPI2_IOCSTATUS_SUCCESS) { + pr_info(MPT3SAS_FMT "\tbreak from expander scan: " \ + "ioc_status(0x%04x), loginfo(0x%08x)\n", +@@ -6787,8 +6799,6 @@ _scsih_scan_for_devices_after_reset(struct MPT3SAS_ADAPTER *ioc) + phys_disk_num))) { + ioc_status = le16_to_cpu(mpi_reply.IOCStatus) & + MPI2_IOCSTATUS_MASK; +- if (ioc_status == MPI2_IOCSTATUS_CONFIG_INVALID_PAGE) +- break; + if (ioc_status != MPI2_IOCSTATUS_SUCCESS) { + pr_info(MPT3SAS_FMT "\tbreak from phys disk scan: "\ + "ioc_status(0x%04x), loginfo(0x%08x)\n", +@@ -6854,8 +6864,6 @@ _scsih_scan_for_devices_after_reset(struct MPT3SAS_ADAPTER *ioc) + &volume_pg1, MPI2_RAID_VOLUME_PGAD_FORM_GET_NEXT_HANDLE, handle))) { + ioc_status = le16_to_cpu(mpi_reply.IOCStatus) & + MPI2_IOCSTATUS_MASK; +- if (ioc_status == MPI2_IOCSTATUS_CONFIG_INVALID_PAGE) +- break; + if (ioc_status != MPI2_IOCSTATUS_SUCCESS) { + pr_info(MPT3SAS_FMT "\tbreak from volume scan: " \ + "ioc_status(0x%04x), loginfo(0x%08x)\n", +@@ -6914,8 +6922,6 @@ _scsih_scan_for_devices_after_reset(struct MPT3SAS_ADAPTER *ioc) + handle))) { + ioc_status = le16_to_cpu(mpi_reply.IOCStatus) & + MPI2_IOCSTATUS_MASK; +- if (ioc_status == MPI2_IOCSTATUS_CONFIG_INVALID_PAGE) +- break; + if (ioc_status != MPI2_IOCSTATUS_SUCCESS) { + pr_info(MPT3SAS_FMT "\tbreak from end device scan:"\ + " ioc_status(0x%04x), loginfo(0x%08x)\n", diff --git a/drivers/scsi/pmcraid.c b/drivers/scsi/pmcraid.c index b46f5e9..c4c4ccb 100644 --- a/drivers/scsi/pmcraid.c @@ -44852,6 +45532,119 @@ index 5f3bcd3..bfca43f 100644 usb_autopm_put_interface(serial->interface); error_get_interface: usb_serial_put(serial); +diff --git a/drivers/usb/serial/cp210x.c b/drivers/usb/serial/cp210x.c +index 4747d1c..3850e92 100644 +--- a/drivers/usb/serial/cp210x.c ++++ b/drivers/usb/serial/cp210x.c +@@ -53,6 +53,7 @@ static const struct usb_device_id id_table[] = { + { USB_DEVICE(0x0489, 0xE000) }, /* Pirelli Broadband S.p.A, DP-L10 SIP/GSM Mobile */ + { USB_DEVICE(0x0489, 0xE003) }, /* Pirelli Broadband S.p.A, DP-L10 SIP/GSM Mobile */ + { USB_DEVICE(0x0745, 0x1000) }, /* CipherLab USB CCD Barcode Scanner 1000 */ ++ { USB_DEVICE(0x0846, 0x1100) }, /* NetGear Managed Switch M4100 series, M5300 series, M7100 series */ + { USB_DEVICE(0x08e6, 0x5501) }, /* Gemalto Prox-PU/CU contactless smartcard reader */ + { USB_DEVICE(0x08FD, 0x000A) }, /* Digianswer A/S , ZigBee/802.15.4 MAC Device */ + { USB_DEVICE(0x0BED, 0x1100) }, /* MEI (TM) Cashflow-SC Bill/Voucher Acceptor */ +@@ -118,6 +119,8 @@ static const struct usb_device_id id_table[] = { + { USB_DEVICE(0x10C4, 0x85F8) }, /* Virtenio Preon32 */ + { USB_DEVICE(0x10C4, 0x8664) }, /* AC-Services CAN-IF */ + { USB_DEVICE(0x10C4, 0x8665) }, /* AC-Services OBD-IF */ ++ { USB_DEVICE(0x10C4, 0x88A4) }, /* MMB Networks ZigBee USB Device */ ++ { USB_DEVICE(0x10C4, 0x88A5) }, /* Planet Innovation Ingeni ZigBee USB Device */ + { USB_DEVICE(0x10C4, 0xEA60) }, /* Silicon Labs factory default */ + { USB_DEVICE(0x10C4, 0xEA61) }, /* Silicon Labs factory default */ + { USB_DEVICE(0x10C4, 0xEA70) }, /* Silicon Labs factory default */ +@@ -148,6 +151,7 @@ static const struct usb_device_id id_table[] = { + { USB_DEVICE(0x17F4, 0xAAAA) }, /* Wavesense Jazz blood glucose meter */ + { USB_DEVICE(0x1843, 0x0200) }, /* Vaisala USB Instrument Cable */ + { USB_DEVICE(0x18EF, 0xE00F) }, /* ELV USB-I2C-Interface */ ++ { USB_DEVICE(0x1ADB, 0x0001) }, /* Schweitzer Engineering C662 Cable */ + { USB_DEVICE(0x1BE3, 0x07A6) }, /* WAGO 750-923 USB Service Cable */ + { USB_DEVICE(0x1E29, 0x0102) }, /* Festo CPX-USB */ + { USB_DEVICE(0x1E29, 0x0501) }, /* Festo CMSP */ +diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c +index 9162db2..b7cabbf 100644 +--- a/drivers/usb/serial/option.c ++++ b/drivers/usb/serial/option.c +@@ -343,17 +343,12 @@ static void option_instat_callback(struct urb *urb); + #define OLIVETTI_VENDOR_ID 0x0b3c + #define OLIVETTI_PRODUCT_OLICARD100 0xc000 + #define OLIVETTI_PRODUCT_OLICARD145 0xc003 ++#define OLIVETTI_PRODUCT_OLICARD200 0xc005 + + /* Celot products */ + #define CELOT_VENDOR_ID 0x211f + #define CELOT_PRODUCT_CT680M 0x6801 + +-/* ONDA Communication vendor id */ +-#define ONDA_VENDOR_ID 0x1ee8 +- +-/* ONDA MT825UP HSDPA 14.2 modem */ +-#define ONDA_MT825UP 0x000b +- + /* Samsung products */ + #define SAMSUNG_VENDOR_ID 0x04e8 + #define SAMSUNG_PRODUCT_GT_B3730 0x6889 +@@ -446,7 +441,8 @@ static void option_instat_callback(struct urb *urb); + + /* Hyundai Petatel Inc. products */ + #define PETATEL_VENDOR_ID 0x1ff4 +-#define PETATEL_PRODUCT_NP10T 0x600e ++#define PETATEL_PRODUCT_NP10T_600A 0x600a ++#define PETATEL_PRODUCT_NP10T_600E 0x600e + + /* TP-LINK Incorporated products */ + #define TPLINK_VENDOR_ID 0x2357 +@@ -786,6 +782,7 @@ static const struct usb_device_id option_ids[] = { + { USB_DEVICE(KYOCERA_VENDOR_ID, KYOCERA_PRODUCT_KPC650) }, + { USB_DEVICE(KYOCERA_VENDOR_ID, KYOCERA_PRODUCT_KPC680) }, + { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6613)}, /* Onda H600/ZTE MF330 */ ++ { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x0023)}, /* ONYX 3G device */ + { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x9000)}, /* SIMCom SIM5218 */ + { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6280) }, /* BP3-USB & BP3-EXT HSDPA */ + { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6008) }, +@@ -821,7 +818,8 @@ static const struct usb_device_id option_ids[] = { + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0017, 0xff, 0xff, 0xff), + .driver_info = (kernel_ulong_t)&net_intf3_blacklist }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0018, 0xff, 0xff, 0xff) }, +- { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0019, 0xff, 0xff, 0xff) }, ++ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0019, 0xff, 0xff, 0xff), ++ .driver_info = (kernel_ulong_t)&net_intf3_blacklist }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0020, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0021, 0xff, 0xff, 0xff), + .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, +@@ -1260,8 +1258,8 @@ static const struct usb_device_id option_ids[] = { + + { USB_DEVICE(OLIVETTI_VENDOR_ID, OLIVETTI_PRODUCT_OLICARD100) }, + { USB_DEVICE(OLIVETTI_VENDOR_ID, OLIVETTI_PRODUCT_OLICARD145) }, ++ { USB_DEVICE(OLIVETTI_VENDOR_ID, OLIVETTI_PRODUCT_OLICARD200) }, + { USB_DEVICE(CELOT_VENDOR_ID, CELOT_PRODUCT_CT680M) }, /* CT-650 CDMA 450 1xEVDO modem */ +- { USB_DEVICE(ONDA_VENDOR_ID, ONDA_MT825UP) }, /* ONDA MT825UP modem */ + { USB_DEVICE_AND_INTERFACE_INFO(SAMSUNG_VENDOR_ID, SAMSUNG_PRODUCT_GT_B3730, USB_CLASS_CDC_DATA, 0x00, 0x00) }, /* Samsung GT-B3730 LTE USB modem.*/ + { USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CEM600) }, + { USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CEM610) }, +@@ -1333,9 +1331,12 @@ static const struct usb_device_id option_ids[] = { + { USB_DEVICE_AND_INTERFACE_INFO(MEDIATEK_VENDOR_ID, MEDIATEK_PRODUCT_DC_4COM2, 0xff, 0x02, 0x01) }, + { USB_DEVICE_AND_INTERFACE_INFO(MEDIATEK_VENDOR_ID, MEDIATEK_PRODUCT_DC_4COM2, 0xff, 0x00, 0x00) }, + { USB_DEVICE(CELLIENT_VENDOR_ID, CELLIENT_PRODUCT_MEN200) }, +- { USB_DEVICE(PETATEL_VENDOR_ID, PETATEL_PRODUCT_NP10T) }, ++ { USB_DEVICE(PETATEL_VENDOR_ID, PETATEL_PRODUCT_NP10T_600A) }, ++ { USB_DEVICE(PETATEL_VENDOR_ID, PETATEL_PRODUCT_NP10T_600E) }, + { USB_DEVICE(TPLINK_VENDOR_ID, TPLINK_PRODUCT_MA180), + .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, ++ { USB_DEVICE(TPLINK_VENDOR_ID, 0x9000), /* TP-Link MA260 */ ++ .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, + { USB_DEVICE(CHANGHONG_VENDOR_ID, CHANGHONG_PRODUCT_CH690) }, + { USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x7d01, 0xff, 0x02, 0x01) }, /* D-Link DWM-156 (variant) */ + { USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x7d01, 0xff, 0x00, 0x00) }, /* D-Link DWM-156 (variant) */ +@@ -1343,6 +1344,8 @@ static const struct usb_device_id option_ids[] = { + { USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x7d02, 0xff, 0x00, 0x00) }, + { USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x7d03, 0xff, 0x02, 0x01) }, + { USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x7d03, 0xff, 0x00, 0x00) }, ++ { USB_DEVICE_AND_INTERFACE_INFO(0x07d1, 0x3e01, 0xff, 0xff, 0xff) }, /* D-Link DWM-152/C1 */ ++ { USB_DEVICE_AND_INTERFACE_INFO(0x07d1, 0x3e02, 0xff, 0xff, 0xff) }, /* D-Link DWM-156/C1 */ + { } /* Terminating entry */ + }; + MODULE_DEVICE_TABLE(usb, option_ids); diff --git a/drivers/usb/storage/realtek_cr.c b/drivers/usb/storage/realtek_cr.c index 6c3586a..a94e621 100644 --- a/drivers/usb/storage/realtek_cr.c @@ -49532,10 +50325,36 @@ index b96fc6c..431d628 100644 __bio_for_each_segment(bvec, bio, i, 0) { char *addr = page_address(bvec->bv_page); diff --git a/fs/block_dev.c b/fs/block_dev.c -index aae187a..fd790ba 100644 +index aae187a..8325c5d 100644 --- a/fs/block_dev.c +++ b/fs/block_dev.c -@@ -652,7 +652,7 @@ static bool bd_may_claim(struct block_device *bdev, struct block_device *whole, +@@ -57,17 +57,24 @@ static void bdev_inode_switch_bdi(struct inode *inode, + struct backing_dev_info *dst) + { + struct backing_dev_info *old = inode->i_data.backing_dev_info; ++ bool wakeup_bdi = false; + + if (unlikely(dst == old)) /* deadlock avoidance */ + return; + bdi_lock_two(&old->wb, &dst->wb); + spin_lock(&inode->i_lock); + inode->i_data.backing_dev_info = dst; +- if (inode->i_state & I_DIRTY) ++ if (inode->i_state & I_DIRTY) { ++ if (bdi_cap_writeback_dirty(dst) && !wb_has_dirty_io(&dst->wb)) ++ wakeup_bdi = true; + list_move(&inode->i_wb_list, &dst->wb.b_dirty); ++ } + spin_unlock(&inode->i_lock); + spin_unlock(&old->wb.list_lock); + spin_unlock(&dst->wb.list_lock); ++ ++ if (wakeup_bdi) ++ bdi_wakeup_thread_delayed(dst); + } + + /* Kill _all_ buffers and pagecache , dirty or not.. */ +@@ -652,7 +659,7 @@ static bool bd_may_claim(struct block_device *bdev, struct block_device *whole, else if (bdev->bd_contains == bdev) return true; /* is a whole device which isn't held */ @@ -51470,6 +52289,20 @@ index 22548f5..41521d8 100644 return 0; } return 1; +diff --git a/fs/ext3/inode.c b/fs/ext3/inode.c +index d512c4b..d706dbf 100644 +--- a/fs/ext3/inode.c ++++ b/fs/ext3/inode.c +@@ -218,7 +218,8 @@ void ext3_evict_inode (struct inode *inode) + */ + if (inode->i_nlink && ext3_should_journal_data(inode) && + EXT3_SB(inode->i_sb)->s_journal && +- (S_ISLNK(inode->i_mode) || S_ISREG(inode->i_mode))) { ++ (S_ISLNK(inode->i_mode) || S_ISREG(inode->i_mode)) && ++ inode->i_ino != EXT3_JOURNAL_INO) { + tid_t commit_tid = atomic_read(&ei->i_datasync_tid); + journal_t *journal = EXT3_SB(inode->i_sb)->s_journal; + diff --git a/fs/ext4/balloc.c b/fs/ext4/balloc.c index 92e68b3..115d987 100644 --- a/fs/ext4/balloc.c @@ -53387,10 +54220,76 @@ index 11dfa0c..6f64416 100644 if (!ret) ret = -EPIPE; diff --git a/fs/fuse/dir.c b/fs/fuse/dir.c -index 185c479..51b9986 100644 +index 185c479..2a4c1b2 100644 --- a/fs/fuse/dir.c +++ b/fs/fuse/dir.c -@@ -1415,7 +1415,7 @@ static char *read_link(struct dentry *dentry) +@@ -1225,13 +1225,29 @@ static int fuse_direntplus_link(struct file *file, + if (name.name[1] == '.' && name.len == 2) + return 0; + } ++ ++ if (invalid_nodeid(o->nodeid)) ++ return -EIO; ++ if (!fuse_valid_type(o->attr.mode)) ++ return -EIO; ++ + fc = get_fuse_conn(dir); + + name.hash = full_name_hash(name.name, name.len); + dentry = d_lookup(parent, &name); +- if (dentry && dentry->d_inode) { ++ if (dentry) { + inode = dentry->d_inode; +- if (get_node_id(inode) == o->nodeid) { ++ if (!inode) { ++ d_drop(dentry); ++ } else if (get_node_id(inode) != o->nodeid || ++ ((o->attr.mode ^ inode->i_mode) & S_IFMT)) { ++ err = d_invalidate(dentry); ++ if (err) ++ goto out; ++ } else if (is_bad_inode(inode)) { ++ err = -EIO; ++ goto out; ++ } else { + struct fuse_inode *fi; + fi = get_fuse_inode(inode); + spin_lock(&fc->lock); +@@ -1244,9 +1260,6 @@ static int fuse_direntplus_link(struct file *file, + */ + goto found; + } +- err = d_invalidate(dentry); +- if (err) +- goto out; + dput(dentry); + dentry = NULL; + } +@@ -1261,10 +1274,19 @@ static int fuse_direntplus_link(struct file *file, + if (!inode) + goto out; + +- alias = d_materialise_unique(dentry, inode); +- err = PTR_ERR(alias); +- if (IS_ERR(alias)) +- goto out; ++ if (S_ISDIR(inode->i_mode)) { ++ mutex_lock(&fc->inst_mutex); ++ alias = fuse_d_add_directory(dentry, inode); ++ mutex_unlock(&fc->inst_mutex); ++ err = PTR_ERR(alias); ++ if (IS_ERR(alias)) { ++ iput(inode); ++ goto out; ++ } ++ } else { ++ alias = d_splice_alias(inode, dentry); ++ } ++ + if (alias) { + dput(dentry); + dentry = alias; +@@ -1415,7 +1437,7 @@ static char *read_link(struct dentry *dentry) return link; } @@ -53577,6 +54476,36 @@ index a2aa97d..10d6c41 100644 if (IS_ERR(nlmsvc_task)) { error = PTR_ERR(nlmsvc_task); printk(KERN_WARNING +diff --git a/fs/lockd/svclock.c b/fs/lockd/svclock.c +index e703318..8ebd3f5 100644 +--- a/fs/lockd/svclock.c ++++ b/fs/lockd/svclock.c +@@ -939,6 +939,7 @@ nlmsvc_retry_blocked(void) + unsigned long timeout = MAX_SCHEDULE_TIMEOUT; + struct nlm_block *block; + ++ spin_lock(&nlm_blocked_lock); + while (!list_empty(&nlm_blocked) && !kthread_should_stop()) { + block = list_entry(nlm_blocked.next, struct nlm_block, b_list); + +@@ -948,6 +949,7 @@ nlmsvc_retry_blocked(void) + timeout = block->b_when - jiffies; + break; + } ++ spin_unlock(&nlm_blocked_lock); + + dprintk("nlmsvc_retry_blocked(%p, when=%ld)\n", + block, block->b_when); +@@ -957,7 +959,9 @@ nlmsvc_retry_blocked(void) + retry_deferred_block(block); + } else + nlmsvc_grant_blocked(block); ++ spin_lock(&nlm_blocked_lock); + } ++ spin_unlock(&nlm_blocked_lock); + + return timeout; + } diff --git a/fs/locks.c b/fs/locks.c index cb424a4..850e4dd 100644 --- a/fs/locks.c @@ -56773,6 +57702,63 @@ index 04ce1ac..a13dd1e 100644 generic_fillattr(inode, stat); return 0; +diff --git a/fs/super.c b/fs/super.c +index 7465d43..68307c0 100644 +--- a/fs/super.c ++++ b/fs/super.c +@@ -336,19 +336,19 @@ EXPORT_SYMBOL(deactivate_super); + * and want to turn it into a full-blown active reference. grab_super() + * is called with sb_lock held and drops it. Returns 1 in case of + * success, 0 if we had failed (superblock contents was already dead or +- * dying when grab_super() had been called). ++ * dying when grab_super() had been called). Note that this is only ++ * called for superblocks not in rundown mode (== ones still on ->fs_supers ++ * of their type), so increment of ->s_count is OK here. + */ + static int grab_super(struct super_block *s) __releases(sb_lock) + { +- if (atomic_inc_not_zero(&s->s_active)) { +- spin_unlock(&sb_lock); +- return 1; +- } +- /* it's going away */ + s->s_count++; + spin_unlock(&sb_lock); +- /* wait for it to die */ + down_write(&s->s_umount); ++ if ((s->s_flags & MS_BORN) && atomic_inc_not_zero(&s->s_active)) { ++ put_super(s); ++ return 1; ++ } + up_write(&s->s_umount); + put_super(s); + return 0; +@@ -463,11 +463,6 @@ retry: + destroy_super(s); + s = NULL; + } +- down_write(&old->s_umount); +- if (unlikely(!(old->s_flags & MS_BORN))) { +- deactivate_locked_super(old); +- goto retry; +- } + return old; + } + } +@@ -660,10 +655,10 @@ restart: + if (hlist_unhashed(&sb->s_instances)) + continue; + if (sb->s_bdev == bdev) { +- if (grab_super(sb)) /* drops sb_lock */ +- return sb; +- else ++ if (!grab_super(sb)) + goto restart; ++ up_write(&sb->s_umount); ++ return sb; + } + } + spin_unlock(&sb_lock); diff --git a/fs/sysfs/bin.c b/fs/sysfs/bin.c index 15c68f9..36a8b3e 100644 --- a/fs/sysfs/bin.c @@ -68485,6 +69471,29 @@ index 91ac8da..a841318 100644 struct dma_pinned_list *pinned_list, struct page *page, unsigned int offset, size_t len); +diff --git a/include/linux/edac.h b/include/linux/edac.h +index 0b76327..5c6d7fb 100644 +--- a/include/linux/edac.h ++++ b/include/linux/edac.h +@@ -622,7 +622,7 @@ struct edac_raw_error_desc { + */ + struct mem_ctl_info { + struct device dev; +- struct bus_type bus; ++ struct bus_type *bus; + + struct list_head link; /* for global list of mem_ctl_info structs */ + +@@ -742,4 +742,9 @@ struct mem_ctl_info { + #endif + }; + ++/* ++ * Maximum number of memory controllers in the coherent fabric. ++ */ ++#define EDAC_MAX_MCS 16 ++ + #endif diff --git a/include/linux/efi.h b/include/linux/efi.h index 3d7df3d..301f024 100644 --- a/include/linux/efi.h @@ -69983,6 +70992,21 @@ index aff7ad8..3942bbd 100644 extern int register_pppox_proto(int proto_num, const struct pppox_proto *pp); extern void unregister_pppox_proto(int proto_num); +diff --git a/include/linux/if_vlan.h b/include/linux/if_vlan.h +index 218a3b6..ee586cb 100644 +--- a/include/linux/if_vlan.h ++++ b/include/linux/if_vlan.h +@@ -79,9 +79,8 @@ static inline int is_vlan_dev(struct net_device *dev) + } + + #define vlan_tx_tag_present(__skb) ((__skb)->vlan_tci & VLAN_TAG_PRESENT) +-#define vlan_tx_nonzero_tag_present(__skb) \ +- (vlan_tx_tag_present(__skb) && ((__skb)->vlan_tci & VLAN_VID_MASK)) + #define vlan_tx_tag_get(__skb) ((__skb)->vlan_tci & ~VLAN_TAG_PRESENT) ++#define vlan_tx_tag_get_id(__skb) ((__skb)->vlan_tci & VLAN_VID_MASK) + + #if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE) + diff --git a/include/linux/init.h b/include/linux/init.h index 8618147..0821126 100644 --- a/include/linux/init.h @@ -72878,6 +73902,20 @@ index adcbb20..62c2559 100644 void v9fs_register_trans(struct p9_trans_module *m); void v9fs_unregister_trans(struct p9_trans_module *m); +diff --git a/include/net/addrconf.h b/include/net/addrconf.h +index 84a6440..dbc6db7 100644 +--- a/include/net/addrconf.h ++++ b/include/net/addrconf.h +@@ -86,6 +86,9 @@ extern int ipv6_dev_get_saddr(struct net *net, + const struct in6_addr *daddr, + unsigned int srcprefs, + struct in6_addr *saddr); ++extern int __ipv6_get_lladdr(struct inet6_dev *idev, ++ struct in6_addr *addr, ++ unsigned char banned_flags); + extern int ipv6_get_lladdr(struct net_device *dev, + struct in6_addr *addr, + unsigned char banned_flags); diff --git a/include/net/bluetooth/l2cap.h b/include/net/bluetooth/l2cap.h index cdd3302..76f8ede 100644 --- a/include/net/bluetooth/l2cap.h @@ -73847,6 +74885,24 @@ index 8072d35..e77aeb8 100644 #define ELFMAG0 0x7f /* EI_MAG */ #define ELFMAG1 'E' #define ELFMAG2 'L' +diff --git a/include/uapi/linux/if_pppox.h b/include/uapi/linux/if_pppox.h +index 0b46fd5..e36a4ae 100644 +--- a/include/uapi/linux/if_pppox.h ++++ b/include/uapi/linux/if_pppox.h +@@ -135,11 +135,11 @@ struct pppoe_tag { + + struct pppoe_hdr { + #if defined(__LITTLE_ENDIAN_BITFIELD) +- __u8 ver : 4; + __u8 type : 4; ++ __u8 ver : 4; + #elif defined(__BIG_ENDIAN_BITFIELD) +- __u8 type : 4; + __u8 ver : 4; ++ __u8 type : 4; + #else + #error "Please fix <asm/byteorder.h>" + #endif diff --git a/include/uapi/linux/personality.h b/include/uapi/linux/personality.h index aa169c4..6a2771d 100644 --- a/include/uapi/linux/personality.h @@ -75990,19 +77046,67 @@ index 9b22d03..6295b62 100644 prev->next = info->next; else diff --git a/kernel/hrtimer.c b/kernel/hrtimer.c -index 7ef5556..8247f11 100644 +index 7ef5556..f67a983 100644 --- a/kernel/hrtimer.c +++ b/kernel/hrtimer.c -@@ -1416,7 +1416,7 @@ void hrtimer_peek_ahead_timers(void) +@@ -709,17 +709,20 @@ static int hrtimer_switch_to_hres(void) + return 1; + } + ++static void clock_was_set_work(struct work_struct *work) ++{ ++ clock_was_set(); ++} ++ ++static DECLARE_WORK(hrtimer_work, clock_was_set_work); ++ + /* +- * Called from timekeeping code to reprogramm the hrtimer interrupt +- * device. If called from the timer interrupt context we defer it to +- * softirq context. ++ * Called from timekeeping and resume code to reprogramm the hrtimer ++ * interrupt device on all cpus. + */ + void clock_was_set_delayed(void) + { +- struct hrtimer_cpu_base *cpu_base = &__get_cpu_var(hrtimer_bases); +- +- cpu_base->clock_was_set = 1; +- __raise_softirq_irqoff(HRTIMER_SOFTIRQ); ++ schedule_work(&hrtimer_work); + } + + #else +@@ -768,8 +771,10 @@ void hrtimers_resume(void) + WARN_ONCE(!irqs_disabled(), + KERN_INFO "hrtimers_resume() called with IRQs enabled!"); + ++ /* Retrigger on the local CPU */ + retrigger_next_event(NULL); +- timerfd_clock_was_set(); ++ /* And schedule a retrigger for all others */ ++ clock_was_set_delayed(); + } + + static inline void timer_stats_hrtimer_set_start_info(struct hrtimer *timer) +@@ -1416,15 +1421,8 @@ void hrtimer_peek_ahead_timers(void) local_irq_restore(flags); } -static void run_hrtimer_softirq(struct softirq_action *h) +static void run_hrtimer_softirq(void) { - struct hrtimer_cpu_base *cpu_base = &__get_cpu_var(hrtimer_bases); +- struct hrtimer_cpu_base *cpu_base = &__get_cpu_var(hrtimer_bases); +- +- if (cpu_base->clock_was_set) { +- cpu_base->clock_was_set = 0; +- clock_was_set(); +- } +- + hrtimer_peek_ahead_timers(); + } -@@ -1758,7 +1758,7 @@ static int __cpuinit hrtimer_cpu_notify(struct notifier_block *self, +@@ -1758,7 +1756,7 @@ static int __cpuinit hrtimer_cpu_notify(struct notifier_block *self, return NOTIFY_OK; } @@ -77662,6 +78766,20 @@ index 6edbb2c..334f085 100644 return kc->clock_set(which_clock, &new_tp); } +diff --git a/kernel/power/autosleep.c b/kernel/power/autosleep.c +index c6422ff..9012ecf 100644 +--- a/kernel/power/autosleep.c ++++ b/kernel/power/autosleep.c +@@ -32,7 +32,8 @@ static void try_to_suspend(struct work_struct *work) + + mutex_lock(&autosleep_lock); + +- if (!pm_save_wakeup_count(initial_count)) { ++ if (!pm_save_wakeup_count(initial_count) || ++ system_state != SYSTEM_RUNNING) { + mutex_unlock(&autosleep_lock); + goto out; + } diff --git a/kernel/power/process.c b/kernel/power/process.c index 98088e0..aaf95c0 100644 --- a/kernel/power/process.c @@ -80174,10 +81292,27 @@ index 6989df2..c2265cf 100644 *data_page = bpage; diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c -index 3f28192..a29e8b0 100644 +index 3f28192..9afb0a9 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c -@@ -2893,7 +2893,7 @@ int trace_keep_overwrite(struct tracer *tracer, u32 mask, int set) +@@ -683,7 +683,15 @@ __update_max_tr(struct trace_array *tr, struct task_struct *tsk, int cpu) + + memcpy(max_data->comm, tsk->comm, TASK_COMM_LEN); + max_data->pid = tsk->pid; +- max_data->uid = task_uid(tsk); ++ /* ++ * If tsk == current, then use current_uid(), as that does not use ++ * RCU. The irq tracer can be called out of RCU scope. ++ */ ++ if (tsk == current) ++ max_data->uid = current_uid(); ++ else ++ max_data->uid = task_uid(tsk); ++ + max_data->nice = tsk->static_prio - 20 - MAX_RT_PRIO; + max_data->policy = tsk->policy; + max_data->rt_priority = tsk->rt_priority; +@@ -2893,7 +2901,7 @@ int trace_keep_overwrite(struct tracer *tracer, u32 mask, int set) return 0; } @@ -80186,7 +81321,7 @@ index 3f28192..a29e8b0 100644 { /* do nothing if flag is already set */ if (!!(trace_flags & mask) == !!enabled) -@@ -4637,10 +4637,9 @@ static const struct file_operations tracing_dyn_info_fops = { +@@ -4637,10 +4645,9 @@ static const struct file_operations tracing_dyn_info_fops = { }; #endif @@ -80198,7 +81333,7 @@ index 3f28192..a29e8b0 100644 static int once; if (d_tracer) -@@ -4660,10 +4659,9 @@ struct dentry *tracing_init_dentry(void) +@@ -4660,10 +4667,9 @@ struct dentry *tracing_init_dentry(void) return d_tracer; } @@ -85781,6 +86916,44 @@ index 85addcd..c429a13 100644 struct vlan_net *vn; vn = net_generic(net, vlan_net_id); +diff --git a/net/8021q/vlan_core.c b/net/8021q/vlan_core.c +index f3b6f51..6c205fc 100644 +--- a/net/8021q/vlan_core.c ++++ b/net/8021q/vlan_core.c +@@ -8,7 +8,7 @@ + bool vlan_do_receive(struct sk_buff **skbp) + { + struct sk_buff *skb = *skbp; +- u16 vlan_id = skb->vlan_tci & VLAN_VID_MASK; ++ u16 vlan_id = vlan_tx_tag_get_id(skb); + struct net_device *vlan_dev; + struct vlan_pcpu_stats *rx_stats; + +diff --git a/net/8021q/vlan_dev.c b/net/8021q/vlan_dev.c +index 63bd98c..c09b2b0 100644 +--- a/net/8021q/vlan_dev.c ++++ b/net/8021q/vlan_dev.c +@@ -73,6 +73,8 @@ vlan_dev_get_egress_qos_mask(struct net_device *dev, struct sk_buff *skb) + { + struct vlan_priority_tci_mapping *mp; + ++ smp_rmb(); /* coupled with smp_wmb() in vlan_dev_set_egress_priority() */ ++ + mp = vlan_dev_priv(dev)->egress_priority_map[(skb->priority & 0xF)]; + while (mp) { + if (mp->priority == skb->priority) { +@@ -248,6 +250,11 @@ int vlan_dev_set_egress_priority(const struct net_device *dev, + np->next = mp; + np->priority = skb_prio; + np->vlan_qos = vlan_qos; ++ /* Before inserting this element in hash table, make sure all its fields ++ * are committed to memory. ++ * coupled with smp_rmb() in vlan_dev_get_egress_qos_mask() ++ */ ++ smp_wmb(); + vlan->egress_priority_map[skb_prio & 0xF] = np; + if (vlan_qos) + vlan->nr_egress_mappings++; diff --git a/net/9p/mod.c b/net/9p/mod.c index 6ab36ae..6f1841b 100644 --- a/net/9p/mod.c @@ -85803,6 +86976,27 @@ index 6ab36ae..6f1841b 100644 spin_unlock(&v9fs_trans_lock); } EXPORT_SYMBOL(v9fs_unregister_trans); +diff --git a/net/9p/trans_common.c b/net/9p/trans_common.c +index de8df95..2ee3879 100644 +--- a/net/9p/trans_common.c ++++ b/net/9p/trans_common.c +@@ -24,11 +24,11 @@ + */ + void p9_release_pages(struct page **pages, int nr_pages) + { +- int i = 0; +- while (pages[i] && nr_pages--) { +- put_page(pages[i]); +- i++; +- } ++ int i; ++ ++ for (i = 0; i < nr_pages; i++) ++ if (pages[i]) ++ put_page(pages[i]); + } + EXPORT_SYMBOL(p9_release_pages); + diff --git a/net/9p/trans_fd.c b/net/9p/trans_fd.c index 02efb25..41541a9 100644 --- a/net/9p/trans_fd.c @@ -86210,6 +87404,22 @@ index b6e44ad..5b0d514 100644 spin_unlock_irqrestore(&dev->port.lock, flags); if (dev->tty_dev->parent) device_move(dev->tty_dev, NULL, DPM_ORDER_DEV_LAST); +diff --git a/net/bridge/br_multicast.c b/net/bridge/br_multicast.c +index 923fbea..642566d 100644 +--- a/net/bridge/br_multicast.c ++++ b/net/bridge/br_multicast.c +@@ -465,8 +465,9 @@ static struct sk_buff *br_ip6_multicast_alloc_query(struct net_bridge *br, + skb_set_transport_header(skb, skb->len); + mldq = (struct mld_msg *) icmp6_hdr(skb); + +- interval = ipv6_addr_any(group) ? br->multicast_last_member_interval : +- br->multicast_query_response_interval; ++ interval = ipv6_addr_any(group) ? ++ br->multicast_query_response_interval : ++ br->multicast_last_member_interval; + + mldq->mld_type = ICMPV6_MGM_QUERY; + mldq->mld_code = 0; diff --git a/net/bridge/netfilter/ebtables.c b/net/bridge/netfilter/ebtables.c index 8d493c9..3849e49 100644 --- a/net/bridge/netfilter/ebtables.c @@ -86482,7 +87692,7 @@ index 368f9c3..f82d4a3 100644 return err; diff --git a/net/core/dev.c b/net/core/dev.c -index c9eb9e6..922c789 100644 +index c9eb9e6..9186a82 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -1617,7 +1617,7 @@ int dev_forward_skb(struct net_device *dev, struct sk_buff *skb) @@ -86530,7 +87740,25 @@ index c9eb9e6..922c789 100644 { struct softnet_data *sd = &__get_cpu_var(softnet_data); -@@ -3496,7 +3496,7 @@ ncls: +@@ -3471,8 +3471,15 @@ ncls: + } + } + +- if (vlan_tx_nonzero_tag_present(skb)) +- skb->pkt_type = PACKET_OTHERHOST; ++ if (unlikely(vlan_tx_tag_present(skb))) { ++ if (vlan_tx_tag_get_id(skb)) ++ skb->pkt_type = PACKET_OTHERHOST; ++ /* Note: we might in the future use prio bits ++ * and set skb->priority like in vlan_do_receive() ++ * For the time being, just ignore Priority Code Point ++ */ ++ skb->vlan_tci = 0; ++ } + + /* deliver only exact match when indicated */ + null_or_dev = deliver_exact ? skb->dev : NULL; +@@ -3496,7 +3503,7 @@ ncls: ret = pt_prev->func(skb, skb->dev, pt_prev, orig_dev); } else { drop: @@ -86539,7 +87767,7 @@ index c9eb9e6..922c789 100644 kfree_skb(skb); /* Jamal, now you will not able to escape explaining * me how you were going to use this. :-) -@@ -4101,7 +4101,7 @@ void netif_napi_del(struct napi_struct *napi) +@@ -4101,7 +4108,7 @@ void netif_napi_del(struct napi_struct *napi) } EXPORT_SYMBOL(netif_napi_del); @@ -86548,7 +87776,7 @@ index c9eb9e6..922c789 100644 { struct softnet_data *sd = &__get_cpu_var(softnet_data); unsigned long time_limit = jiffies + 2; -@@ -5528,7 +5528,7 @@ struct rtnl_link_stats64 *dev_get_stats(struct net_device *dev, +@@ -5528,7 +5535,7 @@ struct rtnl_link_stats64 *dev_get_stats(struct net_device *dev, } else { netdev_stats_to_stats64(storage, &dev->stats); } @@ -86680,10 +87908,57 @@ index 7e7aeb0..2a998cb 100644 m->msg_iov = iov; diff --git a/net/core/neighbour.c b/net/core/neighbour.c -index 3863b8f..85c99a6 100644 +index 3863b8f..7c7ea84 100644 --- a/net/core/neighbour.c +++ b/net/core/neighbour.c -@@ -2778,7 +2778,7 @@ static int proc_unres_qlen(ctl_table *ctl, int write, void __user *buffer, +@@ -239,7 +239,7 @@ static void neigh_flush_dev(struct neigh_table *tbl, struct net_device *dev) + we must kill timers etc. and move + it to safe state. + */ +- skb_queue_purge(&n->arp_queue); ++ __skb_queue_purge(&n->arp_queue); + n->arp_queue_len_bytes = 0; + n->output = neigh_blackhole; + if (n->nud_state & NUD_VALID) +@@ -294,7 +294,7 @@ static struct neighbour *neigh_alloc(struct neigh_table *tbl, struct net_device + if (!n) + goto out_entries; + +- skb_queue_head_init(&n->arp_queue); ++ __skb_queue_head_init(&n->arp_queue); + rwlock_init(&n->lock); + seqlock_init(&n->ha_lock); + n->updated = n->used = now; +@@ -716,7 +716,9 @@ void neigh_destroy(struct neighbour *neigh) + if (neigh_del_timer(neigh)) + pr_warn("Impossible event\n"); + +- skb_queue_purge(&neigh->arp_queue); ++ write_lock_bh(&neigh->lock); ++ __skb_queue_purge(&neigh->arp_queue); ++ write_unlock_bh(&neigh->lock); + neigh->arp_queue_len_bytes = 0; + + if (dev->netdev_ops->ndo_neigh_destroy) +@@ -866,7 +868,7 @@ static void neigh_invalidate(struct neighbour *neigh) + neigh->ops->error_report(neigh, skb); + write_lock(&neigh->lock); + } +- skb_queue_purge(&neigh->arp_queue); ++ __skb_queue_purge(&neigh->arp_queue); + neigh->arp_queue_len_bytes = 0; + } + +@@ -1218,7 +1220,7 @@ int neigh_update(struct neighbour *neigh, const u8 *lladdr, u8 new, + + write_lock_bh(&neigh->lock); + } +- skb_queue_purge(&neigh->arp_queue); ++ __skb_queue_purge(&neigh->arp_queue); + neigh->arp_queue_len_bytes = 0; + } + out: +@@ -2778,7 +2780,7 @@ static int proc_unres_qlen(ctl_table *ctl, int write, void __user *buffer, size_t *lenp, loff_t *ppos) { int size, ret; @@ -87420,6 +88695,31 @@ index c7e8c04..56cb4c1 100644 .kind = "gretap", .maxtype = IFLA_GRE_MAX, .policy = ipgre_policy, +diff --git a/net/ipv4/ip_input.c b/net/ipv4/ip_input.c +index 2bdf802..439f123 100644 +--- a/net/ipv4/ip_input.c ++++ b/net/ipv4/ip_input.c +@@ -190,10 +190,7 @@ static int ip_local_deliver_finish(struct sk_buff *skb) + { + struct net *net = dev_net(skb->dev); + +- __skb_pull(skb, ip_hdrlen(skb)); +- +- /* Point into the IP datagram, just past the header. */ +- skb_reset_transport_header(skb); ++ __skb_pull(skb, skb_network_header_len(skb)); + + rcu_read_lock(); + { +@@ -437,6 +434,8 @@ int ip_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt, + goto drop; + } + ++ skb->transport_header = skb->network_header + iph->ihl*4; ++ + /* Remove any debris in the socket control block */ + memset(IPCB(skb), 0, sizeof(struct inet_skb_parm)); + diff --git a/net/ipv4/ip_sockglue.c b/net/ipv4/ip_sockglue.c index d9c4f11..02b82dbc 100644 --- a/net/ipv4/ip_sockglue.c @@ -87960,7 +89260,7 @@ index 59163c8..8277c51 100644 if (icsk->icsk_af_ops->conn_request(sk, skb) < 0) return 1; diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c -index d09203c..fd5cc91 100644 +index d09203c..518eff5 100644 --- a/net/ipv4/tcp_ipv4.c +++ b/net/ipv4/tcp_ipv4.c @@ -90,6 +90,10 @@ int sysctl_tcp_low_latency __read_mostly; @@ -87974,6 +89274,24 @@ index d09203c..fd5cc91 100644 #ifdef CONFIG_TCP_MD5SIG static int tcp_v4_md5_hash_hdr(char *md5_hash, const struct tcp_md5sig_key *key, __be32 daddr, __be32 saddr, const struct tcphdr *th); +@@ -1005,7 +1009,7 @@ int tcp_md5_do_add(struct sock *sk, const union tcp_md5_addr *addr, + struct tcp_sock *tp = tcp_sk(sk); + struct tcp_md5sig_info *md5sig; + +- key = tcp_md5_do_lookup(sk, (union tcp_md5_addr *)&addr, AF_INET); ++ key = tcp_md5_do_lookup(sk, addr, family); + if (key) { + /* Pre-existing entry - just update that one. */ + memcpy(key->key, newkey, newkeylen); +@@ -1050,7 +1054,7 @@ int tcp_md5_do_del(struct sock *sk, const union tcp_md5_addr *addr, int family) + struct tcp_md5sig_key *key; + struct tcp_md5sig_info *md5sig; + +- key = tcp_md5_do_lookup(sk, (union tcp_md5_addr *)&addr, AF_INET); ++ key = tcp_md5_do_lookup(sk, addr, family); + if (!key) + return -ENOENT; + hlist_del_rcu(&key->node); @@ -1897,6 +1901,9 @@ int tcp_v4_do_rcv(struct sock *sk, struct sk_buff *skb) return 0; @@ -88262,10 +89580,53 @@ index 9a459be..086b866 100644 return -ENOMEM; } diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c -index 50a4c7c..50a27e6 100644 +index 50a4c7c..231de25 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c -@@ -2274,7 +2274,7 @@ int addrconf_set_dstaddr(struct net *net, void __user *arg) +@@ -1375,6 +1375,23 @@ try_nextdev: + } + EXPORT_SYMBOL(ipv6_dev_get_saddr); + ++int __ipv6_get_lladdr(struct inet6_dev *idev, struct in6_addr *addr, ++ unsigned char banned_flags) ++{ ++ struct inet6_ifaddr *ifp; ++ int err = -EADDRNOTAVAIL; ++ ++ list_for_each_entry(ifp, &idev->addr_list, if_list) { ++ if (ifp->scope == IFA_LINK && ++ !(ifp->flags & banned_flags)) { ++ *addr = ifp->addr; ++ err = 0; ++ break; ++ } ++ } ++ return err; ++} ++ + int ipv6_get_lladdr(struct net_device *dev, struct in6_addr *addr, + unsigned char banned_flags) + { +@@ -1384,17 +1401,8 @@ int ipv6_get_lladdr(struct net_device *dev, struct in6_addr *addr, + rcu_read_lock(); + idev = __in6_dev_get(dev); + if (idev) { +- struct inet6_ifaddr *ifp; +- + read_lock_bh(&idev->lock); +- list_for_each_entry(ifp, &idev->addr_list, if_list) { +- if (ifp->scope == IFA_LINK && +- !(ifp->flags & banned_flags)) { +- *addr = ifp->addr; +- err = 0; +- break; +- } +- } ++ err = __ipv6_get_lladdr(idev, addr, banned_flags); + read_unlock_bh(&idev->lock); + } + rcu_read_unlock(); +@@ -2274,7 +2282,7 @@ int addrconf_set_dstaddr(struct net *net, void __user *arg) p.iph.ihl = 5; p.iph.protocol = IPPROTO_IPV6; p.iph.ttl = 64; @@ -88274,7 +89635,17 @@ index 50a4c7c..50a27e6 100644 if (ops->ndo_do_ioctl) { mm_segment_t oldfs = get_fs(); -@@ -4412,7 +4412,7 @@ int addrconf_sysctl_forward(ctl_table *ctl, int write, +@@ -2557,6 +2565,9 @@ static void init_loopback(struct net_device *dev) + if (sp_ifa->flags & (IFA_F_DADFAILED | IFA_F_TENTATIVE)) + continue; + ++ if (sp_ifa->rt) ++ continue; ++ + sp_rt = addrconf_dst_alloc(idev, &sp_ifa->addr, 0); + + /* Failure cases are ignored */ +@@ -4412,7 +4423,7 @@ int addrconf_sysctl_forward(ctl_table *ctl, int write, int *valp = ctl->data; int val = *valp; loff_t pos = *ppos; @@ -88283,7 +89654,7 @@ index 50a4c7c..50a27e6 100644 int ret; /* -@@ -4494,7 +4494,7 @@ int addrconf_sysctl_disable(ctl_table *ctl, int write, +@@ -4494,7 +4505,7 @@ int addrconf_sysctl_disable(ctl_table *ctl, int write, int *valp = ctl->data; int val = *valp; loff_t pos = *ppos; @@ -88500,6 +89871,93 @@ index d1e2e8e..51c19ae 100644 msg.msg_controllen = len; msg.msg_flags = flags; +diff --git a/net/ipv6/mcast.c b/net/ipv6/mcast.c +index bfa6cc3..c3998c2 100644 +--- a/net/ipv6/mcast.c ++++ b/net/ipv6/mcast.c +@@ -1343,8 +1343,9 @@ static void ip6_mc_hdr(struct sock *sk, struct sk_buff *skb, + hdr->daddr = *daddr; + } + +-static struct sk_buff *mld_newpack(struct net_device *dev, int size) ++static struct sk_buff *mld_newpack(struct inet6_dev *idev, int size) + { ++ struct net_device *dev = idev->dev; + struct net *net = dev_net(dev); + struct sock *sk = net->ipv6.igmp_sk; + struct sk_buff *skb; +@@ -1369,7 +1370,7 @@ static struct sk_buff *mld_newpack(struct net_device *dev, int size) + + skb_reserve(skb, hlen); + +- if (ipv6_get_lladdr(dev, &addr_buf, IFA_F_TENTATIVE)) { ++ if (__ipv6_get_lladdr(idev, &addr_buf, IFA_F_TENTATIVE)) { + /* <draft-ietf-magma-mld-source-05.txt>: + * use unspecified address as the source address + * when a valid link-local address is not available. +@@ -1465,7 +1466,7 @@ static struct sk_buff *add_grhead(struct sk_buff *skb, struct ifmcaddr6 *pmc, + struct mld2_grec *pgr; + + if (!skb) +- skb = mld_newpack(dev, dev->mtu); ++ skb = mld_newpack(pmc->idev, dev->mtu); + if (!skb) + return NULL; + pgr = (struct mld2_grec *)skb_put(skb, sizeof(struct mld2_grec)); +@@ -1485,7 +1486,8 @@ static struct sk_buff *add_grhead(struct sk_buff *skb, struct ifmcaddr6 *pmc, + static struct sk_buff *add_grec(struct sk_buff *skb, struct ifmcaddr6 *pmc, + int type, int gdeleted, int sdeleted) + { +- struct net_device *dev = pmc->idev->dev; ++ struct inet6_dev *idev = pmc->idev; ++ struct net_device *dev = idev->dev; + struct mld2_report *pmr; + struct mld2_grec *pgr = NULL; + struct ip6_sf_list *psf, *psf_next, *psf_prev, **psf_list; +@@ -1514,7 +1516,7 @@ static struct sk_buff *add_grec(struct sk_buff *skb, struct ifmcaddr6 *pmc, + AVAILABLE(skb) < grec_size(pmc, type, gdeleted, sdeleted)) { + if (skb) + mld_sendpack(skb); +- skb = mld_newpack(dev, dev->mtu); ++ skb = mld_newpack(idev, dev->mtu); + } + } + first = 1; +@@ -1541,7 +1543,7 @@ static struct sk_buff *add_grec(struct sk_buff *skb, struct ifmcaddr6 *pmc, + pgr->grec_nsrcs = htons(scount); + if (skb) + mld_sendpack(skb); +- skb = mld_newpack(dev, dev->mtu); ++ skb = mld_newpack(idev, dev->mtu); + first = 1; + scount = 0; + } +@@ -1596,8 +1598,8 @@ static void mld_send_report(struct inet6_dev *idev, struct ifmcaddr6 *pmc) + struct sk_buff *skb = NULL; + int type; + ++ read_lock_bh(&idev->lock); + if (!pmc) { +- read_lock_bh(&idev->lock); + for (pmc=idev->mc_list; pmc; pmc=pmc->next) { + if (pmc->mca_flags & MAF_NOREPORT) + continue; +@@ -1609,7 +1611,6 @@ static void mld_send_report(struct inet6_dev *idev, struct ifmcaddr6 *pmc) + skb = add_grec(skb, pmc, type, 0, 0); + spin_unlock_bh(&pmc->mca_lock); + } +- read_unlock_bh(&idev->lock); + } else { + spin_lock_bh(&pmc->mca_lock); + if (pmc->mca_sfcount[MCAST_EXCLUDE]) +@@ -1619,6 +1620,7 @@ static void mld_send_report(struct inet6_dev *idev, struct ifmcaddr6 *pmc) + skb = add_grec(skb, pmc, type, 0, 0); + spin_unlock_bh(&pmc->mca_lock); + } ++ read_unlock_bh(&idev->lock); + if (skb) + mld_sendpack(skb); + } diff --git a/net/ipv6/netfilter/ip6_tables.c b/net/ipv6/netfilter/ip6_tables.c index 341b54a..591e8ed 100644 --- a/net/ipv6/netfilter/ip6_tables.c @@ -88718,10 +90176,172 @@ index 0ba10e5..c14a4f6 100644 return -ENOMEM; } diff --git a/net/ipv6/route.c b/net/ipv6/route.c -index e5fe004..9fe3e8e 100644 +index e5fe004..d8ed9b0 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c -@@ -2881,7 +2881,7 @@ ctl_table ipv6_route_table_template[] = { +@@ -65,6 +65,12 @@ + #include <linux/sysctl.h> + #endif + ++enum rt6_nud_state { ++ RT6_NUD_FAIL_HARD = -2, ++ RT6_NUD_FAIL_SOFT = -1, ++ RT6_NUD_SUCCEED = 1 ++}; ++ + static struct rt6_info *ip6_rt_copy(struct rt6_info *ort, + const struct in6_addr *dest); + static struct dst_entry *ip6_dst_check(struct dst_entry *dst, u32 cookie); +@@ -527,26 +533,29 @@ static inline int rt6_check_dev(struct rt6_info *rt, int oif) + return 0; + } + +-static inline bool rt6_check_neigh(struct rt6_info *rt) ++static inline enum rt6_nud_state rt6_check_neigh(struct rt6_info *rt) + { + struct neighbour *neigh; +- bool ret = false; ++ enum rt6_nud_state ret = RT6_NUD_FAIL_HARD; + + if (rt->rt6i_flags & RTF_NONEXTHOP || + !(rt->rt6i_flags & RTF_GATEWAY)) +- return true; ++ return RT6_NUD_SUCCEED; + + rcu_read_lock_bh(); + neigh = __ipv6_neigh_lookup_noref(rt->dst.dev, &rt->rt6i_gateway); + if (neigh) { + read_lock(&neigh->lock); + if (neigh->nud_state & NUD_VALID) +- ret = true; ++ ret = RT6_NUD_SUCCEED; + #ifdef CONFIG_IPV6_ROUTER_PREF + else if (!(neigh->nud_state & NUD_FAILED)) +- ret = true; ++ ret = RT6_NUD_SUCCEED; + #endif + read_unlock(&neigh->lock); ++ } else { ++ ret = IS_ENABLED(CONFIG_IPV6_ROUTER_PREF) ? ++ RT6_NUD_SUCCEED : RT6_NUD_FAIL_SOFT; + } + rcu_read_unlock_bh(); + +@@ -560,43 +569,52 @@ static int rt6_score_route(struct rt6_info *rt, int oif, + + m = rt6_check_dev(rt, oif); + if (!m && (strict & RT6_LOOKUP_F_IFACE)) +- return -1; ++ return RT6_NUD_FAIL_HARD; + #ifdef CONFIG_IPV6_ROUTER_PREF + m |= IPV6_DECODE_PREF(IPV6_EXTRACT_PREF(rt->rt6i_flags)) << 2; + #endif +- if (!rt6_check_neigh(rt) && (strict & RT6_LOOKUP_F_REACHABLE)) +- return -1; ++ if (strict & RT6_LOOKUP_F_REACHABLE) { ++ int n = rt6_check_neigh(rt); ++ if (n < 0) ++ return n; ++ } + return m; + } + + static struct rt6_info *find_match(struct rt6_info *rt, int oif, int strict, +- int *mpri, struct rt6_info *match) ++ int *mpri, struct rt6_info *match, ++ bool *do_rr) + { + int m; ++ bool match_do_rr = false; + + if (rt6_check_expired(rt)) + goto out; + + m = rt6_score_route(rt, oif, strict); +- if (m < 0) ++ if (m == RT6_NUD_FAIL_SOFT && !IS_ENABLED(CONFIG_IPV6_ROUTER_PREF)) { ++ match_do_rr = true; ++ m = 0; /* lowest valid score */ ++ } else if (m < 0) { + goto out; ++ } ++ ++ if (strict & RT6_LOOKUP_F_REACHABLE) ++ rt6_probe(rt); + + if (m > *mpri) { +- if (strict & RT6_LOOKUP_F_REACHABLE) +- rt6_probe(match); ++ *do_rr = match_do_rr; + *mpri = m; + match = rt; +- } else if (strict & RT6_LOOKUP_F_REACHABLE) { +- rt6_probe(rt); + } +- + out: + return match; + } + + static struct rt6_info *find_rr_leaf(struct fib6_node *fn, + struct rt6_info *rr_head, +- u32 metric, int oif, int strict) ++ u32 metric, int oif, int strict, ++ bool *do_rr) + { + struct rt6_info *rt, *match; + int mpri = -1; +@@ -604,10 +622,10 @@ static struct rt6_info *find_rr_leaf(struct fib6_node *fn, + match = NULL; + for (rt = rr_head; rt && rt->rt6i_metric == metric; + rt = rt->dst.rt6_next) +- match = find_match(rt, oif, strict, &mpri, match); ++ match = find_match(rt, oif, strict, &mpri, match, do_rr); + for (rt = fn->leaf; rt && rt != rr_head && rt->rt6i_metric == metric; + rt = rt->dst.rt6_next) +- match = find_match(rt, oif, strict, &mpri, match); ++ match = find_match(rt, oif, strict, &mpri, match, do_rr); + + return match; + } +@@ -616,15 +634,16 @@ static struct rt6_info *rt6_select(struct fib6_node *fn, int oif, int strict) + { + struct rt6_info *match, *rt0; + struct net *net; ++ bool do_rr = false; + + rt0 = fn->rr_ptr; + if (!rt0) + fn->rr_ptr = rt0 = fn->leaf; + +- match = find_rr_leaf(fn, rt0, rt0->rt6i_metric, oif, strict); ++ match = find_rr_leaf(fn, rt0, rt0->rt6i_metric, oif, strict, ++ &do_rr); + +- if (!match && +- (strict & RT6_LOOKUP_F_REACHABLE)) { ++ if (do_rr) { + struct rt6_info *next = rt0->dst.rt6_next; + + /* no entries matched; do round-robin */ +@@ -1074,10 +1093,13 @@ static void ip6_link_failure(struct sk_buff *skb) + + rt = (struct rt6_info *) skb_dst(skb); + if (rt) { +- if (rt->rt6i_flags & RTF_CACHE) +- rt6_update_expires(rt, 0); +- else if (rt->rt6i_node && (rt->rt6i_flags & RTF_DEFAULT)) ++ if (rt->rt6i_flags & RTF_CACHE) { ++ dst_hold(&rt->dst); ++ if (ip6_del_rt(rt)) ++ dst_free(&rt->dst); ++ } else if (rt->rt6i_node && (rt->rt6i_flags & RTF_DEFAULT)) { + rt->rt6i_node->fn_sernum = -1; ++ } + } + } + +@@ -2881,7 +2903,7 @@ ctl_table ipv6_route_table_template[] = { struct ctl_table * __net_init ipv6_route_sysctl_init(struct net *net) { @@ -88731,7 +90351,7 @@ index e5fe004..9fe3e8e 100644 table = kmemdup(ipv6_route_table_template, sizeof(ipv6_route_table_template), diff --git a/net/ipv6/sit.c b/net/ipv6/sit.c -index 02f96dc..4a5a6e5 100644 +index 02f96dc..58dd9e8 100644 --- a/net/ipv6/sit.c +++ b/net/ipv6/sit.c @@ -74,7 +74,7 @@ static void ipip6_tunnel_setup(struct net_device *dev); @@ -88743,6 +90363,15 @@ index 02f96dc..4a5a6e5 100644 static int sit_net_id __read_mostly; struct sit_net { +@@ -624,7 +624,7 @@ static int ipip6_rcv(struct sk_buff *skb) + tunnel->dev->stats.rx_errors++; + goto out; + } +- } else { ++ } else if (!(tunnel->dev->flags&IFF_POINTOPOINT)) { + if (is_spoofed_6rd(tunnel, iph->saddr, + &ipv6_hdr(skb)->saddr) || + is_spoofed_6rd(tunnel, iph->daddr, @@ -1486,7 +1486,7 @@ static const struct nla_policy ipip6_policy[IFLA_IPTUN_MAX + 1] = { #endif }; @@ -90513,6 +92142,142 @@ index f226709..0e735a8 100644 _proto("Tx RESPONSE %%%u", ntohl(hdr->serial)); ret = kernel_sendmsg(conn->trans->local->socket, &msg, iov, 3, len); +diff --git a/net/sched/sch_qfq.c b/net/sched/sch_qfq.c +index d51852b..5792252 100644 +--- a/net/sched/sch_qfq.c ++++ b/net/sched/sch_qfq.c +@@ -113,7 +113,6 @@ + + #define FRAC_BITS 30 /* fixed point arithmetic */ + #define ONE_FP (1UL << FRAC_BITS) +-#define IWSUM (ONE_FP/QFQ_MAX_WSUM) + + #define QFQ_MTU_SHIFT 16 /* to support TSO/GSO */ + #define QFQ_MIN_LMAX 512 /* see qfq_slot_insert */ +@@ -189,6 +188,7 @@ struct qfq_sched { + struct qfq_aggregate *in_serv_agg; /* Aggregate being served. */ + u32 num_active_agg; /* Num. of active aggregates */ + u32 wsum; /* weight sum */ ++ u32 iwsum; /* inverse weight sum */ + + unsigned long bitmaps[QFQ_MAX_STATE]; /* Group bitmaps. */ + struct qfq_group groups[QFQ_MAX_INDEX + 1]; /* The groups. */ +@@ -314,6 +314,7 @@ static void qfq_update_agg(struct qfq_sched *q, struct qfq_aggregate *agg, + + q->wsum += + (int) agg->class_weight * (new_num_classes - agg->num_classes); ++ q->iwsum = ONE_FP / q->wsum; + + agg->num_classes = new_num_classes; + } +@@ -340,6 +341,10 @@ static void qfq_destroy_agg(struct qfq_sched *q, struct qfq_aggregate *agg) + { + if (!hlist_unhashed(&agg->nonfull_next)) + hlist_del_init(&agg->nonfull_next); ++ q->wsum -= agg->class_weight; ++ if (q->wsum != 0) ++ q->iwsum = ONE_FP / q->wsum; ++ + if (q->in_serv_agg == agg) + q->in_serv_agg = qfq_choose_next_agg(q); + kfree(agg); +@@ -827,38 +832,60 @@ static void qfq_make_eligible(struct qfq_sched *q) + } + } + +- + /* +- * The index of the slot in which the aggregate is to be inserted must +- * not be higher than QFQ_MAX_SLOTS-2. There is a '-2' and not a '-1' +- * because the start time of the group may be moved backward by one +- * slot after the aggregate has been inserted, and this would cause +- * non-empty slots to be right-shifted by one position. ++ * The index of the slot in which the input aggregate agg is to be ++ * inserted must not be higher than QFQ_MAX_SLOTS-2. There is a '-2' ++ * and not a '-1' because the start time of the group may be moved ++ * backward by one slot after the aggregate has been inserted, and ++ * this would cause non-empty slots to be right-shifted by one ++ * position. ++ * ++ * QFQ+ fully satisfies this bound to the slot index if the parameters ++ * of the classes are not changed dynamically, and if QFQ+ never ++ * happens to postpone the service of agg unjustly, i.e., it never ++ * happens that the aggregate becomes backlogged and eligible, or just ++ * eligible, while an aggregate with a higher approximated finish time ++ * is being served. In particular, in this case QFQ+ guarantees that ++ * the timestamps of agg are low enough that the slot index is never ++ * higher than 2. Unfortunately, QFQ+ cannot provide the same ++ * guarantee if it happens to unjustly postpone the service of agg, or ++ * if the parameters of some class are changed. ++ * ++ * As for the first event, i.e., an out-of-order service, the ++ * upper bound to the slot index guaranteed by QFQ+ grows to ++ * 2 + ++ * QFQ_MAX_AGG_CLASSES * ((1<<QFQ_MTU_SHIFT)/QFQ_MIN_LMAX) * ++ * (current_max_weight/current_wsum) <= 2 + 8 * 128 * 1. + * +- * If the weight and lmax (max_pkt_size) of the classes do not change, +- * then QFQ+ does meet the above contraint according to the current +- * values of its parameters. In fact, if the weight and lmax of the +- * classes do not change, then, from the theory, QFQ+ guarantees that +- * the slot index is never higher than +- * 2 + QFQ_MAX_AGG_CLASSES * ((1<<QFQ_MTU_SHIFT)/QFQ_MIN_LMAX) * +- * (QFQ_MAX_WEIGHT/QFQ_MAX_WSUM) = 2 + 8 * 128 * (1 / 64) = 18 ++ * The following function deals with this problem by backward-shifting ++ * the timestamps of agg, if needed, so as to guarantee that the slot ++ * index is never higher than QFQ_MAX_SLOTS-2. This backward-shift may ++ * cause the service of other aggregates to be postponed, yet the ++ * worst-case guarantees of these aggregates are not violated. In ++ * fact, in case of no out-of-order service, the timestamps of agg ++ * would have been even lower than they are after the backward shift, ++ * because QFQ+ would have guaranteed a maximum value equal to 2 for ++ * the slot index, and 2 < QFQ_MAX_SLOTS-2. Hence the aggregates whose ++ * service is postponed because of the backward-shift would have ++ * however waited for the service of agg before being served. + * +- * When the weight of a class is increased or the lmax of the class is +- * decreased, a new aggregate with smaller slot size than the original +- * parent aggregate of the class may happen to be activated. The +- * activation of this aggregate should be properly delayed to when the +- * service of the class has finished in the ideal system tracked by +- * QFQ+. If the activation of the aggregate is not delayed to this +- * reference time instant, then this aggregate may be unjustly served +- * before other aggregates waiting for service. This may cause the +- * above bound to the slot index to be violated for some of these +- * unlucky aggregates. ++ * The other event that may cause the slot index to be higher than 2 ++ * for agg is a recent change of the parameters of some class. If the ++ * weight of a class is increased or the lmax (max_pkt_size) of the ++ * class is decreased, then a new aggregate with smaller slot size ++ * than the original parent aggregate of the class may happen to be ++ * activated. The activation of this aggregate should be properly ++ * delayed to when the service of the class has finished in the ideal ++ * system tracked by QFQ+. If the activation of the aggregate is not ++ * delayed to this reference time instant, then this aggregate may be ++ * unjustly served before other aggregates waiting for service. This ++ * may cause the above bound to the slot index to be violated for some ++ * of these unlucky aggregates. + * + * Instead of delaying the activation of the new aggregate, which is +- * quite complex, the following inaccurate but simple solution is used: +- * if the slot index is higher than QFQ_MAX_SLOTS-2, then the +- * timestamps of the aggregate are shifted backward so as to let the +- * slot index become equal to QFQ_MAX_SLOTS-2. ++ * quite complex, the above-discussed capping of the slot index is ++ * used to handle also the consequences of a change of the parameters ++ * of a class. + */ + static void qfq_slot_insert(struct qfq_group *grp, struct qfq_aggregate *agg, + u64 roundedS) +@@ -1077,7 +1104,7 @@ static struct sk_buff *qfq_dequeue(struct Qdisc *sch) + else + in_serv_agg->budget -= len; + +- q->V += (u64)len * IWSUM; ++ q->V += (u64)len * q->iwsum; + pr_debug("qfq dequeue: len %u F %lld now %lld\n", + len, (unsigned long long) in_serv_agg->F, + (unsigned long long) q->V); diff --git a/net/sctp/ipv6.c b/net/sctp/ipv6.c index 391a245..296b3d7 100644 --- a/net/sctp/ipv6.c @@ -94305,6 +96070,63 @@ index 7d8803a..559f8d0 100644 list_add(&s->list, &cs4297a_devs); +diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c +index dafe04a..660552c 100644 +--- a/sound/pci/hda/patch_sigmatel.c ++++ b/sound/pci/hda/patch_sigmatel.c +@@ -418,9 +418,11 @@ static void stac_update_outputs(struct hda_codec *codec) + val &= ~spec->eapd_mask; + else + val |= spec->eapd_mask; +- if (spec->gpio_data != val) ++ if (spec->gpio_data != val) { ++ spec->gpio_data = val; + stac_gpio_set(codec, spec->gpio_mask, spec->gpio_dir, + val); ++ } + } + } + +@@ -3228,7 +3230,7 @@ static const struct hda_fixup stac927x_fixups[] = { + /* configure the analog microphone on some laptops */ + { 0x0c, 0x90a79130 }, + /* correct the front output jack as a hp out */ +- { 0x0f, 0x0227011f }, ++ { 0x0f, 0x0221101f }, + /* correct the front input jack as a mic */ + { 0x0e, 0x02a79130 }, + {} +@@ -3608,20 +3610,18 @@ static int stac_parse_auto_config(struct hda_codec *codec) + static int stac_init(struct hda_codec *codec) + { + struct sigmatel_spec *spec = codec->spec; +- unsigned int gpio; + int i; + + /* override some hints */ + stac_store_hints(codec); + + /* set up GPIO */ +- gpio = spec->gpio_data; + /* turn on EAPD statically when spec->eapd_switch isn't set. + * otherwise, unsol event will turn it on/off dynamically + */ + if (!spec->eapd_switch) +- gpio |= spec->eapd_mask; +- stac_gpio_set(codec, spec->gpio_mask, spec->gpio_dir, gpio); ++ spec->gpio_data |= spec->eapd_mask; ++ stac_gpio_set(codec, spec->gpio_mask, spec->gpio_dir, spec->gpio_data); + + snd_hda_gen_init(codec); + +@@ -3930,6 +3930,7 @@ static void stac_setup_gpio(struct hda_codec *codec) + { + struct sigmatel_spec *spec = codec->spec; + ++ spec->gpio_mask |= spec->eapd_mask; + if (spec->gpio_led) { + if (!spec->vref_mute_led_nid) { + spec->gpio_mask |= spec->gpio_led; diff --git a/sound/pci/ymfpci/ymfpci.h b/sound/pci/ymfpci/ymfpci.h index 4631a23..001ae57 100644 --- a/sound/pci/ymfpci/ymfpci.h @@ -94388,6 +96210,19 @@ index bb23009..db346c2 100644 return s->unit_minor; fail: +diff --git a/sound/usb/6fire/pcm.c b/sound/usb/6fire/pcm.c +index 40dd50a..6d0a6d1 100644 +--- a/sound/usb/6fire/pcm.c ++++ b/sound/usb/6fire/pcm.c +@@ -543,7 +543,7 @@ static snd_pcm_uframes_t usb6fire_pcm_pointer( + snd_pcm_uframes_t ret; + + if (rt->panic || !sub) +- return SNDRV_PCM_STATE_XRUN; ++ return SNDRV_PCM_POS_XRUN; + + spin_lock_irqsave(&sub->lock, flags); + ret = sub->dma_off; diff --git a/tools/gcc/.gitignore b/tools/gcc/.gitignore new file mode 100644 index 0000000..50f2f2f |