Linux 5.15.183
Greg Kroah-Hartman
maintainerI'm announcing the release of the 5.15.183 kernel.
All users of the 5.15 kernel series must upgrade.
The updated 5.15.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-5.15.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
------------
Makefile | 2 arch/mips/include/asm/ptrace.h | 3 arch/x86/kernel/cpu/bugs.c | 5 arch/x86/kernel/cpu/common.c | 9 arch/x86/mm/tlb.c | 23 + arch/x86/net/bpf_jit_comp.c | 52 +++ drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c | 28 +- drivers/gpu/drm/panel/panel-simple.c | 25 - drivers/iio/accel/adis16201.c | 4 drivers/iio/adc/ad7606_spi.c | 2 drivers/iio/adc/dln2-adc.c | 2 drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_buffer.c | 6 drivers/input/mouse/synaptics.c | 5 drivers/net/can/m_can/m_can.c | 2 drivers/net/can/spi/mcp251xfd/mcp251xfd-core.c | 2 drivers/net/dsa/b53/b53_common.c | 36 +- drivers/net/phy/microchip.c | 46 +++ drivers/nvme/host/core.c | 3 drivers/staging/axis-fifo/axis-fifo.c | 14 - drivers/staging/iio/adc/ad7816.c | 2 drivers/usb/cdns3/cdnsp-gadget.c | 31 ++ drivers/usb/cdns3/cdnsp-gadget.h | 6 drivers/usb/cdns3/cdnsp-pci.c | 12 drivers/usb/cdns3/cdnsp-ring.c | 3 drivers/usb/cdns3/core.h | 3 drivers/usb/class/usbtmc.c | 59 ++-- drivers/usb/gadget/udc/tegra-xudc.c | 4 drivers/usb/host/uhci-platform.c | 2 drivers/usb/host/xhci-tegra.c | 3 drivers/usb/typec/tcpm/tcpm.c | 2 drivers/usb/typec/ucsi/displayport.c | 2 drivers/xen/xenbus/xenbus.h | 2 drivers/xen/xenbus/xenbus_comms.c | 9 drivers/xen/xenbus/xenbus_dev_frontend.c | 2 drivers/xen/xenbus/xenbus_xs.c | 18 + fs/namespace.c | 3 fs/ocfs2/journal.c | 80 ++++- fs/ocfs2/journal.h | 1 fs/ocfs2/ocfs2.h | 17 + fs/ocfs2/quota_local.c | 9 fs/ocfs2/super.c | 3 include/linux/rcupdate.h | 3 include/linux/types.h | 3 include/uapi/linux/types.h | 1 kernel/params.c | 4 net/can/gw.c | 165 +++++++----- net/ipv6/addrconf.c | 15 - net/netfilter/ipset/ip_set_hash_gen.h | 2 net/openvswitch/actions.c | 3 49 files changed, 536 insertions(+), 202 deletions(-)
Aditya Garg (3):
Input: synaptics - enable InterTouch on Dynabook Portege X30L-G
Input: synaptics - enable InterTouch on Dell Precision M3800
Input: synaptics - enable InterTouch on TUXEDO InfinityBook Pro 14 v5
Al Viro (1):
do_umount(): add missing barrier before refcount checks in sync case
Alexey Charkov (1):
usb: uhci-platform: Make the clock really optional
Andrei Kuchynski (1):
usb: typec: ucsi: displayport: Fix NULL pointer access
Andy Shevchenko (1):
types: Complement the aligned types with signed 64-bit one
Angelo Dureghello (1):
iio: adc: ad7606: fix serial register access
Daniel Sneddon (2):
x86/bpf: Call branch history clearing sequence on exit x86/bpf: Add IBHF call at end of classic BPF
Daniel Wagner (1):
nvme: unblock ctrl state transition for firmware update
Dave Hansen (1):
x86/mm: Eliminate window where TLB flushes may be inadvertently skipped
Dave Penkler (3):
usb: usbtmc: Fix erroneous get_stb ioctl error returns
usb: usbtmc: Fix erroneous wait_srq ioctl return
usb: usbtmc: Fix erroneous generic_read ioctl return
Dmitry Antipov (1):
module: ensure that kobject_put() is safe for module type kobjects
Dmitry Torokhov (1):
Input: synaptics - enable SMBus for HP Elitebook 850 G1
Eelco Chaudron (1):
openvswitch: Fix unsafe attribute parsing in output_userspace()
Eric Dumazet (1):
can: gw: use call_rcu() instead of costly synchronize_rcu()
Gabriel Shahrouzi (4):
staging: iio: adc: ad7816: Correct conditional logic for store mode
staging: axis-fifo: Remove hardware resets for user errors
staging: axis-fifo: Correct handling of tx_fifo_depth for size validation
iio: adis16201: Correct inclinometer channel resolution
Greg Kroah-Hartman (2):
Revert "net: phy: microchip: force IRQ polling mode for lan88xx" Linux 5.15.183
Guillaume Nault (1):
gre: Fix again IPv6 link-local address generation.
Jan Kara (3):
ocfs2: switch osb->disable_recovery to enum
ocfs2: implement handshaking with ocfs2 recovery thread
ocfs2: stop quota recovery before disabling quotas
Jason Andryuk (1):
xenbus: Use kref to track req lifetime
Jim Lin (1):
usb: host: tegra: Prevent host controller crash when OTG port is used
Jonas Gorski (6):
net: dsa: b53: allow leaky reserved multicast
net: dsa: b53: fix clearing PVID of a port
net: dsa: b53: fix flushing old pvid VLAN on pvid change
net: dsa: b53: fix VLAN ID for untagged vlan on bridge leave
net: dsa: b53: always rejoin default untagged VLAN on bridge leave
net: dsa: b53: fix learning on VLAN unaware bridges
Jonathan Cameron (1):
iio: adc: dln2: Use aligned_s64 for timestamp
Jozsef Kadlecsik (1):
netfilter: ipset: fix region locking in hash types
Kevin Baker (1):
drm/panel: simple: Update timings for AUO G101EVN010
Manuel Fombuena (1):
Input: synaptics - enable InterTouch on Dynabook Portege X30-D
Marc Kleine-Budde (2):
can: mcan: m_can_class_unregister(): fix order of unregistration calls
can: mcp251xfd: mcp251xfd_remove(): fix order of unregistration calls
Oliver Hartkopp (1):
can: gw: fix RCU/BH usage in cgw_create_job()
Oliver Neukum (1):
USB: usbtmc: use interruptible sleep in usbtmc_read
Pawan Gupta (1):
x86/bhi: Do not set BHI_DIS_S in 32-bit mode
Pawel Laszczak (2):
usb: cdnsp: Fix issue with resuming from L1
usb: cdnsp: fix L1 resume issue for RTL_REVISION_NEW_LPM version
RD Babiera (1):
usb: typec: tcpm: delay SNK_TRY_WAIT_DEBOUNCE to SRC_TRYWAIT transition
Silvano Seva (2):
iio: imu: st_lsm6dsx: fix possible lockup in st_lsm6dsx_read_fifo
iio: imu: st_lsm6dsx: fix possible lockup in st_lsm6dsx_read_tagged_fifo
Thorsten Blum (1):
MIPS: Fix MAX_REG_OFFSET
Uladzislau Rezki (Sony) (1):
rcu/kvfree: Add kvfree_rcu_mightsleep() and kfree_rcu_mightsleep()
Wayne Chang (1):
usb: gadget: tegra-xudc: ACK ST_RC after clearing CTRL_RUN
Wayne Lin (1):
drm/amd/display: Fix wrong handling for AUX_DEFER case
Greg Kroah-Hartman
maintainerMakefile +1 -1
@@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 5 PATCHLEVEL = 15 -SUBLEVEL = 182 +SUBLEVEL = 183 EXTRAVERSION = NAME = Trick or Treat
arch/mips/include/asm/ptrace.h +2 -1
@@ -65,7 +65,8 @@ static inline void instruction_pointer_set(struct pt_regs *regs,/* Query offset/name of register from its name/offset */ extern int regs_query_register_offset (const char *name); -#define MAX_REG_OFFSET (offsetof(struct pt_regs, __last)) +#define MAX_REG_OFFSET \ + (offsetof(struct pt_regs, __last) - sizeof(unsigned long))/** * regs_get_register() - get register value from its offset
arch/x86/kernel/cpu/bugs.c +3 -2
@@ -1656,10 +1656,11 @@ static void __init bhi_select_mitigation(void)return ; } -if (spec_ctrl_bhi_dis ()) +if (!IS_ENABLED (CONFIG_X86_64 ))return ; -if (!IS_ENABLED (CONFIG_X86_64 )) +/* Mitigate in hardware if supported */ +if (spec_ctrl_bhi_dis ())return ;/* Mitigate KVM by default */
arch/x86/kernel/cpu/common.c +6 -3
@@ -1345,9 +1345,12 @@ static void __init cpu_set_bug_bits(struct cpuinfo_x86 *c)if (vulnerable_to_rfds (x86_arch_cap_msr))setup_force_cpu_bug (X86_BUG_RFDS ); -/* When virtualized, eIBRS could be hidden, assume vulnerable */ -if (!(x86_arch_cap_msr &ARCH_CAP_BHI_NO ) && - !cpu_matches (cpu_vuln_whitelist,NO_BHI ) && +/* +* Intel parts with eIBRS are vulnerable to BHI attacks. Parts with +* BHI_NO still need to use the BHI mitigation to prevent Intra-mode +* attacks. When virtualized, eIBRS could be hidden, assume vulnerable. +*/ +if (!cpu_matches (cpu_vuln_whitelist,NO_BHI ) && (boot_cpu_has (X86_FEATURE_IBRS_ENHANCED ) ||boot_cpu_has (X86_FEATURE_HYPERVISOR )))setup_force_cpu_bug (X86_BUG_BHI );
arch/x86/mm/tlb.c +21 -2
@@ -616,7 +616,11 @@ void switch_mm_irqs_off(struct mm_struct *prev, struct mm_struct *next,choose_new_asid (next, next_tlb_gen, &new_asid, &need_flush); -/* Let nmi_uaccess_okay() know that we're changing CR3. */ +/* +* Indicate that CR3 is about to change. nmi_uaccess_okay() +* and others are sensitive to the window where mm_cpumask(), +* CR3 and cpu_tlbstate.loaded_mm are not all in sync. +*/ this_cpu_write (cpu_tlbstate.loaded_mm,LOADED_MM_SWITCHING );barrier (); }
@@ -856,8 +860,16 @@ static void flush_tlb_func(void *info)static bool should_flush_tlb (int cpu,void *data) { +struct mm_struct *loaded_mm =per_cpu (cpu_tlbstate.loaded_mm, cpu);struct flush_tlb_info *info = data; +/* +* Order the 'loaded_mm' and 'is_lazy' against their +* write ordering in switch_mm_irqs_off(). Ensure +* 'is_lazy' is at least as new as 'loaded_mm'. +*/ +smp_rmb (); +/* Lazy TLB will get flushed at the next context switch. */ if (per_cpu (cpu_tlbstate_shared.is_lazy, cpu))return false;
@@ -866,8 +878,15 @@ static bool should_flush_tlb(int cpu, void *data)if (!info->mm)return true; +/* +* While switching, the remote CPU could have state from +* either the prev or next mm. Assume the worst and flush. +*/ +if (loaded_mm ==LOADED_MM_SWITCHING ) +return true; +/* The target mm is loaded, and the CPU is not lazy. */ -if (per_cpu (cpu_tlbstate.loaded_mm, cpu) == info->mm) +if (loaded_mm == info->mm)return true;/* In cpumask, but not the loaded mm? Periodically remove by flushing. */
arch/x86/net/bpf_jit_comp.c +52 -0
70 lines not on this page · raw message
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c +24 -4
@@ -53,6 +53,9 @@#include "dc/dcn20/dcn20_resource.h" #endif +/* +* This function handles both native AUX and I2C-Over-AUX transactions. +*/ static ssize_t dm_dp_aux_transfer (struct drm_dp_aux *aux,struct drm_dp_aux_msg *msg) {
@@ -87,15 +90,25 @@ static ssize_t dm_dp_aux_transfer(struct drm_dp_aux *aux,if (adev->dm.aux_hpd_discon_quirk) {if (msg->address ==DP_SIDEBAND_MSG_DOWN_REQ_BASE && operation_result ==AUX_RET_ERROR_HPD_DISCON ) { - result =0 ; + result = msg->size; operation_result =AUX_RET_SUCCESS ; } } -if (payload.write && result >=0 ) - result = msg->size; +/* +* result equals to 0 includes the cases of AUX_DEFER/I2C_DEFER +*/ +if (payload.write && result >=0 ) { +if (result) { +/*one byte indicating partially written bytes. Force 0 to retry*/ +drm_info (adev_to_drm (adev),"amdgpu: AUX partially written\n" ); + result =0 ; + }else if (!payload.reply[0 ]) +/*I2C_ACK|AUX_ACK*/ + result = msg->size; + } -if (result <0 ) +if (result <0 ) {switch (operation_result) {case AUX_RET_SUCCESS :break ;
@@ -114,6 +127,13 @@ static ssize_t dm_dp_aux_transfer(struct drm_dp_aux *aux,break ; } +drm_info (adev_to_drm (adev),"amdgpu: DP AUX transfer fail:%d\n" , operation_result); + } + +if (payload.reply[0 ]) +drm_info (adev_to_drm (adev),"amdgpu: AUX reply command not ACK: 0x%02x." , + payload.reply[0 ]); +return result; }
drivers/gpu/drm/panel/panel-simple.c +13 -12
@@ -1210,27 +1210,28 @@ static const struct panel_desc auo_g070vvn01 = { }, }; -static const struct drm_display_mode auo_g101evn010_mode = { - .clock =68930 , - .hdisplay =1280 , - .hsync_start =1280 +82 , - .hsync_end =1280 +82 +2 , - .htotal =1280 +82 +2 +84 , - .vdisplay =800 , - .vsync_start =800 +8 , - .vsync_end =800 +8 +2 , - .vtotal =800 +8 +2 +6 , +static const struct display_timing auo_g101evn010_timing = { + .pixelclock = {64000000 ,68930000 ,85000000 }, + .hactive = {1280 ,1280 ,1280 }, + .hfront_porch = {8 ,64 ,256 }, + .hback_porch = {8 ,64 ,256 }, + .hsync_len = {40 ,168 ,767 }, + .vactive = {800 ,800 ,800 }, + .vfront_porch = {4 ,8 ,100 }, + .vback_porch = {4 ,8 ,100 }, + .vsync_len = {8 ,16 ,223 }, };static const struct panel_desc auo_g101evn010 = { - .modes = &auo_g101evn010_mode, - .num_modes =1 , + .timings = &auo_g101evn010_timing, + .num_timings =1 , .bpc =6 , .size = { .width =216 , .height =135 , }, .bus_format =MEDIA_BUS_FMT_RGB666_1X7X3_SPWG , + .bus_flags =DRM_BUS_FLAG_DE_HIGH , .connector_type =DRM_MODE_CONNECTOR_LVDS , };
drivers/iio/accel/adis16201.c +2 -2
@@ -211,9 +211,9 @@ static const struct iio_chan_spec adis16201_channels[] = { BIT(IIO_CHAN_INFO_CALIBBIAS), 0, 14),ADIS_AUX_ADC_CHAN (ADIS16201_AUX_ADC_REG ,ADIS16201_SCAN_AUX_ADC ,0 ,12 ),ADIS_INCLI_CHAN (X ,ADIS16201_XINCL_OUT_REG ,ADIS16201_SCAN_INCLI_X , -BIT (IIO_CHAN_INFO_CALIBBIAS ),0 ,14 ), +BIT (IIO_CHAN_INFO_CALIBBIAS ),0 ,12 ),ADIS_INCLI_CHAN (Y ,ADIS16201_YINCL_OUT_REG ,ADIS16201_SCAN_INCLI_Y , -BIT (IIO_CHAN_INFO_CALIBBIAS ),0 ,14 ), +BIT (IIO_CHAN_INFO_CALIBBIAS ),0 ,12 ), IIO_CHAN_SOFT_TIMESTAMP(7) };
drivers/iio/adc/ad7606_spi.c +1 -1
@@ -127,7 +127,7 @@ static int ad7606_spi_reg_read(struct ad7606_state *st, unsigned int addr) { .tx_buf = &st->d16[0], .len = 2, - .cs_change = 0, + .cs_change = 1, }, { .rx_buf = &st->d16[1], .len = 2,
drivers/iio/adc/dln2-adc.c +1 -1
@@ -483,7 +483,7 @@ static irqreturn_t dln2_adc_trigger_h(int irq, void *p)struct iio_dev *indio_dev = pf->indio_dev;struct {__le16 values[DLN2_ADC_MAX_CHANNELS ]; -int64_t timestamp_space; +aligned_s64 timestamp_space; } data;struct dln2_adc_get_all_vals dev_data;struct dln2_adc *dln2 =iio_priv (indio_dev);
drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_buffer.c +6 -0
@@ -369,6 +369,9 @@ int st_lsm6dsx_read_fifo(struct st_lsm6dsx_hw *hw)if (fifo_status &cpu_to_le16 (ST_LSM6DSX_FIFO_EMPTY_MASK ))return 0 ; +if (!pattern_len) + pattern_len =ST_LSM6DSX_SAMPLE_SIZE ; + fifo_len = (le16_to_cpu (fifo_status) & fifo_diff_mask) *ST_LSM6DSX_CHAN_SIZE ; fifo_len = (fifo_len / pattern_len) * pattern_len;
@@ -586,6 +589,9 @@ int st_lsm6dsx_read_tagged_fifo(struct st_lsm6dsx_hw *hw)if (!fifo_len)return 0 ; +if (!pattern_len) + pattern_len =ST_LSM6DSX_TAGGED_SAMPLE_SIZE ; +for (read_len =0 ; read_len < fifo_len; read_len += pattern_len) { err = st_lsm6dsx_read_block(hw, ST_LSM6DSX_REG_FIFO_OUT_TAG_ADDR,
drivers/input/mouse/synaptics.c +5 -0
@@ -163,6 +163,7 @@ static const char * const topbuttonpad_pnp_ids[] = {static const char *const smbus_pnp_ids[] = {/* all of the topbuttonpad_pnp_ids are valid, we just add some extras */ +"DLL060d" ,/* Dell Precision M3800 */ "LEN0048" ,/* X1 Carbon 3 */ "LEN0046" ,/* X250 */ "LEN0049" ,/* Yoga 11e */
@@ -187,11 +188,15 @@ static const char * const smbus_pnp_ids[] = {"LEN2054" ,/* E480 */ "LEN2055" ,/* E580 */ "LEN2068" ,/* T14 Gen 1 */ +"SYN1221" ,/* TUXEDO InfinityBook Pro 14 v5 */ +"SYN3003" ,/* HP EliteBook 850 G1 */ "SYN3015" ,/* HP EliteBook 840 G2 */ "SYN3052" ,/* HP EliteBook 840 G4 */ "SYN3221" ,/* HP 15-ay000 */ "SYN323d" ,/* HP Spectre X360 13-w013dx */ "SYN3257" ,/* HP Envy 13-ad105ng */ +"TOS01f6" ,/* Dynabook Portege X30L-G */ +"TOS0213" ,/* Dynabook Portege X30-D */ NULL };
drivers/net/can/m_can/m_can.c +1 -1
@@ -2066,9 +2066,9 @@ EXPORT_SYMBOL_GPL(m_can_class_register);void m_can_class_unregister (struct m_can_classdev *cdev) { +unregister_candev (cdev->net);if (cdev->is_peripheral)can_rx_offload_del (&cdev->offload); -unregister_candev (cdev->net); }EXPORT_SYMBOL_GPL (m_can_class_unregister);
drivers/net/can/spi/mcp251xfd/mcp251xfd-core.c +1 -1
@@ -3020,8 +3020,8 @@ static int mcp251xfd_remove(struct spi_device *spi)struct mcp251xfd_priv *priv =spi_get_drvdata (spi);struct net_device *ndev = priv->ndev; -can_rx_offload_del (&priv->offload);mcp251xfd_unregister (priv); +can_rx_offload_del (&priv->offload); spi->max_speed_hz = priv->spi_max_speed_hz_orig;free_candev (ndev);
drivers/net/dsa/b53/b53_common.c +24 -12
@@ -373,15 +373,17 @@ static void b53_enable_vlan(struct b53_device *dev, int port, bool enable,b53_read8 (dev,B53_VLAN_PAGE ,B53_VLAN_CTRL5 , &vc5); } + vc1 &= ~VC1_RX_MCST_FWD_EN ; +if (enable) { vc0 |=VC0_VLAN_EN |VC0_VID_CHK_EN |VC0_VID_HASH_VID ; - vc1 |=VC1_RX_MCST_UNTAG_EN |VC1_RX_MCST_FWD_EN ; + vc1 |=VC1_RX_MCST_UNTAG_EN ; vc4 &= ~VC4_ING_VID_CHECK_MASK ;if (enable_filtering) { vc4 |=VC4_ING_VID_VIO_DROP <<VC4_ING_VID_CHECK_S ; vc5 |=VC5_DROP_VTABLE_MISS ; }else { - vc4 |=VC4_ING_VID_VIO_FWD <<VC4_ING_VID_CHECK_S ; + vc4 |=VC4_NO_ING_VID_CHK <<VC4_ING_VID_CHECK_S ; vc5 &= ~VC5_DROP_VTABLE_MISS ; }
@@ -393,7 +395,7 @@ static void b53_enable_vlan(struct b53_device *dev, int port, bool enable, }else { vc0 &= ~(VC0_VLAN_EN |VC0_VID_CHK_EN |VC0_VID_HASH_VID ); - vc1 &= ~(VC1_RX_MCST_UNTAG_EN |VC1_RX_MCST_FWD_EN ); + vc1 &= ~VC1_RX_MCST_UNTAG_EN ; vc4 &= ~VC4_ING_VID_CHECK_MASK ; vc5 &= ~VC5_DROP_VTABLE_MISS ;
@@ -1500,12 +1502,21 @@ int b53_vlan_add(struct dsa_switch *ds, int port,bool untagged = vlan->flags &BRIDGE_VLAN_INFO_UNTAGGED ;bool pvid = vlan->flags &BRIDGE_VLAN_INFO_PVID ;struct b53_vlan *vl; +u16 old_pvid, new_pvid;int err; err =b53_vlan_prepare (ds, port, vlan);if (err)return err; +b53_read16 (dev,B53_VLAN_PAGE ,B53_VLAN_PORT_DEF_TAG (port), &old_pvid); +if (pvid) + new_pvid = vlan->vid; +else if (!pvid && vlan->vid == old_pvid) + new_pvid =b53_default_pvid (dev); +else + new_pvid = old_pvid; + vl = &dev->vlans[vlan->vid];b53_get_vlan_entry (dev, vlan->vid, vl);
@@ -1522,10 +1533,10 @@ int b53_vlan_add(struct dsa_switch *ds, int port,b53_set_vlan_entry (dev, vlan->vid, vl);b53_fast_age_vlan (dev, vlan->vid); -if (pvid && !dsa_is_cpu_port (ds, port)) { +if (!dsa_is_cpu_port (ds, port) && new_pvid != old_pvid) {b53_write16 (dev,B53_VLAN_PAGE ,B53_VLAN_PORT_DEF_TAG (port), - vlan->vid); -b53_fast_age_vlan (dev, vlan->vid); + new_pvid); +b53_fast_age_vlan (dev, old_pvid); }return 0 ;
@@ -1915,7 +1926,7 @@ EXPORT_SYMBOL(b53_br_join);void b53_br_leave (struct dsa_switch *ds,int port,struct net_device *br) {struct b53_device *dev = ds->priv; -struct b53_vlan *vl = &dev->vlans[0 ]; +struct b53_vlan *vl;s8 cpu_port =dsa_to_port (ds, port)->cpu_dp->index;unsigned int i;u16 pvlan, reg, pvid;
@@ -1941,6 +1952,7 @@ void b53_br_leave(struct dsa_switch *ds, int port, struct net_device *br) dev->ports[port].vlan_ctl_mask = pvlan; pvid =b53_default_pvid (dev); + vl = &dev->vlans[pvid];/* Make this port join all VLANs without VLAN entries */ if (is58xx (dev)) {
@@ -1949,12 +1961,12 @@ void b53_br_leave(struct dsa_switch *ds, int port, struct net_device *br)if (!(reg &BIT (cpu_port))) reg |=BIT (cpu_port);b53_write16 (dev,B53_VLAN_PAGE ,B53_JOIN_ALL_VLAN_EN , reg); - }else { -b53_get_vlan_entry (dev, pvid, vl); - vl->members |=BIT (port) |BIT (cpu_port); - vl->untag |=BIT (port) |BIT (cpu_port); -b53_set_vlan_entry (dev, pvid, vl); } + +b53_get_vlan_entry (dev, pvid, vl); + vl->members |=BIT (port) |BIT (cpu_port); + vl->untag |=BIT (port) |BIT (cpu_port); +b53_set_vlan_entry (dev, pvid, vl); }EXPORT_SYMBOL (b53_br_leave);
drivers/net/phy/microchip.c +43 -3
58 lines not on this page · raw message
drivers/nvme/host/core.c +2 -1
@@ -4389,7 +4389,8 @@ static void nvme_fw_act_work(struct work_struct *work)msleep (100 ); } -if (!nvme_change_ctrl_state (ctrl,NVME_CTRL_LIVE )) +if (!nvme_change_ctrl_state (ctrl,NVME_CTRL_CONNECTING ) || + !nvme_change_ctrl_state (ctrl,NVME_CTRL_LIVE ))return ;nvme_start_queues (ctrl);
drivers/staging/axis-fifo/axis-fifo.c +3 -11
@@ -401,16 +401,14 @@ static ssize_t axis_fifo_read(struct file *f, char __user *buf, bytes_available =ioread32 (fifo->base_addr +XLLF_RLR_OFFSET );if (!bytes_available) { -dev_err (fifo->dt_device,"received a packet of length 0 - fifo core will be reset\n" ); -reset_ip_core (fifo); +dev_err (fifo->dt_device,"received a packet of length 0\n" ); ret = -EIO ; goto end_unlock; }if (bytes_available > len) { -dev_err (fifo->dt_device,"user read buffer too small (available bytes=%zu user buffer bytes=%zu) - fifo core will be reset\n" , +dev_err (fifo->dt_device,"user read buffer too small (available bytes=%zu user buffer bytes=%zu)\n" , bytes_available, len); -reset_ip_core (fifo); ret = -EINVAL ; goto end_unlock; }
@@ -419,8 +417,7 @@ static ssize_t axis_fifo_read(struct file *f, char __user *buf,/* this probably can't happen unless IP * registers were previously mishandled */ -dev_err (fifo->dt_device,"received a packet that isn't word-aligned - fifo core will be reset\n" ); -reset_ip_core (fifo); +dev_err (fifo->dt_device,"received a packet that isn't word-aligned\n" ); ret = -EIO ; goto end_unlock; }
@@ -441,7 +438,6 @@ static ssize_t axis_fifo_read(struct file *f, char __user *buf,if (copy_to_user (buf + copied *sizeof (u32), tmp_buf, copy *sizeof (u32))) { -reset_ip_core (fifo); ret = -EFAULT ; goto end_unlock; }
@@ -552,7 +548,6 @@ static ssize_t axis_fifo_write(struct file *f, const char __user *buf,if (copy_from_user (tmp_buf, buf + copied *sizeof (u32), copy *sizeof (u32))) { -reset_ip_core (fifo); ret = -EFAULT ; goto end_unlock; }
@@ -785,9 +780,6 @@ static int axis_fifo_parse_dt(struct axis_fifo *fifo) goto end; } -/* IP sets TDFV to fifo depth - 4 so we will do the same */ - fifo->tx_fifo_depth -=4 ; - ret =get_dts_property (fifo,"xlnx,use-rx-data" , &fifo->has_rx_fifo);if (ret) {dev_err (fifo->dt_device,"missing xlnx,use-rx-data property\n" );
drivers/staging/iio/adc/ad7816.c +1 -1
@@ -136,7 +136,7 @@ static ssize_t ad7816_store_mode(struct device *dev,struct iio_dev *indio_dev =dev_to_iio_dev (dev);struct ad7816_chip_info *chip =iio_priv (indio_dev); -if (strcmp (buf,"full" )) { +if (strcmp (buf,"full" ) ==0 ) {gpiod_set_value (chip->rdwr_pin,1 ); chip->mode =AD7816_FULL ; }else {
drivers/usb/cdns3/cdnsp-gadget.c +31 -0
@@ -138,6 +138,26 @@ static void cdnsp_clear_port_change_bit(struct cdnsp_device *pdev, (portsc & PORT_CHANGE_BITS), port_regs); } +static void cdnsp_set_apb_timeout_value (struct cdnsp_device *pdev) +{ +struct cdns *cdns =dev_get_drvdata (pdev->dev); +__le32 __iomem *reg; +void __iomem *base; +u32 offset =0 ; +u32 val; + +if (!cdns->override_apb_timeout) +return ; + + base = &pdev->cap_regs->hc_capbase; + offset =cdnsp_find_next_ext_cap (base, offset,D_XEC_PRE_REGS_CAP ); + reg = base + offset +REG_CHICKEN_BITS_3_OFFSET ; + + val =le32_to_cpu (readl (reg)); + val =CHICKEN_APB_TIMEOUT_SET (val, cdns->override_apb_timeout); +writel (cpu_to_le32 (val), reg); +} +static void cdnsp_set_chicken_bits_2 (struct cdnsp_device *pdev,u32 bit) {__le32 __iomem *reg;
@@ -1779,6 +1799,8 @@ static void cdnsp_get_rev_cap(struct cdnsp_device *pdev) reg +=cdnsp_find_next_ext_cap (reg,0 ,RTL_REV_CAP ); pdev->rev_cap = reg; + pdev->rtl_revision =readl (&pdev->rev_cap->rtl_revision); + dev_info(pdev->dev, "Rev: %08x/%08x, eps: %08x, buff: %08x/%08x\n", readl(&pdev->rev_cap->ctrl_revision), readl(&pdev->rev_cap->rtl_revision),
@@ -1804,6 +1826,15 @@ static int cdnsp_gen_setup(struct cdnsp_device *pdev) pdev->hci_version =HC_VERSION (pdev->hcc_params); pdev->hcc_params =readl (&pdev->cap_regs->hcc_params); +/* +* Override the APB timeout value to give the controller more time for +* enabling UTMI clock and synchronizing APB and UTMI clock domains. +* This fix is platform specific and is required to fixes issue with +* reading incorrect value from PORTSC register after resuming +* from L1 state. +*/ +cdnsp_set_apb_timeout_value (pdev); +cdnsp_get_rev_cap (pdev);/* Make sure the Device Controller is halted. */
drivers/usb/cdns3/cdnsp-gadget.h +6 -0
@@ -520,6 +520,9 @@ struct cdnsp_rev_cap {#define REG_CHICKEN_BITS_2_OFFSET 0x48#define CHICKEN_XDMA_2_TP_CACHE_DIS BIT(28) +#define REG_CHICKEN_BITS_3_OFFSET 0x4C +#define CHICKEN_APB_TIMEOUT_SET (p, val) (((p) & ~GENMASK(21, 0)) | (val)) +/* XBUF Extended Capability ID. */ #define XBUF_CAP_ID 0xCB#define XBUF_RX_TAG_MASK_0_OFFSET 0x1C
@@ -1359,6 +1362,7 @@ struct cdnsp_port {* @rev_cap: Controller Capabilities Registers. * @hcs_params1: Cached register copies of read-only HCSPARAMS1 * @hcc_params: Cached register copies of read-only HCCPARAMS1 +* @rtl_revision: Cached controller rtl revision. * @setup: Temporary buffer for setup packet. * @ep0_preq: Internal allocated request used during enumeration. * @ep0_stage: ep0 stage during enumeration process.
@@ -1413,6 +1417,8 @@ struct cdnsp_device {__u32 hcs_params1;__u32 hcs_params3;__u32 hcc_params; +#define RTL_REVISION_NEW_LPM 0x2700 +__u32 rtl_revision;/* Lock used in interrupt thread context. */ spinlock_t lock;struct usb_ctrlrequest setup;
drivers/usb/cdns3/cdnsp-pci.c +10 -2
@@ -33,6 +33,8 @@#define CDNS_DRD_ID 0x0100#define CDNS_DRD_IF (PCI_CLASS_SERIAL_USB << 8 | 0x80) +#define CHICKEN_APB_TIMEOUT_VALUE 0x1C20 +static struct pci_dev *cdnsp_get_second_fun (struct pci_dev *pdev) {/*
@@ -144,6 +146,14 @@ static int cdnsp_pci_probe(struct pci_dev *pdev, cdnsp->otg_irq = pdev->irq; } +/* +* Cadence PCI based platform require some longer timeout for APB +* to fixes domain clock synchronization issue after resuming +* controller from L1 state. +*/ + cdnsp->override_apb_timeout =CHICKEN_APB_TIMEOUT_VALUE ; +pci_set_drvdata (pdev, cdnsp); +if (pci_is_enabled (func)) { cdnsp->dev = dev; cdnsp->gadget_init = cdnsp_gadget_init;
@@ -153,8 +163,6 @@ static int cdnsp_pci_probe(struct pci_dev *pdev, goto free_cdnsp; } -pci_set_drvdata (pdev, cdnsp); -device_wakeup_enable (&pdev->dev);if (pci_dev_run_wake (pdev))pm_runtime_put_noidle (&pdev->dev);
drivers/usb/cdns3/cdnsp-ring.c +2 -1
@@ -308,7 +308,8 @@ static bool cdnsp_ring_ep_doorbell(struct cdnsp_device *pdev,writel (db_value, reg_addr); -cdnsp_force_l0_go (pdev); +if (pdev->rtl_revision <RTL_REVISION_NEW_LPM ) +cdnsp_force_l0_go (pdev);/* Doorbell was set. */ return true;
drivers/usb/cdns3/core.h +3 -0
@@ -79,6 +79,8 @@ struct cdns3_platform_data {* @pdata: platform data from glue layer * @lock: spinlock structure * @xhci_plat_data: xhci private data structure pointer +* @override_apb_timeout: hold value of APB timeout. For value 0 the default +* value in CHICKEN_BITS_3 will be preserved. * @gadget_init: pointer to gadget initialization function */ struct cdns {
@@ -117,6 +119,7 @@ struct cdns {struct cdns3_platform_data *pdata;spinlock_t lock;struct xhci_plat_priv *xhci_plat_data; +u32 override_apb_timeout;int (*gadget_init)(struct cdns *cdns); };
drivers/usb/class/usbtmc.c +36 -23
136 lines not on this page · raw message
drivers/usb/gadget/udc/tegra-xudc.c +4 -0
@@ -1737,6 +1737,10 @@ static int __tegra_xudc_ep_disable(struct tegra_xudc_ep *ep) val =xudc_readl (xudc,CTRL ); val &= ~CTRL_RUN ;xudc_writel (xudc, val,CTRL ); + + val =xudc_readl (xudc,ST ); +if (val &ST_RC ) +xudc_writel (xudc,ST_RC ,ST ); }dev_info (xudc->dev,"ep %u disabled\n" , ep->index);
drivers/usb/host/uhci-platform.c +1 -1
@@ -122,7 +122,7 @@ static int uhci_hcd_platform_probe(struct platform_device *pdev) }/* Get and enable clock if any specified */ - uhci->clk =devm_clk_get (&pdev->dev,NULL ); + uhci->clk =devm_clk_get_optional (&pdev->dev,NULL );if (IS_ERR (uhci->clk)) { ret =PTR_ERR (uhci->clk); goto err_rmr;
drivers/usb/host/xhci-tegra.c +3 -0
@@ -1228,6 +1228,7 @@ static void tegra_xhci_id_work(struct work_struct *work) tegra->otg_usb3_port =tegra_xusb_padctl_get_usb3_companion (tegra->padctl, tegra->otg_usb2_port); +pm_runtime_get_sync (tegra->dev);if (tegra->host_mode) {/* switch to host mode */ if (tegra->otg_usb3_port >=0 ) {
@@ -1257,6 +1258,7 @@ static void tegra_xhci_id_work(struct work_struct *work) }tegra_xhci_set_port_power (tegra, true, true); +pm_runtime_mark_last_busy (tegra->dev); }else {if (tegra->otg_usb3_port >=0 )
@@ -1264,6 +1266,7 @@ static void tegra_xhci_id_work(struct work_struct *work)tegra_xhci_set_port_power (tegra, true, false); } +pm_runtime_put_autosuspend (tegra->dev); }#if IS_ENABLED (CONFIG_PM ) ||IS_ENABLED (CONFIG_PM_SLEEP )
drivers/usb/typec/tcpm/tcpm.c +1 -1
@@ -5055,7 +5055,7 @@ static void _tcpm_cc_change(struct tcpm_port *port, enum typec_cc_status cc1,case SNK_TRY_WAIT_DEBOUNCE :if (!tcpm_port_is_sink (port)) { port->max_wait =0 ; -tcpm_set_state (port,SRC_TRYWAIT ,0 ); +tcpm_set_state (port,SRC_TRYWAIT ,PD_T_PD_DEBOUNCE ); }break ;case SRC_TRY_WAIT :
drivers/usb/typec/ucsi/displayport.c +2 -0
@@ -296,6 +296,8 @@ void ucsi_displayport_remove_partner(struct typec_altmode *alt)if (!dp)return ; +cancel_work_sync (&dp->work); + dp->data.conf =0 ; dp->data.status =0 ; dp->initialized = false;
drivers/xen/xenbus/xenbus.h +2 -0
@@ -77,6 +77,7 @@ enum xb_req_state {struct xb_req_data {struct list_head list;wait_queue_head_t wq; +struct kref kref;struct xsd_sockmsg msg;uint32_t caller_req_id;enum xsd_sockmsg_type type;
@@ -103,6 +104,7 @@ int xb_init_comms(void);void xb_deinit_comms (void );int xs_watch_msg (struct xs_watch_event *event);void xs_request_exit (struct xb_req_data *req); +void xs_free_req (struct kref *kref);int xenbus_match (struct device *_dev,struct device_driver *_drv);int xenbus_dev_probe (struct device *_dev);
drivers/xen/xenbus/xenbus_comms.c +4 -5
@@ -309,8 +309,8 @@ static int process_msg(void)virt_wmb (); req->state = xb_req_state_got_reply; req->cb (req); - }else -kfree (req); + } +kref_put (&req->kref, xs_free_req); }mutex_unlock (&xs_response_mutex);
@@ -386,14 +386,13 @@ static int process_writes(void) state.req->msg.type =XS_ERROR ; state.req->err = err;list_del (&state.req->list); -if (state.req->state == xb_req_state_aborted) -kfree (state.req); -else { +if (state.req->state != xb_req_state_aborted) {/* write err, then update state */ virt_wmb (); state.req->state = xb_req_state_got_reply;wake_up (&state.req->wq); } +kref_put (&state.req->kref, xs_free_req);mutex_unlock (&xb_write_mutex);
drivers/xen/xenbus/xenbus_dev_frontend.c +1 -1
@@ -406,7 +406,7 @@ void xenbus_dev_queue_reply(struct xb_req_data *req)mutex_unlock (&u->reply_mutex);kfree (req->body); -kfree (req); +kref_put (&req->kref, xs_free_req);kref_put (&u->kref, xenbus_file_free);
drivers/xen/xenbus/xenbus_xs.c +16 -2
@@ -112,6 +112,12 @@ static void xs_suspend_exit(void)wake_up_all (&xs_state_enter_wq); } +void xs_free_req (struct kref *kref) +{ + struct xb_req_data *req = container_of(kref, struct xb_req_data, kref); +kfree (req); +} +static uint32_t xs_request_enter (struct xb_req_data *req) {uint32_t rq_id;
@@ -237,6 +243,12 @@ static void xs_send(struct xb_req_data *req, struct xsd_sockmsg *msg) req->caller_req_id = req->msg.req_id; req->msg.req_id =xs_request_enter (req); +/* +* Take 2nd ref. One for this thread, and the second for the +* xenbus_thread. +*/ +kref_get (&req->kref); +mutex_lock (&xb_write_mutex);list_add_tail (&req->list, &xb_write_list); notify =list_is_singular (&xb_write_list);
@@ -261,8 +273,8 @@ static void *xs_wait_for_reply(struct xb_req_data *req, struct xsd_sockmsg *msg)if (req->state == xb_req_state_queued || req->state == xb_req_state_wait_reply) req->state = xb_req_state_aborted; -else -kfree (req); + +kref_put (&req->kref, xs_free_req);mutex_unlock (&xb_write_mutex);return ret;
@@ -291,6 +303,7 @@ int xenbus_dev_request_and_reply(struct xsd_sockmsg *msg, void *par) req->cb = xenbus_dev_queue_reply; req->par = par; req->user_req = true; +kref_init (&req->kref);xs_send (req, msg);
@@ -319,6 +332,7 @@ static void *xs_talkv(struct xenbus_transaction t, req->num_vecs = num_vecs; req->cb = xs_wake_up; req->user_req = false; +kref_init (&req->kref); msg.req_id =0 ; msg.tx_id = t.id;
fs/namespace.c +2 -1
@@ -586,7 +586,7 @@ int __legitimize_mnt(struct vfsmount *bastard, unsigned seq)return 0 ; mnt =real_mount (bastard);mnt_add_count (mnt,1 ); -smp_mb ();// see mntput_no_expire() +smp_mb ();// see mntput_no_expire() and do_umount() if (likely (!read_seqretry (&mount_lock, seq)))return 0 ;if (bastard->mnt_flags &MNT_SYNC_UMOUNT ) {
@@ -1664,6 +1664,7 @@ static int do_umount(struct mount *mnt, int flags)umount_tree (mnt,UMOUNT_PROPAGATE ); retval =0 ; }else { +smp_mb ();// paired with __legitimize_mnt() shrink_submounts (mnt); retval = -EBUSY ;if (!propagate_mount_busy (mnt,2 )) {
fs/ocfs2/journal.c +58 -22
129 lines not on this page · raw message
fs/ocfs2/journal.h +1 -0
@@ -148,6 +148,7 @@ void ocfs2_wait_for_recovery(struct ocfs2_super *osb);int ocfs2_recovery_init (struct ocfs2_super *osb);void ocfs2_recovery_exit (struct ocfs2_super *osb); +void ocfs2_recovery_disable_quota (struct ocfs2_super *osb);int ocfs2_compute_replay_slots (struct ocfs2_super *osb);void ocfs2_free_replay_slots (struct ocfs2_super *osb);
fs/ocfs2/ocfs2.h +16 -1
@@ -284,6 +284,21 @@ enum ocfs2_mount_options#define OCFS2_OSB_ERROR_FS 0x0004#define OCFS2_DEFAULT_ATIME_QUANTUM 60 +enum ocfs2_recovery_state { +OCFS2_REC_ENABLED =0 , +OCFS2_REC_QUOTA_WANT_DISABLE , +/* +* Must be OCFS2_REC_QUOTA_WANT_DISABLE + 1 for +* ocfs2_recovery_disable_quota() to work. +*/ +OCFS2_REC_QUOTA_DISABLED , +OCFS2_REC_WANT_DISABLE , +/* +* Must be OCFS2_REC_WANT_DISABLE + 1 for ocfs2_recovery_exit() to work +*/ +OCFS2_REC_DISABLED , +}; +struct ocfs2_journal ;struct ocfs2_slot_info ;struct ocfs2_recovery_map ;
@@ -346,7 +361,7 @@ struct ocfs2_superstruct ocfs2_recovery_map *recovery_map;struct ocfs2_replay_map *replay_map;struct task_struct *recovery_thread_task; -int disable_recovery; +enum ocfs2_recovery_state recovery_state;wait_queue_head_t checkpoint_event;struct ocfs2_journal *journal;unsigned long osb_commit_interval;
fs/ocfs2/quota_local.c +2 -7
@@ -453,8 +453,7 @@ struct ocfs2_quota_recovery *ocfs2_begin_quota_recovery(/* Sync changes in local quota file into global quota file and * reinitialize local quota file. -* The function expects local quota file to be already locked and -* s_umount locked in shared mode. */ +* The function expects local quota file to be already locked. */ static int ocfs2_recover_local_quota_file (struct inode *lqinode,int type,struct ocfs2_quota_recovery *rec)
@@ -585,7 +584,6 @@ int ocfs2_finish_quota_recovery(struct ocfs2_super *osb, {unsigned int ino[OCFS2_MAXQUOTAS ] = {LOCAL_USER_QUOTA_SYSTEM_INODE ,LOCAL_GROUP_QUOTA_SYSTEM_INODE }; -struct super_block *sb = osb->sb;struct ocfs2_local_disk_dqinfo *ldinfo;struct buffer_head *bh;handle_t *handle;
@@ -597,7 +595,6 @@ int ocfs2_finish_quota_recovery(struct ocfs2_super *osb,printk (KERN_NOTICE "ocfs2: Finishing quota recovery on device (%s) for " "slot %u\n" , osb->dev_str, slot_num); -down_read (&sb->s_umount);for (type =0 ; type <OCFS2_MAXQUOTAS ; type++) {if (list_empty (&(rec->r_list[type])))continue ;
@@ -674,7 +671,6 @@ int ocfs2_finish_quota_recovery(struct ocfs2_super *osb,break ; } out: -up_read (&sb->s_umount);kfree (rec);return status; }
@@ -840,8 +836,7 @@ static int ocfs2_local_free_info(struct super_block *sb, int type)ocfs2_release_local_quota_bitmaps (&oinfo->dqi_chunk);/* -* s_umount held in exclusive mode protects us against racing with -* recovery thread... +* ocfs2_dismount_volume() has already aborted quota recovery... */ if (oinfo->dqi_rec) {ocfs2_free_quota_recovery (oinfo->dqi_rec);
fs/ocfs2/super.c +3 -0
@@ -1872,6 +1872,9 @@ static void ocfs2_dismount_volume(struct super_block *sb, int mnt_err)/* Orphan scan should be stopped as early as possible */ ocfs2_orphan_scan_stop (osb); +/* Stop quota recovery so that we can disable quotas */ +ocfs2_recovery_disable_quota (osb); +ocfs2_disable_quotas (osb);/* All dquots should be freed by now */
include/linux/rcupdate.h +3 -0
@@ -979,6 +979,9 @@ static inline notrace void rcu_read_unlock_sched_notrace(void)#define kvfree_rcu (...) KVFREE_GET_MACRO(__VA_ARGS__, \ kvfree_rcu_arg_2, kvfree_rcu_arg_1)(__VA_ARGS__) +#define kvfree_rcu_mightsleep (ptr) kvfree_rcu_arg_1(ptr) +#define kfree_rcu_mightsleep (ptr) kvfree_rcu_mightsleep(ptr) +#define KVFREE_GET_MACRO (_1, _2,NAME , ...) NAME#define kvfree_rcu_arg_2 (ptr, rhf) \ do { \
include/linux/types.h +2 -1
@@ -109,8 +109,9 @@ typedef u64 u_int64_t;typedef s64 int64_t ;#endif -/* this is a special 64bit data type that is 8-byte aligned */ +/* These are the special 64-bit data types that are 8-byte aligned */ #define aligned_u64 __aligned_u64 +#define aligned_s64 __aligned_s64#define aligned_be64 __aligned_be64#define aligned_le64 __aligned_le64
include/uapi/linux/types.h +1 -0
@@ -46,6 +46,7 @@ typedef __u32 __bitwise __wsum;* No conversions are necessary between 32-bit user-space and a 64-bit kernel. */ #define __aligned_u64 __u64 __attribute__((aligned(8))) +#define __aligned_s64 __s64 __attribute__((aligned(8)))#define __aligned_be64 __be64 __attribute__((aligned(8)))#define __aligned_le64 __le64 __attribute__((aligned(8)))
kernel/params.c +3 -1
@@ -945,7 +945,9 @@ int module_sysfs_initialized;static void module_kobj_release (struct kobject *kobj) {struct module_kobject *mk =to_module_kobject (kobj); -complete (mk->kobj_completion); + +if (mk->kobj_completion) +complete (mk->kobj_completion); }struct kobj_type module_ktype = {
net/can/gw.c +100 -65
336 lines not on this page · raw message
net/ipv6/addrconf.c +9 -6
@@ -3145,16 +3145,13 @@ static void add_v4_addrs(struct inet6_dev *idev)struct in6_addr addr;struct net_device *dev;struct net *net =dev_net (idev->dev); -int scope, plen, offset =0 ; +int scope, plen;u32 pflags =0 ;ASSERT_RTNL ();memset (&addr,0 ,sizeof (struct in6_addr )); -/* in case of IP6GRE the dev_addr is an IPv6 and therefore we use only the last 4 bytes */ -if (idev->dev->addr_len ==sizeof (struct in6_addr )) - offset =sizeof (struct in6_addr ) -4 ; -memcpy (&addr.s6_addr32[3 ], idev->dev->dev_addr + offset,4 ); +memcpy (&addr.s6_addr32[3 ], idev->dev->dev_addr,4 );if (!(idev->dev->flags &IFF_POINTOPOINT ) && idev->dev->type ==ARPHRD_SIT ) { scope = IPV6_ADDR_COMPATv4;
@@ -3462,7 +3459,13 @@ static void addrconf_gre_config(struct net_device *dev)return ; } -if (dev->type ==ARPHRD_ETHER ) { +/* Generate the IPv6 link-local address using addrconf_addr_gen(), +* unless we have an IPv4 GRE device not bound to an IP address and +* which is in EUI64 mode (as __ipv6_isatap_ifid() would fail in this +* case). Such devices fall back to add_v4_addrs() instead. +*/ +if (!(dev->type ==ARPHRD_IPGRE && *(__be32 *)dev->dev_addr ==0 && + idev->cnf.addr_gen_mode ==IN6_ADDR_GEN_MODE_EUI64 )) {addrconf_addr_gen (idev, true);return ; }
net/netfilter/ipset/ip_set_hash_gen.h +1 -1
@@ -63,7 +63,7 @@ struct hbucket {#define ahash_sizeof_regions (htable_bits) \ (ahash_numof_locks(htable_bits) * sizeof(struct ip_set_region))#define ahash_region (n, htable_bits) \ - ((n) % ahash_numof_locks(htable_bits)) + ((n) / jhash_size(HTABLE_REGION_BITS))#define ahash_bucket_start (h, htable_bits) \ ((htable_bits) < HTABLE_REGION_BITS ? 0 \ : (h) * jhash_size(HTABLE_REGION_BITS))
net/openvswitch/actions.c +1 -2
@@ -954,8 +954,7 @@ static int output_userspace(struct datapath *dp, struct sk_buff *skb, upcall.cmd =OVS_PACKET_CMD_ACTION ; upcall.mru =OVS_CB (skb)->mru; -for (a =nla_data (attr), rem =nla_len (attr); rem >0 ; - a =nla_next (a, &rem)) { +nla_for_each_nested (a, attr, rem) {switch (nla_type (a)) {case OVS_USERSPACE_ATTR_USERDATA : upcall.userdata = a;