Linux 4.20.12
Greg KH
maintainerI'm announcing the release of the 4.20.12 kernel.
All users of the 4.20 kernel series must upgrade.
The updated 4.20.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-4.20.y
and can be browsed at the normal kernel.org git web browser:
http://git.kernel.org/?p=linux/kernel/git/stable/linux-stable.git;a=summary
thanks,
greg k-h
------------
Makefile | 2 - arch/arm64/include/asm/memory.h | 11 ++++++ arch/arm64/kernel/setup.c | 1 crypto/af_alg.c | 4 +- drivers/firmware/efi/efi.c | 4 -- drivers/firmware/efi/libstub/arm-stub.c | 3 - drivers/hwmon/lm80.c | 4 +- drivers/isdn/mISDN/timerdev.c | 2 - drivers/mmc/host/meson-gx-mmc.c | 3 + drivers/net/dsa/mv88e6xxx/chip.c | 28 ++++++++++++--- drivers/net/ethernet/marvell/sky2.c | 2 - drivers/net/ethernet/mellanox/mlxsw/spectrum.c | 12 +++--- drivers/net/ethernet/stmicro/stmmac/dwmac4_descs.c | 9 +++-- drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c | 22 ++++++------ drivers/net/ethernet/ti/netcp_core.c | 2 - drivers/net/phy/xilinx_gmii2rgmii.c | 5 ++ drivers/net/vxlan.c | 14 ++++++- drivers/pci/pci.c | 3 + drivers/target/target_core_transport.c | 2 - drivers/vhost/vhost.c | 2 - include/linux/efi.h | 7 --- include/linux/memblock.h | 3 - include/linux/netdev_features.h | 24 ++++++++++++- include/net/ax25.h | 12 ++++++ include/net/inetpeer.h | 1 mm/memblock.c | 11 +++++- net/ax25/ax25_ip.c | 4 +- net/ax25/ax25_route.c | 19 ++++------ net/core/dev.c | 4 +- net/core/skbuff.c | 4 ++ net/ipv4/inetpeer.c | 1 net/ipv4/netfilter/nf_nat_snmp_basic_main.c | 7 +++ net/ipv4/route.c | 7 ++- net/ipv4/tcp.c | 2 - net/ipv4/tcp_ipv4.c | 7 ++- net/ipv6/addrconf.c | 3 + net/ipv6/ip6_gre.c | 34 +++++++++++-------- net/packet/af_packet.c | 3 + net/vmw_vsock/vmci_transport.c | 4 ++ net/x25/af_x25.c | 6 +-- 40 files changed, 196 insertions(+), 102 deletions(-)
Alexander Duyck (1):
net: Do not allocate page fragments that are not skb aligned
Alexandre Torgue (1):
net: stmmac: handle endianness in dwmac4_get_timestamp
Ard Biesheuvel (2):
arm64, mm, efi: Account for GICv3 LPI tables in static memblock reserve table efi/arm: Revert "Defer persistent reservations until after paging_init()"
David S. Miller (1):
net: Add header for usage of fls64()
Eric Dumazet (6):
vxlan: test dev->flags & IFF_UP before calling netif_rx()
tcp: clear icsk_backoff in tcp_write_queue_purge()
tcp: tcp_v4_err() should be more careful net/x25: do not hold the cpu too long in x25_new_lci()
mISDN: fix a race in dev_expire_timer()
ax25: fix possible use-after-free
Greg Kroah-Hartman (1):
Linux 4.20.12
Hauke Mehrtens (1):
net: Fix for_each_netdev_feature on Big endian
Jann Horn (1):
netfilter: nf_nat_snmp_basic: add missing length checks in ASN.1 cbs
Jason Wang (1):
vhost: correctly check the return value of translate_desc() in log_used()
John David Anglin (1):
dsa: mv88e6xxx: Ensure all pending interrupts are handled prior to exit
Jose Abreu (1):
net: stmmac: Fix a race in EEE enable callback
Kai-Heng Feng (1):
sky2: Increase D3 delay again
Logan Gunthorpe (1):
PCI: Fix __initdata issue with "pci=disable_acs_redir" parameter
Lorenzo Bianconi (2):
net: ipv4: use a dedicated counter for icmp_v4 redirect packets
net: ip6_gre: initialize erspan_ver just for erspan tunnels
Mao Wenan (1):
net: crypto set sk to NULL when af_alg_release.
Martin Blumenstingl (1):
mmc: meson-gx: fix interrupt name
Murali Karicheri (1):
net: netcp: Fix ethss driver probe issue
Nicolas Dichtel (1):
af_packet: fix raw sockets over 6in4 tunnel
Paolo Abeni (1):
vsock: cope with memory allocation failure at socket creation time
Paul Kocialkowski (1):
net: phy: xgmiitorgmii: Support generic PHY status read
Petr Machata (1):
mlxsw: __mlxsw_sp_port_headroom_set(): Fix a use of local variable
Wei Yongjun (2):
scsi: target/core: Use kmem_cache_free() instead of kfree()
hwmon: (lm80) Fix missing unlock on error in set_fan_div()
Zhiqiang Liu (1):
net: fix IPv6 prefix route residue
Greg KH
maintainerMakefile +1 -1
@@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 4 PATCHLEVEL = 20 -SUBLEVEL = 11 +SUBLEVEL = 12 EXTRAVERSION = NAME = Shy Crocodile
arch/arm64/include/asm/memory.h +11 -0
@@ -303,6 +303,17 @@ static inline void *phys_to_virt(phys_addr_t x)#define virt_addr_valid (kaddr) (_virt_addr_is_linear(kaddr) && \ _virt_addr_valid(kaddr)) +/* +* Given that the GIC architecture permits ITS implementations that can only be +* configured with a LPI table address once, GICv3 systems with many CPUs may +* end up reserving a lot of different regions after a kexec for their LPI +* tables (one per CPU), as we are forced to reuse the same memory after kexec +* (and thus reserve it persistently with EFI beforehand) +*/ +#if defined(CONFIG_EFI ) && defined(CONFIG_ARM_GIC_V3_ITS ) +# define INIT_MEMBLOCK_RESERVED_REGIONS (INIT_MEMBLOCK_REGIONS + 2*(NR_CPUS + 1)) +#endif +#include <asm-generic/memory_model.h> #endif
arch/arm64/kernel/setup.c +0 -1
@@ -313,7 +313,6 @@ void __init setup_arch(char **cmdline_p)arm64_memblock_init ();paging_init (); -efi_apply_persistent_mem_reservations ();acpi_table_upgrade ();
crypto/af_alg.c +3 -1
@@ -122,8 +122,10 @@ static void alg_do_release(const struct af_alg_type *type, void *private)int af_alg_release (struct socket *sock) { -if (sock->sk) +if (sock->sk) {sock_put (sock->sk); + sock->sk =NULL ; + }return 0 ; }EXPORT_SYMBOL_GPL (af_alg_release);
drivers/firmware/efi/efi.c +0 -4
@@ -592,11 +592,7 @@ int __init efi_config_parse_tables(void *config_tables, int count, int sz,early_memunmap (tbl,sizeof (*tbl)); } -return 0 ; -} -int __init efi_apply_persistent_mem_reservations (void ) -{if (efi.mem_reserve !=EFI_INVALID_TABLE_ADDR ) {unsigned long prsv = efi.mem_reserve;
drivers/firmware/efi/libstub/arm-stub.c +0 -3
@@ -75,9 +75,6 @@ void install_memreserve_table(efi_system_table_t *sys_table_arg)efi_guid_t memreserve_table_guid =LINUX_EFI_MEMRESERVE_TABLE_GUID ;efi_status_t status; -if (IS_ENABLED (CONFIG_ARM )) -return ; - status =efi_call_early (allocate_pool,EFI_LOADER_DATA ,sizeof (*rsv), (void **)&rsv);if (status !=EFI_SUCCESS ) {
drivers/hwmon/lm80.c +3 -1
@@ -393,8 +393,10 @@ static ssize_t set_fan_div(struct device *dev, struct device_attribute *attr, } rv =lm80_read_value (client,LM80_REG_FANDIV ); -if (rv <0 ) +if (rv <0 ) { +mutex_unlock (&data->update_lock);return rv; + } reg = (rv & ~(3 << (2 * (nr +1 )))) | (data->fan_div[nr] << (2 * (nr +1 )));lm80_write_value (client,LM80_REG_FANDIV , reg);
drivers/isdn/mISDN/timerdev.c +1 -1
@@ -170,8 +170,8 @@ dev_expire_timer(struct timer_list *t)spin_lock_irqsave (&timer->dev->lock, flags);if (timer->id >=0 )list_move_tail (&timer->list, &timer->dev->expired); -spin_unlock_irqrestore (&timer->dev->lock, flags);wake_up_interruptible (&timer->dev->wait); +spin_unlock_irqrestore (&timer->dev->lock, flags); } static int
drivers/mmc/host/meson-gx-mmc.c +2 -1
@@ -1286,7 +1286,8 @@ static int meson_mmc_probe(struct platform_device *pdev) host->regs + SD_EMMC_IRQ_EN); ret =request_threaded_irq (host->irq, meson_mmc_irq, - meson_mmc_irq_thread,IRQF_SHARED ,NULL , host); + meson_mmc_irq_thread,IRQF_SHARED , +dev_name (&pdev->dev), host);if (ret) goto err_init_clk;
drivers/net/dsa/mv88e6xxx/chip.c +22 -6
@@ -261,6 +261,7 @@ static irqreturn_t mv88e6xxx_g1_irq_thread_work(struct mv88e6xxx_chip *chip)unsigned int sub_irq;unsigned int n;u16 reg; +u16 ctl1;int err;mutex_lock (&chip->reg_lock);
@@ -270,13 +271,28 @@ static irqreturn_t mv88e6xxx_g1_irq_thread_work(struct mv88e6xxx_chip *chip)if (err) goto out; -for (n =0 ; n < chip->g1_irq.nirqs; ++n) { -if (reg & (1 << n)) { - sub_irq =irq_find_mapping (chip->g1_irq.domain, n); -handle_nested_irq (sub_irq); - ++nhandled; +do { +for (n =0 ; n < chip->g1_irq.nirqs; ++n) { +if (reg & (1 << n)) { + sub_irq =irq_find_mapping (chip->g1_irq.domain, + n); +handle_nested_irq (sub_irq); + ++nhandled; + } } - } + +mutex_lock (&chip->reg_lock); + err =mv88e6xxx_g1_read (chip,MV88E6XXX_G1_CTL1 , &ctl1); +if (err) + goto unlock; + err =mv88e6xxx_g1_read (chip,MV88E6XXX_G1_STS , ®); +unlock: +mutex_unlock (&chip->reg_lock); +if (err) + goto out; + ctl1 &=GENMASK (chip->g1_irq.nirqs,0 ); + }while (reg & ctl1); + out:return (nhandled >0 ?IRQ_HANDLED :IRQ_NONE ); }
drivers/net/ethernet/marvell/sky2.c +1 -1
@@ -5087,7 +5087,7 @@ static int sky2_probe(struct pci_dev *pdev, const struct pci_device_id *ent)INIT_WORK (&hw->restart_work, sky2_restart);pci_set_drvdata (pdev, hw); - pdev->d3_delay =200 ; + pdev->d3_delay =300 ;return 0 ;
drivers/net/ethernet/mellanox/mlxsw/spectrum.c +7 -5
@@ -845,8 +845,9 @@ int __mlxsw_sp_port_headroom_set(struct mlxsw_sp_port *mlxsw_sp_port, int mtu,for (i =0 ; i <IEEE_8021QAZ_MAX_TCS ; i++) {bool configure = false;bool pfc = false; +u16 thres_cells; +u16 delay_cells;bool lossy; -u16 thres;for (j =0 ; j <IEEE_8021QAZ_MAX_TCS ; j++) {if (prio_tc[j] == i) {
@@ -860,10 +861,11 @@ int __mlxsw_sp_port_headroom_set(struct mlxsw_sp_port *mlxsw_sp_port, int mtu,continue ; lossy = !(pfc || pause_en); - thres =mlxsw_sp_pg_buf_threshold_get (mlxsw_sp, mtu); - delay =mlxsw_sp_pg_buf_delay_get (mlxsw_sp, mtu, delay, pfc, - pause_en); -mlxsw_sp_pg_buf_pack (pbmc_pl, i, thres + delay, thres, lossy); + thres_cells =mlxsw_sp_pg_buf_threshold_get (mlxsw_sp, mtu); + delay_cells =mlxsw_sp_pg_buf_delay_get (mlxsw_sp, mtu, delay, + pfc, pause_en); +mlxsw_sp_pg_buf_pack (pbmc_pl, i, thres_cells + delay_cells, + thres_cells, lossy); }return mlxsw_reg_write (mlxsw_sp->core,MLXSW_REG (pbmc), pbmc_pl);
drivers/net/ethernet/stmicro/stmmac/dwmac4_descs.c +6 -3
@@ -241,15 +241,18 @@ static inline void dwmac4_get_timestamp(void *desc, u32 ats, u64 *ts)static int dwmac4_rx_check_timestamp (void *desc) {struct dma_desc *p = (struct dma_desc *)desc; +unsigned int rdes0 =le32_to_cpu (p->des0); +unsigned int rdes1 =le32_to_cpu (p->des1); +unsigned int rdes3 =le32_to_cpu (p->des3);u32 own, ctxt;int ret =1 ; - own = p->des3 &RDES3_OWN ; - ctxt = ((p->des3 &RDES3_CONTEXT_DESCRIPTOR ) + own = rdes3 &RDES3_OWN ; + ctxt = ((rdes3 &RDES3_CONTEXT_DESCRIPTOR ) >>RDES3_CONTEXT_DESCRIPTOR_SHIFT );if (likely (!own && ctxt)) { -if ((p->des0 ==0xffffffff ) && (p->des1 ==0xffffffff )) +if ((rdes0 ==0xffffffff ) && (rdes1 ==0xffffffff ))/* Corrupted value */ ret = -EINVAL ;else
drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c +12 -10
@@ -692,25 +692,27 @@ static int stmmac_ethtool_op_set_eee(struct net_device *dev, struct ethtool_eee *edata) {struct stmmac_priv *priv =netdev_priv (dev); +int ret; - priv->eee_enabled = edata->eee_enabled; - -if (!priv->eee_enabled) +if (!edata->eee_enabled) {stmmac_disable_eee_mode (priv); -else { + }else {/* We are asking for enabling the EEE but it is safe * to verify all by invoking the eee_init function. * In case of failure it will return an error. */ - priv->eee_enabled =stmmac_eee_init (priv); -if (!priv->eee_enabled) + edata->eee_enabled =stmmac_eee_init (priv); +if (!edata->eee_enabled)return -EOPNOTSUPP ; - -/* Do not change tx_lpi_timer in case of failure */ - priv->tx_lpi_timer = edata->tx_lpi_timer; } -return phy_ethtool_set_eee (dev->phydev, edata); + ret =phy_ethtool_set_eee (dev->phydev, edata); +if (ret) +return ret; + + priv->eee_enabled = edata->eee_enabled; + priv->tx_lpi_timer = edata->tx_lpi_timer; +return 0 ; }static u32 stmmac_usec2riwt (u32 usec,struct stmmac_priv *priv)
drivers/net/ethernet/ti/netcp_core.c +1 -1
@@ -259,7 +259,7 @@ static int netcp_module_probe(struct netcp_device *netcp_device,const char *name;char node_name[32 ]; -if (of_property_read_string (node,"label" , &name) <0 ) { +if (of_property_read_string (child,"label" , &name) <0 ) {snprintf (node_name,sizeof (node_name),"%pOFn" , child); name = node_name; }
drivers/net/phy/xilinx_gmii2rgmii.c +4 -1
@@ -44,7 +44,10 @@ static int xgmiitorgmii_read_status(struct phy_device *phydev)u16 val =0 ;int err; - err = priv->phy_drv->read_status (phydev); +if (priv->phy_drv->read_status) + err = priv->phy_drv->read_status (phydev); +else + err =genphy_read_status (phydev);if (err <0 )return err;
drivers/net/vxlan.c +11 -3
@@ -2072,7 +2072,7 @@ static void vxlan_encap_bypass(struct sk_buff *skb, struct vxlan_dev *src_vxlan,struct pcpu_sw_netstats *tx_stats, *rx_stats;union vxlan_addr loopback;union vxlan_addr *remote_ip = &dst_vxlan->default_dst.remote_ip; -struct net_device *dev = skb->dev; +struct net_device *dev;int len = skb->len; tx_stats =this_cpu_ptr (src_vxlan->dev->tstats);
@@ -2092,9 +2092,15 @@ static void vxlan_encap_bypass(struct sk_buff *skb, struct vxlan_dev *src_vxlan,#endif } +rcu_read_lock (); + dev = skb->dev; +if (unlikely (!(dev->flags &IFF_UP ))) { +kfree_skb (skb); + goto drop; + } +if (dst_vxlan->cfg.flags &VXLAN_F_LEARN ) -vxlan_snoop (skb->dev, &loopback,eth_hdr (skb)->h_source,0 , - vni); +vxlan_snoop (dev, &loopback,eth_hdr (skb)->h_source,0 , vni);u64_stats_update_begin (&tx_stats->syncp); tx_stats->tx_packets++;
@@ -2107,8 +2113,10 @@ static void vxlan_encap_bypass(struct sk_buff *skb, struct vxlan_dev *src_vxlan, rx_stats->rx_bytes += len;u64_stats_update_end (&rx_stats->syncp); }else { +drop: dev->stats.rx_dropped++; } +rcu_read_unlock (); } static int encap_bypass_if_local(struct sk_buff *skb, struct net_device *dev,
drivers/pci/pci.c +2 -1
@@ -6195,7 +6195,8 @@ static int __init pci_setup(char *str) }else if (!strncmp (str,"pcie_scan_all" ,13 )) {pci_add_flags (PCI_SCAN_ALL_PCIE_DEVS ); }else if (!strncmp (str,"disable_acs_redir=" ,18 )) { - disable_acs_redir_param = str +18 ; + disable_acs_redir_param = +kstrdup (str +18 ,GFP_KERNEL ); }else {printk (KERN_ERR "PCI: Unknown option `%s'\n" , str);
drivers/target/target_core_transport.c +1 -1
@@ -266,7 +266,7 @@ struct se_session *transport_alloc_session(enum target_prot_op sup_prot_ops) } ret =transport_init_session (se_sess);if (ret <0 ) { -kfree (se_sess); +kmem_cache_free (se_sess_cache, se_sess);return ERR_PTR (ret); } se_sess->sup_prot_ops = sup_prot_ops;
drivers/vhost/vhost.c +1 -1
@@ -1784,7 +1784,7 @@ static int log_used(struct vhost_virtqueue *vq, u64 used_offset, u64 len) ret =translate_desc (vq, (uintptr_t )vq->used + used_offset, len, iov,64 ,VHOST_ACCESS_WO ); -if (ret) +if (ret <0 )return ret;for (i =0 ; i < ret; i++) {
include/linux/efi.h +0 -7
@@ -1167,8 +1167,6 @@ static inline bool efi_enabled(int feature)extern void efi_reboot (enum reboot_mode reboot_mode,const char *__unused);extern bool efi_is_table_address (unsigned long phys_addr); - -extern int efi_apply_persistent_mem_reservations (void );#else static inline bool efi_enabled (int feature) {
@@ -1187,11 +1185,6 @@ static inline bool efi_is_table_address(unsigned long phys_addr) {return false; } - -static inline int efi_apply_persistent_mem_reservations (void ) -{ -return 0 ; -}#endif extern int efi_status_to_err (efi_status_t status);
include/linux/memblock.h +0 -3
@@ -29,9 +29,6 @@ extern unsigned long max_pfn;*/ extern unsigned long long max_possible_pfn; -#define INIT_MEMBLOCK_REGIONS 128 -#define INIT_PHYSMEM_REGIONS 4 -/** * enum memblock_flags - definition of memory region attributes * @MEMBLOCK_NONE: no special request
include/linux/netdev_features.h +22 -2
@@ -11,6 +11,8 @@#define _LINUX_NETDEV_FEATURES_H#include <linux/types.h> +#include <linux/bitops.h> +#include <asm/byteorder.h> typedef u64 netdev_features_t ;
@@ -154,8 +156,26 @@ enum {#define NETIF_F_HW_TLS_TX __NETIF_F(HW_TLS_TX)#define NETIF_F_HW_TLS_RX __NETIF_F(HW_TLS_RX) -#define for_each_netdev_feature (mask_addr, bit) \ - for_each_set_bit(bit, (unsigned long *)mask_addr, NETDEV_FEATURE_COUNT) +/* Finds the next feature with the highest number of the range of start till 0. +*/ +static inline int find_next_netdev_feature (u64 feature,unsigned long start) +{ +/* like BITMAP_LAST_WORD_MASK() for u64 +* this sets the most significant 64 - start to 0. +*/ + feature &= ~0ULL >> (-start & ((sizeof (feature) *8 ) -1 )); + +return fls64 (feature) -1 ; +} + +/* This goes for the MSB to the LSB through the set feature bits, +* mask_addr should be a u64 and bit an int +*/ +#define for_each_netdev_feature (mask_addr, bit) \ + for ((bit) = find_next_netdev_feature((mask_addr), \ + NETDEV_FEATURE_COUNT); \ + (bit) >= 0; \ + (bit) = find_next_netdev_feature((mask_addr), (bit) - 1))/* Features valid for ethtool to change */ /* = all defined minus driver/device-class-related */
include/net/ax25.h +12 -0
@@ -201,6 +201,18 @@ static inline void ax25_hold_route(ax25_route *ax25_rt)void __ax25_put_route (ax25_route *ax25_rt); +extern rwlock_t ax25_route_lock; + +static inline void ax25_route_lock_use (void ) +{ +read_lock (&ax25_route_lock); +} + +static inline void ax25_route_lock_unuse (void ) +{ +read_unlock (&ax25_route_lock); +} +static inline void ax25_put_route (ax25_route *ax25_rt) {if (refcount_dec_and_test (&ax25_rt->refcount))
include/net/inetpeer.h +1 -0
@@ -39,6 +39,7 @@ struct inet_peer {u32 metrics[RTAX_MAX ];u32 rate_tokens;/* rate limiting for ICMP */ +u32 n_redirects;unsigned long rate_last;/* * Once inet_peer is queued for deletion (refcnt == 0), following field
mm/memblock.c +9 -2
@@ -26,6 +26,13 @@#include "internal.h" +#define INIT_MEMBLOCK_REGIONS 128 +#define INIT_PHYSMEM_REGIONS 4 + +#ifndef INIT_MEMBLOCK_RESERVED_REGIONS +# define INIT_MEMBLOCK_RESERVED_REGIONS INIT_MEMBLOCK_REGIONS +#endif +/** * DOC: memblock overview *
@@ -92,7 +99,7 @@ unsigned long max_pfn;unsigned long long max_possible_pfn; static struct memblock_region memblock_memory_init_regions[INIT_MEMBLOCK_REGIONS] __initdata_memblock; -static struct memblock_region memblock_reserved_init_regions[INIT_MEMBLOCK_REGIONS] __initdata_memblock; +static struct memblock_region memblock_reserved_init_regions[INIT_MEMBLOCK_RESERVED_REGIONS] __initdata_memblock;#ifdef CONFIG_HAVE_MEMBLOCK_PHYS_MAP static struct memblock_region memblock_physmem_init_regions[INIT_PHYSMEM_REGIONS] __initdata_memblock;#endif
@@ -105,7 +112,7 @@ struct memblock memblock __initdata_memblock = { .reserved.regions = memblock_reserved_init_regions, .reserved.cnt = 1, /* empty dummy entry */ - .reserved.max = INIT_MEMBLOCK_REGIONS, + .reserved.max = INIT_MEMBLOCK_RESERVED_REGIONS, .reserved.name = "reserved",#ifdef CONFIG_HAVE_MEMBLOCK_PHYS_MAP
net/ax25/ax25_ip.c +2 -2
@@ -114,6 +114,7 @@ netdev_tx_t ax25_ip_xmit(struct sk_buff *skb) dst = (ax25_address *)(bp +1 ); src = (ax25_address *)(bp +8 ); +ax25_route_lock_use (); route =ax25_get_route (dst,NULL );if (route) { digipeat = route->digipeat;
@@ -206,9 +207,8 @@ netdev_tx_t ax25_ip_xmit(struct sk_buff *skb)ax25_queue_xmit (skb, dev); put: -if (route) -ax25_put_route (route); +ax25_route_lock_unuse ();return NETDEV_TX_OK ; }
net/ax25/ax25_route.c +8 -11
@@ -40,7 +40,7 @@#include <linux/export.h> static ax25_route *ax25_route_list; -static DEFINE_RWLOCK (ax25_route_lock); +DEFINE_RWLOCK (ax25_route_lock);void ax25_rt_device_down (struct net_device *dev) {
@@ -335,6 +335,7 @@ const struct seq_operations ax25_rt_seqops = {* Find AX.25 route * * Only routes with a reference count of zero can be destroyed. +* Must be called with ax25_route_lock read locked. */ ax25_route *ax25_get_route (ax25_address *addr,struct net_device *dev) {
@@ -342,7 +343,6 @@ ax25_route *ax25_get_route(ax25_address *addr, struct net_device *dev)ax25_route *ax25_def_rt =NULL ;ax25_route *ax25_rt; -read_lock (&ax25_route_lock);/* * Bind to the physical interface we heard them on, or the default * route if none is found;
@@ -365,11 +365,6 @@ ax25_route *ax25_get_route(ax25_address *addr, struct net_device *dev)if (ax25_spe_rt !=NULL ) ax25_rt = ax25_spe_rt; -if (ax25_rt !=NULL ) -ax25_hold_route (ax25_rt); - -read_unlock (&ax25_route_lock); -return ax25_rt; }
@@ -400,9 +395,12 @@ int ax25_rt_autobind(ax25_cb *ax25, ax25_address *addr)ax25_route *ax25_rt;int err =0 ; -if ((ax25_rt =ax25_get_route (addr,NULL )) ==NULL ) +ax25_route_lock_use (); + ax25_rt =ax25_get_route (addr,NULL ); +if (!ax25_rt) { +ax25_route_lock_unuse ();return -EHOSTUNREACH ; - + }if ((ax25->ax25_dev =ax25_dev_ax25dev (ax25_rt->dev)) ==NULL ) { err = -EHOSTUNREACH ; goto put;
@@ -437,8 +435,7 @@ int ax25_rt_autobind(ax25_cb *ax25, ax25_address *addr) } put: -ax25_put_route (ax25_rt); - +ax25_route_lock_unuse ();return err; }
net/core/dev.c +2 -2
@@ -8064,7 +8064,7 @@ static netdev_features_t netdev_sync_upper_features(struct net_device *lower,netdev_features_t feature;int feature_bit; -for_each_netdev_feature (&upper_disables, feature_bit) { +for_each_netdev_feature (upper_disables, feature_bit) { feature =__NETIF_F_BIT (feature_bit);if (!(upper->wanted_features & feature) && (features & feature)) {
@@ -8084,7 +8084,7 @@ static void netdev_sync_lower_features(struct net_device *upper,netdev_features_t feature;int feature_bit; -for_each_netdev_feature (&upper_disables, feature_bit) { +for_each_netdev_feature (upper_disables, feature_bit) { feature =__NETIF_F_BIT (feature_bit);if (!(features & feature) && (lower->features & feature)) { netdev_dbg(upper, "Disabling feature %pNF on lower dev %s.\n",
net/core/skbuff.c +4 -0
@@ -353,6 +353,8 @@ static void *__netdev_alloc_frag(unsigned int fragsz, gfp_t gfp_mask)*/ void *netdev_alloc_frag (unsigned int fragsz) { + fragsz =SKB_DATA_ALIGN (fragsz); +return __netdev_alloc_frag (fragsz,GFP_ATOMIC ); }EXPORT_SYMBOL (netdev_alloc_frag);
@@ -366,6 +368,8 @@ static void *__napi_alloc_frag(unsigned int fragsz, gfp_t gfp_mask)void *napi_alloc_frag (unsigned int fragsz) { + fragsz =SKB_DATA_ALIGN (fragsz); +return __napi_alloc_frag (fragsz,GFP_ATOMIC ); }EXPORT_SYMBOL (napi_alloc_frag);
net/ipv4/inetpeer.c +1 -0
@@ -216,6 +216,7 @@ struct inet_peer *inet_getpeer(struct inet_peer_base *base,atomic_set (&p->rid,0 ); p->metrics[RTAX_LOCK -1 ] =INETPEER_METRICS_NEW ; p->rate_tokens =0 ; + p->n_redirects =0 ;/* 60*HZ is arbitrary, but chosen enough high so that the first * calculation of tokens is at its maximum. */
net/ipv4/netfilter/nf_nat_snmp_basic_main.c +6 -1
@@ -105,6 +105,8 @@ static void fast_csum(struct snmp_ctx *ctx, unsigned char offset)int snmp_version (void *context,size_t hdrlen,unsigned char tag,const void *data,size_t datalen) { +if (datalen !=1 ) +return -EINVAL ;if (*(unsigned char *)data >1 )return -ENOTSUPP ;return 1 ;
@@ -114,8 +116,11 @@ int snmp_helper(void *context, size_t hdrlen, unsigned char tag, const void *data, size_t datalen) {struct snmp_ctx *ctx = (struct snmp_ctx *)context; -__be32 *pdata = (__be32 *)data; +__be32 *pdata; +if (datalen !=4 ) +return -EINVAL ; + pdata = (__be32 *)data;if (*pdata == ctx->from) {pr_debug ("%s: %pI4 to %pI4\n" , __func__, (void *)&ctx->from, (void *)&ctx->to);
net/ipv4/route.c +5 -2
@@ -887,13 +887,15 @@ void ip_rt_send_redirect(struct sk_buff *skb)/* No redirected packets during ip_rt_redirect_silence; * reset the algorithm. */ -if (time_after (jiffies, peer->rate_last + ip_rt_redirect_silence)) +if (time_after (jiffies, peer->rate_last + ip_rt_redirect_silence)) { peer->rate_tokens =0 ; + peer->n_redirects =0 ; + }/* Too many ignored redirects; do not send anything * set dst.rate_last to the last seen redirected packet. */ -if (peer->rate_tokens >= ip_rt_redirect_number) { +if (peer->n_redirects >= ip_rt_redirect_number) { peer->rate_last = jiffies; goto out_put_peer; }
@@ -910,6 +912,7 @@ void ip_rt_send_redirect(struct sk_buff *skb)icmp_send (skb,ICMP_REDIRECT ,ICMP_REDIR_HOST , gw); peer->rate_last = jiffies; ++peer->rate_tokens; + ++peer->n_redirects;#ifdef CONFIG_IP_ROUTE_VERBOSE if (log_martians && peer->rate_tokens == ip_rt_redirect_number)
net/ipv4/tcp.c +1 -1
@@ -2532,6 +2532,7 @@ void tcp_write_queue_purge(struct sock *sk)sk_mem_reclaim (sk);tcp_clear_all_retrans_hints (tcp_sk (sk));tcp_sk (sk)->packets_out =0 ; +inet_csk (sk)->icsk_backoff =0 ; }int tcp_disconnect (struct sock *sk,int flags)
@@ -2580,7 +2581,6 @@ int tcp_disconnect(struct sock *sk, int flags) tp->write_seq += tp->max_window +2 ;if (tp->write_seq ==0 ) tp->write_seq =1 ; - icsk->icsk_backoff =0 ; tp->snd_cwnd =2 ; icsk->icsk_probes_out =0 ; tp->snd_ssthresh =TCP_INFINITE_SSTHRESH ;
net/ipv4/tcp_ipv4.c +4 -3
@@ -535,14 +535,15 @@ void tcp_v4_err(struct sk_buff *icmp_skb, u32 info)if (sock_owned_by_user (sk))break ; + skb =tcp_rtx_queue_head (sk); +if (WARN_ON_ONCE (!skb)) +break ; + icsk->icsk_backoff--; icsk->icsk_rto = tp->srtt_us ?__tcp_set_rto (tp) :TCP_TIMEOUT_INIT ; icsk->icsk_rto =inet_csk_rto_backoff (icsk,TCP_RTO_MAX ); - skb =tcp_rtx_queue_head (sk); -BUG_ON (!skb); -tcp_mstamp_refresh (tp); delta_us = (u32)(tp->tcp_mstamp -tcp_skb_timestamp_us (skb)); remaining = icsk->icsk_rto -
net/ipv6/addrconf.c +2 -1
@@ -1165,7 +1165,8 @@ check_cleanup_prefix_route(struct inet6_ifaddr *ifp, unsigned long *expires)list_for_each_entry (ifa, &idev->addr_list, if_list) {if (ifa == ifp)continue ; -if (!ipv6_prefix_equal (&ifa->addr, &ifp->addr, +if (ifa->prefix_len != ifp->prefix_len || + !ipv6_prefix_equal (&ifa->addr, &ifp->addr, ifp->prefix_len))continue ;if (ifa->flags & (IFA_F_PERMANENT |IFA_F_NOPREFIXROUTE ))
net/ipv6/ip6_gre.c +20 -14
@@ -1717,6 +1717,24 @@ static int ip6erspan_tap_validate(struct nlattr *tb[], struct nlattr *data[],return 0 ; } +static void ip6erspan_set_version (struct nlattr *data[], +struct __ip6_tnl_parm *parms) +{ + parms->erspan_ver =1 ; +if (data[IFLA_GRE_ERSPAN_VER ]) + parms->erspan_ver =nla_get_u8 (data[IFLA_GRE_ERSPAN_VER ]); + +if (parms->erspan_ver ==1 ) { +if (data[IFLA_GRE_ERSPAN_INDEX ]) + parms->index =nla_get_u32 (data[IFLA_GRE_ERSPAN_INDEX ]); + }else if (parms->erspan_ver ==2 ) { +if (data[IFLA_GRE_ERSPAN_DIR ]) + parms->dir =nla_get_u8 (data[IFLA_GRE_ERSPAN_DIR ]); +if (data[IFLA_GRE_ERSPAN_HWID ]) + parms->hwid =nla_get_u16 (data[IFLA_GRE_ERSPAN_HWID ]); + } +} +static void ip6gre_netlink_parms (struct nlattr *data[],struct __ip6_tnl_parm *parms) {
@@ -1765,20 +1783,6 @@ static void ip6gre_netlink_parms(struct nlattr *data[],if (data[IFLA_GRE_COLLECT_METADATA ]) parms->collect_md = true; - - parms->erspan_ver =1 ; -if (data[IFLA_GRE_ERSPAN_VER ]) - parms->erspan_ver =nla_get_u8 (data[IFLA_GRE_ERSPAN_VER ]); - -if (parms->erspan_ver ==1 ) { -if (data[IFLA_GRE_ERSPAN_INDEX ]) - parms->index =nla_get_u32 (data[IFLA_GRE_ERSPAN_INDEX ]); - }else if (parms->erspan_ver ==2 ) { -if (data[IFLA_GRE_ERSPAN_DIR ]) - parms->dir =nla_get_u8 (data[IFLA_GRE_ERSPAN_DIR ]); -if (data[IFLA_GRE_ERSPAN_HWID ]) - parms->hwid =nla_get_u16 (data[IFLA_GRE_ERSPAN_HWID ]); - } }static int ip6gre_tap_init (struct net_device *dev)
@@ -2207,6 +2211,7 @@ static int ip6erspan_newlink(struct net *src_net, struct net_device *dev,int err;ip6gre_netlink_parms (data, &nt->parms); +ip6erspan_set_version (data, &nt->parms); ign =net_generic (net, ip6gre_net_id);if (nt->parms.collect_md) {
@@ -2252,6 +2257,7 @@ static int ip6erspan_changelink(struct net_device *dev, struct nlattr *tb[],if (IS_ERR (t))return PTR_ERR (t); +ip6erspan_set_version (data, &p);ip6gre_tunnel_unlink_md (ign, t);ip6gre_tunnel_unlink (ign, t);ip6erspan_tnl_change (t, &p, !tb[IFLA_MTU ]);
net/packet/af_packet.c +2 -1
@@ -2887,7 +2887,8 @@ static int packet_snd(struct socket *sock, struct msghdr *msg, size_t len) goto out_free; }else if (reserve) {skb_reserve (skb, -reserve); -if (len < reserve) +if (len < reserve +sizeof (struct ipv6hdr ) && + dev->min_header_len != dev->hard_header_len)skb_reset_network_header (skb); }
net/vmw_vsock/vmci_transport.c +4 -0
@@ -1651,6 +1651,10 @@ static void vmci_transport_cleanup(struct work_struct *work)static void vmci_transport_destruct (struct vsock_sock *vsk) { +/* transport can be NULL if we hit a failure at init() time */ +if (!vmci_trans (vsk)) +return ; +/* Ensure that the detach callback doesn't use the sk/vsk * we are about to destruct. */
net/x25/af_x25.c +2 -4
@@ -352,17 +352,15 @@ static unsigned int x25_new_lci(struct x25_neigh *nb)unsigned int lci =1 ;struct sock *sk; -read_lock_bh (&x25_list_lock); - -while ((sk =__x25_find_socket (lci, nb)) !=NULL ) { +while ((sk =x25_find_socket (lci, nb)) !=NULL ) {sock_put (sk);if (++lci ==4096 ) { lci =0 ;break ; } +cond_resched (); } -read_unlock_bh (&x25_list_lock);return lci; }