Linux 5.6.18
Greg Kroah-Hartman
maintainerI'm announcing the release of the 5.6.18 kernel.
All users of the 5.6 kernel series must upgrade.
The updated 5.6.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-5.6.y
and can be browsed at the normal kernel.org git web browser:
https://git.kernel.org/?p=linux/kernel/git/stable/linux-stable.git;a=summary
thanks,
greg k-h
------------
Documentation/ABI/testing/sysfs-devices-system-cpu | 1 Documentation/admin-guide/hw-vuln/index.rst | 1 Documentation/admin-guide/hw-vuln/special-register-buffer-data-sampling.rst | 149 ++++++++++ Documentation/admin-guide/kernel-parameters.txt | 20 + Makefile | 2 arch/x86/include/asm/cpu_device_id.h | 30 ++ arch/x86/include/asm/cpufeatures.h | 2 arch/x86/include/asm/msr-index.h | 4 arch/x86/kernel/cpu/bugs.c | 106 +++++++ arch/x86/kernel/cpu/common.c | 56 +++ arch/x86/kernel/cpu/cpu.h | 1 arch/x86/kernel/cpu/match.c | 7 drivers/base/cpu.c | 8 drivers/iio/adc/stm32-adc-core.c | 34 -- drivers/iio/chemical/pms7003.c | 17 - drivers/iio/chemical/sps30.c | 9 drivers/iio/light/vcnl4000.c | 6 drivers/net/dsa/ocelot/felix.c | 8 drivers/net/ethernet/mellanox/mlx5/core/en_tc.c | 6 drivers/net/ethernet/mellanox/mlx5/core/fs_core.c | 6 drivers/net/ethernet/mellanox/mlx5/core/main.c | 18 + drivers/net/ethernet/netronome/nfp/flower/offload.c | 3 drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 3 drivers/net/usb/qmi_wwan.c | 1 drivers/nfc/st21nfca/dep.c | 4 drivers/nvmem/qfprom.c | 14 drivers/staging/rtl8712/wifi.h | 9 drivers/tty/hvc/hvc_console.c | 23 - drivers/tty/serial/8250/Kconfig | 1 drivers/tty/vt/keyboard.c | 26 + drivers/usb/class/cdc-acm.c | 2 drivers/usb/musb/musb_core.c | 7 drivers/usb/musb/musb_debugfs.c | 10 drivers/usb/serial/ch341.c | 68 ++++ drivers/usb/serial/option.c | 4 drivers/usb/serial/qcserial.c | 1 drivers/usb/serial/usb_wwan.c | 4 include/linux/mod_devicetable.h | 6 include/linux/virtio_net.h | 25 + kernel/events/uprobes.c | 16 - net/ipv4/devinet.c | 1 net/l2tp/l2tp_core.c | 3 net/l2tp/l2tp_ip.c | 29 + net/l2tp/l2tp_ip6.c | 30 +- net/mptcp/protocol.c | 20 + net/sched/sch_fq_pie.c | 4 net/sctp/ulpevent.c | 3 net/vmw_vsock/af_vsock.c | 2 net/vmw_vsock/virtio_transport_common.c | 8 tools/testing/selftests/tc-testing/tc-tests/qdiscs/fq_pie.json | 21 + 50 files changed, 693 insertions(+), 146 deletions(-)
Bin Liu (2):
USB: serial: usb_wwan: do not resubmit rx urb on fatal errors
usb: musb: start session in resume for host port
Chuhong Yuan (1):
NFC: st21nfca: add missed kfree_skb() in an error path
Daniele Palmas (2):
net: usb: qmi_wwan: add Telit LE910C1-EUX composition
USB: serial: option: add Telit LE910C1-EUX compositions
Davide Caratti (1):
net/sched: fix infinite loop in sch_fq_pie
Dinghao Liu (1):
usb: musb: Fix runtime PM imbalance on error
Dmitry Torokhov (1):
vt: keyboard: avoid signed integer overflow in k_ascii
Eric Dumazet (3):
l2tp: add sk_family checks to l2tp_validate_socket
l2tp: do not use inet_hash()/inet_unhash()
net: be more gentle about silly gso requests coming from user
Fabrice Gasnier (1):
iio: adc: stm32-adc: fix a wrong error message when probing interrupts
Fugang Duan (1):
net: stmmac: enable timestamp snapshot for required PTP packets in dwmac v5.10a
Greg Kroah-Hartman (2):
Revert "net/mlx5: Annotate mutex destroy for root ns" Linux 5.6.18
Heinrich Kuhn (1):
nfp: flower: fix used time of merge flow statistics
Jia He (1):
virtio_vsock: Fix race condition in virtio_transport_recv_pkt
Jiri Slaby (1):
tty: hvc_console, fix crashes on parallel open/close
Johan Hovold (1):
USB: serial: ch341: fix lockup of devices with limited prescaler
Jonas Falkevik (1):
sctp: check assoc before SCTP_ADDR_{MADE_PRIM, ADDED} event
Jonathan Cameron (2):
iio:chemical:sps30: Fix timestamp alignment iio:chemical:pms7003: Fix timestamp alignment and prevent data leak.
Josh Poimboeuf (1):
x86/speculation: Add Ivy Bridge to affected list
Josh Triplett (1):
serial: 8250: Enable 16550A variants by default on non-x86
Mark Bloch (1):
net/mlx5: Fix crash upon suspend/resume
Mark Gross (4):
x86/cpu: Add a steppings field to struct x86_cpu_id
x86/cpu: Add 'table' argument to cpu_matches()
x86/speculation: Add Special Register Buffer Data Sampling (SRBDS) mitigation x86/speculation: Add SRBDS vulnerability and mitigation documentation
Mathieu Othacehe (1):
iio: vcnl4000: Fix i2c swapped word reading.
Matt Jolly (1):
USB: serial: qcserial: add DW5816e QDL support
Michael Hanselmann (1):
USB: serial: ch341: add basis for quirk detection
Oleg Nesterov (1):
uprobes: ensure that uprobe->offset and ->ref_ctr_offset are properly aligned
Oliver Neukum (1):
CDC-ACM: heed quirk also in error handling
Pablo Neira Ayuso (1):
net/mlx5e: replace EINVAL in mlx5e_flower_parse_meta()
Paolo Abeni (1):
mptcp: fix unblocking connect()
Pascal Terjan (1):
staging: rtl8712: Fix IEEE80211_ADDBA_PARAM_BUF_SIZE_MASK
Srinivas Kandagatla (1):
nvmem: qfprom: remove incorrect write support
Stefano Garzarella (1):
vsock: fix timeout in vsock_accept()
Vladimir Oltean (1):
net: dsa: felix: send VLANs on CPU port as egress-tagged
Willem de Bruijn (1):
net: check untrusted gso_size at kernel entry
Yang Yingliang (1):
devinet: fix memleak in inetdev_init()
Greg Kroah-Hartman
maintainerDocumentation/ABI/testing/sysfs-devices-system-cpu +1 -0
@@ -492,6 +492,7 @@ What: /sys/devices/system/cpu/vulnerabilities /sys/devices/system/cpu/vulnerabilities/spec_store_bypass /sys/devices/system/cpu/vulnerabilities/l1tf /sys/devices/system/cpu/vulnerabilities/mds + /sys/devices/system/cpu/vulnerabilities/srbds /sys/devices/system/cpu/vulnerabilities/tsx_async_abort /sys/devices/system/cpu/vulnerabilities/itlb_multihit Date: January 2018
Documentation/admin-guide/hw-vuln/index.rst +1 -0
@@ -14,3 +14,4 @@ are configurable at compile, boot or run time. mds tsx_async_abort multihit.rst + special-register-buffer-data-sampling.rst
Documentation/admin-guide/hw-vuln/special-register-buffer-data-sampling.rst new file +149 -0
149 lines not on this page · raw message
Documentation/admin-guide/kernel-parameters.txt +20 -0
@@ -4659,6 +4659,26 @@ spia_pedr= spia_peddr= + srbds= [X86,INTEL] + Control the Special Register Buffer Data Sampling + (SRBDS) mitigation. + + Certain CPUs are vulnerable to an MDS-like + exploit which can leak bits from the random + number generator. + + By default, this issue is mitigated by + microcode. However, the microcode fix can cause + the RDRAND and RDSEED instructions to become + much slower. Among other effects, this will + result in reduced throughput from /dev/urandom. + + The microcode mitigation can be disabled with + the following option: + + off: Disable mitigation and remove + performance impact to RDRAND and RDSEED + srcutree.counter_wrap_check [KNL] Specifies how frequently to check for grace-period sequence counter wrap for the
Makefile +1 -1
@@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 5 PATCHLEVEL = 6 -SUBLEVEL = 17 +SUBLEVEL = 18 EXTRAVERSION = NAME = Kleptomaniac Octopus
arch/x86/include/asm/cpu_device_id.h +30 -0
@@ -9,6 +9,36 @@#include <linux/mod_devicetable.h> +#define X86_CENTAUR_FAM6_C7_D 0xd +#define X86_CENTAUR_FAM6_NANO 0xf + +#define X86_STEPPINGS (mins, maxs) GENMASK(maxs, mins) + +/** +* X86_MATCH_VENDOR_FAM_MODEL_STEPPINGS_FEATURE - Base macro for CPU matching +* @_vendor: The vendor name, e.g. INTEL, AMD, HYGON, ..., ANY +* The name is expanded to X86_VENDOR_@_vendor +* @_family: The family number or X86_FAMILY_ANY +* @_model: The model number, model constant or X86_MODEL_ANY +* @_steppings: Bitmask for steppings, stepping constant or X86_STEPPING_ANY +* @_feature: A X86_FEATURE bit or X86_FEATURE_ANY +* @_data: Driver specific data or NULL. The internal storage +* format is unsigned long. The supplied value, pointer +* etc. is casted to unsigned long internally. +* +* Backport version to keep the SRBDS pile consistant. No shorter variants +* required for this. +*/ +#define X86_MATCH_VENDOR_FAM_MODEL_STEPPINGS_FEATURE (_vendor, _family, _model, \ + _steppings, _feature, _data) { \ + .vendor = X86_VENDOR_##_vendor, \ + .family = _family, \ + .model = _model, \ + .steppings = _steppings, \ + .feature = _feature, \ + .driver_data = (unsigned long) _data \ +} +/* * Match specific microcode revisions. *
arch/x86/include/asm/cpufeatures.h +2 -0
@@ -360,6 +360,7 @@#define X86_FEATURE_AVX512_4FMAPS (18*32+ 3)/* AVX-512 Multiply Accumulation Single precision */ #define X86_FEATURE_FSRM (18*32+ 4)/* Fast Short Rep Mov */ #define X86_FEATURE_AVX512_VP2INTERSECT (18*32+ 8)/* AVX-512 Intersect for D/Q */ +#define X86_FEATURE_SRBDS_CTRL (18*32+ 9)/* "" SRBDS mitigation MSR available */ #define X86_FEATURE_MD_CLEAR (18*32+10)/* VERW clears CPU buffers */ #define X86_FEATURE_TSX_FORCE_ABORT (18*32+13)/* "" TSX_FORCE_ABORT */ #define X86_FEATURE_PCONFIG (18*32+18)/* Intel PCONFIG */
@@ -404,5 +405,6 @@#define X86_BUG_SWAPGS X86_BUG(21)/* CPU is affected by speculation through SWAPGS */ #define X86_BUG_TAA X86_BUG(22)/* CPU is affected by TSX Async Abort(TAA) */ #define X86_BUG_ITLB_MULTIHIT X86_BUG(23)/* CPU may incur MCE during certain page attribute changes */ +#define X86_BUG_SRBDS X86_BUG(24)/* CPU may leak RNG bits if not mitigated */ #endif /* _ASM_X86_CPUFEATURES_H */
arch/x86/include/asm/msr-index.h +4 -0
@@ -119,6 +119,10 @@#define TSX_CTRL_RTM_DISABLE BIT(0)/* Disable RTM feature */ #define TSX_CTRL_CPUID_CLEAR BIT(1)/* Disable TSX enumeration */ +/* SRBDS support */ +#define MSR_IA32_MCU_OPT_CTRL 0x00000123 +#define RNGDS_MITG_DIS BIT(0) +#define MSR_IA32_SYSENTER_CS 0x00000174#define MSR_IA32_SYSENTER_ESP 0x00000175#define MSR_IA32_SYSENTER_EIP 0x00000176
arch/x86/kernel/cpu/bugs.c +106 -0
140 lines not on this page · raw message
arch/x86/kernel/cpu/common.c +45 -11
105 lines not on this page · raw message
arch/x86/kernel/cpu/cpu.h +1 -0
@@ -77,6 +77,7 @@ extern void detect_ht(struct cpuinfo_x86 *c);unsigned int aperfmperf_get_khz (int cpu);extern void x86_spec_ctrl_setup_ap (void ); +extern void update_srbds_msr (void );extern u64 x86_read_arch_cap_msr (void );
arch/x86/kernel/cpu/match.c +6 -1
@@ -34,13 +34,18 @@ const struct x86_cpu_id *x86_match_cpu(const struct x86_cpu_id *match)const struct x86_cpu_id *m;struct cpuinfo_x86 *c = &boot_cpu_data; -for (m = match; m->vendor | m->family | m->model | m->feature; m++) { +for (m = match; + m->vendor | m->family | m->model | m->steppings | m->feature; + m++) {if (m->vendor !=X86_VENDOR_ANY && c->x86_vendor != m->vendor)continue ;if (m->family !=X86_FAMILY_ANY && c->x86 != m->family)continue ;if (m->model !=X86_MODEL_ANY && c->x86_model != m->model)continue ; +if (m->steppings !=X86_STEPPING_ANY && + !(BIT (c->x86_stepping) & m->steppings)) +continue ;if (m->feature !=X86_FEATURE_ANY && !cpu_has (c, m->feature))continue ;return m;
drivers/base/cpu.c +8 -0
@@ -567,6 +567,12 @@ ssize_t __weak cpu_show_itlb_multihit(struct device *dev,return sprintf (buf,"Not affected\n" ); } +ssize_t __weak cpu_show_srbds (struct device *dev, +struct device_attribute *attr,char *buf) +{ +return sprintf (buf,"Not affected\n" ); +} + static DEVICE_ATTR(meltdown, 0444, cpu_show_meltdown, NULL); static DEVICE_ATTR(spectre_v1, 0444, cpu_show_spectre_v1, NULL); static DEVICE_ATTR(spectre_v2, 0444, cpu_show_spectre_v2, NULL);
@@ -575,6 +581,7 @@ static DEVICE_ATTR(l1tf, 0444, cpu_show_l1tf, NULL); static DEVICE_ATTR(mds, 0444, cpu_show_mds, NULL); static DEVICE_ATTR(tsx_async_abort, 0444, cpu_show_tsx_async_abort, NULL); static DEVICE_ATTR(itlb_multihit, 0444, cpu_show_itlb_multihit, NULL); +static DEVICE_ATTR(srbds, 0444, cpu_show_srbds, NULL);static struct attribute *cpu_root_vulnerabilities_attrs[] = { &dev_attr_meltdown.attr,
@@ -585,6 +592,7 @@ static struct attribute *cpu_root_vulnerabilities_attrs[] = { &dev_attr_mds.attr, &dev_attr_tsx_async_abort.attr, &dev_attr_itlb_multihit.attr, + &dev_attr_srbds.attr, NULL };
drivers/iio/adc/stm32-adc-core.c +14 -20
@@ -65,12 +65,14 @@ struct stm32_adc_priv;* @clk_sel: clock selection routine * @max_clk_rate_hz: maximum analog clock rate (Hz, from datasheet) * @has_syscfg: SYSCFG capability flags +* @num_irqs: number of interrupt lines */ struct stm32_adc_priv_cfg {const struct stm32_adc_common_regs *regs;int (*clk_sel)(struct platform_device *,struct stm32_adc_priv *);u32 max_clk_rate_hz;unsigned int has_syscfg; +unsigned int num_irqs; };/**
@@ -375,21 +377,15 @@ static int stm32_adc_irq_probe(struct platform_device *pdev,struct device_node *np = pdev->dev.of_node;unsigned int i; -for (i =0 ; i <STM32_ADC_MAX_ADCS ; i++) { +/* +* Interrupt(s) must be provided, depending on the compatible: +* - stm32f4/h7 shares a common interrupt line. +* - stm32mp1, has one line per ADC +*/ +for (i =0 ; i < priv->cfg->num_irqs; i++) { priv->irq[i] =platform_get_irq (pdev, i); -if (priv->irq[i] <0 ) { -/* -* At least one interrupt must be provided, make others -* optional: -* - stm32f4/h7 shares a common interrupt. -* - stm32mp1, has one line per ADC (either for ADC1, -* ADC2 or both). -*/ -if (i && priv->irq[i] == -ENXIO ) -continue ; - +if (priv->irq[i] <0 )return priv->irq[i]; - } } priv->domain = irq_domain_add_simple(np, STM32_ADC_MAX_ADCS, 0,
@@ -400,9 +396,7 @@ static int stm32_adc_irq_probe(struct platform_device *pdev,return -ENOMEM ; } -for (i =0 ; i <STM32_ADC_MAX_ADCS ; i++) { -if (priv->irq[i] <0 ) -continue ; +for (i =0 ; i < priv->cfg->num_irqs; i++) {irq_set_chained_handler (priv->irq[i], stm32_adc_irq_handler);irq_set_handler_data (priv->irq[i], priv); }
@@ -420,11 +414,8 @@ static void stm32_adc_irq_remove(struct platform_device *pdev,irq_dispose_mapping (irq_find_mapping (priv->domain, hwirq));irq_domain_remove (priv->domain); -for (i =0 ; i <STM32_ADC_MAX_ADCS ; i++) { -if (priv->irq[i] <0 ) -continue ; +for (i =0 ; i < priv->cfg->num_irqs; i++)irq_set_chained_handler (priv->irq[i],NULL ); - } } static int stm32_adc_core_switches_supply_en(struct stm32_adc_priv *priv,
@@ -817,6 +808,7 @@ static const struct stm32_adc_priv_cfg stm32f4_adc_priv_cfg = { .regs = &stm32f4_adc_common_regs, .clk_sel = stm32f4_adc_clk_sel, .max_clk_rate_hz = 36000000, + .num_irqs = 1, };static const struct stm32_adc_priv_cfg stm32h7_adc_priv_cfg = {
@@ -824,6 +816,7 @@ static const struct stm32_adc_priv_cfg stm32h7_adc_priv_cfg = { .clk_sel = stm32h7_adc_clk_sel, .max_clk_rate_hz = 36000000, .has_syscfg = HAS_VBOOSTER, + .num_irqs = 1, };static const struct stm32_adc_priv_cfg stm32mp1_adc_priv_cfg = {
@@ -831,6 +824,7 @@ static const struct stm32_adc_priv_cfg stm32mp1_adc_priv_cfg = { .clk_sel = stm32h7_adc_clk_sel, .max_clk_rate_hz = 40000000, .has_syscfg = HAS_VBOOSTER | HAS_ANASWVDD, + .num_irqs = 2, };static const struct of_device_id stm32_adc_of_match[] = {
drivers/iio/chemical/pms7003.c +12 -5
@@ -73,6 +73,11 @@ struct pms7003_state {struct pms7003_frame frame;struct completion frame_ready;struct mutex lock;/* must be held whenever state gets touched */ +/* Used to construct scan to push to the IIO buffer */ +struct { +u16 data[3 ];/* PM1, PM2P5, PM10 */ +s64 ts; + } scan; };static int pms7003_do_cmd (struct pms7003_state *state,enum pms7003_cmd cmd)
@@ -104,7 +109,6 @@ static irqreturn_t pms7003_trigger_handler(int irq, void *p)struct iio_dev *indio_dev = pf->indio_dev;struct pms7003_state *state =iio_priv (indio_dev);struct pms7003_frame *frame = &state->frame; -u16 data[3 +1 +4 ];/* PM1, PM2P5, PM10, padding, timestamp */ int ret;mutex_lock (&state->lock);
@@ -114,12 +118,15 @@ static irqreturn_t pms7003_trigger_handler(int irq, void *p) goto err; } - data[PM1 ] =pms7003_get_pm (frame->data +PMS7003_PM1_OFFSET ); - data[PM2P5 ] =pms7003_get_pm (frame->data +PMS7003_PM2P5_OFFSET ); - data[PM10 ] =pms7003_get_pm (frame->data +PMS7003_PM10_OFFSET ); + state->scan.data[PM1 ] = +pms7003_get_pm (frame->data +PMS7003_PM1_OFFSET ); + state->scan.data[PM2P5 ] = +pms7003_get_pm (frame->data +PMS7003_PM2P5_OFFSET ); + state->scan.data[PM10 ] = +pms7003_get_pm (frame->data +PMS7003_PM10_OFFSET );mutex_unlock (&state->lock); -iio_push_to_buffers_with_timestamp (indio_dev, data, +iio_push_to_buffers_with_timestamp (indio_dev, &state->scan,iio_get_time_ns (indio_dev)); err:iio_trigger_notify_done (indio_dev->trig);
drivers/iio/chemical/sps30.c +6 -3
@@ -230,15 +230,18 @@ static irqreturn_t sps30_trigger_handler(int irq, void *p)struct iio_dev *indio_dev = pf->indio_dev;struct sps30_state *state =iio_priv (indio_dev);int ret; -s32 data[4 +2 ];/* PM1, PM2P5, PM4, PM10, timestamp */ +struct { +s32 data[4 ];/* PM1, PM2P5, PM4, PM10 */ +s64 ts; + } scan;mutex_lock (&state->lock); - ret =sps30_do_meas (state, data,4 ); + ret =sps30_do_meas (state, scan.data,ARRAY_SIZE (scan.data));mutex_unlock (&state->lock);if (ret) goto err; -iio_push_to_buffers_with_timestamp (indio_dev, data, +iio_push_to_buffers_with_timestamp (indio_dev, &scan,iio_get_time_ns (indio_dev)); err:iio_trigger_notify_done (indio_dev->trig);
drivers/iio/light/vcnl4000.c +2 -4
@@ -193,7 +193,6 @@ static int vcnl4000_measure(struct vcnl4000_data *data, u8 req_mask, u8 rdy_mask, u8 data_reg, int *val) { int tries = 20; -__be16 buf;int ret;mutex_lock (&data->vcnl4000_lock);
@@ -220,13 +219,12 @@ static int vcnl4000_measure(struct vcnl4000_data *data, u8 req_mask, goto fail; } - ret =i2c_smbus_read_i2c_block_data (data->client, - data_reg,sizeof (buf), (u8 *) &buf); + ret =i2c_smbus_read_word_swapped (data->client, data_reg);if (ret <0 ) goto fail;mutex_unlock (&data->vcnl4000_lock); - *val =be16_to_cpu (buf); + *val = ret;return 0 ;
drivers/net/dsa/ocelot/felix.c +6 -2
@@ -100,13 +100,17 @@ static void felix_vlan_add(struct dsa_switch *ds, int port, const struct switchdev_obj_port_vlan *vlan) {struct ocelot *ocelot = ds->priv; +u16 flags = vlan->flags;u16 vid;int err; +if (dsa_is_cpu_port (ds, port)) + flags &= ~BRIDGE_VLAN_INFO_UNTAGGED ; +for (vid = vlan->vid_begin; vid <= vlan->vid_end; vid++) { err =ocelot_vlan_add (ocelot, port, vid, - vlan->flags &BRIDGE_VLAN_INFO_PVID , - vlan->flags &BRIDGE_VLAN_INFO_UNTAGGED ); + flags &BRIDGE_VLAN_INFO_PVID , + flags &BRIDGE_VLAN_INFO_UNTAGGED );if (err) {dev_err (ds->dev,"Failed to add VLAN %d to port %d: %d\n" , vid, port, err);
drivers/net/ethernet/mellanox/mlx5/core/en_tc.c +3 -3
@@ -1824,7 +1824,7 @@ static int mlx5e_flower_parse_meta(struct net_device *filter_dev,flow_rule_match_meta (rule, &match);if (match.mask->ingress_ifindex !=0xFFFFFFFF ) {NL_SET_ERR_MSG_MOD (extack,"Unsupported ingress ifindex mask" ); -return -EINVAL ; +return -EOPNOTSUPP ; } ingress_dev = __dev_get_by_index(dev_net(filter_dev),
@@ -1832,13 +1832,13 @@ static int mlx5e_flower_parse_meta(struct net_device *filter_dev,if (!ingress_dev) {NL_SET_ERR_MSG_MOD (extack,"Can't find the ingress port to match on" ); -return -EINVAL ; +return -ENOENT ; }if (ingress_dev != filter_dev) {NL_SET_ERR_MSG_MOD (extack,"Can't match on the ingress filter port" ); -return -EINVAL ; +return -EOPNOTSUPP ; }return 0 ;
drivers/net/ethernet/mellanox/mlx5/core/fs_core.c +0 -6
@@ -416,12 +416,6 @@ static void del_sw_ns(struct fs_node *node)static void del_sw_prio (struct fs_node *node) { -struct mlx5_flow_root_namespace *root_ns; -struct mlx5_flow_namespace *ns; - -fs_get_obj (ns, node); - root_ns = container_of(ns, struct mlx5_flow_root_namespace, ns); -mutex_destroy (&root_ns->chain_lock);kfree (node); }
drivers/net/ethernet/mellanox/mlx5/core/main.c +18 -0
@@ -1552,6 +1552,22 @@ static void shutdown(struct pci_dev *pdev)mlx5_pci_disable_device (dev); } +static int mlx5_suspend (struct pci_dev *pdev,pm_message_t state) +{ +struct mlx5_core_dev *dev =pci_get_drvdata (pdev); + +mlx5_unload_one (dev, false); + +return 0 ; +} + +static int mlx5_resume (struct pci_dev *pdev) +{ +struct mlx5_core_dev *dev =pci_get_drvdata (pdev); + +return mlx5_load_one (dev, false); +} +static const struct pci_device_id mlx5_core_pci_table[] = { {PCI_VDEVICE (MELLANOX ,PCI_DEVICE_ID_MELLANOX_CONNECTIB ) }, {PCI_VDEVICE (MELLANOX ,0x1012 ),MLX5_PCI_DEV_IS_VF },/* Connect-IB VF */
@@ -1595,6 +1611,8 @@ static struct pci_driver mlx5_core_driver = { .id_table = mlx5_core_pci_table, .probe = init_one, .remove = remove_one, + .suspend = mlx5_suspend, + .resume = mlx5_resume, .shutdown = shutdown, .err_handler = &mlx5_err_handler, .sriov_configure = mlx5_core_sriov_configure,
drivers/net/ethernet/netronome/nfp/flower/offload.c +2 -1
@@ -1440,7 +1440,8 @@ __nfp_flower_update_merge_stats(struct nfp_app *app, ctx_id =be32_to_cpu (sub_flow->meta.host_ctx_id); priv->stats[ctx_id].pkts += pkts; priv->stats[ctx_id].bytes += bytes; -max_t (u64, priv->stats[ctx_id].used, used); + priv->stats[ctx_id].used =max_t (u64, used, + priv->stats[ctx_id].used); } }
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +2 -1
@@ -630,7 +630,8 @@ static int stmmac_hwtstamp_set(struct net_device *dev, struct ifreq *ifr) config.rx_filter =HWTSTAMP_FILTER_PTP_V2_EVENT ; ptp_v2 =PTP_TCR_TSVER2ENA ; snap_type_sel =PTP_TCR_SNAPTYPSEL_1 ; - ts_event_en =PTP_TCR_TSEVNTENA ; +if (priv->synopsys_id !=DWMAC_CORE_5_10 ) + ts_event_en =PTP_TCR_TSEVNTENA ; ptp_over_ipv4_udp =PTP_TCR_TSIPV4ENA ; ptp_over_ipv6_udp =PTP_TCR_TSIPV6ENA ; ptp_over_ethernet =PTP_TCR_TSIPENA ;
drivers/net/usb/qmi_wwan.c +1 -0
@@ -1324,6 +1324,7 @@ static const struct usb_device_id products[] = { {QMI_FIXED_INTF(0x1bbb, 0x0203, 2)}, /* Alcatel L800MA */ {QMI_FIXED_INTF(0x2357, 0x0201, 4)}, /* TP-LINK HSUPA Modem MA180 */ {QMI_FIXED_INTF(0x2357, 0x9000, 4)}, /* TP-LINK MA260 */ + {QMI_QUIRK_SET_DTR(0x1bc7, 0x1031, 3)}, /* Telit LE910C1-EUX */ {QMI_QUIRK_SET_DTR(0x1bc7, 0x1040, 2)}, /* Telit LE922A */ {QMI_QUIRK_SET_DTR(0x1bc7, 0x1050, 2)}, /* Telit FN980 */ {QMI_FIXED_INTF(0x1bc7, 0x1100, 3)}, /* Telit ME910 */
drivers/nfc/st21nfca/dep.c +3 -1
@@ -173,8 +173,10 @@ static int st21nfca_tm_send_atr_res(struct nfc_hci_dev *hdev,memcpy (atr_res->gbi, atr_req->gbi, gb_len); r =nfc_set_remote_general_bytes (hdev->ndev, atr_res->gbi, gb_len); -if (r <0 ) +if (r <0 ) { +kfree_skb (skb);return r; + } } info->dep_info.curr_nfc_dep_pni =0 ;
drivers/nvmem/qfprom.c +0 -14
@@ -27,25 +27,11 @@ static int qfprom_reg_read(void *context,return 0 ; } -static int qfprom_reg_write (void *context, -unsigned int reg,void *_val,size_t bytes) -{ -struct qfprom_priv *priv = context; -u8 *val = _val; -int i =0 , words = bytes; - -while (words--) -writeb (*val++, priv->base + reg + i++); - -return 0 ; -} -static struct nvmem_config econfig = { .name ="qfprom" , .stride =1 , .word_size =1 , .reg_read = qfprom_reg_read, - .reg_write = qfprom_reg_write, };static int qfprom_probe (struct platform_device *pdev)
drivers/staging/rtl8712/wifi.h +1 -8
@@ -440,7 +440,7 @@ static inline unsigned char *get_hdr_bssid(unsigned char *pframe)/* block-ack parameters */ #define IEEE80211_ADDBA_PARAM_POLICY_MASK 0x0002#define IEEE80211_ADDBA_PARAM_TID_MASK 0x003C -#define IEEE80211_ADDBA_PARAM_BUF_SIZE_MASK 0xFFA0 +#define IEEE80211_ADDBA_PARAM_BUF_SIZE_MASK 0xFFC0#define IEEE80211_DELBA_PARAM_TID_MASK 0xF000#define IEEE80211_DELBA_PARAM_INITIATOR_MASK 0x0800
@@ -532,13 +532,6 @@ struct ieee80211_ht_addt_info {#define IEEE80211_HT_IE_NON_GF_STA_PRSNT 0x0004#define IEEE80211_HT_IE_NON_HT_STA_PRSNT 0x0010 -/* block-ack parameters */ -#define IEEE80211_ADDBA_PARAM_POLICY_MASK 0x0002 -#define IEEE80211_ADDBA_PARAM_TID_MASK 0x003C -#define IEEE80211_ADDBA_PARAM_BUF_SIZE_MASK 0xFFA0 -#define IEEE80211_DELBA_PARAM_TID_MASK 0xF000 -#define IEEE80211_DELBA_PARAM_INITIATOR_MASK 0x0800 -/* * A-PMDU buffer sizes * According to IEEE802.11n spec size varies from 8K to 64K (in powers of 2)
drivers/tty/hvc/hvc_console.c +8 -15
@@ -371,15 +371,14 @@ static int hvc_open(struct tty_struct *tty, struct file * filp)* tty fields and return the kref reference. */ if (rc) { -tty_port_tty_set (&hp->port,NULL ); - tty->driver_data =NULL ; -tty_port_put (&hp->port);printk (KERN_ERR "hvc_open: request_irq failed with rc %d.\n" , rc); - }else + }else {/* We are ready... raise DTR/RTS */ if (C_BAUD (tty))if (hp->ops->dtr_rts) hp->ops->dtr_rts (hp,1 ); +tty_port_set_initialized (&hp->port, true); + }/* Force wakeup of the polling thread */ hvc_kick ();
@@ -389,22 +388,12 @@ static int hvc_open(struct tty_struct *tty, struct file * filp)static void hvc_close (struct tty_struct *tty,struct file * filp) { -struct hvc_struct *hp; +struct hvc_struct *hp = tty->driver_data;unsigned long flags;if (tty_hung_up_p (filp))return ; -/* -* No driver_data means that this close was issued after a failed -* hvc_open by the tty layer's release_dev() function and we can just -* exit cleanly because the kref reference wasn't made. -*/ -if (!tty->driver_data) -return ; - - hp = tty->driver_data; -spin_lock_irqsave (&hp->port.lock, flags);if (--hp->port.count ==0 ) {
@@ -412,6 +401,9 @@ static void hvc_close(struct tty_struct *tty, struct file * filp)/* We are done with the tty pointer now. */ tty_port_tty_set (&hp->port,NULL ); +if (!tty_port_initialized (&hp->port)) +return ; +if (C_HUPCL (tty))if (hp->ops->dtr_rts) hp->ops->dtr_rts (hp,0 );
@@ -428,6 +420,7 @@ static void hvc_close(struct tty_struct *tty, struct file * filp)* waking periodically to check chars_in_buffer(). */ tty_wait_until_sent (tty,HVC_CLOSE_WAIT ); +tty_port_set_initialized (&hp->port, false); }else {if (hp->port.count <0 ) printk(KERN_ERR "hvc_close %X: oops, count is %d\n",
drivers/tty/serial/8250/Kconfig +1 -0
@@ -63,6 +63,7 @@ config SERIAL_8250_PNP config SERIAL_8250_16550A_VARIANTS bool "Support for variants of the 16550A serial port" depends on SERIAL_8250 + default !X86 help The 8250 driver can probe for many variants of the venerable 16550A serial port. Doing so takes additional time at boot.
drivers/tty/vt/keyboard.c +16 -10
@@ -127,7 +127,11 @@ static DEFINE_SPINLOCK(func_buf_lock); /* guard 'func_buf' and friends */static unsigned long key_down[BITS_TO_LONGS (KEY_CNT )];/* keyboard key bitmap */ static unsigned char shift_down[NR_SHIFT ];/* shift state counters.. */ static bool dead_key_next; -static int npadch =-1 ;/* -1 or number assembled on pad */ + +/* Handles a number being assembled on the number pad */ +static bool npadch_active; +static unsigned int npadch_value; +static unsigned int diacr;static char rep;/* flag telling character repeat */
@@ -845,12 +849,12 @@ static void k_shift(struct vc_data *vc, unsigned char value, char up_flag) shift_state &= ~(1 << value);/* kludge */ -if (up_flag && shift_state != old_state && npadch !=-1 ) { +if (up_flag && shift_state != old_state && npadch_active) {if (kbd->kbdmode ==VC_UNICODE ) -to_utf8 (vc, npadch); +to_utf8 (vc, npadch_value);else -put_queue (vc, npadch &0xff ); - npadch =-1 ; +put_queue (vc, npadch_value &0xff ); + npadch_active = false; } }
@@ -868,7 +872,7 @@ static void k_meta(struct vc_data *vc, unsigned char value, char up_flag)static void k_ascii (struct vc_data *vc,unsigned char value,char up_flag) { -int base; +unsigned int base;if (up_flag)return ;
@@ -882,10 +886,12 @@ static void k_ascii(struct vc_data *vc, unsigned char value, char up_flag) base =16 ; } -if (npadch ==-1 ) - npadch = value; -else - npadch = npadch * base + value; +if (!npadch_active) { + npadch_value =0 ; + npadch_active = true; + } + + npadch_value = npadch_value * base + value; }static void k_lock (struct vc_data *vc,unsigned char value,char up_flag)
drivers/usb/class/cdc-acm.c +1 -1
@@ -584,7 +584,7 @@ static void acm_softint(struct work_struct *work) }if (test_and_clear_bit (ACM_ERROR_DELAY , &acm->flags)) { -for (i =0 ; i <ACM_NR ; i++) +for (i =0 ; i < acm->rx_buflimit; i++)if (test_and_clear_bit (i, &acm->urbs_in_error_delay))acm_submit_read_urb (acm, i,GFP_NOIO ); }
drivers/usb/musb/musb_core.c +7 -0
@@ -2877,6 +2877,13 @@ static int musb_resume(struct device *dev)musb_enable_interrupts (musb);musb_platform_enable (musb); +/* session might be disabled in suspend */ +if (musb->port_mode ==MUSB_HOST && + !(musb->ops->quirks &MUSB_PRESERVE_SESSION )) { + devctl |=MUSB_DEVCTL_SESSION ; +musb_writeb (musb->mregs,MUSB_DEVCTL , devctl); + } +spin_lock_irqsave (&musb->lock, flags); error =musb_run_resume_work (musb);if (error)
drivers/usb/musb/musb_debugfs.c +5 -5
@@ -168,6 +168,11 @@ static ssize_t musb_test_mode_write(struct file *file,u8 test;char buf[24 ]; +memset (buf,0x00 ,sizeof (buf)); + +if (copy_from_user (buf, ubuf,min_t (size_t,sizeof (buf) -1 , count))) +return -EFAULT ; +pm_runtime_get_sync (musb->controller); test =musb_readb (musb->mregs,MUSB_TESTMODE );if (test) {
@@ -176,11 +181,6 @@ static ssize_t musb_test_mode_write(struct file *file, goto ret; } -memset (buf,0x00 ,sizeof (buf)); - -if (copy_from_user (buf, ubuf,min_t (size_t,sizeof (buf) -1 , count))) -return -EFAULT ; -if (strstarts (buf,"force host full-speed" )) test =MUSB_TEST_FORCE_HOST |MUSB_TEST_FORCE_FS ;
drivers/usb/serial/ch341.c +65 -3
113 lines not on this page · raw message
drivers/usb/serial/option.c +4 -0
@@ -1157,6 +1157,10 @@ static const struct usb_device_id option_ids[] = { { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_CC864_SINGLE) }, { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_DE910_DUAL) }, { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_UE910_V2) }, + { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1031, 0xff), /* Telit LE910C1-EUX */ + .driver_info = NCTRL(0) | RSVD(3) }, + { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1033, 0xff), /* Telit LE910C1-EUX (ECM) */ + .driver_info = NCTRL(0) }, { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_LE922_USBCFG0), .driver_info = RSVD(0) | RSVD(1) | NCTRL(2) | RSVD(3) }, { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_LE922_USBCFG1),
drivers/usb/serial/qcserial.c +1 -0
@@ -173,6 +173,7 @@ static const struct usb_device_id id_table[] = { {DEVICE_SWI(0x413c, 0x81b3)}, /* Dell Wireless 5809e Gobi(TM) 4G LTE Mobile Broadband Card (rev3) */ {DEVICE_SWI(0x413c, 0x81b5)}, /* Dell Wireless 5811e QDL */ {DEVICE_SWI(0x413c, 0x81b6)}, /* Dell Wireless 5811e QDL */ + {DEVICE_SWI(0x413c, 0x81cb)}, /* Dell Wireless 5816e QDL */ {DEVICE_SWI(0x413c, 0x81cc)}, /* Dell Wireless 5816e */ {DEVICE_SWI(0x413c, 0x81cf)}, /* Dell Wireless 5819 */ {DEVICE_SWI(0x413c, 0x81d0)}, /* Dell Wireless 5819 */
drivers/usb/serial/usb_wwan.c +4 -0
@@ -270,6 +270,10 @@ static void usb_wwan_indat_callback(struct urb *urb)if (status) {dev_dbg (dev,"%s: nonzero status: %d on endpoint %02x.\n" , __func__, status, endpoint); + +/* don't resubmit on fatal errors */ +if (status == -ESHUTDOWN || status == -ENOENT ) +return ; }else {if (urb->actual_length) { tty_insert_flip_string(&port->port, data,
include/linux/mod_devicetable.h +6 -0
@@ -657,6 +657,10 @@ struct mips_cdmm_device_id {/* * MODULE_DEVICE_TABLE expects this struct to be called x86cpu_device_id. * Although gcc seems to ignore this error, clang fails without this define. +* +* Note: The ordering of the struct is different from upstream because the +* static initializers in kernels < 5.7 still use C89 style while upstream +* has been converted to proper C99 initializers. */ #define x86cpu_device_id x86_cpu_idstruct x86_cpu_id {
@@ -665,6 +669,7 @@ struct x86_cpu_id {__u16 model;__u16 feature;/* bit index */ kernel_ulong_t driver_data; +__u16 steppings; };#define X86_FEATURE_MATCH (x) \
@@ -673,6 +678,7 @@ struct x86_cpu_id {#define X86_VENDOR_ANY 0xffff#define X86_FAMILY_ANY 0#define X86_MODEL_ANY 0 +#define X86_STEPPING_ANY 0#define X86_FEATURE_ANY 0/* Same as FPU, you can't test for that */ /*
include/linux/virtio_net.h +18 -7
@@ -31,6 +31,7 @@ static inline int virtio_net_hdr_to_skb(struct sk_buff *skb, {unsigned int gso_type =0 ;unsigned int thlen =0 ; +unsigned int p_off =0 ;unsigned int ip_proto;if (hdr->gso_type !=VIRTIO_NET_HDR_GSO_NONE ) {
@@ -68,7 +69,8 @@ static inline int virtio_net_hdr_to_skb(struct sk_buff *skb,if (!skb_partial_csum_set (skb, start, off))return -EINVAL ; -if (skb_transport_offset (skb) + thlen >skb_headlen (skb)) + p_off =skb_transport_offset (skb) + thlen; +if (p_off >skb_headlen (skb))return -EINVAL ; }else {/* gso packets without NEEDS_CSUM do not set transport_offset.
@@ -92,23 +94,32 @@ static inline int virtio_net_hdr_to_skb(struct sk_buff *skb,return -EINVAL ; } -if (keys.control.thoff + thlen >skb_headlen (skb) || + p_off = keys.control.thoff + thlen; +if (p_off >skb_headlen (skb) || keys.basic.ip_proto != ip_proto)return -EINVAL ;skb_set_transport_header (skb, keys.control.thoff); + }else if (gso_type) { + p_off = thlen; +if (p_off >skb_headlen (skb)) +return -EINVAL ; } }if (hdr->gso_type !=VIRTIO_NET_HDR_GSO_NONE ) {u16 gso_size =__virtio16_to_cpu (little_endian, hdr->gso_size); +struct skb_shared_info *shinfo =skb_shinfo (skb); -skb_shinfo (skb)->gso_size = gso_size; -skb_shinfo (skb)->gso_type = gso_type; +/* Too small packets are not really GSO ones. */ +if (skb->len - p_off > gso_size) { + shinfo->gso_size = gso_size; + shinfo->gso_type = gso_type; -/* Header must be checked, and gso_segs computed. */ -skb_shinfo (skb)->gso_type |=SKB_GSO_DODGY ; -skb_shinfo (skb)->gso_segs =0 ; +/* Header must be checked, and gso_segs computed. */ + shinfo->gso_type |=SKB_GSO_DODGY ; + shinfo->gso_segs =0 ; + } }return 0 ;
kernel/events/uprobes.c +12 -4
@@ -867,10 +867,6 @@ static int prepare_uprobe(struct uprobe *uprobe, struct file *file,if (ret) goto out; -/* uprobe_write_opcode() assumes we don't cross page boundary */ -BUG_ON ((uprobe->offset & ~PAGE_MASK ) + -UPROBE_SWBP_INSN_SIZE >PAGE_SIZE ); -smp_wmb ();/* pairs with the smp_rmb() in handle_swbp() */ set_bit (UPROBE_COPY_INSN , &uprobe->flags);
@@ -1166,6 +1162,15 @@ static int __uprobe_register(struct inode *inode, loff_t offset,if (offset >i_size_read (inode))return -EINVAL ; +/* +* This ensures that copy_from_page(), copy_to_page() and +* __update_ref_ctr() can't cross page boundary. +*/ +if (!IS_ALIGNED (offset,UPROBE_SWBP_INSN_SIZE )) +return -EINVAL ; +if (!IS_ALIGNED (ref_ctr_offset,sizeof (short ))) +return -EINVAL ; + retry: uprobe =alloc_uprobe (inode, offset, ref_ctr_offset);if (!uprobe)
@@ -2014,6 +2019,9 @@ static int is_trap_at_addr(struct mm_struct *mm, unsigned long vaddr)uprobe_opcode_t opcode;int result; +if (WARN_ON_ONCE (!IS_ALIGNED (vaddr,UPROBE_SWBP_INSN_SIZE ))) +return -EINVAL ; +pagefault_disable (); result =__get_user (opcode, (uprobe_opcode_t __user *)vaddr);pagefault_enable ();
net/ipv4/devinet.c +1 -0
@@ -276,6 +276,7 @@ static struct in_device *inetdev_init(struct net_device *dev) err =devinet_sysctl_register (in_dev);if (err) { in_dev->dead =1 ; +neigh_parms_release (&arp_tbl, in_dev->arp_parms);in_dev_put (in_dev); in_dev =NULL ; goto out;
net/l2tp/l2tp_core.c +3 -0
@@ -1458,6 +1458,9 @@ static int l2tp_validate_socket(const struct sock *sk, const struct net *net,if (sk->sk_type !=SOCK_DGRAM )return -EPROTONOSUPPORT ; +if (sk->sk_family !=PF_INET && sk->sk_family !=PF_INET6 ) +return -EPROTONOSUPPORT ; +if ((encap ==L2TP_ENCAPTYPE_UDP && sk->sk_protocol !=IPPROTO_UDP ) || (encap ==L2TP_ENCAPTYPE_IP && sk->sk_protocol !=IPPROTO_L2TP ))return -EPROTONOSUPPORT ;
net/l2tp/l2tp_ip.c +22 -7
@@ -20,7 +20,6 @@#include <net/icmp.h> #include <net/udp.h> #include <net/inet_common.h> -#include <net/inet_hashtables.h> #include <net/tcp_states.h> #include <net/protocol.h> #include <net/xfrm.h>
@@ -209,15 +208,31 @@ static int l2tp_ip_recv(struct sk_buff *skb)return 0 ; } -static int l2tp_ip_open (struct sock *sk) +static int l2tp_ip_hash (struct sock *sk) { -/* Prevent autobind. We don't have ports. */ -inet_sk (sk)->inet_num =IPPROTO_L2TP ; +if (sk_unhashed (sk)) { +write_lock_bh (&l2tp_ip_lock); +sk_add_node (sk, &l2tp_ip_table); +write_unlock_bh (&l2tp_ip_lock); + } +return 0 ; +} +static void l2tp_ip_unhash (struct sock *sk) +{ +if (sk_unhashed (sk)) +return ;write_lock_bh (&l2tp_ip_lock); -sk_add_node (sk, &l2tp_ip_table); +sk_del_node_init (sk);write_unlock_bh (&l2tp_ip_lock); +} + +static int l2tp_ip_open (struct sock *sk) +{ +/* Prevent autobind. We don't have ports. */ +inet_sk (sk)->inet_num =IPPROTO_L2TP ; +l2tp_ip_hash (sk);return 0 ; }
@@ -594,8 +609,8 @@ static struct proto l2tp_ip_prot = { .sendmsg = l2tp_ip_sendmsg, .recvmsg = l2tp_ip_recvmsg, .backlog_rcv = l2tp_ip_backlog_recv, - .hash = inet_hash, - .unhash = inet_unhash, + .hash = l2tp_ip_hash, + .unhash = l2tp_ip_unhash, .obj_size =sizeof (struct l2tp_ip_sock ), #ifdef CONFIG_COMPAT .compat_setsockopt = compat_ip_setsockopt,
net/l2tp/l2tp_ip6.c +22 -8
@@ -20,8 +20,6 @@#include <net/icmp.h> #include <net/udp.h> #include <net/inet_common.h> -#include <net/inet_hashtables.h> -#include <net/inet6_hashtables.h> #include <net/tcp_states.h> #include <net/protocol.h> #include <net/xfrm.h>
@@ -222,15 +220,31 @@ static int l2tp_ip6_recv(struct sk_buff *skb)return 0 ; } -static int l2tp_ip6_open (struct sock *sk) +static int l2tp_ip6_hash (struct sock *sk) { -/* Prevent autobind. We don't have ports. */ -inet_sk (sk)->inet_num =IPPROTO_L2TP ; +if (sk_unhashed (sk)) { +write_lock_bh (&l2tp_ip6_lock); +sk_add_node (sk, &l2tp_ip6_table); +write_unlock_bh (&l2tp_ip6_lock); + } +return 0 ; +} +static void l2tp_ip6_unhash (struct sock *sk) +{ +if (sk_unhashed (sk)) +return ;write_lock_bh (&l2tp_ip6_lock); -sk_add_node (sk, &l2tp_ip6_table); +sk_del_node_init (sk);write_unlock_bh (&l2tp_ip6_lock); +} + +static int l2tp_ip6_open (struct sock *sk) +{ +/* Prevent autobind. We don't have ports. */ +inet_sk (sk)->inet_num =IPPROTO_L2TP ; +l2tp_ip6_hash (sk);return 0 ; }
@@ -728,8 +742,8 @@ static struct proto l2tp_ip6_prot = { .sendmsg = l2tp_ip6_sendmsg, .recvmsg = l2tp_ip6_recvmsg, .backlog_rcv = l2tp_ip6_backlog_recv, - .hash = inet6_hash, - .unhash = inet_unhash, + .hash = l2tp_ip6_hash, + .unhash = l2tp_ip6_unhash, .obj_size =sizeof (struct l2tp_ip6_sock ), #ifdef CONFIG_COMPAT .compat_setsockopt = compat_ipv6_setsockopt,
net/mptcp/protocol.c +18 -2
@@ -920,6 +920,14 @@ static int mptcp_stream_connect(struct socket *sock, struct sockaddr *uaddr,int err;lock_sock (sock->sk); +if (sock->state !=SS_UNCONNECTED && msk->subflow) { +/* pending connection or invalid state, let existing subflow +* cope with that +*/ + ssock = msk->subflow; + goto do_connect; + } + ssock =__mptcp_socket_create (msk,TCP_SYN_SENT );if (IS_ERR (ssock)) { err =PTR_ERR (ssock);
@@ -934,9 +942,17 @@ static int mptcp_stream_connect(struct socket *sock, struct sockaddr *uaddr,mptcp_subflow_ctx (ssock->sk)->request_mptcp =0 ;#endif +do_connect: err = ssock->ops->connect (ssock, uaddr, addr_len, flags); -inet_sk_state_store (sock->sk,inet_sk_state_load (ssock->sk)); -mptcp_copy_inaddrs (sock->sk, ssock->sk); + sock->state = ssock->state; + +/* on successful connect, the msk state will be moved to established by +* subflow_finish_connect() +*/ +if (!err || err ==EINPROGRESS ) +mptcp_copy_inaddrs (sock->sk, ssock->sk); +else +inet_sk_state_store (sock->sk,inet_sk_state_load (ssock->sk)); unlock:release_sock (sock->sk);
net/sched/sch_fq_pie.c +2 -2
@@ -298,9 +298,9 @@ static int fq_pie_change(struct Qdisc *sch, struct nlattr *opt, goto flow_error; } q->flows_cnt =nla_get_u32 (tb[TCA_FQ_PIE_FLOWS ]); -if (!q->flows_cnt || q->flows_cnt >65536 ) { +if (!q->flows_cnt || q->flows_cnt >=65536 ) {NL_SET_ERR_MSG_MOD (extack, -"Number of flows must be < 65536" ); +"Number of flows must range in [1..65535]" ); goto flow_error; } }
net/sctp/ulpevent.c +3 -0
@@ -343,6 +343,9 @@ void sctp_ulpevent_nofity_peer_addr_change(struct sctp_transport *transport,struct sockaddr_storage addr;struct sctp_ulpevent *event; +if (asoc->state <SCTP_STATE_ESTABLISHED ) +return ; +memset (&addr,0 ,sizeof (struct sockaddr_storage ));memcpy (&addr, &transport->ipaddr, transport->af_specific->sockaddr_len);
net/vmw_vsock/af_vsock.c +1 -1
@@ -1408,7 +1408,7 @@ static int vsock_accept(struct socket *sock, struct socket *newsock, int flags,/* Wait for children sockets to appear; these are the new sockets * created upon connection establishment. */ - timeout =sock_sndtimeo (listener, flags &O_NONBLOCK ); + timeout =sock_rcvtimeo (listener, flags &O_NONBLOCK );prepare_to_wait (sk_sleep (listener), &wait,TASK_INTERRUPTIBLE ); while ((connected = vsock_dequeue_accept(listener)) == NULL &&
net/vmw_vsock/virtio_transport_common.c +8 -0
@@ -1128,6 +1128,14 @@ void virtio_transport_recv_pkt(struct virtio_transport *t,lock_sock (sk); +/* Check if sk has been released before lock_sock */ +if (sk->sk_shutdown ==SHUTDOWN_MASK ) { + (void )virtio_transport_reset_no_sock (t, pkt); +release_sock (sk); +sock_put (sk); + goto free_pkt; + } +/* Update CID in case it has changed after a transport reset event */ vsk->local_addr.svm_cid = dst.svm_cid;
tools/testing/selftests/tc-testing/tc-tests/qdiscs/fq_pie.json new file +21 -0
@@ -0,0 +1,21 @@ +[ + { + "id": "83be", + "name": "Create FQ-PIE with invalid number of flows", + "category": [ + "qdisc", + "fq_pie" + ], + "setup": [ + "$IP link add dev $DUMMY type dummy || /bin/true" + ], + "cmdUnderTest": "$TC qdisc add dev $DUMMY root fq_pie flows 65536", + "expExitCode": "2", + "verifyCmd": "$TC qdisc show dev $DUMMY", + "matchPattern": "qdisc", + "matchCount": "0", + "teardown": [ + "$IP link del dev $DUMMY" + ] + } +]