Linux 4.4.228
Greg Kroah-Hartman
maintainerI'm announcing the release of the 4.4.228 kernel.
All users of the 4.4 kernel series must upgrade.
The updated 4.4.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-4.4.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 | 15 - arch/arm/kernel/ptrace.c | 4 arch/arm/mach-tegra/tegra.c | 4 arch/arm/mm/proc-macros.S | 3 arch/arm64/include/asm/kvm_host.h | 6 arch/m68k/include/asm/mac_via.h | 1 arch/m68k/mac/config.c | 21 -- arch/m68k/mac/via.c | 6 arch/mips/kernel/genex.S | 6 arch/mips/kernel/mips-cm.c | 6 arch/mips/kernel/setup.c | 10 + arch/mips/kernel/time.c | 70 +++++++ arch/powerpc/platforms/cell/spufs/file.c | 113 +++++++---- arch/sparc/kernel/ptrace_32.c | 228 ++++++++++-------------- arch/x86/include/asm/cpufeatures.h | 2 arch/x86/include/asm/nospec-branch.h | 1 arch/x86/kernel/cpu/bugs.c | 93 ++++++--- arch/x86/kernel/process.c | 28 +- arch/x86/kernel/process.h | 2 arch/x86/kernel/reboot.c | 8 arch/x86/kernel/time.c | 4 arch/x86/kernel/vmlinux.lds.S | 4 arch/x86/kvm/svm.c | 2 arch/x86/kvm/vmx.c | 2 arch/x86/mm/init.c | 2 drivers/acpi/device_pm.c | 2 drivers/acpi/scan.c | 28 ++ drivers/acpi/sysfs.c | 4 drivers/clocksource/dw_apb_timer_of.c | 6 drivers/cpuidle/sysfs.c | 6 drivers/firmware/efi/efivars.c | 4 drivers/macintosh/windfarm_pm112.c | 22 +- drivers/md/md.c | 3 drivers/media/usb/dvb-usb/dibusb-mb.c | 2 drivers/media/usb/go7007/snd-go7007.c | 35 +-- drivers/net/can/usb/kvaser_usb.c | 6 drivers/net/ethernet/allwinner/sun4i-emac.c | 4 drivers/net/ethernet/intel/e1000/e1000_main.c | 4 drivers/net/ethernet/intel/e1000e/e1000.h | 1 drivers/net/ethernet/intel/e1000e/netdev.c | 12 - drivers/net/ethernet/intel/igb/e1000_regs.h | 3 drivers/net/ethernet/intel/igb/igb_ethtool.c | 3 drivers/net/ethernet/intel/igb/igb_main.c | 5 drivers/net/ethernet/intel/ixgbe/ixgbe_common.c | 2 drivers/net/ethernet/nxp/lpc_eth.c | 3 drivers/net/macvlan.c | 4 drivers/net/phy/marvell.c | 2 drivers/net/vmxnet3/vmxnet3_ethtool.c | 2 drivers/net/vxlan.c | 4 drivers/net/wireless/ath/ath9k/hif_usb.c | 58 ++++-- drivers/net/wireless/ath/ath9k/hif_usb.h | 6 drivers/net/wireless/ath/ath9k/htc_drv_init.c | 10 - drivers/net/wireless/ath/ath9k/htc_drv_txrx.c | 6 drivers/net/wireless/ath/ath9k/htc_hst.c | 3 drivers/net/wireless/ath/ath9k/wmi.c | 5 drivers/net/wireless/ath/ath9k/wmi.h | 3 drivers/net/wireless/ath/carl9170/fw.c | 4 drivers/net/wireless/ath/carl9170/main.c | 21 -- drivers/net/wireless/b43/main.c | 2 drivers/net/wireless/b43legacy/main.c | 1 drivers/net/wireless/b43legacy/xmit.c | 1 drivers/net/wireless/mwifiex/cfg80211.c | 14 - drivers/pci/probe.c | 24 ++ drivers/pinctrl/samsung/pinctrl-exynos.c | 9 drivers/power/reset/vexpress-poweroff.c | 1 drivers/pwm/pwm-fsl-ftm.c | 2 drivers/scsi/scsi_lib.c | 4 drivers/spi/spi-bcm2835.c | 4 drivers/spi/spi-bcm2835aux.c | 4 drivers/spi/spi-dw-mid.c | 16 + drivers/spi/spi-dw.c | 14 - drivers/spi/spi-pxa2xx.c | 4 drivers/spi/spi.c | 5 drivers/staging/android/ion/ion_heap.c | 4 drivers/video/fbdev/w100fb.c | 2 drivers/w1/masters/omap_hdq.c | 10 - fs/btrfs/file-item.c | 6 fs/btrfs/inode.c | 6 fs/btrfs/ioctl.c | 3 fs/btrfs/send.c | 67 +++++++ fs/btrfs/tree-log.c | 15 + fs/btrfs/tree-log.h | 2 fs/ext4/ext4_extents.h | 9 fs/fat/inode.c | 6 fs/fs-writeback.c | 1 fs/nilfs2/segment.c | 2 fs/overlayfs/copy_up.c | 2 fs/proc/inode.c | 2 fs/proc/self.c | 2 fs/proc/thread_self.c | 2 include/linux/kgdb.h | 2 include/linux/sunrpc/gss_api.h | 1 include/linux/sunrpc/svcauth_gss.h | 3 kernel/cpu_pm.c | 4 kernel/debug/debug_core.c | 1 kernel/sched/fair.c | 2 lib/mpi/longlong.h | 2 mm/slub.c | 4 net/bluetooth/hci_event.c | 1 net/ipv6/ipv6_sockglue.c | 13 - net/netfilter/nft_nat.c | 4 net/sunrpc/auth_gss/gss_mech_switch.c | 12 - net/sunrpc/auth_gss/svcauth_gss.c | 18 + security/integrity/ima/ima.h | 7 security/integrity/ima/ima_policy.c | 3 security/smack/smackfs.c | 10 + sound/core/pcm_native.c | 5 sound/isa/es1688/es1688.c | 4 sound/usb/card.c | 20 +- sound/usb/usbaudio.h | 2 tools/perf/builtin-probe.c | 3 tools/perf/util/dso.c | 16 + tools/perf/util/dso.h | 1 tools/perf/util/probe-finder.c | 1 tools/perf/util/symbol.c | 2 115 files changed, 841 insertions(+), 470 deletions(-)
Adrian Hunter (1):
perf symbols: Fix debuginfo search for Ubuntu
Al Viro (1):
sparc32: fix register window handling in genregs32_[gs]et()
Alexander Sverdlin (1):
macvlan: Skip loopback packets in RX handler
Anders Roxell (1):
power: vexpress: add suppress_bind_attrs to true
Andy Shevchenko (2):
spi: No need to assign dummy value in spi_unregister_controller()
spi: dw: Zero DMA Tx and Rx configurations on stack
Anthony Steinhauser (3):
x86/speculation: Prevent rogue cross-process SSBD shutdown x86/speculation: Avoid force-disabling IBPB based on STIBP and enhanced IBRS. x86/speculation: PR_SPEC_FORCE_DISABLE enforcement for indirect branches.
Ard Biesheuvel (1):
efi/efivars: Add missing kobject_put() in sysfs entry creation error path
Arvind Sankar (1):
x86/mm: Stop printing BRK addresses
Ashok Raj (1):
PCI: Program MPS for RCiEP devices
Bob Haarman (1):
x86_64: Fix jiffies ODR violation
Casey Schaufler (1):
Smack: slab-out-of-bounds in vsscanf
Christian Lamparter (1):
carl9170: remove P2P_GO support
Christoph Hellwig (1):
staging: android: ion: use vmap instead of vm_map_ram
Christophe JAILLET (1):
video: fbdev: w100fb: Fix a potential double free.
Chuhong Yuan (2):
ALSA: es1688: Add the missed snd_card_free()
media: go7007: fix a miss of snd_card_free
Colin Ian King (1):
media: dvb: return -EREMOTEIO on i2c transfer failure.
Daniel Thompson (1):
kgdb: Fix spurious true from in_dbg_master()
Dmitry Osipenko (1):
ARM: tegra: Correct PL310 Auxiliary Control Register initialization
Douglas Anderson (2):
kgdb: Prevent infinite recursive entries to the debugger kernel/cpu_pm: Fix uninitted local in cpu_pm
Eric W. Biederman (1):
proc: Use new_inode not new_inode_pseudo
Filipe Manana (2):
btrfs: do not ignore error from btrfs_next_leaf() when inserting checksums
Btrfs: fix unreplayable log after snapshot delete + parent dir fsync
Finn Thain (1):
m68k: mac: Don't call via_flush_cache() on Mac IIfx
Fredrik Strupe (1):
ARM: 8977/1: ptrace: Fix mask for thumb breakpoint hook
Greg Kroah-Hartman (1):
Linux 4.4.228
Guoqing Jiang (1):
md: don't flush workqueue unconditionally in md_open
H. Nikolaus Schaller (1):
w1: omap-hdq: cleanup to add missing newline for some dev_dbg
Hangbin Liu (1):
ipv6: fix IPV6_ADDRFORM operation logic
Harshad Shirwadkar (1):
ext4: fix EXT_MAX_EXTENT/INDEX to check for zeroed eh_max
Hill Ma (1):
x86/reboot/quirks: Add MacBook6,1 reboot quirk
Hsin-Yu Chao (1):
Bluetooth: Add SCO fallback for invalid LMP parameters error
Ido Schimmel (1):
vxlan: Avoid infinite loop when suppressing NS messages with invalid options
Jarod Wilson (1):
igb: improve handling of disconnected adapters
Jens Axboe (1):
sched/fair: Don't NUMA balance for kthreads
Jeremy Kerr (1):
powerpc/spufs: fix copy_to_user while atomic
Jia-Ju Bai (1):
net: vmxnet3: fix possible buffer overflow caused by bad DMA value in vmxnet3_get_rss()
Jiaxun Yang (1):
PCI: Don't disable decoding when mmio_always_on is set
Johannes Thumshirn (1):
scsi: return correct blkprep status code in case scsi_init_io() fails.
Jonathan Bakker (1):
pinctrl: samsung: Save/restore eint_mask over suspend for EINT_TYPE GPIOs
Kai-Heng Feng (1):
igb: Report speed and duplex as unknown when device is runtime suspended
Kees Cook (1):
e1000: Distribute switch variables for initialization
Krzysztof Struczynski (1):
ima: Fix ima digest hash table key calculation
Larry Finger (3):
b43legacy: Fix case where channel status is corrupted
b43: Fix connection problem with WPA3
b43_legacy: Fix connection problem with WPA3
Linus Walleij (1):
ARM: 8978/1: mm: make act_mm() respect THREAD_SIZE
Lukas Wunner (5):
spi: bcm2835aux: Fix controller unregister order
spi: dw: Fix controller unregister order
spi: Fix controller unregister order
spi: pxa2xx: Fix controller unregister order
spi: bcm2835: Fix controller unregister order
Marc Zyngier (1):
KVM: arm64: Make vcpu_cp1x() work on Big Endian hosts
Marcos Paulo de Souza (1):
btrfs: send: emit file capabilities after chown
Masahiro Yamada (1):
kbuild: force to build vmlinux if CONFIG_MODVERSION=y
Masami Hiramatsu (1):
perf probe: Do not show the skipped events
Masashi Honma (1):
ath9k_htc: Silence undersized packet warnings
Michael Ellerman (1):
drivers/macintosh: Fix memleak in windfarm_pm112 driver
Michał Mirosław (1):
ALSA: pcm: disallow linking stream to itself
Nathan Chancellor (1):
lib/mpi: Fix 64-bit MIPS build with Clang
NeilBrown (2):
sunrpc: svcauth_gss_register_pseudoflavor must reject duplicate registrations.
sunrpc: clean up properly in gss_mech_unregister()
OGAWA Hirofumi (1):
fat: don't allow to mount if the FAT length == 0
Omar Sandoval (1):
btrfs: fix error handling when submitting direct I/O bio
Pablo Neira Ayuso (1):
netfilter: nft_nat: return EOPNOTSUPP if type or flags are not supported
Pali Rohár (1):
mwifiex: Fix memory corruption in dump_station
Paolo Bonzini (1):
KVM: nSVM: leave ASID aside in copy_vmcb_control_area
Punit Agrawal (1):
e1000e: Relax condition to trigger reset for ME workaround
Qiujun Huang (4):
ath9k: Fix use-after-free Read in ath9k_wmi_ctrl_rx
ath9k: Fix use-after-free Write in ath9k_htc_rx_msg
ath9x: Fix stack-out-of-bounds Write in ath9k_hif_usb_rx_cb
ath9k: Fix general protection fault in ath9k_hif_usb_rx_cb
Qiushi Wu (2):
ACPI: sysfs: Fix reference count leak in acpi_sysfs_add_hotplug_profile()
cpuidle: Fix three reference count leaks
Rafael J. Wysocki (1):
ACPI: PM: Avoid using power resources if there are none for D0
Roberto Sassu (1):
ima: Directly assign the ima_default_policy pointer to ima_rules
Ryusuke Konishi (1):
nilfs2: fix null pointer dereference at nilfs_segctor_do_construct()
Sasha Levin (1):
spi: dw: fix possible race condition
Sean Christopherson (1):
KVM: nVMX: Consult only the "basic" exit reason when routing nested exit
Serge Semin (5):
spi: dw: Enable interrupts in accordance with DMA xfer mode
clocksource: dw_apb_timer_of: Fix missing clockevent timers
mips: cm: Fix an invalid error code of INTVN_*_ERR
mips: Add udelay lpj numbers adjustment
spi: dw: Return any value retrieved from the dma_transfer callback
Stefan Agner (1):
pwm: fsl-ftm: Use flat regmap cache
Takashi Iwai (1):
ALSA: usb-audio: Fix inconsistent card PM state after resume
Tejun Heo (1):
cgroup, blkcg: Prepare some symbols for module and !CONFIG_CGROUP usages
Thomas Lendacky (1):
x86/speculation: Add support for STIBP always-on preferred mode
Tiezhu Yang (1):
MIPS: Make sparse_init() using top-down allocation
Waiman Long (1):
x86/speculation: Change misspelled STIPB to STIBP
Wang Hai (1):
mm/slub: fix a memory leak in sysfs_slab_add()
Wei Yongjun (1):
net: lpc-enet: fix error return code in lpc_mii_init()
Xiaolong Huang (1):
can: kvaser_usb: kvaser_usb_leaf: Fix some info-leaks to USB devices
Xie XiuQi (1):
ixgbe: fix signed-integer-overflow warning
YuanJunQing (1):
MIPS: Fix IRQ tracing when call handle_fpe() and handle_msa_fpe()
Yunjian Wang (1):
net: allwinner: Fix use correct return type for ndo_start_xmit()
Yuxuan Shui (1):
ovl: initialize error in ovl_copy_xattr
Zhao Qiang (1):
net: phy: marvell: Limit 88m1101 autoneg errata to 88E1145 as well.
Greg Kroah-Hartman
maintainerMakefile +9 -6
@@ -1,6 +1,6 @@ VERSION = 4 PATCHLEVEL = 4 -SUBLEVEL = 227 +SUBLEVEL = 228 EXTRAVERSION = NAME = Blurry Fish Butt
@@ -313,12 +313,8 @@ KBUILD_MODULES := KBUILD_BUILTIN := 1 # If we have only "make modules", don't compile built-in objects. -# When we're building modules with modversions, we need to consider -# the built-in objects during the descend as well, in order to -# make sure the checksums are up to date before we record them. - ifeq ($(MAKECMDGOALS),modules) - KBUILD_BUILTIN := $(if $(CONFIG_MODVERSIONS),1) + KBUILD_BUILTIN := endif # If we have "make <whatever> modules", compile modules
@@ -1156,6 +1152,13 @@ ifdef CONFIG_MODULES all: modules +# When we're building modules with modversions, we need to consider +# the built-in objects during the descend as well, in order to +# make sure the checksums are up to date before we record them. +ifdef CONFIG_MODVERSIONS + KBUILD_BUILTIN := 1 +endif + # Build modules # # A module can be listed more than once in obj-m resulting in
arch/arm/kernel/ptrace.c +2 -2
@@ -227,8 +227,8 @@ static struct undef_hook arm_break_hook = { };static struct undef_hook thumb_break_hook = { - .instr_mask =0xffff , - .instr_val =0xde01 , + .instr_mask =0xffffffff , + .instr_val =0x0000de01 , .cpsr_mask =PSR_T_BIT , .cpsr_val =PSR_T_BIT , .fn = break_trap,
arch/arm/mach-tegra/tegra.c +2 -2
@@ -155,8 +155,8 @@ static const char * const tegra_dt_board_compat[] = { };DT_MACHINE_START (TEGRA_DT ,"NVIDIA Tegra SoC (Flattened Device Tree)" ) - .l2c_aux_val = 0x3c400001, - .l2c_aux_mask = 0xc20fc3fe, + .l2c_aux_val = 0x3c400000, + .l2c_aux_mask = 0xc20fc3ff, .smp = smp_ops(tegra_smp_ops), .map_io = tegra_map_common_io, .init_early = tegra_init_early,
arch/arm/mm/proc-macros.S +2 -1
@@ -4,6 +4,7 @@ * VMA_VM_FLAGS * VM_EXEC */ +#include <linux/const.h> #include <asm/asm-offsets.h> #include <asm/thread_info.h>
@@ -30,7 +31,7 @@ * act_mm - get current->active_mm */ .macro act_mm, rd - bic \rd, sp, #8128 + bic \rd, sp, #(THREAD_SIZE - 1) & ~63 bic \rd, \rd, #63 ldr \rd, [\rd, #TI_TASK] ldr \rd, [\rd, #TSK_ACTIVE_MM]
arch/arm64/include/asm/kvm_host.h +4 -2
@@ -178,8 +178,10 @@ struct kvm_vcpu_arch {* CP14 and CP15 live in the same array, as they are backed by the * same system registers. */ -#define vcpu_cp14 (v,r) ((v)->arch.ctxt.copro[(r)]) -#define vcpu_cp15 (v,r) ((v)->arch.ctxt.copro[(r)]) +#define CPx_BIAS IS_ENABLED(CONFIG_CPU_BIG_ENDIAN) + +#define vcpu_cp14 (v,r) ((v)->arch.ctxt.copro[(r) ^ CPx_BIAS]) +#define vcpu_cp15 (v,r) ((v)->arch.ctxt.copro[(r) ^ CPx_BIAS])#ifdef CONFIG_CPU_BIG_ENDIAN #define vcpu_cp15_64_high (v,r) vcpu_cp15((v),(r))
arch/m68k/include/asm/mac_via.h +1 -0
@@ -256,6 +256,7 @@ extern int rbv_present,via_alt_mapping;struct irq_desc ; +extern void via_l2_flush (int writeback);extern void via_register_interrupts (void );extern void via_irq_enable (int );extern void via_irq_disable (int );
arch/m68k/mac/config.c +2 -19
@@ -60,7 +60,6 @@ extern void iop_preinit(void);extern void iop_init (void );extern void via_init (void );extern void via_init_clock (irq_handler_t func); -extern void via_flush_cache (void );extern void oss_init (void );extern void psc_init (void );extern void baboon_init (void );
@@ -131,21 +130,6 @@ int __init mac_parse_bootinfo(const struct bi_record *record)return unknown; } -/* -* Flip into 24bit mode for an instant - flushes the L2 cache card. We -* have to disable interrupts for this. Our IRQ handlers will crap -* themselves if they take an IRQ in 24bit mode! -*/ - -static void mac_cache_card_flush (int writeback) -{ -unsigned long flags; - -local_irq_save (flags); -via_flush_cache (); -local_irq_restore (flags); -} -void __init config_mac (void ) {if (!MACH_IS_MAC )
@@ -178,9 +162,8 @@ void __init config_mac(void)* not. */ -if (macintosh_config->ident ==MAC_MODEL_IICI - || macintosh_config->ident ==MAC_MODEL_IIFX ) - mach_l2_flush = mac_cache_card_flush; +if (macintosh_config->ident ==MAC_MODEL_IICI ) + mach_l2_flush = via_l2_flush; }
arch/m68k/mac/via.c +5 -1
@@ -299,10 +299,14 @@ void via_debug_dump(void)* the system into 24-bit mode for an instant. */ -void via_flush_cache (void ) +void via_l2_flush (int writeback) { +unsigned long flags; + +local_irq_save (flags); via2[gBufB] &= ~VIA2B_vMode32; via2[gBufB] |= VIA2B_vMode32; +local_irq_restore (flags); }/*
arch/mips/kernel/genex.S +3 -3
@@ -430,20 +430,20 @@ NESTED(nmi_handler, PT_SIZE, sp) .endm .macro __build_clear_fpe + CLI + TRACE_IRQS_OFF .set push /* gas fails to assemble cfc1 for some archs (octeon).*/ \ .set mips1 SET_HARDFLOAT cfc1 a1, fcr31 .set pop - CLI - TRACE_IRQS_OFF .endm .macro __build_clear_msa_fpe - _cfcmsa a1, MSA_CSR CLI TRACE_IRQS_OFF + _cfcmsa a1, MSA_CSR .endm .macro __build_clear_ade
arch/mips/kernel/mips-cm.c +3 -3
@@ -123,9 +123,9 @@ static char *cm2_causes[32] = {"COH_RD_ERR" ,"MMIO_WR_ERR" ,"MMIO_RD_ERR" ,"0x07" ,"0x08" ,"0x09" ,"0x0a" ,"0x0b" ,"0x0c" ,"0x0d" ,"0x0e" ,"0x0f" , -"0x10" ,"0x11" ,"0x12" ,"0x13" , -"0x14" ,"0x15" ,"0x16" ,"INTVN_WR_ERR" , -"INTVN_RD_ERR" ,"0x19" ,"0x1a" ,"0x1b" , +"0x10" ,"INTVN_WR_ERR" ,"INTVN_RD_ERR" ,"0x13" , +"0x14" ,"0x15" ,"0x16" ,"0x17" , +"0x18" ,"0x19" ,"0x1a" ,"0x1b" ,"0x1c" ,"0x1d" ,"0x1e" ,"0x1f" };
arch/mips/kernel/setup.c +10 -0
@@ -769,7 +769,17 @@ static void __init arch_mem_init(char **cmdline_p) BOOTMEM_DEFAULT);#endif device_tree_init (); + +/* +* In order to reduce the possibility of kernel panic when failed to +* get IO TLB memory under CONFIG_SWIOTLB, it is better to allocate +* low memory as small as possible before plat_swiotlb_setup(), so +* make sparse_init() using top-down allocation. +*/ +memblock_set_bottom_up (false);sparse_init (); +memblock_set_bottom_up (true); +plat_swiotlb_setup ();paging_init ();
arch/mips/kernel/time.c +70 -0
82 lines not on this page · raw message
arch/powerpc/platforms/cell/spufs/file.c +75 -38
234 lines not on this page · raw message
arch/sparc/kernel/ptrace_32.c +98 -130
262 lines not on this page · raw message
arch/x86/include/asm/cpufeatures.h +1 -1
@@ -270,6 +270,7 @@#define X86_FEATURE_AMD_IBPB (13*32+12)/* "" Indirect Branch Prediction Barrier */ #define X86_FEATURE_AMD_IBRS (13*32+14)/* "" Indirect Branch Restricted Speculation */ #define X86_FEATURE_AMD_STIBP (13*32+15)/* "" Single Thread Indirect Branch Predictors */ +#define X86_FEATURE_AMD_STIBP_ALWAYS_ON (13*32+17)/* "" Single Thread Indirect Branch Predictors always-on preferred */ #define X86_FEATURE_AMD_SSBD (13*32+24)/* "" Speculative Store Bypass Disable */ #define X86_FEATURE_VIRT_SSBD (13*32+25)/* Virtualized Speculative Store Bypass Disable */ #define X86_FEATURE_AMD_SSB_NO (13*32+26)/* "" Speculative Store Bypass is fixed in hardware. */
@@ -308,7 +309,6 @@#define X86_FEATURE_SUCCOR (17*32+1)/* Uncorrectable error containment and recovery */ #define X86_FEATURE_SMCA (17*32+3)/* Scalable MCA */ -/* Intel-defined CPU features, CPUID level 0x00000007:0 (EDX), word 18 */ #define X86_FEATURE_AVX512_4VNNIW (18*32+ 2)/* AVX-512 Neural Network Instructions */ #define X86_FEATURE_AVX512_4FMAPS (18*32+ 3)/* AVX-512 Multiply Accumulation Single precision */
arch/x86/include/asm/nospec-branch.h +1 -0
@@ -178,6 +178,7 @@ enum spectre_v2_mitigation {enum spectre_v2_user_mitigation {SPECTRE_V2_USER_NONE ,SPECTRE_V2_USER_STRICT , +SPECTRE_V2_USER_STRICT_PREFERRED ,SPECTRE_V2_USER_PRCTL ,SPECTRE_V2_USER_SECCOMP , };
arch/x86/kernel/cpu/bugs.c +62 -31
180 lines not on this page · raw message
arch/x86/kernel/process.c +10 -18
@@ -333,28 +333,20 @@ static __always_inline void __speculation_ctrl_update(unsigned long tifp,u64 msr = x86_spec_ctrl_base;bool updmsr = false; -/* -* If TIF_SSBD is different, select the proper mitigation -* method. Note that if SSBD mitigation is disabled or permanentely -* enabled this branch can't be taken because nothing can set -* TIF_SSBD. -*/ -if (tif_diff & _TIF_SSBD) { -if (static_cpu_has (X86_FEATURE_VIRT_SSBD )) { +/* Handle change of TIF_SSBD depending on the mitigation method. */ +if (static_cpu_has (X86_FEATURE_VIRT_SSBD )) { +if (tif_diff & _TIF_SSBD)amd_set_ssb_virt_state (tifn); - }else if (static_cpu_has (X86_FEATURE_LS_CFG_SSBD )) { + }else if (static_cpu_has (X86_FEATURE_LS_CFG_SSBD )) { +if (tif_diff & _TIF_SSBD)amd_set_core_ssb_state (tifn); - }else if (static_cpu_has (X86_FEATURE_SPEC_CTRL_SSBD ) || -static_cpu_has (X86_FEATURE_AMD_SSBD )) { - msr |=ssbd_tif_to_spec_ctrl (tifn); - updmsr = true; - } + }else if (static_cpu_has (X86_FEATURE_SPEC_CTRL_SSBD ) || +static_cpu_has (X86_FEATURE_AMD_SSBD )) { + updmsr |= !!(tif_diff & _TIF_SSBD); + msr |=ssbd_tif_to_spec_ctrl (tifn); } -/* -* Only evaluate TIF_SPEC_IB if conditional STIBP is enabled, -* otherwise avoid the MSR write. -*/ +/* Only evaluate TIF_SPEC_IB if conditional STIBP is enabled. */ if (IS_ENABLED (CONFIG_SMP ) &&static_branch_unlikely (&switch_to_cond_stibp)) { updmsr |= !!(tif_diff & _TIF_SPEC_IB);
arch/x86/kernel/process.h +1 -1
@@ -19,7 +19,7 @@ static inline void switch_to_extra(struct task_struct *prev,if (IS_ENABLED (CONFIG_SMP )) {/* * Avoid __switch_to_xtra() invocation when conditional -* STIPB is disabled and the only different bit is +* STIBP is disabled and the only different bit is * TIF_SPEC_IB. For CONFIG_SMP=n TIF_SPEC_IB is not * in the TIF_WORK_CTXSW masks. */
arch/x86/kernel/reboot.c +8 -0
@@ -162,6 +162,14 @@ static struct dmi_system_id __initdata reboot_dmi_table[] = { DMI_MATCH(DMI_PRODUCT_NAME, "MacBook5"), }, }, + { /* Handle problems with rebooting on Apple MacBook6,1 */ + .callback = set_pci_reboot, + .ident = "Apple MacBook6,1", + .matches = { +DMI_MATCH (DMI_SYS_VENDOR ,"Apple Inc." ), + DMI_MATCH(DMI_PRODUCT_NAME, "MacBook6,1"), + }, + }, { /* Handle problems with rebooting on Apple MacBookPro5 */ .callback = set_pci_reboot, .ident = "Apple MacBookPro5",
arch/x86/kernel/time.c +0 -4
@@ -22,10 +22,6 @@#include <asm/hpet.h> #include <asm/time.h> -#ifdef CONFIG_X86_64 -__visible volatile unsigned long jiffies __cacheline_aligned_in_smp = INITIAL_JIFFIES; -#endif -unsigned long profile_pc (struct pt_regs *regs) {unsigned long pc =instruction_pointer (regs);
arch/x86/kernel/vmlinux.lds.S +2 -2
@@ -34,13 +34,13 @@ OUTPUT_FORMAT(CONFIG_OUTPUT_FORMAT, CONFIG_OUTPUT_FORMAT, CONFIG_OUTPUT_FORMAT) #ifdef CONFIG_X86_32 OUTPUT_ARCH(i386) ENTRY(phys_startup_32) -jiffies = jiffies_64; #else OUTPUT_ARCH(i386:x86-64) ENTRY(phys_startup_64) -jiffies_64 = jiffies; #endif +jiffies = jiffies_64; + #if defined(CONFIG_X86_64) && defined(CONFIG_DEBUG_RODATA) /* * On 64-bit, align RODATA to 2MB so that even with CONFIG_DEBUG_RODATA
arch/x86/kvm/svm.c +1 -1
@@ -2250,7 +2250,7 @@ static inline void copy_vmcb_control_area(struct vmcb *dst_vmcb, struct vmcb *fr dst->iopm_base_pa = from->iopm_base_pa; dst->msrpm_base_pa = from->msrpm_base_pa; dst->tsc_offset = from->tsc_offset; - dst->asid = from->asid; +/* asid not copied, it is handled manually for svm->vmcb. */ dst->tlb_ctl = from->tlb_ctl; dst->int_ctl = from->int_ctl; dst->int_vector = from->int_vector;
arch/x86/kvm/vmx.c +1 -1
@@ -7844,7 +7844,7 @@ static bool nested_vmx_exit_handled(struct kvm_vcpu *vcpu)return true; } -switch (exit_reason) { +switch ((u16 )exit_reason) {case EXIT_REASON_EXCEPTION_NMI :if (is_nmi (intr_info))return false;
arch/x86/mm/init.c +0 -2
@@ -109,8 +109,6 @@ __ref void *alloc_low_pages(unsigned int num) }else { pfn = pgt_buf_end; pgt_buf_end += num; -printk (KERN_DEBUG "BRK [%#010lx, %#010lx] PGTABLE\n" , - pfn <<PAGE_SHIFT , (pgt_buf_end <<PAGE_SHIFT ) -1 ); }for (i =0 ; i < num; i++) {
drivers/acpi/device_pm.c +1 -1
@@ -170,7 +170,7 @@ int acpi_device_set_power(struct acpi_device *device, int state)* possibly drop references to the power resources in use. */ state =ACPI_STATE_D3_HOT ; -/* If _PR3 is not available, use D3hot as the target state. */ +/* If D3cold is not supported, use D3hot as the target state. */ if (!device->power.states[ACPI_STATE_D3_COLD ].flags.valid) target_state = state; }else if (!device->power.states[state].flags.valid) {
drivers/acpi/scan.c +19 -9
@@ -907,12 +907,9 @@ static void acpi_bus_init_power_state(struct acpi_device *device, int state)if (buffer.length && package && package->type ==ACPI_TYPE_PACKAGE - && package->package.count) { -int err =acpi_extract_power_resources (package,0 , - &ps->resources); -if (!err) - device->power.flags.power_resources =1 ; - } + && package->package.count) +acpi_extract_power_resources (package,0 , &ps->resources); +ACPI_FREE (buffer.pointer); }
@@ -959,14 +956,27 @@ static void acpi_bus_get_power_flags(struct acpi_device *device)acpi_bus_init_power_state (device, i);INIT_LIST_HEAD (&device->power.states[ACPI_STATE_D3_COLD ].resources); -if (!list_empty (&device->power.states[ACPI_STATE_D3_HOT ].resources)) - device->power.states[ACPI_STATE_D3_COLD ].flags.valid =1 ; -/* Set defaults for D0 and D3hot states (always valid) */ +/* Set the defaults for D0 and D3hot (always supported). */ device->power.states[ACPI_STATE_D0 ].flags.valid =1 ; device->power.states[ACPI_STATE_D0 ].power =100 ; device->power.states[ACPI_STATE_D3_HOT ].flags.valid =1 ; +/* +* Use power resources only if the D0 list of them is populated, because +* some platforms may provide _PR3 only to indicate D3cold support and +* in those cases the power resources list returned by it may be bogus. +*/ +if (!list_empty (&device->power.states[ACPI_STATE_D0 ].resources)) { + device->power.flags.power_resources =1 ; +/* +* D3cold is supported if the D3hot list of power resources is +* not empty. +*/ +if (!list_empty (&device->power.states[ACPI_STATE_D3_HOT ].resources)) + device->power.states[ACPI_STATE_D3_COLD ].flags.valid =1 ; + } +if (acpi_bus_init_power (device)) device->flags.power_manageable =0 ; }
drivers/acpi/sysfs.c +3 -1
@@ -831,8 +831,10 @@ void acpi_sysfs_add_hotplug_profile(struct acpi_hotplug_profile *hotplug, error =kobject_init_and_add (&hotplug->kobj, &acpi_hotplug_profile_ktype, hotplug_kobj,"%s" , name); -if (error) +if (error) { +kobject_put (&hotplug->kobj); goto err_out; + }kobject_uevent (&hotplug->kobj,KOBJ_ADD );return ;
drivers/clocksource/dw_apb_timer_of.c +2 -4
@@ -134,16 +134,14 @@ static int num_called;static void __init dw_apb_timer_init (struct device_node *timer) {switch (num_called) { -case 0 : -pr_debug ("%s: found clockevent timer\n" , __func__); -add_clockevent (timer); -break ;case 1 :pr_debug ("%s: found clocksource timer\n" , __func__);add_clocksource (timer);init_sched_clock ();break ;default : +pr_debug ("%s: found clockevent timer\n" , __func__); +add_clockevent (timer);break ; }
drivers/cpuidle/sysfs.c +3 -3
@@ -412,7 +412,7 @@ static int cpuidle_add_state_sysfs(struct cpuidle_device *device) ret =kobject_init_and_add (&kobj->kobj, &ktype_state_cpuidle, &kdev->kobj,"state%d" , i);if (ret) { -kfree (kobj); +kobject_put (&kobj->kobj); goto error_state; }kobject_uevent (&kobj->kobj,KOBJ_ADD );
@@ -542,7 +542,7 @@ static int cpuidle_add_driver_sysfs(struct cpuidle_device *dev) ret =kobject_init_and_add (&kdrv->kobj, &ktype_driver_cpuidle, &kdev->kobj,"driver" );if (ret) { -kfree (kdrv); +kobject_put (&kdrv->kobj);return ret; }
@@ -636,7 +636,7 @@ int cpuidle_add_sysfs(struct cpuidle_device *dev) error =kobject_init_and_add (&kdev->kobj, &ktype_cpuidle, &cpu_dev->kobj,"cpuidle" );if (error) { -kfree (kdev); +kobject_put (&kdev->kobj);return error; }
drivers/firmware/efi/efivars.c +3 -1
@@ -585,8 +585,10 @@ efivar_create_sysfs_entry(struct efivar_entry *new_var) ret =kobject_init_and_add (&new_var->kobj, &efivar_ktype,NULL ,"%s" , short_name);kfree (short_name); -if (ret) +if (ret) { +kobject_put (&new_var->kobj);return ret; + }kobject_uevent (&new_var->kobj,KOBJ_ADD );efivar_entry_add (new_var, &efivar_sysfs_list);
drivers/macintosh/windfarm_pm112.c +14 -8
@@ -13,6 +13,7 @@#include <linux/device.h> #include <linux/platform_device.h> #include <linux/reboot.h> +#include <linux/slab.h> #include <asm/prom.h> #include <asm/smu.h>
@@ -133,14 +134,6 @@ static int create_cpu_loop(int cpu)s32 tmax;int fmin; -/* Get PID params from the appropriate SAT */ - hdr =smu_sat_get_sdb_partition (chip,0xC8 + core,NULL ); -if (hdr ==NULL ) { -printk (KERN_WARNING "windfarm: can't get CPU PID fan config\n" ); -return -EINVAL ; - } - piddata = (struct smu_sdbp_cpupiddata *)&hdr[1 ]; -/* Get FVT params to get Tmax; if not found, assume default */ hdr =smu_sat_get_sdb_partition (chip,0xC4 + core,NULL );if (hdr) {
@@ -153,6 +146,16 @@ static int create_cpu_loop(int cpu)if (tmax < cpu_all_tmax) cpu_all_tmax = tmax; +kfree (hdr); + +/* Get PID params from the appropriate SAT */ + hdr =smu_sat_get_sdb_partition (chip,0xC8 + core,NULL ); +if (hdr ==NULL ) { +printk (KERN_WARNING "windfarm: can't get CPU PID fan config\n" ); +return -EINVAL ; + } + piddata = (struct smu_sdbp_cpupiddata *)&hdr[1 ]; +/* * Darwin has a minimum fan speed of 1000 rpm for the 4-way and * 515 for the 2-way. That appears to be overkill, so for now,
@@ -175,6 +178,9 @@ static int create_cpu_loop(int cpu) pid.min = fmin;wf_cpu_pid_init (&cpu_pid[cpu], &pid); + +kfree (hdr); +return 0 ; }
drivers/md/md.c +2 -1
@@ -7038,7 +7038,8 @@ static int md_open(struct block_device *bdev, fmode_t mode)*/ mddev_put (mddev);/* Wait until bdev->bd_disk is definitely gone */ -flush_workqueue (md_misc_wq); +if (work_pending (&mddev->del_work)) +flush_workqueue (md_misc_wq);/* Then retry the open from the top */ return -ERESTARTSYS ; }
drivers/media/usb/dvb-usb/dibusb-mb.c +1 -1
@@ -84,7 +84,7 @@ static int dibusb_tuner_probe_and_attach(struct dvb_usb_adapter *adap)if (i2c_transfer (&adap->dev->i2c_adap, msg,2 ) !=2 ) {err ("tuner i2c write failed." ); - ret = -EREMOTEIO ; +return -EREMOTEIO ; }if (adap->fe_adap[0 ].fe->ops.i2c_gate_ctrl)
drivers/media/usb/go7007/snd-go7007.c +17 -18
@@ -243,22 +243,18 @@ int go7007_snd_init(struct go7007 *go) gosnd->capturing =0 ; ret =snd_card_new (go->dev, index[dev], id[dev],THIS_MODULE ,0 , &gosnd->card); -if (ret <0 ) { -kfree (gosnd); -return ret; - } +if (ret <0 ) + goto free_snd; + ret =snd_device_new (gosnd->card,SNDRV_DEV_LOWLEVEL , go, &go7007_snd_device_ops); -if (ret <0 ) { -kfree (gosnd); -return ret; - } +if (ret <0 ) + goto free_card; + ret =snd_pcm_new (gosnd->card,"go7007" ,0 ,0 ,1 , &gosnd->pcm); -if (ret <0 ) { -snd_card_free (gosnd->card); -kfree (gosnd); -return ret; - } +if (ret <0 ) + goto free_card; +strlcpy (gosnd->card->driver,"go7007" ,sizeof (gosnd->card->driver));strlcpy (gosnd->card->shortname, go->name,sizeof (gosnd->card->driver)); strlcpy(gosnd->card->longname, gosnd->card->shortname,
@@ -269,11 +265,8 @@ int go7007_snd_init(struct go7007 *go) &go7007_snd_capture_ops); ret =snd_card_register (gosnd->card); -if (ret <0 ) { -snd_card_free (gosnd->card); -kfree (gosnd); -return ret; - } +if (ret <0 ) + goto free_card; gosnd->substream =NULL ; go->snd_context = gosnd;
@@ -281,6 +274,12 @@ int go7007_snd_init(struct go7007 *go) ++dev;return 0 ; + +free_card: +snd_card_free (gosnd->card); +free_snd: +kfree (gosnd); +return ret; }EXPORT_SYMBOL (go7007_snd_init);
drivers/net/can/usb/kvaser_usb.c +3 -3
@@ -787,7 +787,7 @@ static int kvaser_usb_simple_msg_async(struct kvaser_usb_net_priv *priv,return -ENOMEM ; } - buf =kmalloc (sizeof (struct kvaser_msg ),GFP_ATOMIC ); + buf =kzalloc (sizeof (struct kvaser_msg ),GFP_ATOMIC );if (!buf) {usb_free_urb (urb);return -ENOMEM ;
@@ -1457,7 +1457,7 @@ static int kvaser_usb_set_opt_mode(const struct kvaser_usb_net_priv *priv)struct kvaser_msg *msg;int rc; - msg =kmalloc (sizeof (*msg),GFP_KERNEL ); + msg =kzalloc (sizeof (*msg),GFP_KERNEL );if (!msg)return -ENOMEM ;
@@ -1590,7 +1590,7 @@ static int kvaser_usb_flush_queue(struct kvaser_usb_net_priv *priv)struct kvaser_msg *msg;int rc; - msg =kmalloc (sizeof (*msg),GFP_KERNEL ); + msg =kzalloc (sizeof (*msg),GFP_KERNEL );if (!msg)return -ENOMEM ;
drivers/net/ethernet/allwinner/sun4i-emac.c +2 -2
@@ -438,7 +438,7 @@ static void emac_timeout(struct net_device *dev)/* Hardware start transmission. * Send a packet to media from the upper layer. */ -static int emac_start_xmit (struct sk_buff *skb,struct net_device *dev) +static netdev_tx_t emac_start_xmit (struct sk_buff *skb,struct net_device *dev) {struct emac_board_info *db =netdev_priv (dev);unsigned long channel;
@@ -446,7 +446,7 @@ static int emac_start_xmit(struct sk_buff *skb, struct net_device *dev) channel = db->tx_fifo_stat &3 ;if (channel ==3 ) -return 1 ; +return NETDEV_TX_BUSY ; channel = (channel ==1 ?1 :0 );
drivers/net/ethernet/intel/e1000/e1000_main.c +3 -1
@@ -3162,8 +3162,9 @@ static netdev_tx_t e1000_xmit_frame(struct sk_buff *skb, hdr_len =skb_transport_offset (skb) +tcp_hdrlen (skb);if (skb->data_len && hdr_len == len) {switch (hw->mac_type) { +case e1000_82544: {unsigned int pull_size; -case e1000_82544: +/* Make sure we have room to chop off 4 bytes, * and that the end alignment will work out to * this hardware's requirements
@@ -3184,6 +3185,7 @@ static netdev_tx_t e1000_xmit_frame(struct sk_buff *skb, } len =skb_headlen (skb);break ; + }default :/* do nothing */ break ;
drivers/net/ethernet/intel/e1000e/e1000.h +0 -1
@@ -585,7 +585,6 @@ static inline u32 __er32(struct e1000_hw *hw, unsigned long reg)#define er32 (reg) __er32(hw, E1000_##reg) -s32 __ew32_prepare (struct e1000_hw *hw);void __ew32 (struct e1000_hw *hw,unsigned long reg,u32 val);#define ew32 (reg, val) __ew32(hw, E1000_##reg, (val))
drivers/net/ethernet/intel/e1000e/netdev.c +5 -7
@@ -136,14 +136,12 @@ static const struct e1000_reg_info e1000_reg_info_tbl[] = {* has bit 24 set while ME is accessing MAC CSR registers, wait if it is set * and try again a number of times. **/ -s32 __ew32_prepare (struct e1000_hw *hw) +static void __ew32_prepare (struct e1000_hw *hw) {s32 i =E1000_ICH_FWSM_PCIM2PCI_COUNT ;while ((er32 (FWSM ) &E1000_ICH_FWSM_PCIM2PCI ) && --i)udelay (50 ); - -return i; }void __ew32 (struct e1000_hw *hw,unsigned long reg,u32 val)
@@ -624,11 +622,11 @@ static void e1000e_update_rdt_wa(struct e1000_ring *rx_ring, unsigned int i) {struct e1000_adapter *adapter = rx_ring->adapter;struct e1000_hw *hw = &adapter->hw; -s32 ret_val =__ew32_prepare (hw); +__ew32_prepare (hw);writel (i, rx_ring->tail); -if (unlikely (!ret_val && (i !=readl (rx_ring->tail)))) { +if (unlikely (i !=readl (rx_ring->tail))) {u32 rctl =er32 (RCTL );ew32 (RCTL , rctl & ~E1000_RCTL_EN );
@@ -641,11 +639,11 @@ static void e1000e_update_tdt_wa(struct e1000_ring *tx_ring, unsigned int i) {struct e1000_adapter *adapter = tx_ring->adapter;struct e1000_hw *hw = &adapter->hw; -s32 ret_val =__ew32_prepare (hw); +__ew32_prepare (hw);writel (i, tx_ring->tail); -if (unlikely (!ret_val && (i !=readl (tx_ring->tail)))) { +if (unlikely (i !=readl (tx_ring->tail))) {u32 tctl =er32 (TCTL );ew32 (TCTL , tctl & ~E1000_TCTL_EN );
drivers/net/ethernet/intel/igb/e1000_regs.h +1 -2
@@ -386,8 +386,7 @@ do { \#define array_wr32 (reg, offset, value) \ wr32((reg) + ((offset) << 2), (value)) -#define array_rd32 (reg, offset) \ - (readl(hw->hw_addr + reg + ((offset) << 2))) +#define array_rd32 (reg, offset) (igb_rd32(hw, reg + ((offset) << 2)))/* DMA Coalescing registers */ #define E1000_PCIEMISC 0x05BB8/* PCIE misc config register */
drivers/net/ethernet/intel/igb/igb_ethtool.c +2 -1
@@ -143,7 +143,8 @@ static int igb_get_settings(struct net_device *netdev, struct ethtool_cmd *ecmd)u32 status;u32 speed; - status =rd32 (E1000_STATUS ); + status =pm_runtime_suspended (&adapter->pdev->dev) ? +0 :rd32 (E1000_STATUS );if (hw->phy.media_type == e1000_media_type_copper) { ecmd->supported = (SUPPORTED_10baseT_Half |
drivers/net/ethernet/intel/igb/igb_main.c +2 -3
@@ -946,7 +946,6 @@ static void igb_configure_msix(struct igb_adapter *adapter)static int igb_request_msix (struct igb_adapter *adapter) {struct net_device *netdev = adapter->netdev; -struct e1000_hw *hw = &adapter->hw;int i, err =0 , vector =0 , free_vector =0 ; err = request_irq(adapter->msix_entries[vector].vector,
@@ -959,7 +958,7 @@ static int igb_request_msix(struct igb_adapter *adapter) vector++; - q_vector->itr_register = hw->hw_addr +E1000_EITR (vector); + q_vector->itr_register = adapter->io_addr +E1000_EITR (vector);if (q_vector->rx.ring && q_vector->tx.ring) sprintf(q_vector->name, "%s-TxRx-%u", netdev->name,
@@ -1230,7 +1229,7 @@ static int igb_alloc_q_vector(struct igb_adapter *adapter, q_vector->tx.work_limit = adapter->tx_work_limit;/* initialize ITR configuration */ - q_vector->itr_register = adapter->hw.hw_addr +E1000_EITR (0 ); + q_vector->itr_register = adapter->io_addr +E1000_EITR (0 ); q_vector->itr_val =IGB_START_ITR ;/* initialize pointer to rings */
drivers/net/ethernet/intel/ixgbe/ixgbe_common.c +1 -1
@@ -2185,7 +2185,7 @@ s32 ixgbe_fc_enable_generic(struct ixgbe_hw *hw) }/* Configure pause time (2 TCs per register) */ - reg = hw->fc.pause_time *0x00010001 ; + reg = hw->fc.pause_time *0x00010001U ;for (i =0 ; i < (MAX_TRAFFIC_CLASS /2 ); i++)IXGBE_WRITE_REG (hw,IXGBE_FCTTV (i), reg);
drivers/net/ethernet/nxp/lpc_eth.c +2 -1
@@ -865,7 +865,8 @@ static int lpc_mii_init(struct netdata_local *pldat)if (mdiobus_register (pldat->mii_bus)) goto err_out_free_mdio_irq; -if (lpc_mii_probe (pldat->ndev) !=0 ) + err =lpc_mii_probe (pldat->ndev); +if (err) goto err_out_unregister_bus;return 0 ;
drivers/net/macvlan.c +4 -0
@@ -420,6 +420,10 @@ static rx_handler_result_t macvlan_handle_frame(struct sk_buff **pskb)int ret;rx_handler_result_t handle_res; +/* Packets from dev_loopback_xmit() do not have L2 header, bail out */ +if (unlikely (skb->pkt_type ==PACKET_LOOPBACK )) +return RX_HANDLER_PASS ; + port =macvlan_port_get_rcu (skb->dev);if (is_multicast_ether_addr (eth->h_dest)) { skb =ip_check_defrag (dev_net (skb->dev), skb,IP_DEFRAG_MACVLAN );
drivers/net/phy/marvell.c +1 -1
@@ -1091,7 +1091,7 @@ static struct phy_driver marvell_drivers[] = { .features = PHY_GBIT_FEATURES, .flags = PHY_HAS_INTERRUPT, .config_init = &m88e1145_config_init, - .config_aneg = &marvell_config_aneg, + .config_aneg = &m88e1101_config_aneg, .read_status = &genphy_read_status, .ack_interrupt = &marvell_ack_interrupt, .config_intr = &marvell_config_intr,
drivers/net/vmxnet3/vmxnet3_ethtool.c +2 -0
@@ -664,6 +664,8 @@ vmxnet3_get_rss(struct net_device *netdev, u32 *p, u8 *key, u8 *hfunc) *hfunc =ETH_RSS_HASH_TOP ;if (!p)return 0 ; +if (n >UPT1_RSS_MAX_IND_TABLE_SIZE ) +return 0 ;while (n--) p[n] = rssConf->indTable[n];return 0 ;
drivers/net/vxlan.c +4 -0
@@ -1476,6 +1476,10 @@ static struct sk_buff *vxlan_na_create(struct sk_buff *request, daddr =eth_hdr (request)->h_source; ns_olen = request->len -skb_transport_offset (request) -sizeof (*ns);for (i =0 ; i < ns_olen-1 ; i += (ns->opt[i+1 ]<<3 )) { +if (!ns->opt[i +1 ]) { +kfree_skb (reply); +return NULL ; + }if (ns->opt[i] ==ND_OPT_SOURCE_LL_ADDR ) { daddr = ns->opt + i +sizeof (struct nd_opt_hdr );break ;
drivers/net/wireless/ath/ath9k/hif_usb.c +45 -13
164 lines not on this page · raw message
drivers/net/wireless/ath/ath9k/hif_usb.h +6 -0
@@ -84,6 +84,11 @@ struct tx_buf {struct list_head list; }; +struct rx_buf { +struct sk_buff *skb; +struct hif_device_usb *hif_dev; +}; +#define HIF_USB_TX_STOP BIT(0)#define HIF_USB_TX_FLUSH BIT(1)
@@ -131,5 +136,6 @@ struct hif_device_usb {int ath9k_hif_usb_init (void );void ath9k_hif_usb_exit (void ); +void ath9k_hif_usb_dealloc_urbs (struct hif_device_usb *hif_dev);#endif /* HTC_USB_H */
drivers/net/wireless/ath/ath9k/htc_drv_init.c +7 -3
@@ -931,8 +931,9 @@ err_init:int ath9k_htc_probe_device (struct htc_target *htc_handle,struct device *dev,u16 devid,char *product,u32 drv_info) { -struct ieee80211_hw *hw; +struct hif_device_usb *hif_dev;struct ath9k_htc_priv *priv; +struct ieee80211_hw *hw;int ret; hw =ieee80211_alloc_hw (sizeof (struct ath9k_htc_priv ), &ath9k_htc_ops);
@@ -967,7 +968,10 @@ int ath9k_htc_probe_device(struct htc_target *htc_handle, struct device *dev,return 0 ; err_init: -ath9k_deinit_wmi (priv); +ath9k_stop_wmi (priv); + hif_dev = (struct hif_device_usb *)htc_handle->hif_dev; +ath9k_hif_usb_dealloc_urbs (hif_dev); +ath9k_destoy_wmi (priv); err_free:ieee80211_free_hw (hw);return ret;
@@ -982,7 +986,7 @@ void ath9k_htc_disconnect_device(struct htc_target *htc_handle, bool hotunplug) htc_handle->drv_priv->ah->ah_flags |=AH_UNPLUGGED ;ath9k_deinit_device (htc_handle->drv_priv); -ath9k_deinit_wmi (htc_handle->drv_priv); +ath9k_stop_wmi (htc_handle->drv_priv);ieee80211_free_hw (htc_handle->drv_priv->hw); } }
drivers/net/wireless/ath/ath9k/htc_drv_txrx.c +3 -3
@@ -998,9 +998,9 @@ static bool ath9k_rx_prepare(struct ath9k_htc_priv *priv,* which are not PHY_ERROR (short radar pulses have a length of 3) */ if (unlikely (!rs_datalen || (rs_datalen <10 && !is_phyerr))) { -ath_warn (common, -"Short RX data len, dropping (dlen: %d)\n" , - rs_datalen); +ath_dbg (common,ANY , +"Short RX data len, dropping (dlen: %d)\n" , + rs_datalen); goto rx_next; }
drivers/net/wireless/ath/ath9k/htc_hst.c +3 -0
@@ -114,6 +114,9 @@ static void htc_process_conn_rsp(struct htc_target *target,if (svc_rspmsg->status ==HTC_SERVICE_SUCCESS ) { epid = svc_rspmsg->endpoint_id; +if (epid <0 || epid >=ENDPOINT_MAX ) +return ; + service_id =be16_to_cpu (svc_rspmsg->service_id); max_msglen =be16_to_cpu (svc_rspmsg->max_msg_len); endpoint = &target->endpoint[epid];
drivers/net/wireless/ath/ath9k/wmi.c +4 -1
@@ -112,14 +112,17 @@ struct wmi *ath9k_init_wmi(struct ath9k_htc_priv *priv)return wmi; } -void ath9k_deinit_wmi (struct ath9k_htc_priv *priv) +void ath9k_stop_wmi (struct ath9k_htc_priv *priv) {struct wmi *wmi = priv->wmi;mutex_lock (&wmi->op_mutex); wmi->stopped = true;mutex_unlock (&wmi->op_mutex); +} +void ath9k_destoy_wmi (struct ath9k_htc_priv *priv) +{kfree (priv->wmi); }
drivers/net/wireless/ath/ath9k/wmi.h +2 -1
@@ -179,7 +179,6 @@ struct wmi { };struct wmi *ath9k_init_wmi (struct ath9k_htc_priv *priv); -void ath9k_deinit_wmi (struct ath9k_htc_priv *priv);int ath9k_wmi_connect (struct htc_target *htc,struct wmi *wmi,enum htc_endpoint_id *wmi_ctrl_epid); int ath9k_wmi_cmd(struct wmi *wmi, enum wmi_cmd_id cmd_id,
@@ -189,6 +188,8 @@ int ath9k_wmi_cmd(struct wmi *wmi, enum wmi_cmd_id cmd_id,void ath9k_wmi_event_tasklet (unsigned long data);void ath9k_fatal_work (struct work_struct *work);void ath9k_wmi_event_drain (struct ath9k_htc_priv *priv); +void ath9k_stop_wmi (struct ath9k_htc_priv *priv); +void ath9k_destoy_wmi (struct ath9k_htc_priv *priv);#define WMI_CMD (_wmi_cmd) \ do { \
drivers/net/wireless/ath/carl9170/fw.c +1 -3
@@ -351,9 +351,7 @@ static int carl9170_fw(struct ar9170 *ar, const __u8 *data, size_t len) ar->hw->wiphy->interface_modes |=BIT (NL80211_IFTYPE_ADHOC );if (SUPP (CARL9170FW_WLANTX_CAB )) { - if_comb_types |= -BIT (NL80211_IFTYPE_AP ) | -BIT (NL80211_IFTYPE_P2P_GO ); + if_comb_types |=BIT (NL80211_IFTYPE_AP );#ifdef CONFIG_MAC80211_MESH if_comb_types |=
drivers/net/wireless/ath/carl9170/main.c +4 -17
@@ -582,11 +582,10 @@ static int carl9170_init_interface(struct ar9170 *ar, ar->disable_offload |= ((vif->type !=NL80211_IFTYPE_STATION ) && (vif->type !=NL80211_IFTYPE_AP )); -/* While the driver supports HW offload in a single -* P2P client configuration, it doesn't support HW -* offload in the favourit, concurrent P2P GO+CLIENT -* configuration. Hence, HW offload will always be -* disabled for P2P. +/* The driver used to have P2P GO+CLIENT support, +* but since this was dropped and we don't know if +* there are any gremlins lurking in the shadows, +* so best we keep HW offload disabled for P2P. */ ar->disable_offload |= vif->p2p;
@@ -639,18 +638,6 @@ static int carl9170_op_add_interface(struct ieee80211_hw *hw,if (vif->type ==NL80211_IFTYPE_STATION )break ; -/* P2P GO [master] use-case -* Because the P2P GO station is selected dynamically -* by all participating peers of a WIFI Direct network, -* the driver has be able to change the main interface -* operating mode on the fly. -*/ -if (main_vif->p2p && vif->p2p && - vif->type ==NL80211_IFTYPE_AP ) { - old_main = main_vif; -break ; - } - err = -EBUSY ;rcu_read_unlock ();
drivers/net/wireless/b43/main.c +1 -1
@@ -5611,7 +5611,7 @@ static struct b43_wl *b43_wireless_init(struct b43_bus_dev *dev)/* fill hw info */ ieee80211_hw_set (hw,RX_INCLUDES_FCS );ieee80211_hw_set (hw,SIGNAL_DBM ); - +ieee80211_hw_set (hw,MFP_CAPABLE ); hw->wiphy->interface_modes =BIT (NL80211_IFTYPE_AP ) | BIT(NL80211_IFTYPE_MESH_POINT) |
drivers/net/wireless/b43legacy/main.c +1 -0
@@ -3835,6 +3835,7 @@ static int b43legacy_wireless_init(struct ssb_device *dev)/* fill hw info */ ieee80211_hw_set (hw,RX_INCLUDES_FCS );ieee80211_hw_set (hw,SIGNAL_DBM ); +ieee80211_hw_set (hw,MFP_CAPABLE );/* Allow WPA3 in software */ hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_AP) |
drivers/net/wireless/b43legacy/xmit.c +1 -0
@@ -571,6 +571,7 @@ void b43legacy_rx(struct b43legacy_wldev *dev,default :b43legacywarn (dev->wl,"Unexpected value for chanstat (0x%X)\n" , chanstat); + goto drop; }memcpy (IEEE80211_SKB_RXCB (skb), &status,sizeof (status));
drivers/net/wireless/mwifiex/cfg80211.c +6 -8
@@ -1387,7 +1387,8 @@ mwifiex_cfg80211_dump_station(struct wiphy *wiphy, struct net_device *dev, int idx, u8 *mac, struct station_info *sinfo) { struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); -static struct mwifiex_sta_node *node; +struct mwifiex_sta_node *node; +int i;if ((GET_BSS_ROLE (priv) ==MWIFIEX_BSS_ROLE_STA ) && priv->media_connected && idx ==0 ) {
@@ -1397,13 +1398,10 @@ mwifiex_cfg80211_dump_station(struct wiphy *wiphy, struct net_device *dev,mwifiex_send_cmd (priv,HOST_CMD_APCMD_STA_LIST , HostCmd_ACT_GEN_GET,0 ,NULL , true); -if (node && (&node->list == &priv->sta_list)) { - node =NULL ; -return -ENOENT ; - } - - node =list_prepare_entry (node, &priv->sta_list, list); -list_for_each_entry_continue (node, &priv->sta_list, list) { + i =0 ; +list_for_each_entry (node, &priv->sta_list, list) { +if (i++ != idx) +continue ;ether_addr_copy (mac, node->mac_addr);return mwifiex_dump_station_info (priv, node, sinfo); }
drivers/pci/probe.c +22 -2
@@ -1226,7 +1226,7 @@ int pci_setup_device(struct pci_dev *dev)/* device class may be changed after fixup */ class = dev->class >>8 ; -if (dev->non_compliant_bars) { +if (dev->non_compliant_bars && !dev->mmio_always_on) {pci_read_config_word (dev,PCI_COMMAND , &cmd);if (cmd & (PCI_COMMAND_IO |PCI_COMMAND_MEMORY )) {dev_info (&dev->dev,"device has non-compliant BARs; disabling IO/MEM decoding\n" );
@@ -1335,13 +1335,33 @@ static void pci_configure_mps(struct pci_dev *dev)struct pci_dev *bridge =pci_upstream_bridge (dev);int mps, p_mps, rc; -if (!pci_is_pcie (dev) || !bridge || !pci_is_pcie (bridge)) +if (!pci_is_pcie (dev))return ;/* MPS and MRRS fields are of type 'RsvdP' for VFs, short-circuit out */ if (dev->is_virtfn)return ; +/* +* For Root Complex Integrated Endpoints, program the maximum +* supported value unless limited by the PCIE_BUS_PEER2PEER case. +*/ +if (pci_pcie_type (dev) ==PCI_EXP_TYPE_RC_END ) { +if (pcie_bus_config ==PCIE_BUS_PEER2PEER ) + mps =128 ; +else + mps =128 << dev->pcie_mpss; + rc =pcie_set_mps (dev, mps); +if (rc) { +dev_warn (&dev->dev,"can't set Max Payload Size to %d; if necessary, use \"pci=pcie_bus_safe\" and report a bug\n" , + mps); + } +return ; + } + +if (!bridge || !pci_is_pcie (bridge)) +return ; + mps =pcie_get_mps (dev); p_mps =pcie_get_mps (bridge);
drivers/pinctrl/samsung/pinctrl-exynos.c +9 -0
@@ -288,6 +288,7 @@ struct exynos_eint_gpio_save {u32 eint_con;u32 eint_fltcon0;u32 eint_fltcon1; +u32 eint_mask; };/*
@@ -588,10 +589,13 @@ static void exynos_pinctrl_suspend_bank( + 2 * bank->eint_offset); save->eint_fltcon1 =readl (regs +EXYNOS_GPIO_EFLTCON_OFFSET +2 * bank->eint_offset +4 ); + save->eint_mask =readl (regs + bank->irq_chip->eint_mask + + bank->eint_offset);pr_debug ("%s: save con %#010x\n" , bank->name, save->eint_con);pr_debug ("%s: save fltcon0 %#010x\n" , bank->name, save->eint_fltcon0);pr_debug ("%s: save fltcon1 %#010x\n" , bank->name, save->eint_fltcon1); +pr_debug ("%s: save mask %#010x\n" , bank->name, save->eint_mask); }static void exynos_pinctrl_suspend (struct samsung_pinctrl_drv_data *drvdata)
@@ -620,6 +624,9 @@ static void exynos_pinctrl_resume_bank(pr_debug ("%s: fltcon1 %#010x => %#010x\n" , bank->name,readl (regs +EXYNOS_GPIO_EFLTCON_OFFSET +2 * bank->eint_offset +4 ), save->eint_fltcon1); +pr_debug ("%s: mask %#010x => %#010x\n" , bank->name, +readl (regs + bank->irq_chip->eint_mask + + bank->eint_offset), save->eint_mask);writel (save->eint_con, regs +EXYNOS_GPIO_ECON_OFFSET + bank->eint_offset);
@@ -627,6 +634,8 @@ static void exynos_pinctrl_resume_bank( + 2 * bank->eint_offset);writel (save->eint_fltcon1, regs +EXYNOS_GPIO_EFLTCON_OFFSET +2 * bank->eint_offset +4 ); +writel (save->eint_mask, regs + bank->irq_chip->eint_mask + + bank->eint_offset); }static void exynos_pinctrl_resume (struct samsung_pinctrl_drv_data *drvdata)
drivers/power/reset/vexpress-poweroff.c +1 -0
@@ -150,6 +150,7 @@ static struct platform_driver vexpress_reset_driver = { .driver = { .name = "vexpress-reset", .of_match_table = vexpress_reset_of_match, + .suppress_bind_attrs = true, }, };
drivers/pwm/pwm-fsl-ftm.c +1 -1
@@ -392,7 +392,7 @@ static const struct regmap_config fsl_pwm_regmap_config = { .max_register = FTM_PWMLOAD, .volatile_reg = fsl_pwm_volatile_reg, - .cache_type = REGCACHE_RBTREE, + .cache_type = REGCACHE_FLAT, };static int fsl_pwm_probe (struct platform_device *pdev)
drivers/scsi/scsi_lib.c +2 -2
@@ -1118,10 +1118,10 @@ int scsi_init_io(struct scsi_cmnd *cmd)struct scsi_device *sdev = cmd->device;struct request *rq = cmd->request;bool is_mq = (rq->mq_ctx !=NULL ); -int error; +int error =BLKPREP_KILL ;if (WARN_ON_ONCE (!rq->nr_phys_segments)) -return -EINVAL ; + goto err_exit; error =scsi_init_sgtable (rq, &cmd->sdb);if (error)
drivers/spi/spi-bcm2835.c +3 -1
@@ -798,7 +798,7 @@ static int bcm2835_spi_probe(struct platform_device *pdev) goto out_clk_disable; } - err =devm_spi_register_master (&pdev->dev, master); + err =spi_register_master (master);if (err) {dev_err (&pdev->dev,"could not register SPI master: %d\n" , err); goto out_clk_disable;
@@ -818,6 +818,8 @@ static int bcm2835_spi_remove(struct platform_device *pdev)struct spi_master *master =platform_get_drvdata (pdev);struct bcm2835_spi *bs =spi_master_get_devdata (master); +spi_unregister_master (master); +/* Clear FIFOs, and disable the HW block */ bcm2835_wr (bs,BCM2835_SPI_CS ,BCM2835_SPI_CS_CLEAR_RX |BCM2835_SPI_CS_CLEAR_TX );
drivers/spi/spi-bcm2835aux.c +3 -1
@@ -457,7 +457,7 @@ static int bcm2835aux_spi_probe(struct platform_device *pdev) goto out_clk_disable; } - err =devm_spi_register_master (&pdev->dev, master); + err =spi_register_master (master);if (err) {dev_err (&pdev->dev,"could not register SPI master: %d\n" , err); goto out_clk_disable;
@@ -477,6 +477,8 @@ static int bcm2835aux_spi_remove(struct platform_device *pdev)struct spi_master *master =platform_get_drvdata (pdev);struct bcm2835aux_spi *bs =spi_master_get_devdata (master); +spi_unregister_master (master); +bcm2835aux_spi_reset_hw (bs);/* disable the HW block by releasing the clock */
drivers/spi/spi-dw-mid.c +11 -5
@@ -155,6 +155,7 @@ static struct dma_async_tx_descriptor *dw_spi_dma_prepare_tx(struct dw_spi *dws,if (!xfer->tx_buf)return NULL ; +memset (&txconf,0 ,sizeof (txconf)); txconf.direction =DMA_MEM_TO_DEV ; txconf.dst_addr = dws->dma_addr; txconf.dst_maxburst =16 ;
@@ -201,6 +202,7 @@ static struct dma_async_tx_descriptor *dw_spi_dma_prepare_rx(struct dw_spi *dws,if (!xfer->rx_buf)return NULL ; +memset (&rxconf,0 ,sizeof (rxconf)); rxconf.direction =DMA_DEV_TO_MEM ; rxconf.src_addr = dws->dma_addr; rxconf.src_maxburst =16 ;
@@ -226,19 +228,23 @@ static struct dma_async_tx_descriptor *dw_spi_dma_prepare_rx(struct dw_spi *dws,static int mid_spi_dma_setup (struct dw_spi *dws,struct spi_transfer *xfer) { -u16 dma_ctrl =0 ; +u16 imr =0 , dma_ctrl =0 ;dw_writel (dws,DW_SPI_DMARDLR ,0xf );dw_writel (dws,DW_SPI_DMATDLR ,0x10 ); -if (xfer->tx_buf) +if (xfer->tx_buf) { dma_ctrl |=SPI_DMA_TDMAE ; -if (xfer->rx_buf) + imr |=SPI_INT_TXOI ; + } +if (xfer->rx_buf) { dma_ctrl |=SPI_DMA_RDMAE ; + imr |=SPI_INT_RXUI |SPI_INT_RXOI ; + }dw_writel (dws,DW_SPI_DMACR , dma_ctrl);/* Set the interrupt mask */ -spi_umask_intr (dws,SPI_INT_TXOI |SPI_INT_RXUI |SPI_INT_RXOI ); +spi_umask_intr (dws, imr); dws->transfer_handler = dma_transfer;
@@ -268,7 +274,7 @@ static int mid_spi_dma_transfer(struct dw_spi *dws, struct spi_transfer *xfer)dma_async_issue_pending (dws->txchan); } -return 0 ; +return 1 ; }static void mid_spi_dma_stop (struct dw_spi *dws)
drivers/spi/spi-dw.c +7 -7
@@ -385,11 +385,8 @@ static int dw_spi_transfer_one(struct spi_master *master,spi_enable_chip (dws,1 ); -if (dws->dma_mapped) { - ret = dws->dma_ops->dma_transfer (dws, transfer); -if (ret <0 ) -return ret; - } +if (dws->dma_mapped) +return dws->dma_ops->dma_transfer (dws, transfer);if (chip->poll_mode)return poll_transfer (dws);
@@ -501,6 +498,8 @@ int dw_spi_add_host(struct device *dev, struct dw_spi *dws)snprintf (dws->name,sizeof (dws->name),"dw_spi%d" , dws->bus_num);spin_lock_init (&dws->buf_lock); +spi_master_set_devdata (master, dws); + ret =request_irq (dws->irq, dw_spi_irq,IRQF_SHARED , dws->name, master);if (ret <0 ) {dev_err (dev,"can not get IRQ\n" );
@@ -532,8 +531,7 @@ int dw_spi_add_host(struct device *dev, struct dw_spi *dws) } } -spi_master_set_devdata (master, dws); - ret =devm_spi_register_master (dev, master); + ret =spi_register_master (master);if (ret) {dev_err (&master->dev,"problem registering spi master\n" ); goto err_dma_exit;
@@ -557,6 +555,8 @@ void dw_spi_remove_host(struct dw_spi *dws) {dw_spi_debugfs_remove (dws); +spi_unregister_master (dws->master); +if (dws->dma_ops && dws->dma_ops->dma_exit) dws->dma_ops->dma_exit (dws);
drivers/spi/spi-pxa2xx.c +3 -1
@@ -1605,7 +1605,7 @@ static int pxa2xx_spi_probe(struct platform_device *pdev)/* Register with the SPI framework */ platform_set_drvdata (pdev, drv_data); - status =devm_spi_register_master (&pdev->dev, master); + status =spi_register_master (master);if (status !=0 ) {dev_err (&pdev->dev,"problem registering spi master\n" ); goto out_error_clock_enabled;
@@ -1635,6 +1635,8 @@ static int pxa2xx_spi_remove(struct platform_device *pdev)pm_runtime_get_sync (&pdev->dev); +spi_unregister_master (drv_data->master); +/* Disable the SSP at the peripheral and SOC level */ pxa2xx_spi_write (drv_data,SSCR0 ,0 );clk_disable_unprepare (ssp->clk);
drivers/spi/spi.c +2 -3
@@ -1917,18 +1917,17 @@ static int __unregister(struct device *dev, void *null)*/ void spi_unregister_master (struct spi_master *master) { -int dummy; -if (master->queued) {if (spi_destroy_queue (master))dev_err (&master->dev,"queue remove failed\n" ); } +device_for_each_child (&master->dev,NULL , __unregister); +mutex_lock (&board_lock);list_del (&master->list);mutex_unlock (&board_lock); - dummy =device_for_each_child (&master->dev,NULL , __unregister);device_unregister (&master->dev); }EXPORT_SYMBOL_GPL (spi_unregister_master);
drivers/staging/android/ion/ion_heap.c +2 -2
@@ -105,12 +105,12 @@ int ion_heap_map_user(struct ion_heap *heap, struct ion_buffer *buffer,static int ion_heap_clear_pages (struct page **pages,int num,pgprot_t pgprot) { -void *addr =vm_map_ram (pages, num,-1 , pgprot); +void *addr =vmap (pages, num,VM_MAP , pgprot);if (!addr)return -ENOMEM ;memset (addr,0 ,PAGE_SIZE * num); -vm_unmap_ram (addr, num); +vunmap (addr);return 0 ; }
drivers/video/fbdev/w100fb.c +2 -0
@@ -583,6 +583,7 @@ static void w100fb_restore_vidmem(struct w100fb_par *par) memsize=par->mach->mem->size;memcpy_toio (remapped_fbuf + (W100_FB_BASE -MEM_WINDOW_BASE ), par->saved_extmem, memsize);vfree (par->saved_extmem); + par->saved_extmem =NULL ; }if (par->saved_intmem) { memsize=MEM_INT_SIZE ;
@@ -591,6 +592,7 @@ static void w100fb_restore_vidmem(struct w100fb_par *par)else memcpy_toio (remapped_fbuf + (W100_FB_BASE -MEM_WINDOW_BASE ), par->saved_intmem, memsize);vfree (par->saved_intmem); + par->saved_intmem =NULL ; } }
drivers/w1/masters/omap_hdq.c +5 -5
@@ -204,7 +204,7 @@ static int hdq_write_byte(struct hdq_data *hdq_data, u8 val, u8 *status)/* check irqstatus */ if (!(*status &OMAP_HDQ_INT_STATUS_TXCOMPLETE )) {dev_dbg (hdq_data->dev,"timeout waiting for" -" TXCOMPLETE/RXCOMPLETE, %x" , *status); +" TXCOMPLETE/RXCOMPLETE, %x\n" , *status); ret = -ETIMEDOUT ; goto out; }
@@ -215,7 +215,7 @@ static int hdq_write_byte(struct hdq_data *hdq_data, u8 val, u8 *status) OMAP_HDQ_FLAG_CLEAR, &tmp_status);if (ret) {dev_dbg (hdq_data->dev,"timeout waiting GO bit" -" return to zero, %x" , tmp_status); +" return to zero, %x\n" , tmp_status); } out:
@@ -231,7 +231,7 @@ static irqreturn_t hdq_isr(int irq, void *_hdq)spin_lock_irqsave (&hdq_data->hdq_spinlock, irqflags); hdq_data->hdq_irqstatus =hdq_reg_in (hdq_data,OMAP_HDQ_INT_STATUS );spin_unlock_irqrestore (&hdq_data->hdq_spinlock, irqflags); -dev_dbg (hdq_data->dev,"hdq_isr: %x" , hdq_data->hdq_irqstatus); +dev_dbg (hdq_data->dev,"hdq_isr: %x\n" , hdq_data->hdq_irqstatus); if (hdq_data->hdq_irqstatus & (OMAP_HDQ_INT_STATUS_TXCOMPLETE | OMAP_HDQ_INT_STATUS_RXCOMPLETE
@@ -339,7 +339,7 @@ static int omap_hdq_break(struct hdq_data *hdq_data) tmp_status = hdq_data->hdq_irqstatus;/* check irqstatus */ if (!(tmp_status &OMAP_HDQ_INT_STATUS_TIMEOUT )) { -dev_dbg (hdq_data->dev,"timeout waiting for TIMEOUT, %x" , +dev_dbg (hdq_data->dev,"timeout waiting for TIMEOUT, %x\n" , tmp_status); ret = -ETIMEDOUT ; goto out;
@@ -366,7 +366,7 @@ static int omap_hdq_break(struct hdq_data *hdq_data) &tmp_status);if (ret)dev_dbg (hdq_data->dev,"timeout waiting INIT&GO bits" -" return to zero, %x" , tmp_status); +" return to zero, %x\n" , tmp_status); out:mutex_unlock (&hdq_data->hdq_mutex);
fs/btrfs/file-item.c +4 -2
@@ -742,10 +742,12 @@ again: nritems =btrfs_header_nritems (path->nodes[0 ]);if (!nritems || (path->slots[0 ] >= nritems -1 )) { ret =btrfs_next_leaf (root, path); -if (ret ==1 ) +if (ret <0 ) { + goto out; + }else if (ret >0 ) { found_next =1 ; -if (ret !=0 ) goto insert; + } slot = path->slots[0 ]; }btrfs_item_key_to_cpu (path->nodes[0 ], &found_key, slot);
fs/btrfs/inode.c +3 -3
@@ -8294,7 +8294,6 @@ static int btrfs_submit_direct_hook(int rw, struct btrfs_dio_private *dip, bio->bi_private = dip; bio->bi_end_io = btrfs_end_dio_bio;btrfs_io_bio (bio)->logical = file_offset; -atomic_inc (&dip->pending_bios);while (bvec <= (orig_bio->bi_io_vec + orig_bio->bi_vcnt -1 )) { if (map_length < submit_len + bvec->bv_len ||
@@ -8351,7 +8350,8 @@ submit:if (!ret)return 0 ; -bio_put (bio); +if (bio != orig_bio) +bio_put (bio); out_err: dip->errors =1 ;/*
@@ -8398,7 +8398,7 @@ static void btrfs_submit_direct(int rw, struct bio *dio_bio, io_bio->bi_private = dip; dip->orig_bio = io_bio; dip->dio_bio = dio_bio; -atomic_set (&dip->pending_bios,0 ); +atomic_set (&dip->pending_bios,1 ); btrfs_bio =btrfs_io_bio (io_bio); btrfs_bio->logical = file_offset;
fs/btrfs/ioctl.c +3 -0
@@ -59,6 +59,7 @@#include "props.h" #include "sysfs.h" #include "qgroup.h" +#include "tree-log.h" #ifdef CONFIG_64BIT /* If we have a 32-bit userspace and 64-bit kernel, then the UAPI
@@ -2540,6 +2541,8 @@ static noinline int btrfs_ioctl_snap_destroy(struct file *file, out_end_trans: trans->block_rsv =NULL ; trans->bytes_reserved =0 ; +if (!err) +btrfs_record_snapshot_destroy (trans, dir); ret =btrfs_end_transaction (trans, root);if (ret && !err) err = ret;
fs/btrfs/send.c +67 -0
91 lines not on this page · raw message
fs/btrfs/tree-log.c +15 -0
@@ -5694,6 +5694,21 @@ record:BTRFS_I (dir)->last_unlink_trans = trans->transid; } +/* +* Make sure that if someone attempts to fsync the parent directory of a deleted +* snapshot, it ends up triggering a transaction commit. This is to guarantee +* that after replaying the log tree of the parent directory's root we will not +* see the snapshot anymore and at log replay time we will not see any log tree +* corresponding to the deleted snapshot's root, which could lead to replaying +* it after replaying the log tree of the parent directory (which would replay +* the snapshot delete operation). +*/ +void btrfs_record_snapshot_destroy (struct btrfs_trans_handle *trans, +struct inode *dir) +{ +BTRFS_I (dir)->last_unlink_trans = trans->transid; +} +/* * Call this after adding a new name for a file and it will properly * update the log to reflect the new name.
fs/btrfs/tree-log.h +2 -0
@@ -79,6 +79,8 @@ int btrfs_pin_log_trans(struct btrfs_root *root);void btrfs_record_unlink_dir (struct btrfs_trans_handle *trans,struct inode *dir,struct inode *inode,int for_rename); +void btrfs_record_snapshot_destroy (struct btrfs_trans_handle *trans, +struct inode *dir);int btrfs_log_new_name (struct btrfs_trans_handle *trans,struct inode *inode,struct inode *old_dir,struct dentry *parent);
fs/ext4/ext4_extents.h +6 -3
@@ -169,10 +169,13 @@ struct ext4_ext_path { (EXT_FIRST_EXTENT((__hdr__)) + le16_to_cpu((__hdr__)->eh_entries) - 1)#define EXT_LAST_INDEX (__hdr__) \ (EXT_FIRST_INDEX((__hdr__)) + le16_to_cpu((__hdr__)->eh_entries) - 1) -#define EXT_MAX_EXTENT (__hdr__) \ - (EXT_FIRST_EXTENT((__hdr__)) + le16_to_cpu((__hdr__)->eh_max) - 1) +#define EXT_MAX_EXTENT (__hdr__) \ + ((le16_to_cpu((__hdr__)->eh_max)) ? \ + ((EXT_FIRST_EXTENT((__hdr__)) + le16_to_cpu((__hdr__)->eh_max) - 1)) \ + : 0)#define EXT_MAX_INDEX (__hdr__) \ - (EXT_FIRST_INDEX((__hdr__)) + le16_to_cpu((__hdr__)->eh_max) - 1) + ((le16_to_cpu((__hdr__)->eh_max)) ? \ + ((EXT_FIRST_INDEX((__hdr__)) + le16_to_cpu((__hdr__)->eh_max) - 1)) : 0)static inline struct ext4_extent_header *ext_inode_hdr (struct inode *inode) {
fs/fat/inode.c +6 -0
@@ -1422,6 +1422,12 @@ static int fat_read_bpb(struct super_block *sb, struct fat_boot_sector *b, goto out; } +if (bpb->fat_fat_length ==0 && bpb->fat32_length ==0 ) { +if (!silent) +fat_msg (sb,KERN_ERR ,"bogus number of FAT sectors" ); + goto out; + } + error =0 ; out:
fs/fs-writeback.c +1 -0
@@ -269,6 +269,7 @@ void __inode_attach_wb(struct inode *inode, struct page *page)if (unlikely (cmpxchg (&inode->i_wb,NULL , wb)))wb_put (wb); } +EXPORT_SYMBOL_GPL (__inode_attach_wb);/** * locked_inode_to_wb_and_lock_list - determine a locked inode's wb and lock it
fs/nilfs2/segment.c +2 -0
@@ -2781,6 +2781,8 @@ int nilfs_attach_log_writer(struct super_block *sb, struct nilfs_root *root)if (!nilfs->ns_writer)return -ENOMEM ; +inode_attach_wb (nilfs->ns_bdev->bd_inode,NULL ); + err =nilfs_segctor_start_thread (nilfs->ns_writer);if (err) {kfree (nilfs->ns_writer);
fs/overlayfs/copy_up.c +1 -1
@@ -24,7 +24,7 @@ int ovl_copy_xattr(struct dentry *old, struct dentry *new) {ssize_t list_size, size, value_size =0 ;char *buf, *name, *value =NULL ; -int uninitialized_var (error ); +int error =0 ;size_t slen; if (!old->d_inode->i_op->getxattr ||
fs/proc/inode.c +1 -1
@@ -415,7 +415,7 @@ const struct inode_operations proc_link_inode_operations = {struct inode *proc_get_inode (struct super_block *sb,struct proc_dir_entry *de) { -struct inode *inode =new_inode_pseudo (sb); +struct inode *inode =new_inode (sb);if (inode) { inode->i_ino = de->low_ino;
fs/proc/self.c +1 -1
@@ -51,7 +51,7 @@ int proc_setup_self(struct super_block *s)mutex_lock (&root_inode->i_mutex); self =d_alloc_name (s->s_root,"self" );if (self) { -struct inode *inode =new_inode_pseudo (s); +struct inode *inode =new_inode (s);if (inode) { inode->i_ino = self_inum; inode->i_mtime = inode->i_atime = inode->i_ctime =CURRENT_TIME ;
fs/proc/thread_self.c +1 -1
@@ -52,7 +52,7 @@ int proc_setup_thread_self(struct super_block *s)mutex_lock (&root_inode->i_mutex); thread_self =d_alloc_name (s->s_root,"thread-self" );if (thread_self) { -struct inode *inode =new_inode_pseudo (s); +struct inode *inode =new_inode (s);if (inode) { inode->i_ino = thread_self_inum; inode->i_mtime = inode->i_atime = inode->i_ctime =CURRENT_TIME ;
include/linux/kgdb.h +1 -1
@@ -317,7 +317,7 @@ extern void gdbstub_exit(int status);extern int kgdb_single_step;extern atomic_t kgdb_active;#define in_dbg_master () \ - (raw_smp_processor_id() == atomic_read(&kgdb_active)) + (irqs_disabled() && (smp_processor_id() == atomic_read(&kgdb_active)))extern bool dbg_is_early;extern void __init dbg_late_init (void );#else /* ! CONFIG_KGDB */
include/linux/sunrpc/gss_api.h +1 -0
@@ -81,6 +81,7 @@ struct pf_desc {u32 service;char *name;char *auth_domain_name; +struct auth_domain *domain; };/* Different mechanisms (e.g., krb5 or spkm3) may implement gss-api, and
include/linux/sunrpc/svcauth_gss.h +2 -1
@@ -20,7 +20,8 @@ int gss_svc_init(void);void gss_svc_shutdown (void );int gss_svc_init_net (struct net *net);void gss_svc_shutdown_net (struct net *net); -int svcauth_gss_register_pseudoflavor (u32 pseudoflavor,char * name); +struct auth_domain *svcauth_gss_register_pseudoflavor (u32 pseudoflavor, +char *name);u32 svcauth_gss_flavor (struct auth_domain *dom);#endif /* __KERNEL__ */
kernel/cpu_pm.c +2 -2
@@ -97,7 +97,7 @@ EXPORT_SYMBOL_GPL(cpu_pm_unregister_notifier);*/ int cpu_pm_enter (void ) { -int nr_calls; +int nr_calls =0 ;int ret =0 ;read_lock (&cpu_pm_notifier_lock);
@@ -156,7 +156,7 @@ EXPORT_SYMBOL_GPL(cpu_pm_exit);*/ int cpu_cluster_pm_enter (void ) { -int nr_calls; +int nr_calls =0 ;int ret =0 ;read_lock (&cpu_pm_notifier_lock);
kernel/debug/debug_core.c +1 -0
@@ -443,6 +443,7 @@ static int kgdb_reenter_check(struct kgdb_state *ks)if (exception_level >1 ) {dump_stack (); + kgdb_io_module_registered = false;panic ("Recursive entry to debugger" ); }
kernel/sched/fair.c +1 -1
@@ -2325,7 +2325,7 @@ void task_tick_numa(struct rq *rq, struct task_struct *curr)/* * We don't care about NUMA placement if we don't have memory. */ -if (!curr->mm || (curr->flags &PF_EXITING ) || work->next != work) +if ((curr->flags & (PF_EXITING |PF_KTHREAD )) || work->next != work)return ;/*
lib/mpi/longlong.h +1 -1
@@ -671,7 +671,7 @@ do { \************** MIPS/64 ************** ***************************************/ #if (defined(__mips) && __mips >=3 ) &&W_TYPE_SIZE ==64 -#if defined(__mips_isa_rev) && __mips_isa_rev >=6 +#if defined(__mips_isa_rev) && __mips_isa_rev >=6 && defined(CONFIG_CC_IS_GCC )/* * GCC ends up emitting a __multi3 intrinsic call for MIPS64r6 with the plain C * code below, so we special case MIPS64r6 until the compiler can do better.
mm/slub.c +3 -1
@@ -5424,8 +5424,10 @@ static int sysfs_slab_add(struct kmem_cache *s) s->kobj.kset =cache_kset (s); err =kobject_init_and_add (&s->kobj, &slab_ktype,NULL ,"%s" , name); -if (err) +if (err) { +kobject_put (&s->kobj); goto out; + } err =sysfs_create_group (&s->kobj, &slab_attr_group);if (err)
net/bluetooth/hci_event.c +1 -0
@@ -3761,6 +3761,7 @@ static void hci_sync_conn_complete_evt(struct hci_dev *hdev,case 0x11 :/* Unsupported Feature or Parameter Value */ case 0x1c :/* SCO interval rejected */ case 0x1a :/* Unsupported Remote Feature */ +case 0x1e :/* Invalid LMP Parameters */ case 0x1f :/* Unspecified error */ case 0x20 :/* Unsupported LMP Parameter value */ if (conn->out) {
net/ipv6/ipv6_sockglue.c +7 -6
@@ -185,14 +185,15 @@ static int do_ipv6_setsockopt(struct sock *sk, int level, int optname, retv = -EBUSY ;break ; } - } -if (sk->sk_protocol ==IPPROTO_TCP && - sk->sk_prot != &tcpv6_prot) { - retv = -EBUSY ; + }else if (sk->sk_protocol ==IPPROTO_TCP ) { +if (sk->sk_prot != &tcpv6_prot) { + retv = -EBUSY ; +break ; + } + }else {break ; } -if (sk->sk_protocol !=IPPROTO_TCP ) -break ; +if (sk->sk_state !=TCP_ESTABLISHED ) { retv = -ENOTCONN ;break ;
net/netfilter/nft_nat.c +2 -2
@@ -135,7 +135,7 @@ static int nft_nat_init(const struct nft_ctx *ctx, const struct nft_expr *expr, priv->type =NF_NAT_MANIP_DST ;break ;default : -return -EINVAL ; +return -EOPNOTSUPP ; } err =nft_nat_validate (ctx, expr,NULL );
@@ -206,7 +206,7 @@ static int nft_nat_init(const struct nft_ctx *ctx, const struct nft_expr *expr,if (tb[NFTA_NAT_FLAGS ]) { priv->flags =ntohl (nla_get_be32 (tb[NFTA_NAT_FLAGS ]));if (priv->flags & ~NF_NAT_RANGE_MASK ) -return -EINVAL ; +return -EOPNOTSUPP ; }return 0 ;
net/sunrpc/auth_gss/gss_mech_switch.c +9 -3
@@ -61,6 +61,8 @@ gss_mech_free(struct gss_api_mech *gm)for (i =0 ; i < gm->gm_pf_num; i++) { pf = &gm->gm_pfs[i]; +if (pf->domain) +auth_domain_put (pf->domain);kfree (pf->auth_domain_name); pf->auth_domain_name =NULL ; }
@@ -83,6 +85,7 @@ make_auth_domain_name(char *name)static int gss_mech_svc_setup (struct gss_api_mech *gm) { +struct auth_domain *dom;struct pf_desc *pf;int i, status;
@@ -92,10 +95,13 @@ gss_mech_svc_setup(struct gss_api_mech *gm) status = -ENOMEM ;if (pf->auth_domain_name ==NULL ) goto out; - status =svcauth_gss_register_pseudoflavor (pf->pseudoflavor, - pf->auth_domain_name); -if (status) + dom =svcauth_gss_register_pseudoflavor ( + pf->pseudoflavor, pf->auth_domain_name); +if (IS_ERR (dom)) { + status =PTR_ERR (dom); goto out; + } + pf->domain = dom; }return 0 ; out:
net/sunrpc/auth_gss/svcauth_gss.c +10 -8
@@ -772,7 +772,7 @@ u32 svcauth_gss_flavor(struct auth_domain *dom)EXPORT_SYMBOL_GPL (svcauth_gss_flavor); -int +struct auth_domain *svcauth_gss_register_pseudoflavor (u32 pseudoflavor,char * name) {struct gss_domain *new;
@@ -789,21 +789,23 @@ svcauth_gss_register_pseudoflavor(u32 pseudoflavor, char * name) new->h.flavour = &svcauthops_gss; new->pseudoflavor = pseudoflavor; - stat =0 ; test =auth_domain_lookup (name, &new->h); -if (test != &new->h) {/* Duplicate registration */ +if (test != &new->h) { +pr_warn ("svc: duplicate registration of gss pseudo flavour %s.\n" , + name); + stat = -EADDRINUSE ;auth_domain_put (test); -kfree (new->h.name); - goto out_free_dom; + goto out_free_name; } -return 0 ; +return test; +out_free_name: +kfree (new->h.name); out_free_dom:kfree (new); out: -return stat; +return ERR_PTR (stat); } -EXPORT_SYMBOL_GPL (svcauth_gss_register_pseudoflavor); static inline int
security/integrity/ima/ima.h +4 -3
@@ -34,7 +34,7 @@ enum tpm_pcrs { TPM_PCR0 = 0, TPM_PCR8 = 8 };#define IMA_DIGEST_SIZE SHA1_DIGEST_SIZE#define IMA_EVENT_NAME_LEN_MAX 255 -#define IMA_HASH_BITS 9 +#define IMA_HASH_BITS 10#define IMA_MEASURE_HTABLE_SIZE (1 << IMA_HASH_BITS)#define IMA_TEMPLATE_FIELD_ID_MAX_LEN 16
@@ -131,9 +131,10 @@ struct ima_h_table { };extern struct ima_h_table ima_htable; -static inline unsigned long ima_hash_key (u8 *digest) +static inline unsigned int ima_hash_key (u8 *digest) { -return hash_long (*digest,IMA_HASH_BITS ); +/* there is no point in taking a hash of part of a digest */ +return (digest[0 ] | digest[1 ] <<8 ) %IMA_MEASURE_HTABLE_SIZE ; }/* LIM API function definitions */
security/integrity/ima/ima_policy.c +1 -2
@@ -135,7 +135,7 @@ static struct ima_rule_entry default_appraise_rules[] = {static LIST_HEAD (ima_default_rules);static LIST_HEAD (ima_policy_rules); -static struct list_head *ima_rules; +static struct list_head *ima_rules = &ima_default_rules;static DEFINE_MUTEX (ima_rules_mutex);
@@ -412,7 +412,6 @@ void __init ima_init_policy(void) &ima_default_rules); } - ima_rules = &ima_default_rules; }/**
security/smack/smackfs.c +10 -0
@@ -912,11 +912,21 @@ static ssize_t smk_set_cipso(struct file *file, const char __user *buf,else rule +=strlen (skp->smk_known) +1 ; +if (rule > data + count) { + rc = -EOVERFLOW ; + goto out; + } + ret =sscanf (rule,"%d" , &maplevel);if (ret !=1 || maplevel >SMACK_CIPSO_MAXLEVEL ) goto out; rule +=SMK_DIGITLEN ; +if (rule > data + count) { + rc = -EOVERFLOW ; + goto out; + } + ret =sscanf (rule,"%d" , &catlen);if (ret !=1 || catlen >SMACK_CIPSO_MAXCATNUM ) goto out;
sound/core/pcm_native.c +5 -0
@@ -1836,6 +1836,11 @@ static int snd_pcm_link(struct snd_pcm_substream *substream, int fd) } pcm_file = f.file->private_data; substream1 = pcm_file->substream; +if (substream == substream1) { + res = -EINVAL ; + goto _badf; + } + group =kmalloc (sizeof (*group),GFP_KERNEL );if (!group) { res = -ENOMEM ;
sound/isa/es1688/es1688.c +3 -1
@@ -284,8 +284,10 @@ static int snd_es968_pnp_detect(struct pnp_card_link *pcard,return error; } error =snd_es1688_probe (card, dev); -if (error <0 ) +if (error <0 ) { +snd_card_free (card);return error; + }pnp_set_card_drvdata (pcard, card); snd_es968_pnp_is_probed =1 ;return 0 ;
sound/usb/card.c +13 -7
@@ -713,9 +713,6 @@ static int usb_audio_suspend(struct usb_interface *intf, pm_message_t message)if (chip == (void *)-1L )return 0 ; - chip->autosuspended = !!PMSG_IS_AUTO (message); -if (!chip->autosuspended) -snd_power_change_state (chip->card, SNDRV_CTL_POWER_D3hot);if (!chip->num_suspended_intf++) {list_for_each_entry (as, &chip->pcm_list, list) {snd_pcm_suspend_all (as->pcm);
@@ -728,6 +725,11 @@ static int usb_audio_suspend(struct usb_interface *intf, pm_message_t message)snd_usb_mixer_suspend (mixer); } +if (!PMSG_IS_AUTO (message) && !chip->system_suspend) { +snd_power_change_state (chip->card, SNDRV_CTL_POWER_D3hot); + chip->system_suspend = chip->num_suspended_intf; + } +return 0 ; }
@@ -740,10 +742,11 @@ static int __usb_audio_resume(struct usb_interface *intf, bool reset_resume)if (chip == (void *)-1L )return 0 ; -if (--chip->num_suspended_intf) -return 0 ;atomic_inc (&chip->active);/* avoid autopm */ +if (chip->num_suspended_intf >1 ) + goto out; +/* * ALSA leaves material resumption to user space * we just notify and restart the mixers
@@ -758,9 +761,12 @@ static int __usb_audio_resume(struct usb_interface *intf, bool reset_resume)snd_usbmidi_resume (p); } -if (!chip->autosuspended) + out: +if (chip->num_suspended_intf == chip->system_suspend) {snd_power_change_state (chip->card,SNDRV_CTL_POWER_D0 ); - chip->autosuspended =0 ; + chip->system_suspend =0 ; + } + chip->num_suspended_intf--; err_out:atomic_dec (&chip->active);/* allow autopm after this point */
sound/usb/usbaudio.h +1 -1
@@ -37,7 +37,7 @@ struct snd_usb_audio {struct usb_interface *pm_intf;u32 usb_id;struct mutex mutex; - unsigned int autosuspended:1; +unsigned int system_suspend;atomic_t active;atomic_t shutdown;atomic_t usage_count;
tools/perf/builtin-probe.c +3 -0
@@ -336,6 +336,9 @@ static int perf_add_probe_events(struct perf_probe_event *pevs, int npevs)for (k =0 ; k < pev->ntevs; k++) {struct probe_trace_event *tev = &pev->tevs[k]; +/* Skipped events have no event name */ +if (!tev->event) +continue ;/* We use tev's name for showing new events */ show_perf_probe_event(tev->group, tev->event, pev,
tools/perf/util/dso.c +16 -0
@@ -18,6 +18,7 @@ char dso__symtab_origin(const struct dso *dso) [DSO_BINARY_TYPE__BUILD_ID_CACHE] = 'B', [DSO_BINARY_TYPE__FEDORA_DEBUGINFO] = 'f', [DSO_BINARY_TYPE__UBUNTU_DEBUGINFO] = 'u', + [DSO_BINARY_TYPE__MIXEDUP_UBUNTU_DEBUGINFO] = 'x', [DSO_BINARY_TYPE__OPENEMBEDDED_DEBUGINFO] = 'o', [DSO_BINARY_TYPE__BUILDID_DEBUGINFO] = 'b', [DSO_BINARY_TYPE__SYSTEM_PATH_DSO] = 'd',
@@ -73,6 +74,21 @@ int dso__read_binary_type_filename(const struct dso *dso,snprintf (filename + len, size - len,"%s" , dso->long_name);break ; +case DSO_BINARY_TYPE__MIXEDUP_UBUNTU_DEBUGINFO : +/* +* Ubuntu can mixup /usr/lib with /lib, putting debuginfo in +* /usr/lib/debug/lib when it is expected to be in +* /usr/lib/debug/usr/lib +*/ +if (strlen (dso->long_name) <9 || +strncmp (dso->long_name,"/usr/lib/" ,9 )) { + ret =-1 ; +break ; + } + len =__symbol__join_symfs (filename, size,"/usr/lib/debug" ); +snprintf (filename + len, size - len,"%s" , dso->long_name +4 ); +break ; +case DSO_BINARY_TYPE__OPENEMBEDDED_DEBUGINFO : {const char *last_slash;
tools/perf/util/dso.h +1 -0
@@ -21,6 +21,7 @@ enum dso_binary_type {DSO_BINARY_TYPE__BUILD_ID_CACHE ,DSO_BINARY_TYPE__FEDORA_DEBUGINFO ,DSO_BINARY_TYPE__UBUNTU_DEBUGINFO , +DSO_BINARY_TYPE__MIXEDUP_UBUNTU_DEBUGINFO ,DSO_BINARY_TYPE__BUILDID_DEBUGINFO ,DSO_BINARY_TYPE__SYSTEM_PATH_DSO , DSO_BINARY_TYPE__GUEST_KMODULE,
tools/perf/util/probe-finder.c +1 -0
@@ -110,6 +110,7 @@ enum dso_binary_type distro_dwarf_types[] = {DSO_BINARY_TYPE__UBUNTU_DEBUGINFO ,DSO_BINARY_TYPE__OPENEMBEDDED_DEBUGINFO ,DSO_BINARY_TYPE__BUILDID_DEBUGINFO , +DSO_BINARY_TYPE__MIXEDUP_UBUNTU_DEBUGINFO , DSO_BINARY_TYPE__NOT_FOUND, };
tools/perf/util/symbol.c +2 -0
@@ -56,6 +56,7 @@ static enum dso_binary_type binary_type_symtab[] = {DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE ,DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE_COMP ,DSO_BINARY_TYPE__OPENEMBEDDED_DEBUGINFO , +DSO_BINARY_TYPE__MIXEDUP_UBUNTU_DEBUGINFO , DSO_BINARY_TYPE__NOT_FOUND, };
@@ -1363,6 +1364,7 @@ static bool dso__is_compatible_symtab_type(struct dso *dso, bool kmod,case DSO_BINARY_TYPE__SYSTEM_PATH_DSO :case DSO_BINARY_TYPE__FEDORA_DEBUGINFO :case DSO_BINARY_TYPE__UBUNTU_DEBUGINFO : +case DSO_BINARY_TYPE__MIXEDUP_UBUNTU_DEBUGINFO :case DSO_BINARY_TYPE__BUILDID_DEBUGINFO :case DSO_BINARY_TYPE__OPENEMBEDDED_DEBUGINFO :return !kmod && dso->kernel ==DSO_TYPE_USER ;