Linux 4.14.198
Greg Kroah-Hartman
maintainerI'm announcing the release of the 4.14.198 kernel.
All users of the 4.14 kernel series must upgrade.
The updated 4.14.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-4.14.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 block/blk-core.c | 2 drivers/net/ethernet/broadcom/bnxt/bnxt.c | 9 drivers/net/usb/dm9601.c | 4 drivers/vfio/pci/vfio_pci.c | 352 +++++++++++++++++++++++++++--- drivers/vfio/pci/vfio_pci_config.c | 51 +++- drivers/vfio/pci/vfio_pci_intrs.c | 14 + drivers/vfio/pci/vfio_pci_private.h | 16 + drivers/vfio/pci/vfio_pci_rdwr.c | 29 +- drivers/vfio/vfio_iommu_type1.c | 36 ++- net/core/dev.c | 3 net/core/netpoll.c | 2 net/netlabel/netlabel_domainhash.c | 59 ++--- net/sctp/socket.c | 16 - net/tipc/socket.c | 9 sound/firewire/tascam/tascam.c | 30 ++ 16 files changed, 538 insertions(+), 96 deletions(-)
Alex Williamson (4):
vfio/type1: Support faulting PFNMAP vmas
vfio-pci: Fault mmaps to enable vma tracking
vfio-pci: Invalidate mmaps and block MMIO access on disabled memory vfio/pci: Fix SR-IOV VF handling with MMIO blocking
Greg Kroah-Hartman (1):
Linux 4.14.198
Jakub Kicinski (2):
bnxt: don't enable NAPI until rings are ready
net: disable netpoll on fresh napis
Jens Axboe (1):
block: ensure bdi->io_pages is always initialized
Kamil Lorenc (1):
net: usb: dm9601: Add USB ID of Keenetic Plus DSL
Paul Moore (1):
netlabel: fix problems with mapping removal
Takashi Sakamoto (1):
ALSA; firewire-tascam: exclude Tascam FE-8 from detection
Tetsuo Handa (1):
tipc: fix shutdown() of connectionless socket
Xin Long (1):
sctp: not disable bh in the whole sctp_get_port_local()
Greg Kroah-Hartman
maintainerMakefile +1 -1
@@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 4 PATCHLEVEL = 14 -SUBLEVEL = 197 +SUBLEVEL = 198 EXTRAVERSION = NAME = Petit Gorille
block/blk-core.c +2 -0
@@ -852,6 +852,8 @@ struct request_queue *blk_alloc_queue_node(gfp_t gfp_mask, int node_id) q->backing_dev_info->ra_pages = (VM_MAX_READAHEAD *1024 ) /PAGE_SIZE ; + q->backing_dev_info->io_pages = + (VM_MAX_READAHEAD *1024 ) /PAGE_SIZE ; q->backing_dev_info->capabilities =BDI_CAP_CGROUP_WRITEBACK ; q->backing_dev_info->name ="block" ; q->node = node_id;
drivers/net/ethernet/broadcom/bnxt/bnxt.c +3 -6
@@ -6378,14 +6378,14 @@ static int __bnxt_open_nic(struct bnxt *bp, bool irq_re_init, bool link_re_init) } } -bnxt_enable_napi (bp); - rc =bnxt_init_nic (bp, irq_re_init);if (rc) {netdev_err (bp->dev,"bnxt_init_nic err: %x\n" , rc); - goto open_err; + goto open_err_irq; } +bnxt_enable_napi (bp); +if (link_re_init) {mutex_lock (&bp->link_lock); rc =bnxt_update_phy_setting (bp);
@@ -6410,9 +6410,6 @@ static int __bnxt_open_nic(struct bnxt *bp, bool irq_re_init, bool link_re_init)bnxt_vf_reps_open (bp);return 0 ; -open_err: -bnxt_disable_napi (bp); - open_err_irq:bnxt_del_napi (bp);
drivers/net/usb/dm9601.c +4 -0
@@ -625,6 +625,10 @@ static const struct usb_device_id products[] = { USB_DEVICE(0x0a46, 0x1269), /* DM9621A USB to Fast Ethernet Adapter */ .driver_info = (unsigned long)&dm9601_info, }, + { + USB_DEVICE(0x0586, 0x3427), /* ZyXEL Keenetic Plus DSL xDSL modem */ + .driver_info = (unsigned long)&dm9601_info, + }, {}, // END };
drivers/vfio/pci/vfio_pci.c +325 -27
453 lines not on this page · raw message
drivers/vfio/pci/vfio_pci_config.c +45 -6
100 lines not on this page · raw message
drivers/vfio/pci/vfio_pci_intrs.c +14 -0
@@ -252,6 +252,7 @@ static int vfio_msi_enable(struct vfio_pci_device *vdev, int nvec, bool msix)struct pci_dev *pdev = vdev->pdev;unsigned int flag = msix ?PCI_IRQ_MSIX :PCI_IRQ_MSI ;int ret; +u16 cmd;if (!is_irq_none (vdev))return -EINVAL ;
@@ -261,13 +262,16 @@ static int vfio_msi_enable(struct vfio_pci_device *vdev, int nvec, bool msix)return -ENOMEM ;/* return the number of supported vectors if we can't get all: */ + cmd =vfio_pci_memory_lock_and_enable (vdev); ret =pci_alloc_irq_vectors (pdev,1 , nvec, flag);if (ret < nvec) {if (ret >0 )pci_free_irq_vectors (pdev); +vfio_pci_memory_unlock_and_restore (vdev, cmd);kfree (vdev->ctx);return ret; } +vfio_pci_memory_unlock_and_restore (vdev, cmd); vdev->num_ctx = nvec; vdev->irq_type = msix ? VFIO_PCI_MSIX_IRQ_INDEX :
@@ -290,6 +294,7 @@ static int vfio_msi_set_vector_signal(struct vfio_pci_device *vdev,struct pci_dev *pdev = vdev->pdev;struct eventfd_ctx *trigger;int irq, ret; +u16 cmd;if (vector <0 || vector >= vdev->num_ctx)return -EINVAL ;
@@ -298,7 +303,11 @@ static int vfio_msi_set_vector_signal(struct vfio_pci_device *vdev,if (vdev->ctx[vector].trigger) {irq_bypass_unregister_producer (&vdev->ctx[vector].producer); + + cmd =vfio_pci_memory_lock_and_enable (vdev);free_irq (irq, vdev->ctx[vector].trigger); +vfio_pci_memory_unlock_and_restore (vdev, cmd); +kfree (vdev->ctx[vector].name);eventfd_ctx_put (vdev->ctx[vector].trigger); vdev->ctx[vector].trigger =NULL ;
@@ -326,6 +335,7 @@ static int vfio_msi_set_vector_signal(struct vfio_pci_device *vdev,* such a reset it would be unsuccessful. To avoid this, restore the * cached value of the message prior to enabling. */ + cmd =vfio_pci_memory_lock_and_enable (vdev);if (msix) {struct msi_msg msg;
@@ -335,6 +345,7 @@ static int vfio_msi_set_vector_signal(struct vfio_pci_device *vdev, ret =request_irq (irq, vfio_msihandler,0 , vdev->ctx[vector].name, trigger); +vfio_pci_memory_unlock_and_restore (vdev, cmd);if (ret) {kfree (vdev->ctx[vector].name);eventfd_ctx_put (trigger);
@@ -379,6 +390,7 @@ static void vfio_msi_disable(struct vfio_pci_device *vdev, bool msix) {struct pci_dev *pdev = vdev->pdev;int i; +u16 cmd;for (i =0 ; i < vdev->num_ctx; i++) {vfio_virqfd_disable (&vdev->ctx[i].unmask);
@@ -387,7 +399,9 @@ static void vfio_msi_disable(struct vfio_pci_device *vdev, bool msix)vfio_msi_set_block (vdev,0 , vdev->num_ctx,NULL , msix); + cmd =vfio_pci_memory_lock_and_enable (vdev);pci_free_irq_vectors (pdev); +vfio_pci_memory_unlock_and_restore (vdev, cmd);/* * Both disable paths above use pci_intx_for_msi() to clear DisINTx
drivers/vfio/pci/vfio_pci_private.h +16 -0
@@ -63,6 +63,11 @@ struct vfio_pci_dummy_resource {struct list_head res_next; }; +struct vfio_pci_mmap_vma { +struct vm_area_struct *vma; +struct list_head vma_next; +}; +struct vfio_pci_device {struct pci_dev *pdev;void __iomem *barmap[PCI_STD_RESOURCE_END +1 ];
@@ -95,6 +100,9 @@ struct vfio_pci_device {struct eventfd_ctx *err_trigger;struct eventfd_ctx *req_trigger;struct list_head dummy_resources_list; +struct mutex vma_lock; +struct list_head vma_list; +struct rw_semaphore memory_lock; };#define is_intx (vdev) (vdev->irq_type == VFIO_PCI_INTX_IRQ_INDEX)
@@ -130,6 +138,14 @@ extern int vfio_pci_register_dev_region(struct vfio_pci_device *vdev, unsigned int type, unsigned int subtype, const struct vfio_pci_regops *ops, size_t size, u32 flags, void *data); + +extern bool __vfio_pci_memory_enabled (struct vfio_pci_device *vdev); +extern void vfio_pci_zap_and_down_write_memory_lock (struct vfio_pci_device + *vdev); +extern u16 vfio_pci_memory_lock_and_enable (struct vfio_pci_device *vdev); +extern void vfio_pci_memory_unlock_and_restore (struct vfio_pci_device *vdev, +u16 cmd); +#ifdef CONFIG_VFIO_PCI_IGD extern int vfio_pci_igd_init (struct vfio_pci_device *vdev);#else
drivers/vfio/pci/vfio_pci_rdwr.c +21 -8
@@ -122,6 +122,7 @@ ssize_t vfio_pci_bar_rw(struct vfio_pci_device *vdev, char __user *buf,size_t x_start =0 , x_end =0 ;resource_size_t end;void __iomem *io; +struct resource *res = &vdev->pdev->resource[bar];ssize_t done;if (pci_resource_start (pdev, bar))
@@ -137,6 +138,14 @@ ssize_t vfio_pci_bar_rw(struct vfio_pci_device *vdev, char __user *buf, count =min (count, (size_t )(end - pos)); +if (res->flags &IORESOURCE_MEM ) { +down_read (&vdev->memory_lock); +if (!__vfio_pci_memory_enabled (vdev)) { +up_read (&vdev->memory_lock); +return -EIO ; + } + } +if (bar ==PCI_ROM_RESOURCE ) {/* * The ROM can fill less space than the BAR, so we start the
@@ -144,20 +153,21 @@ ssize_t vfio_pci_bar_rw(struct vfio_pci_device *vdev, char __user *buf,* filling large ROM BARs much faster. */ io =pci_map_rom (pdev, &x_start); -if (!io) -return -ENOMEM ; +if (!io) { + done = -ENOMEM ; + goto out; + } x_end = end; }else if (!vdev->barmap[bar]) { -int ret; - - ret =pci_request_selected_regions (pdev,1 << bar,"vfio" ); -if (ret) -return ret; + done =pci_request_selected_regions (pdev,1 << bar,"vfio" ); +if (done) + goto out; io =pci_iomap (pdev, bar,0 );if (!io) {pci_release_selected_regions (pdev,1 << bar); -return -ENOMEM ; + done = -ENOMEM ; + goto out; } vdev->barmap[bar] = io;
@@ -176,6 +186,9 @@ ssize_t vfio_pci_bar_rw(struct vfio_pci_device *vdev, char __user *buf,if (bar ==PCI_ROM_RESOURCE )pci_unmap_rom (pdev, io); +out: +if (res->flags &IORESOURCE_MEM ) +up_read (&vdev->memory_lock);return done; }
drivers/vfio/vfio_iommu_type1.c +33 -3
@@ -336,6 +336,32 @@ static int put_pfn(unsigned long pfn, int prot)return 0 ; } +static int follow_fault_pfn (struct vm_area_struct *vma,struct mm_struct *mm, +unsigned long vaddr,unsigned long *pfn, +bool write_fault) +{ +int ret; + + ret =follow_pfn (vma, vaddr, pfn); +if (ret) { +bool unlocked = false; + + ret =fixup_user_fault (NULL , mm, vaddr, +FAULT_FLAG_REMOTE | + (write_fault ?FAULT_FLAG_WRITE :0 ), + &unlocked); +if (unlocked) +return -EAGAIN ; + +if (ret) +return ret; + + ret =follow_pfn (vma, vaddr, pfn); + } + +return ret; +} +static int vaddr_get_pfn (struct mm_struct *mm,unsigned long vaddr,int prot,unsigned long *pfn) {
@@ -375,12 +401,16 @@ static int vaddr_get_pfn(struct mm_struct *mm, unsigned long vaddr,down_read (&mm->mmap_sem); +retry: vma =find_vma_intersection (mm, vaddr, vaddr +1 );if (vma && vma->vm_flags &VM_PFNMAP ) { -if (!follow_pfn (vma, vaddr, pfn) && -is_invalid_reserved_pfn (*pfn)) - ret =0 ; + ret =follow_fault_pfn (vma, mm, vaddr, pfn, prot &IOMMU_WRITE ); +if (ret == -EAGAIN ) + goto retry; + +if (!ret && !is_invalid_reserved_pfn (*pfn)) + ret = -EFAULT ; }up_read (&mm->mmap_sem);
net/core/dev.c +2 -1
@@ -5532,12 +5532,13 @@ void netif_napi_add(struct net_device *dev, struct napi_struct *napi,pr_err_once ("netif_napi_add() called with weight %d on device %s\n" , weight, dev->name); napi->weight = weight; -list_add (&napi->dev_list, &dev->napi_list); napi->dev = dev;#ifdef CONFIG_NETPOLL napi->poll_owner =-1 ;#endif set_bit (NAPI_STATE_SCHED , &napi->state); +set_bit (NAPI_STATE_NPSVC , &napi->state); +list_add_rcu (&napi->dev_list, &dev->napi_list);napi_hash_add (napi); }EXPORT_SYMBOL (netif_napi_add);
net/core/netpoll.c +1 -1
@@ -179,7 +179,7 @@ static void poll_napi(struct net_device *dev)struct napi_struct *napi;int cpu =smp_processor_id (); -list_for_each_entry (napi, &dev->napi_list, dev_list) { +list_for_each_entry_rcu (napi, &dev->napi_list, dev_list) {if (cmpxchg (&napi->poll_owner,-1 , cpu) ==-1 ) {poll_one_napi (napi);smp_store_release (&napi->poll_owner,-1 );
net/netlabel/netlabel_domainhash.c +30 -29
94 lines not on this page · raw message
net/sctp/socket.c +6 -10
@@ -7086,8 +7086,6 @@ static long sctp_get_port_local(struct sock *sk, union sctp_addr *addr)pr_debug ("%s: begins, snum:%d\n" , __func__, snum); -local_bh_disable (); -if (snum ==0 ) {/* Search for an available port. */ int low, high, remaining, index;
@@ -7106,20 +7104,21 @@ static long sctp_get_port_local(struct sock *sk, union sctp_addr *addr)continue ; index =sctp_phashfn (sock_net (sk), rover); head = &sctp_port_hashtable[index]; -spin_lock (&head->lock); +spin_lock_bh (&head->lock);sctp_for_each_hentry (pp, &head->chain)if ((pp->port == rover) &&net_eq (sock_net (sk), pp->net)) goto next;break ; next: -spin_unlock (&head->lock); +spin_unlock_bh (&head->lock); +cond_resched (); }while (--remaining >0 );/* Exhausted local port range during search? */ ret =1 ;if (remaining <=0 ) - goto fail; +return ret;/* OK, here is the one we will use. HEAD (the port * hash table list entry) is non-NULL and we hold it's
@@ -7134,7 +7133,7 @@ static long sctp_get_port_local(struct sock *sk, union sctp_addr *addr)* port iterator, pp being NULL. */ head = &sctp_port_hashtable[sctp_phashfn (sock_net (sk), snum)]; -spin_lock (&head->lock); +spin_lock_bh (&head->lock);sctp_for_each_hentry (pp, &head->chain) {if ((pp->port == snum) &&net_eq (pp->net,sock_net (sk))) goto pp_found;
@@ -7218,10 +7217,7 @@ static long sctp_get_port_local(struct sock *sk, union sctp_addr *addr) ret =0 ; fail_unlock: -spin_unlock (&head->lock); - -fail: -local_bh_enable (); +spin_unlock_bh (&head->lock);return ret; }
net/tipc/socket.c +6 -3
@@ -2126,18 +2126,21 @@ static int tipc_shutdown(struct socket *sock, int how)lock_sock (sk);__tipc_shutdown (sock,TIPC_CONN_SHUTDOWN ); - sk->sk_shutdown =SEND_SHUTDOWN ; +if (tipc_sk_type_connectionless (sk)) + sk->sk_shutdown =SHUTDOWN_MASK ; +else + sk->sk_shutdown =SEND_SHUTDOWN ;if (sk->sk_state ==TIPC_DISCONNECTING ) {/* Discard any unreceived messages */ __skb_queue_purge (&sk->sk_receive_queue); -/* Wake up anyone sleeping in poll */ - sk->sk_state_change (sk); res =0 ; }else { res = -ENOTCONN ; } +/* Wake up anyone sleeping in poll. */ + sk->sk_state_change (sk);release_sock (sk);return res;
sound/firewire/tascam/tascam.c +29 -1
@@ -225,11 +225,39 @@ static void snd_tscm_remove(struct fw_unit *unit) }static const struct ieee1394_device_id snd_tscm_id_table[] = { +// Tascam, FW-1884. { .match_flags =IEEE1394_MATCH_VENDOR_ID | -IEEE1394_MATCH_SPECIFIER_ID , +IEEE1394_MATCH_SPECIFIER_ID | +IEEE1394_MATCH_VERSION , .vendor_id =0x00022e , .specifier_id =0x00022e , + .version =0x800000 , + }, +// Tascam, FE-8 (.version = 0x800001) +// This kernel module doesn't support FE-8 because the most of features +// can be implemented in userspace without any specific support of this +// module. +// +// .version = 0x800002 is unknown. +// +// Tascam, FW-1082. + { + .match_flags =IEEE1394_MATCH_VENDOR_ID | +IEEE1394_MATCH_SPECIFIER_ID | +IEEE1394_MATCH_VERSION , + .vendor_id =0x00022e , + .specifier_id =0x00022e , + .version =0x800003 , + }, +// Tascam, FW-1804. + { + .match_flags =IEEE1394_MATCH_VENDOR_ID | +IEEE1394_MATCH_SPECIFIER_ID | +IEEE1394_MATCH_VERSION , + .vendor_id =0x00022e , + .specifier_id =0x00022e , + .version =0x800004 , },/* FE-08 requires reverse-engineering because it just has faders. */ {}