Linux 4.4.294
Greg Kroah-Hartman
maintainerI'm announcing the release of the 4.4.294 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 | 2 arch/arm/boot/dts/bcm5301x.dtsi | 2 arch/arm/include/asm/tlb.h | 8 arch/arm/mach-socfpga/core.h | 2 arch/arm/mach-socfpga/platsmp.c | 8 arch/ia64/include/asm/tlb.h | 10 arch/parisc/install.sh | 1 arch/s390/include/asm/tlb.h | 13 + arch/s390/kernel/setup.c | 3 arch/sh/include/asm/tlb.h | 10 arch/um/include/asm/tlb.h | 12 drivers/android/binder.c | 2 drivers/ata/sata_fsl.c | 20 + drivers/block/xen-blkfront.c | 126 ++++++--- drivers/net/ethernet/dec/tulip/de4x5.c | 34 +- drivers/net/ethernet/natsemi/xtsonic.c | 2 drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c | 10 drivers/net/xen-netfront.c | 257 ++++++++++++-------- drivers/platform/x86/thinkpad_acpi.c | 12 drivers/scsi/mpt3sas/mpt3sas_scsih.c | 2 drivers/scsi/scsi_transport_iscsi.c | 6 drivers/staging/android/ion/ion.c | 6 drivers/staging/rtl8192e/rtl8192e/rtl_core.c | 3 drivers/tty/hvc/hvc_xen.c | 17 + drivers/tty/serial/amba-pl011.c | 1 drivers/tty/serial/msm_serial.c | 3 drivers/usb/core/hub.c | 23 + drivers/usb/serial/option.c | 5 drivers/video/console/vgacon.c | 14 - drivers/xen/xenbus/xenbus_probe.c | 27 ++ fs/file.c | 19 + fs/file_table.c | 9 fs/fuse/dev.c | 10 fs/nfs/nfs42xdr.c | 3 fs/proc/vmcore.c | 15 - include/asm-generic/tlb.h | 7 include/linux/file.h | 2 include/linux/fs.h | 4 include/linux/ipc_namespace.h | 15 + include/linux/kprobes.h | 2 include/linux/sched.h | 2 include/linux/shm.h | 13 - include/linux/siphash.h | 14 - include/net/nfc/nci_core.h | 1 include/net/nl802154.h | 7 include/xen/interface/io/ring.h | 257 +++++++++----------- ipc/shm.c | 176 ++++++++++--- kernel/kprobes.c | 3 kernel/trace/trace_events.c | 7 lib/siphash.c | 12 mm/hugetlb.c | 58 +++- net/ipv4/devinet.c | 2 net/ipv4/tcp_cubic.c | 5 net/nfc/nci/core.c | 19 + sound/pci/ctxfi/ctamixer.c | 14 - sound/pci/ctxfi/ctdaio.c | 16 - sound/pci/ctxfi/ctresource.c | 7 sound/pci/ctxfi/ctresource.h | 4 sound/pci/ctxfi/ctsrc.c | 7 sound/soc/soc-topology.c | 3 60 files changed, 893 insertions(+), 461 deletions(-)
Alexander Aring (1):
net: ieee802154: handle iftypes as u32
Alexander Mikhalitsyn (1):
shm: extend forced shm destroy to support objects from several IPC nses
Arnd Bergmann (1):
siphash: use _unaligned version by default
Baokun Li (2):
sata_fsl: fix UAF in sata_fsl_port_stop when rmmod sata_fsl
sata_fsl: fix warning in remove_proc_entry when rmmod sata_fsl
Dan Carpenter (1):
staging: rtl8192e: Fix use after free in _rtl92e_pci_disconnect()
Daniele Palmas (1):
USB: serial: option: add Telit LE910S1 0x9200 composition
David Hildenbrand (1):
proc/vmcore: fix clearing user buffer by properly using clear_user()
Eric Dumazet (1):
tcp_cubic: fix spurious Hystart ACK train detections for not-cwnd-limited flows
Florian Fainelli (1):
ARM: dts: BCM5301X: Add interrupt properties to GPIO node
Greg Kroah-Hartman (1):
Linux 4.4.294
Helge Deller (1):
parisc: Fix "make install" on newer debian releases
Jens Axboe (1):
fs: add fget_many() and fput_many()
Juergen Gross (9):
xen: sync include/xen/interface/io/ring.h with Xen's newest version xen/blkfront: read response from backend only once xen/blkfront: don't take local copy of a request from the ring page xen/blkfront: don't trust the backend response data blindly xen/netfront: read response from backend only once xen/netfront: don't read data from request on the ring page xen/netfront: disentangle tx_skb_freelist
xen/netfront: don't trust the backend response data blindly
tty: hvc: replace BUG_ON() with negative return value
Lee Jones (1):
staging: ion: Prevent incorrect reference counting behavour
Lin Ma (1):
NFC: add NCI_UNREG flag to eliminate the race
Linus Torvalds (1):
fget: check that the fd still exists after getting a ref to it
Maciej W. Rozycki (1):
vgacon: Propagate console boot parameters before calling `vc_resize'
Masami Hiramatsu (1):
kprobes: Limit max data_size of the kretprobe instances
Mathias Nyman (2):
usb: hub: Fix usb enumeration issue due to address0 race
usb: hub: Fix locking issues with address0_mutex
Mike Christie (1):
scsi: iscsi: Unblock session then wake up error handler
Mike Kravetz (1):
hugetlb: take PMD sharing into account when flushing tlb/caches
Miklos Szeredi (2):
fuse: fix page stealing
fuse: release pipe buf after last use
Mingjie Zhang (1):
USB: serial: option: add Fibocom FM101-GL variants
Nadav Amit (1):
hugetlbfs: flush TLBs correctly after huge_pmd_unshare
Pierre Gondois (1):
serial: pl011: Add ACPI SBSA UART match id
Randy Dunlap (1):
natsemi: xtensa: fix section mismatch warnings
Slark Xiao (1):
platform/x86: thinkpad_acpi: Fix WWAN device disabled issue after S3 deep
Sreekanth Reddy (1):
scsi: mpt3sas: Fix kernel panic during drive powercycle test
Stefano Stabellini (2):
xen: don't continue xenstore initialization in case of errors
xen: detect uninitialized xenbus in xenbus_init
Steven Rostedt (VMware) (1):
tracing: Check pid filtering when creating events
Sven Eckelmann (1):
tty: serial: msm_serial: Deactivate RX DMA for polling support
Takashi Iwai (3):
ALSA: ctxfi: Fix out-of-range access
ASoC: topology: Add missing rwsem around snd_ctl_remove() calls
ARM: socfpga: Fix crash with CONFIG_FORTIRY_SOURCE
Teng Qi (1):
net: ethernet: dec: tulip: de4x5: fix possible array overflows in type3_infoblock()
Todd Kjos (1):
binder: fix test regression due to sender_euid change
Trond Myklebust (1):
NFSv42: Don't fail clone() unless the OP_CLONE operation failed
Vasily Gorbik (1):
s390/setup: avoid using memblock_enforce_memory_limit
Zhou Qingyang (1):
net: qlogic: qlcnic: Fix a NULL pointer dereference in qlcnic_83xx_add_rings()
liuguoqiang (1):
net: return correct error code
zhangyue (1):
net: tulip: de4x5: fix the problem that the array 'lp->phy[8]' may be out of bound
Greg Kroah-Hartman
maintainerMakefile +1 -1
@@ -1,6 +1,6 @@ VERSION = 4 PATCHLEVEL = 4 -SUBLEVEL = 293 +SUBLEVEL = 294 EXTRAVERSION = NAME = Blurry Fish Butt
arch/arm/boot/dts/bcm5301x.dtsi +2 -0
@@ -175,6 +175,8 @@ gpio-controller; #gpio-cells = <2>; + interrupt-controller; + #interrupt-cells = <2>; }; };
arch/arm/include/asm/tlb.h +8 -0
@@ -257,6 +257,14 @@ tlb_remove_pmd_tlb_entry(struct mmu_gather *tlb, pmd_t *pmdp, unsigned long addrtlb_add_flush (tlb, addr); } +static inline void +tlb_flush_pmd_range (struct mmu_gather *tlb,unsigned long address, +unsigned long size) +{ +tlb_add_flush (tlb, address); +tlb_add_flush (tlb, address + size -PMD_SIZE ); +} +#define pte_free_tlb (tlb, ptep, addr) __pte_free_tlb(tlb, ptep, addr)#define pmd_free_tlb (tlb, pmdp, addr) __pmd_free_tlb(tlb, pmdp, addr)#define pud_free_tlb (tlb, pudp, addr) pud_free((tlb)->mm, pudp)
arch/arm/mach-socfpga/core.h +1 -1
@@ -44,7 +44,7 @@ extern void __iomem *sdr_ctl_base_addr;u32 socfpga_sdram_self_refresh (u32 sdr_base);extern unsigned int socfpga_sdram_self_refresh_sz; -extern char secondary_trampoline, secondary_trampoline_end; +extern char secondary_trampoline[], secondary_trampoline_end[];extern unsigned long socfpga_cpu1start_addr;
arch/arm/mach-socfpga/platsmp.c +4 -4
@@ -31,14 +31,14 @@static int socfpga_boot_secondary (unsigned int cpu,struct task_struct *idle) { -int trampoline_size = &secondary_trampoline_end - &secondary_trampoline; +int trampoline_size = secondary_trampoline_end - secondary_trampoline;if (socfpga_cpu1start_addr) {/* This will put CPU #1 into reset. */ writel (RSTMGR_MPUMODRST_CPU1 , rst_manager_base_addr +SOCFPGA_RSTMGR_MODMPURST ); -memcpy (phys_to_virt (0 ), &secondary_trampoline, trampoline_size); +memcpy (phys_to_virt (0 ), secondary_trampoline, trampoline_size);writel (virt_to_phys (secondary_startup), sys_manager_base_addr + (socfpga_cpu1start_addr &0x000000ff ));
@@ -56,12 +56,12 @@ static int socfpga_boot_secondary(unsigned int cpu, struct task_struct *idle)static int socfpga_a10_boot_secondary (unsigned int cpu,struct task_struct *idle) { -int trampoline_size = &secondary_trampoline_end - &secondary_trampoline; +int trampoline_size = secondary_trampoline_end - secondary_trampoline;if (socfpga_cpu1start_addr) {writel (RSTMGR_MPUMODRST_CPU1 , rst_manager_base_addr +SOCFPGA_A10_RSTMGR_MODMPURST ); -memcpy (phys_to_virt (0 ), &secondary_trampoline, trampoline_size); +memcpy (phys_to_virt (0 ), secondary_trampoline, trampoline_size);writel (virt_to_phys (secondary_startup), sys_manager_base_addr + (socfpga_cpu1start_addr &0x00000fff ));
arch/ia64/include/asm/tlb.h +10 -0
@@ -251,6 +251,16 @@ __tlb_remove_tlb_entry (struct mmu_gather *tlb, pte_t *ptep, unsigned long addre tlb->end_addr = address +PAGE_SIZE ; } +static inline void +tlb_flush_pmd_range (struct mmu_gather *tlb,unsigned long address, +unsigned long size) +{ +if (tlb->start_addr > address) + tlb->start_addr = address; +if (tlb->end_addr < address + size) + tlb->end_addr = address + size; +} +#define tlb_migrate_finish (mm) platform_tlb_migrate_finish(mm)#define tlb_start_vma (tlb, vma) do { } while (0)
arch/parisc/install.sh +1 -0
@@ -39,6 +39,7 @@ verify "$3" if [ -n "${INSTALLKERNEL}" ]; then if [ -x ~/bin/${INSTALLKERNEL} ]; then exec ~/bin/${INSTALLKERNEL} "$@"; fi if [ -x /sbin/${INSTALLKERNEL} ]; then exec /sbin/${INSTALLKERNEL} "$@"; fi + if [ -x /usr/sbin/${INSTALLKERNEL} ]; then exec /usr/sbin/${INSTALLKERNEL} "$@"; fi fi # Default install
arch/s390/include/asm/tlb.h +13 -0
@@ -97,6 +97,19 @@ static inline void tlb_remove_page(struct mmu_gather *tlb, struct page *page) {free_page_and_swap_cache (page); } +static inline void tlb_flush_pmd_range (struct mmu_gather *tlb, +unsigned long address,unsigned long size) +{ +/* +* the range might exceed the original range that was provided to +* tlb_gather_mmu(), so we need to update it despite the fact it is +* usually not updated. +*/ +if (tlb->start > address) + tlb->start = address; +if (tlb->end < address + size) + tlb->end = address + size; +}/* * pte_free_tlb frees a pte table and clears the CRSTE for the
arch/s390/kernel/setup.c +0 -3
@@ -687,9 +687,6 @@ static void __init setup_memory(void)storage_key_init_range (reg->base, reg->base + reg->size); }psw_set_key (PAGE_DEFAULT_KEY ); - -/* Only cosmetics */ -memblock_enforce_memory_limit (memblock_end_of_DRAM ()); }/*
arch/sh/include/asm/tlb.h +10 -0
@@ -65,6 +65,16 @@ tlb_remove_tlb_entry(struct mmu_gather *tlb, pte_t *ptep, unsigned long address) tlb->end = address +PAGE_SIZE ; } +static inline void +tlb_flush_pmd_range (struct mmu_gather *tlb,unsigned long address, +unsigned long size) +{ +if (tlb->start > address) + tlb->start = address; +if (tlb->end < address + size) + tlb->end = address + size; +} +/* * In the case of tlb vma handling, we can optimise these away in the * case where we're doing a full MM flush. When we're doing a munmap,
arch/um/include/asm/tlb.h +12 -0
@@ -110,6 +110,18 @@ static inline void tlb_remove_page(struct mmu_gather *tlb, struct page *page)__tlb_remove_page (tlb, page); } +static inline void +tlb_flush_pmd_range (struct mmu_gather *tlb,unsigned long address, +unsigned long size) +{ + tlb->need_flush =1 ; + +if (tlb->start > address) + tlb->start = address; +if (tlb->end < address + size) + tlb->end = address + size; +} +/** * tlb_remove_tlb_entry - remember a pte unmapping for later tlb invalidation. *
drivers/android/binder.c +1 -1
@@ -1494,7 +1494,7 @@ static void binder_transaction(struct binder_proc *proc, t->from = thread; else t->from = NULL; - t->sender_euid = proc->cred->euid; + t->sender_euid =task_euid (proc->tsk); t->to_proc = target_proc; t->to_thread = target_thread; t->code = tr->code;
drivers/ata/sata_fsl.c +13 -7
@@ -1406,6 +1406,14 @@ static int sata_fsl_init_controller(struct ata_host *host)return 0 ; } +static void sata_fsl_host_stop (struct ata_host *host) +{ +struct sata_fsl_host_priv *host_priv = host->private_data; + +iounmap (host_priv->hcr_base); +kfree (host_priv); +} +/* * scsi mid-layer and libata interface structures */
@@ -1438,6 +1446,8 @@ static struct ata_port_operations sata_fsl_ops = { .port_start = sata_fsl_port_start, .port_stop = sata_fsl_port_stop, + .host_stop = sata_fsl_host_stop, + .pmp_attach = sata_fsl_pmp_attach, .pmp_detach = sata_fsl_pmp_detach, };
@@ -1492,9 +1502,9 @@ static int sata_fsl_probe(struct platform_device *ofdev) host_priv->ssr_base = ssr_base; host_priv->csr_base = csr_base; - irq =irq_of_parse_and_map (ofdev->dev.of_node,0 ); -if (!irq) { -dev_err (&ofdev->dev,"invalid irq from platform\n" ); + irq =platform_get_irq (ofdev,0 ); +if (irq <0 ) { + retval = irq; goto error_exit_with_cleanup; } host_priv->irq = irq;
@@ -1571,10 +1581,6 @@ static int sata_fsl_remove(struct platform_device *ofdev)ata_host_detach (host); -irq_dispose_mapping (host_priv->irq); -iounmap (host_priv->hcr_base); -kfree (host_priv); -return 0 ; }
drivers/block/xen-blkfront.c +88 -38
235 lines not on this page · raw message
drivers/net/ethernet/dec/tulip/de4x5.c +21 -13
@@ -4701,6 +4701,10 @@ type3_infoblock(struct net_device *dev, u_char count, u_char *p) lp->ibn =3 ; lp->active = *p++;if (MOTO_SROM_BUG ) lp->active =0 ; +/* if (MOTO_SROM_BUG) statement indicates lp->active could +* be 8 (i.e. the size of array lp->phy) */ +if (WARN_ON (lp->active >=ARRAY_SIZE (lp->phy))) +return -EINVAL ; lp->phy[lp->active].gep = (*p ? p :NULL ); p += (2 * (*p) +1 ); lp->phy[lp->active].rst = (*p ? p :NULL ); p += (2 * (*p) +1 ); lp->phy[lp->active].mc =get_unaligned_le16 (p); p +=2 ;
@@ -4992,19 +4996,23 @@ mii_get_phy(struct net_device *dev) }if ((j == limit) && (i <DE4X5_MAX_MII )) {for (k=0 ; k <DE4X5_MAX_PHY && lp->phy[k].id; k++); - lp->phy[k].addr = i; - lp->phy[k].id = id; - lp->phy[k].spd.reg =GENERIC_REG ;/* ANLPA register */ - lp->phy[k].spd.mask =GENERIC_MASK ;/* 100Mb/s technologies */ - lp->phy[k].spd.value =GENERIC_VALUE ;/* TX & T4, H/F Duplex */ - lp->mii_cnt++; - lp->active++; -printk ("%s: Using generic MII device control. If the board doesn't operate,\nplease mail the following dump to the author:\n" , dev->name); - j = de4x5_debug; - de4x5_debug |=DEBUG_MII ; -de4x5_dbg_mii (dev, k); - de4x5_debug = j; -printk ("\n" ); +if (k <DE4X5_MAX_PHY ) { + lp->phy[k].addr = i; + lp->phy[k].id = id; + lp->phy[k].spd.reg =GENERIC_REG ;/* ANLPA register */ + lp->phy[k].spd.mask =GENERIC_MASK ;/* 100Mb/s technologies */ + lp->phy[k].spd.value =GENERIC_VALUE ;/* TX & T4, H/F Duplex */ + lp->mii_cnt++; + lp->active++; +printk ("%s: Using generic MII device control. If the board doesn't operate,\nplease mail the following dump to the author:\n" , dev->name); + j = de4x5_debug; + de4x5_debug |=DEBUG_MII ; +de4x5_dbg_mii (dev, k); + de4x5_debug = j; +printk ("\n" ); + }else { + goto purgatory; + } } } purgatory:
drivers/net/ethernet/natsemi/xtsonic.c +1 -1
@@ -128,7 +128,7 @@ static const struct net_device_ops xtsonic_netdev_ops = { .ndo_set_mac_address = eth_mac_addr, }; -static int __init sonic_probe1 (struct net_device *dev) +static int sonic_probe1 (struct net_device *dev) {static unsigned version_printed =0 ;unsigned int silicon_revision;
drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c +8 -2
@@ -1076,8 +1076,14 @@ static int qlcnic_83xx_add_rings(struct qlcnic_adapter *adapter) sds_mbx_size =sizeof (struct qlcnic_sds_mbx ); context_id = recv_ctx->context_id; num_sds = adapter->drv_sds_rings -QLCNIC_MAX_SDS_RINGS ; - ahw->hw_ops->alloc_mbx_args (&cmd, adapter, -QLCNIC_CMD_ADD_RCV_RINGS ); + err = ahw->hw_ops->alloc_mbx_args (&cmd, adapter, +QLCNIC_CMD_ADD_RCV_RINGS ); +if (err) { +dev_err (&adapter->pdev->dev, +"Failed to alloc mbx args %d\n" , err); +return err; + } + cmd.req.arg[1 ] =0 | (num_sds <<8 ) | (context_id <<16 );/* set up status rings, mbx 2-81 */
drivers/net/xen-netfront.c +155 -102
545 lines not on this page · raw message
drivers/platform/x86/thinkpad_acpi.c +0 -12
@@ -1168,15 +1168,6 @@ static int tpacpi_rfk_update_swstate(const struct tpacpi_rfk *tp_rfk)return status; } -/* Query FW and update rfkill sw state for all rfkill switches */ -static void tpacpi_rfk_update_swstate_all (void ) -{ -unsigned int i; - -for (i =0 ; i <TPACPI_RFK_SW_MAX ; i++) -tpacpi_rfk_update_swstate (tpacpi_rfkill_switches[i]); -} -/* * Sync the HW-blocking state of all rfkill switches, * do notice it causes the rfkill core to schedule uevents
@@ -3015,9 +3006,6 @@ static void tpacpi_send_radiosw_update(void)if (wlsw ==TPACPI_RFK_RADIO_OFF )tpacpi_rfk_update_hwblock_state (true); -/* Sync sw blocking state */ -tpacpi_rfk_update_swstate_all (); -/* Sync hw blocking state last if it is hw-unblocked */ if (wlsw ==TPACPI_RFK_RADIO_ON )tpacpi_rfk_update_hwblock_state (false);
drivers/scsi/mpt3sas/mpt3sas_scsih.c +1 -1
@@ -2904,7 +2904,7 @@ _scsih_ublock_io_device(struct MPT3SAS_ADAPTER *ioc, u64 sas_address)shost_for_each_device (sdev, ioc->shost) { sas_device_priv_data = sdev->hostdata; -if (!sas_device_priv_data) +if (!sas_device_priv_data || !sas_device_priv_data->sas_target)continue ;if (sas_device_priv_data->sas_target->sas_address != sas_address)
drivers/scsi/scsi_transport_iscsi.c +3 -3
@@ -1896,12 +1896,12 @@ static void session_recovery_timedout(struct work_struct *work) }spin_unlock_irqrestore (&session->lock, flags); -if (session->transport->session_recovery_timedout) - session->transport->session_recovery_timedout (session); -ISCSI_DBG_TRANS_SESSION (session,"Unblocking SCSI target\n" );scsi_target_unblock (&session->dev,SDEV_TRANSPORT_OFFLINE );ISCSI_DBG_TRANS_SESSION (session,"Completed unblocking SCSI target\n" ); + +if (session->transport->session_recovery_timedout) + session->transport->session_recovery_timedout (session); }static void __iscsi_unblock_session (struct work_struct *work)
drivers/staging/android/ion/ion.c +6 -0
@@ -606,6 +606,9 @@ static void *ion_buffer_kmap_get(struct ion_buffer *buffer)void *vaddr;if (buffer->kmap_cnt) { +if (buffer->kmap_cnt ==INT_MAX ) +return ERR_PTR (-EOVERFLOW ); + buffer->kmap_cnt++;return buffer->vaddr; }
@@ -626,6 +629,9 @@ static void *ion_handle_kmap_get(struct ion_handle *handle)void *vaddr;if (handle->kmap_cnt) { +if (handle->kmap_cnt ==INT_MAX ) +return ERR_PTR (-EOVERFLOW ); + handle->kmap_cnt++;return buffer->vaddr; }
drivers/staging/rtl8192e/rtl8192e/rtl_core.c +2 -1
@@ -2712,13 +2712,14 @@ static void _rtl92e_pci_disconnect(struct pci_dev *pdev)free_irq (dev->irq, dev); priv->irq =0 ; } -free_rtllib (dev);if (dev->mem_start !=0 ) {iounmap ((void __iomem *)dev->mem_start);release_mem_region (pci_resource_start (pdev,1 ),pci_resource_len (pdev,1 )); } + +free_rtllib (dev); }else { priv =rtllib_priv (dev); }
drivers/tty/hvc/hvc_xen.c +14 -3
@@ -98,7 +98,11 @@ static int __write_console(struct xencons_info *xencons, cons = intf->out_cons; prod = intf->out_prod;mb ();/* update queue values before going on */ -BUG_ON ((prod - cons) >sizeof (intf->out)); + +if ((prod - cons) >sizeof (intf->out)) { +pr_err_once ("xencons: Illegal ring page indices" ); +return -EINVAL ; + }while ((sent < len) && ((prod - cons) <sizeof (intf->out))) intf->out[MASK_XENCONS_IDX (prod++, intf->out)] = data[sent++];
@@ -126,7 +130,10 @@ static int domU_write_console(uint32_t vtermno, const char *data, int len)*/ while (len) {int sent =__write_console (cons, data, len); - + +if (sent <0 ) +return sent; + data += sent; len -= sent;
@@ -150,7 +157,11 @@ static int domU_read_console(uint32_t vtermno, char *buf, int len) cons = intf->in_cons; prod = intf->in_prod;mb ();/* get pointers before reading ring */ -BUG_ON ((prod - cons) >sizeof (intf->in)); + +if ((prod - cons) >sizeof (intf->in)) { +pr_err_once ("xencons: Illegal ring page indices" ); +return -EINVAL ; + }while (cons != prod && recv < len) buf[recv++] = intf->in[MASK_XENCONS_IDX (cons++, intf->in)];
drivers/tty/serial/amba-pl011.c +1 -0
@@ -2493,6 +2493,7 @@ MODULE_DEVICE_TABLE(of, sbsa_uart_of_match);static const struct acpi_device_id sbsa_uart_acpi_match[] = { {"ARMH0011" ,0 }, + {"ARMHB000" ,0 }, {}, };MODULE_DEVICE_TABLE (acpi, sbsa_uart_acpi_match);
drivers/tty/serial/msm_serial.c +3 -0
@@ -446,6 +446,9 @@ static void msm_start_rx_dma(struct msm_port *msm_port)u32 val;int ret; +if (IS_ENABLED (CONFIG_CONSOLE_POLL )) +return ; +if (!dma->chan)return ;
drivers/usb/core/hub.c +18 -5
@@ -4393,8 +4393,6 @@ hub_port_init(struct usb_hub *hub, struct usb_device *udev, int port1,if (oldspeed ==USB_SPEED_LOW ) delay =HUB_LONG_RESET_TIME ; -mutex_lock (hcd->address0_mutex); -/* Reset the device; full speed may morph to high speed */ /* FIXME a USB 2.0 device may morph into SuperSpeed on reset. */ retval =hub_port_reset (hub, port1, udev, delay, false);
@@ -4681,7 +4679,6 @@ fail:hub_port_disable (hub, port1,0 );update_devnum (udev, devnum);/* for disconnect processing */ } -mutex_unlock (hcd->address0_mutex);return retval; }
@@ -4771,6 +4768,7 @@ static void hub_port_connect(struct usb_hub *hub, int port1, u16 portstatus,struct usb_port *port_dev = hub->ports[port1 -1 ];struct usb_device *udev = port_dev->child;static int unreliable_port =-1 ; +bool retry_locked;/* Disconnect any existing devices under this port */ if (udev) {
@@ -4826,7 +4824,11 @@ static void hub_port_connect(struct usb_hub *hub, int port1, u16 portstatus, unit_load =100 ; status =0 ; +for (i =0 ; i <SET_CONFIG_TRIES ; i++) { +usb_lock_port (port_dev); +mutex_lock (hcd->address0_mutex); + retry_locked = true;/* reallocate for each attempt, since references * to the previous one can escape in various ways
@@ -4835,6 +4837,8 @@ static void hub_port_connect(struct usb_hub *hub, int port1, u16 portstatus,if (!udev) {dev_err (&port_dev->dev,"couldn't allocate usb_device\n" ); +mutex_unlock (hcd->address0_mutex); +usb_unlock_port (port_dev); goto done; }
@@ -4856,12 +4860,14 @@ static void hub_port_connect(struct usb_hub *hub, int port1, u16 portstatus, }/* reset (non-USB 3.0 devices) and get descriptor */ -usb_lock_port (port_dev); status =hub_port_init (hub, udev, port1, i); -usb_unlock_port (port_dev);if (status <0 ) goto loop; +mutex_unlock (hcd->address0_mutex); +usb_unlock_port (port_dev); + retry_locked = false; +if (udev->quirks &USB_QUIRK_DELAY_INIT )msleep (2000 );
@@ -4954,6 +4960,10 @@ loop:usb_ep0_reinit (udev);release_devnum (udev);hub_free_dev (udev); +if (retry_locked) { +mutex_unlock (hcd->address0_mutex); +usb_unlock_port (port_dev); + }usb_put_dev (udev);if ((status == -ENOTCONN ) || (status == -ENOTSUPP ))break ;
@@ -5506,6 +5516,8 @@ static int usb_reset_and_verify_device(struct usb_device *udev) bos = udev->bos; udev->bos =NULL ; +mutex_lock (hcd->address0_mutex); +for (i =0 ; i <SET_CONFIG_TRIES ; ++i) {/* ep0 maxpacket size may change; let the HCD know about it.
@@ -5515,6 +5527,7 @@ static int usb_reset_and_verify_device(struct usb_device *udev)if (ret >=0 || ret == -ENOTCONN || ret == -ENODEV )break ; } +mutex_unlock (hcd->address0_mutex);if (ret <0 ) goto re_enumerate;
drivers/usb/serial/option.c +5 -0
@@ -1243,6 +1243,8 @@ static const struct usb_device_id option_ids[] = { .driver_info = NCTRL(2) }, { USB_DEVICE(TELIT_VENDOR_ID, 0x9010), /* Telit SBL FN980 flashing device */ .driver_info = NCTRL(0) | ZLP }, + { USB_DEVICE(TELIT_VENDOR_ID, 0x9200), /* Telit LE910S1 flashing device */ + .driver_info = NCTRL(0) | ZLP }, { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_MF622, 0xff, 0xff, 0xff) }, /* ZTE WCDMA products */ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0002, 0xff, 0xff, 0xff), .driver_info = RSVD(1) },
@@ -2072,6 +2074,9 @@ static const struct usb_device_id option_ids[] = { { USB_DEVICE_AND_INTERFACE_INFO(0x2cb7, 0x010b, 0xff, 0xff, 0x30) }, /* Fibocom FG150 Diag */ { USB_DEVICE_AND_INTERFACE_INFO(0x2cb7, 0x010b, 0xff, 0, 0) }, /* Fibocom FG150 AT */ { USB_DEVICE_INTERFACE_CLASS(0x2cb7, 0x01a0, 0xff) }, /* Fibocom NL668-AM/NL652-EU (laptop MBIM) */ + { USB_DEVICE_INTERFACE_CLASS(0x2cb7, 0x01a2, 0xff) }, /* Fibocom FM101-GL (laptop MBIM) */ + { USB_DEVICE_INTERFACE_CLASS(0x2cb7, 0x01a4, 0xff), /* Fibocom FM101-GL (laptop MBIM) */ + .driver_info = RSVD(4) }, { USB_DEVICE_INTERFACE_CLASS(0x2df3, 0x9d03, 0xff) }, /* LongSung M5710 */ { USB_DEVICE_INTERFACE_CLASS(0x305a, 0x1404, 0xff) }, /* GosunCn GM500 RNDIS */ { USB_DEVICE_INTERFACE_CLASS(0x305a, 0x1405, 0xff) }, /* GosunCn GM500 MBIM */
drivers/video/console/vgacon.c +9 -5
@@ -422,11 +422,17 @@ static void vgacon_init(struct vc_data *c, int init)struct uni_pagedir *p;/* -* We cannot be loaded as a module, therefore init is always 1, -* but vgacon_init can be called more than once, and init will -* not be 1. +* We cannot be loaded as a module, therefore init will be 1 +* if we are the default console, however if we are a fallback +* console, for example if fbcon has failed registration, then +* init will be 0, so we need to make sure our boot parameters +* have been copied to the console structure for vgacon_resize +* ultimately called by vc_resize. Any subsequent calls to +* vgacon_init init will have init set to 0 too. */ c->vc_can_do_color = vga_can_do_color; + c->vc_scan_lines = vga_scan_lines; + c->vc_font.height = c->vc_cell_height = vga_video_font_height;/* set dimensions manually if init != 0 since vc_resize() will fail */ if (init) {
@@ -435,8 +441,6 @@ static void vgacon_init(struct vc_data *c, int init) }else vc_resize (c, vga_video_num_columns, vga_video_num_lines); - c->vc_scan_lines = vga_scan_lines; - c->vc_font.height = c->vc_cell_height = vga_video_font_height; c->vc_complement_mask =0x7700 ;if (vga_512_chars) c->vc_hi_font_mask =0x0800 ;
drivers/xen/xenbus/xenbus_probe.c +26 -1
@@ -764,7 +764,7 @@ static struct notifier_block xenbus_resume_nb = {static int __init xenbus_init (void ) { -int err =0 ; +int err;uint64_t v =0 ; xen_store_domain_type =XS_UNKNOWN ;
@@ -804,6 +804,29 @@ static int __init xenbus_init(void) err =hvm_get_parameter (HVM_PARAM_STORE_PFN , &v);if (err) goto out_error; +/* +* Uninitialized hvm_params are zero and return no error. +* Although it is theoretically possible to have +* HVM_PARAM_STORE_PFN set to zero on purpose, in reality it is +* not zero when valid. If zero, it means that Xenstore hasn't +* been properly initialized. Instead of attempting to map a +* wrong guest physical address return error. +* +* Also recognize all bits set as an invalid value. +*/ +if (!v || !~v) { + err = -ENOENT ; + goto out_error; + } +/* Avoid truncation on 32-bit. */ +#if BITS_PER_LONG ==32 +if (v >ULONG_MAX ) { +pr_err ("%s: cannot handle HVM_PARAM_STORE_PFN=%llx > ULONG_MAX\n" , + __func__, v); + err = -EINVAL ; + goto out_error; + } +#endif xen_store_gfn = (unsigned long )v; xen_store_interface = xen_remap(xen_store_gfn << XEN_PAGE_SHIFT,
@@ -832,8 +855,10 @@ static int __init xenbus_init(void)*/ proc_mkdir ("xen" ,NULL );#endif +return 0 ; out_error: + xen_store_domain_type =XS_UNKNOWN ;return err; }
fs/file.c +14 -5
@@ -691,7 +691,7 @@ void do_close_on_exec(struct files_struct *files)spin_unlock (&files->file_lock); } -static struct file *__fget (unsigned int fd,fmode_t mask) +static struct file *__fget (unsigned int fd,fmode_t mask,unsigned int refs) {struct files_struct *files = current->files;struct file *file;
@@ -706,23 +706,32 @@ loop:*/ if (file->f_mode & mask) file =NULL ; -else if (!get_file_rcu (file)) +else if (!get_file_rcu_many (file, refs)) goto loop; +else if (__fcheck_files (files, fd) != file) { +fput_many (file, refs); + goto loop; + } }rcu_read_unlock ();return file; } +struct file *fget_many (unsigned int fd,unsigned int refs) +{ +return __fget (fd,FMODE_PATH , refs); +} +struct file *fget (unsigned int fd) { -return __fget (fd,FMODE_PATH ); +return __fget (fd,FMODE_PATH ,1 ); }EXPORT_SYMBOL (fget);struct file *fget_raw (unsigned int fd) { -return __fget (fd,0 ); +return __fget (fd,0 ,1 ); }EXPORT_SYMBOL (fget_raw);
@@ -753,7 +762,7 @@ static unsigned long __fget_light(unsigned int fd, fmode_t mask)return 0 ;return (unsigned long )file; }else { - file =__fget (fd, mask); + file =__fget (fd, mask,1 );if (!file)return 0 ;return FDPUT_FPUT | (unsigned long )file;
fs/file_table.c +7 -2
@@ -261,9 +261,9 @@ void flush_delayed_fput(void) static DECLARE_DELAYED_WORK(delayed_fput_work, delayed_fput); -void fput (struct file *file) +void fput_many (struct file *file,unsigned int refs) { -if (atomic_long_dec_and_test (&file->f_count)) { +if (atomic_long_sub_and_test (refs, &file->f_count)) {struct task_struct *task = current;if (likely (!in_interrupt () && !(task->flags &PF_KTHREAD ))) {
@@ -282,6 +282,11 @@ void fput(struct file *file) } } +void fput (struct file *file) +{ +fput_many (file,1 ); +} +/* * synchronous analog of fput(); for kernel threads that might be needed * in some umount() (and thus can't use flush_delayed_fput() without
fs/fuse/dev.c +9 -1
@@ -927,6 +927,13 @@ static int fuse_try_move_page(struct fuse_copy_state *cs, struct page **pagep)if (!(buf->flags &PIPE_BUF_FLAG_LRU ))lru_cache_add_file (newpage); +/* +* Release while we have extra ref on stolen page. Otherwise +* anon_pipe_buf_release() might think the page can be reused. +*/ + buf->ops->release (cs->pipe, buf); + buf->ops =NULL ; + err =0 ;spin_lock (&cs->req->waitq.lock);if (test_bit (FR_ABORTED , &cs->req->flags))
@@ -2090,7 +2097,8 @@ static ssize_t fuse_dev_splice_write(struct pipe_inode_info *pipe, out_free:for (idx =0 ; idx < nbuf; idx++) {struct pipe_buffer *buf = &bufs[idx]; - buf->ops->release (pipe, buf); +if (buf->ops) + buf->ops->release (pipe, buf); }pipe_unlock (pipe);
fs/nfs/nfs42xdr.c +1 -2
@@ -439,8 +439,7 @@ static int nfs4_xdr_dec_clone(struct rpc_rqst *rqstp, status =decode_clone (xdr);if (status) goto out; - status =decode_getfattr (xdr, res->dst_fattr, res->server); - +decode_getfattr (xdr, res->dst_fattr, res->server); out: res->rpc_status = status;return status;
fs/proc/vmcore.c +10 -5
@@ -105,14 +105,19 @@ static ssize_t read_from_oldmem(char *buf, size_t count, nr_bytes = count;/* If pfn is not ram, return zeros for sparse dump files */ -if (pfn_is_ram (pfn) ==0 ) -memset (buf,0 , nr_bytes); -else { +if (pfn_is_ram (pfn) ==0 ) { + tmp =0 ; +if (!userbuf) +memset (buf,0 , nr_bytes); +else if (clear_user (buf, nr_bytes)) + tmp = -EFAULT ; + }else { tmp =copy_oldmem_page (pfn, buf, nr_bytes, offset, userbuf); -if (tmp <0 ) -return tmp; } +if (tmp <0 ) +return tmp; + *ppos += nr_bytes; count -= nr_bytes; buf += nr_bytes;
include/asm-generic/tlb.h +7 -0
@@ -165,6 +165,13 @@ static inline void __tlb_reset_range(struct mmu_gather *tlb)#define tlb_end_vma __tlb_end_vma#endif +static inline void tlb_flush_pmd_range (struct mmu_gather *tlb, +unsigned long address,unsigned long size) +{ + tlb->start =min (tlb->start, address); + tlb->end =max (tlb->end, address + size); +} +#ifndef __tlb_remove_tlb_entry#define __tlb_remove_tlb_entry (tlb, ptep, address) do { } while (0)#endif
include/linux/file.h +2 -0
@@ -12,6 +12,7 @@struct file ;extern void fput (struct file *); +extern void fput_many (struct file *,unsigned int );struct file_operations ;struct vfsmount ;
@@ -40,6 +41,7 @@ static inline void fdput(struct fd fd) }extern struct file *fget (unsigned int fd); +extern struct file *fget_many (unsigned int fd,unsigned int refs);extern struct file *fget_raw (unsigned int fd);extern unsigned long __fdget (unsigned int fd);extern unsigned long __fdget_raw (unsigned int fd);
include/linux/fs.h +3 -1
@@ -923,7 +923,9 @@ static inline struct file *get_file(struct file *f)atomic_long_inc (&f->f_count);return f; } -#define get_file_rcu (x) atomic_long_inc_not_zero(&(x)->f_count) +#define get_file_rcu_many (x, cnt) \ + atomic_long_add_unless(&(x)->f_count, (cnt), 0) +#define get_file_rcu (x) get_file_rcu_many((x), 1)#define fput_atomic (x) atomic_long_add_unless(&(x)->f_count, -1, 1)#define file_count (x) atomic_long_read(&(x)->f_count)
include/linux/ipc_namespace.h +15 -0
@@ -123,6 +123,16 @@ static inline struct ipc_namespace *get_ipc_ns(struct ipc_namespace *ns)return ns; } +static inline struct ipc_namespace *get_ipc_ns_not_zero (struct ipc_namespace *ns) +{ +if (ns) { +if (atomic_inc_not_zero (&ns->count)) +return ns; + } + +return NULL ; +} +extern void put_ipc_ns (struct ipc_namespace *ns);#else static inline struct ipc_namespace *copy_ipcs(unsigned long flags,
@@ -139,6 +149,11 @@ static inline struct ipc_namespace *get_ipc_ns(struct ipc_namespace *ns)return ns; } +static inline struct ipc_namespace *get_ipc_ns_not_zero (struct ipc_namespace *ns) +{ +return ns; +} +static inline void put_ipc_ns (struct ipc_namespace *ns) { }
include/linux/kprobes.h +2 -0
@@ -192,6 +192,8 @@ struct kretprobe {raw_spinlock_t lock; }; +#define KRETPROBE_MAX_DATA_SIZE 4096 +struct kretprobe_instance {struct hlist_node hlist;struct kretprobe *rp;
include/linux/sched.h +1 -1
@@ -2792,7 +2792,7 @@ static inline int thread_group_empty(struct task_struct *p)* Protects ->fs, ->files, ->mm, ->group_info, ->comm, keyring * subscriptions and synchronises with wait4(). Also used in procfs. Also * pins the final release of task.io_context. Also protects ->cpuset and -* ->cgroup.subsys[]. And ->vfork_done. +* ->cgroup.subsys[]. And ->vfork_done. And ->sysvshm.shm_clist. * * Nests both inside and outside of read_lock(&tasklist_lock). * It must not be nested with write_lock_irq(&tasklist_lock),
include/linux/shm.h +11 -2
@@ -19,9 +19,18 @@ struct shmid_kernel /* private to the kernel */pid_t shm_lprid;struct user_struct *mlock_user; -/* The task created the shm object. NULL if the task is dead. */ +/* +* The task created the shm object, for +* task_lock(shp->shm_creator) +*/ struct task_struct *shm_creator; -struct list_head shm_clist;/* list by creator */ + +/* +* List by creator. task_lock(->shm_creator) required for read/write. +* If list_empty(), then the creator is dead already. +*/ +struct list_head shm_clist; +struct ipc_namespace *ns; };/* shm_mode upper byte flags */
include/linux/siphash.h +4 -10
@@ -27,9 +27,7 @@ static inline bool siphash_key_is_zero(const siphash_key_t *key) }u64 __siphash_aligned (const void *data,size_t len,const siphash_key_t *key); -#ifndef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS u64 __siphash_unaligned (const void *data,size_t len,const siphash_key_t *key); -#endif u64 siphash_1u64 (const u64 a,const siphash_key_t *key);u64 siphash_2u64 (const u64 a,const u64 b,const siphash_key_t *key);
@@ -82,10 +80,9 @@ static inline u64 ___siphash_aligned(const __le64 *data, size_t len,static inline u64 siphash (const void *data,size_t len,const siphash_key_t *key) { -#ifndef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS -if (!IS_ALIGNED ((unsigned long )data,SIPHASH_ALIGNMENT )) +if (IS_ENABLED (CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS ) || + !IS_ALIGNED ((unsigned long )data,SIPHASH_ALIGNMENT ))return __siphash_unaligned (data, len, key); -#endif return ___siphash_aligned (data, len, key); }
@@ -96,10 +93,8 @@ typedef struct {u32 __hsiphash_aligned (const void *data,size_t len,const hsiphash_key_t *key); -#ifndef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS u32 __hsiphash_unaligned (const void *data,size_t len,const hsiphash_key_t *key); -#endif u32 hsiphash_1u32 (const u32 a,const hsiphash_key_t *key);u32 hsiphash_2u32 (const u32 a,const u32 b,const hsiphash_key_t *key);
@@ -135,10 +130,9 @@ static inline u32 ___hsiphash_aligned(const __le32 *data, size_t len,static inline u32 hsiphash (const void *data,size_t len,const hsiphash_key_t *key) { -#ifndef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS -if (!IS_ALIGNED ((unsigned long )data,HSIPHASH_ALIGNMENT )) +if (IS_ENABLED (CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS ) || + !IS_ALIGNED ((unsigned long )data,HSIPHASH_ALIGNMENT ))return __hsiphash_unaligned (data, len, key); -#endif return ___hsiphash_aligned (data, len, key); }
include/net/nfc/nci_core.h +1 -0
@@ -42,6 +42,7 @@ enum nci_flag {NCI_UP ,NCI_DATA_EXCHANGE ,NCI_DATA_EXCHANGE_TO , + NCI_UNREG, };/* NCI device states */
include/net/nl802154.h +4 -3
@@ -19,6 +19,8 @@* */ +#include <linux/types.h> +#define NL802154_GENL_NAME "nl802154"enum nl802154_commands {
@@ -143,10 +145,9 @@ enum nl802154_attrs { };enum nl802154_iftype { -/* for backwards compatibility TODO */ -NL802154_IFTYPE_UNSPEC =-1 , +NL802154_IFTYPE_UNSPEC = (~(__u32 )0 ), -NL802154_IFTYPE_NODE , +NL802154_IFTYPE_NODE =0 ,NL802154_IFTYPE_MONITOR ,NL802154_IFTYPE_COORD ,
include/xen/interface/io/ring.h +124 -133
351 lines not on this page · raw message
ipc/shm.c +132 -44
244 lines not on this page · raw message
kernel/kprobes.c +3 -0
@@ -1899,6 +1899,9 @@ int register_kretprobe(struct kretprobe *rp) } } +if (rp->data_size >KRETPROBE_MAX_DATA_SIZE ) +return -E2BIG ; + rp->kp.pre_handler = pre_handler_kretprobe; rp->kp.post_handler =NULL ; rp->kp.fault_handler =NULL ;
kernel/trace/trace_events.c +7 -0
@@ -2341,12 +2341,19 @@ static struct trace_event_file * trace_create_new_event(struct trace_event_call *call, struct trace_array *tr) { + struct trace_pid_list *pid_list;struct trace_event_file *file; file =kmem_cache_alloc (file_cachep,GFP_TRACE );if (!file)return NULL ; + pid_list =rcu_dereference_protected (tr->filtered_pids, +lockdep_is_held (&event_mutex)); + +if (pid_list) + file->flags |=EVENT_FILE_FL_PID_FILTER ; + file->event_call = call; file->tr = tr;atomic_set (&file->sm_ref,0 );
lib/siphash.c +6 -6
@@ -49,6 +49,7 @@SIPROUND ; \return (v0 ^ v1) ^ (v2 ^ v3); +#ifndef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS u64 __siphash_aligned (const void *data,size_t len,const siphash_key_t *key) {const u8 *end = data + len - (len %sizeof (u64));
@@ -80,8 +81,8 @@ u64 __siphash_aligned(const void *data, size_t len, const siphash_key_t *key)POSTAMBLE }EXPORT_SYMBOL (__siphash_aligned ); +#endif -#ifndef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS u64 __siphash_unaligned (const void *data,size_t len,const siphash_key_t *key) {const u8 *end = data + len - (len %sizeof (u64));
@@ -113,7 +114,6 @@ u64 __siphash_unaligned(const void *data, size_t len, const siphash_key_t *key) POSTAMBLE }EXPORT_SYMBOL (__siphash_unaligned); -#endif /** * siphash_1u64 - compute 64-bit siphash PRF value of a u64
@@ -250,6 +250,7 @@ EXPORT_SYMBOL(siphash_3u32);HSIPROUND ; \return (v0 ^ v1) ^ (v2 ^ v3); +#ifndef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS u32 __hsiphash_aligned (const void *data,size_t len,const hsiphash_key_t *key) {const u8 *end = data + len - (len %sizeof (u64));
@@ -280,8 +281,8 @@ u32 __hsiphash_aligned(const void *data, size_t len, const hsiphash_key_t *key)HPOSTAMBLE }EXPORT_SYMBOL (__hsiphash_aligned ); +#endif -#ifndef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS u32 __hsiphash_unaligned (const void *data,size_t len,const hsiphash_key_t *key) {
@@ -313,7 +314,6 @@ u32 __hsiphash_unaligned(const void *data, size_t len, HPOSTAMBLE }EXPORT_SYMBOL (__hsiphash_unaligned); -#endif /** * hsiphash_1u32 - compute 64-bit hsiphash PRF value of a u32
@@ -418,6 +418,7 @@ EXPORT_SYMBOL(hsiphash_4u32);HSIPROUND ; \return v1 ^ v3; +#ifndef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS u32 __hsiphash_aligned (const void *data,size_t len,const hsiphash_key_t *key) {const u8 *end = data + len - (len %sizeof (u32));
@@ -438,8 +439,8 @@ u32 __hsiphash_aligned(const void *data, size_t len, const hsiphash_key_t *key)HPOSTAMBLE }EXPORT_SYMBOL (__hsiphash_aligned ); +#endif -#ifndef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS u32 __hsiphash_unaligned (const void *data,size_t len,const hsiphash_key_t *key) {
@@ -461,7 +462,6 @@ u32 __hsiphash_unaligned(const void *data, size_t len, HPOSTAMBLE }EXPORT_SYMBOL (__hsiphash_unaligned); -#endif /** * hsiphash_1u32 - compute 32-bit hsiphash PRF value of a u32
mm/hugetlb.c +47 -11
110 lines not on this page · raw message
net/ipv4/devinet.c +1 -1
@@ -2237,7 +2237,7 @@ static int __devinet_sysctl_register(struct net *net, char *dev_name, free:kfree (t); out: -return -ENOBUFS ; +return -ENOMEM ; }static void __devinet_sysctl_unregister (struct ipv4_devconf *cnf)
net/ipv4/tcp_cubic.c +3 -2
@@ -342,8 +342,6 @@ static void bictcp_cong_avoid(struct sock *sk, u32 ack, u32 acked)return ;if (tcp_in_slow_start (tp)) { -if (hystart &&after (ack, ca->end_seq)) -bictcp_hystart_reset (sk); acked =tcp_slow_start (tp, acked);if (!acked)return ;
@@ -394,6 +392,9 @@ static void hystart_update(struct sock *sk, u32 delay)if (ca->found & hystart_detect)return ; +if (after (tp->snd_una, ca->end_seq)) +bictcp_hystart_reset (sk); +if (hystart_detect &HYSTART_ACK_TRAIN ) {u32 now =bictcp_clock ();
net/nfc/nci/core.c +17 -2
@@ -401,6 +401,11 @@ static int nci_open_device(struct nci_dev *ndev)mutex_lock (&ndev->req_lock); +if (test_bit (NCI_UNREG , &ndev->flags)) { + rc = -ENODEV ; + goto done; + } +if (test_bit (NCI_UP , &ndev->flags)) { rc = -EALREADY ; goto done;
@@ -464,6 +469,10 @@ done:static int nci_close_device (struct nci_dev *ndev) {nci_req_cancel (ndev,ENODEV ); + +/* This mutex needs to be held as a barrier for +* caller nci_unregister_device +*/ mutex_lock (&ndev->req_lock);if (!test_and_clear_bit (NCI_UP , &ndev->flags)) {
@@ -501,8 +510,8 @@ static int nci_close_device(struct nci_dev *ndev)/* Flush cmd wq */ flush_workqueue (ndev->cmd_wq); -/* Clear flags */ - ndev->flags =0 ; +/* Clear flags except NCI_UNREG */ + ndev->flags &=BIT (NCI_UNREG );mutex_unlock (&ndev->req_lock);
@@ -1182,6 +1191,12 @@ void nci_unregister_device(struct nci_dev *ndev) {struct nci_conn_info *conn_info, *n; +/* This set_bit is not protected with specialized barrier, +* However, it is fine because the mutex_lock(&ndev->req_lock); +* in nci_close_device() will help to emit one. +*/ +set_bit (NCI_UNREG , &ndev->flags); +nci_close_device (ndev);destroy_workqueue (ndev->cmd_wq);
sound/pci/ctxfi/ctamixer.c +6 -8
@@ -27,16 +27,15 @@#define BLANK_SLOT 4094 -static int amixer_master (struct rsc *rsc) +static void amixer_master (struct rsc *rsc) { rsc->conj =0 ; - return rsc->idx = container_of(rsc, struct amixer, rsc)->idx[0]; + rsc->idx = container_of(rsc, struct amixer, rsc)->idx[0]; } -static int amixer_next_conj (struct rsc *rsc) +static void amixer_next_conj (struct rsc *rsc) { rsc->conj++; - return container_of(rsc, struct amixer, rsc)->idx[rsc->conj]; }static int amixer_index (const struct rsc *rsc)
@@ -335,16 +334,15 @@ int amixer_mgr_destroy(struct amixer_mgr *amixer_mgr)/* SUM resource management */ -static int sum_master (struct rsc *rsc) +static void sum_master (struct rsc *rsc) { rsc->conj =0 ; - return rsc->idx = container_of(rsc, struct sum, rsc)->idx[0]; + rsc->idx = container_of(rsc, struct sum, rsc)->idx[0]; } -static int sum_next_conj (struct rsc *rsc) +static void sum_next_conj (struct rsc *rsc) { rsc->conj++; - return container_of(rsc, struct sum, rsc)->idx[rsc->conj]; }static int sum_index (const struct rsc *rsc)
sound/pci/ctxfi/ctdaio.c +8 -8
@@ -55,12 +55,12 @@ static struct daio_rsc_idx idx_20k2[NUM_DAIOTYP] = { [SPDIFIO] = {.left = 0x05, .right = 0x85}, }; -static int daio_master (struct rsc *rsc) +static void daio_master (struct rsc *rsc) {/* Actually, this is not the resource index of DAIO. * For DAO, it is the input mapper index. And, for DAI, * it is the output time-slot index. */ -return rsc->conj = rsc->idx; + rsc->conj = rsc->idx; }static int daio_index (const struct rsc *rsc)
@@ -68,19 +68,19 @@ static int daio_index(const struct rsc *rsc)return rsc->conj; } -static int daio_out_next_conj (struct rsc *rsc) +static void daio_out_next_conj (struct rsc *rsc) { -return rsc->conj +=2 ; + rsc->conj +=2 ; } -static int daio_in_next_conj_20k1 (struct rsc *rsc) +static void daio_in_next_conj_20k1 (struct rsc *rsc) { -return rsc->conj +=0x200 ; + rsc->conj +=0x200 ; } -static int daio_in_next_conj_20k2 (struct rsc *rsc) +static void daio_in_next_conj_20k2 (struct rsc *rsc) { -return rsc->conj +=0x100 ; + rsc->conj +=0x100 ; }static const struct rsc_ops daio_out_rsc_ops = {
sound/pci/ctxfi/ctresource.c +3 -4
@@ -113,18 +113,17 @@ static int audio_ring_slot(const struct rsc *rsc)return (rsc->conj <<4 ) + offset_in_audio_slot_block[rsc->type]; } -static int rsc_next_conj (struct rsc *rsc) +static void rsc_next_conj (struct rsc *rsc) {unsigned int i;for (i =0 ; (i <8 ) && (!(rsc->msr & (0x1 << i))); ) i++; rsc->conj += (AUDIO_SLOT_BLOCK_NUM >> i); -return rsc->conj; } -static int rsc_master (struct rsc *rsc) +static void rsc_master (struct rsc *rsc) { -return rsc->conj = rsc->idx; + rsc->conj = rsc->idx; }static const struct rsc_ops rsc_generic_ops = {
sound/pci/ctxfi/ctresource.h +2 -2
@@ -43,8 +43,8 @@ struct rsc { };struct rsc_ops { -int (*master)(struct rsc *rsc);/* Move to master resource */ -int (*next_conj)(struct rsc *rsc);/* Move to next conjugate resource */ +void (*master)(struct rsc *rsc);/* Move to master resource */ +void (*next_conj)(struct rsc *rsc);/* Move to next conjugate resource */ int (*index)(const struct rsc *rsc);/* Return the index of resource */ /* Return the output slot number */ int (*output_slot)(const struct rsc *rsc);
sound/pci/ctxfi/ctsrc.c +3 -4
@@ -594,16 +594,15 @@ int src_mgr_destroy(struct src_mgr *src_mgr)/* SRCIMP resource manager operations */ -static int srcimp_master (struct rsc *rsc) +static void srcimp_master (struct rsc *rsc) { rsc->conj =0 ; - return rsc->idx = container_of(rsc, struct srcimp, rsc)->idx[0]; + rsc->idx = container_of(rsc, struct srcimp, rsc)->idx[0]; } -static int srcimp_next_conj (struct rsc *rsc) +static void srcimp_next_conj (struct rsc *rsc) { rsc->conj++; - return container_of(rsc, struct srcimp, rsc)->idx[rsc->conj]; }static int srcimp_index (const struct rsc *rsc)
sound/soc/soc-topology.c +3 -0
@@ -1831,6 +1831,7 @@ EXPORT_SYMBOL_GPL(snd_soc_tplg_widget_remove_all);/* remove dynamic controls from the component driver */ int snd_soc_tplg_component_remove (struct snd_soc_component *comp,u32 index) { +struct snd_card *card = comp->card->snd_card;struct snd_soc_dobj *dobj, *next_dobj;int pass =SOC_TPLG_PASS_END ;
@@ -1838,6 +1839,7 @@ int snd_soc_tplg_component_remove(struct snd_soc_component *comp, u32 index)while (pass >=SOC_TPLG_PASS_START ) {/* remove mixer controls */ +down_write (&card->controls_rwsem);list_for_each_entry_safe (dobj, next_dobj, &comp->dobj_list, list) {
@@ -1870,6 +1872,7 @@ int snd_soc_tplg_component_remove(struct snd_soc_component *comp, u32 index)break ; } } +up_write (&card->controls_rwsem); pass--; }