summaryrefslogtreecommitdiff
path: root/kernel/irq/migration.c
diff options
context:
space:
mode:
authorGreg Kroah-Hartman <gregkh@google.com>2020-06-03 09:38:51 +0200
committerGreg Kroah-Hartman <gregkh@google.com>2020-06-03 09:38:51 +0200
commit60fca757270659c627384fcfe7219d2b85f1459c (patch)
tree3a45d7b815eeb7ac3f052d63f290c533fa9432c4 /kernel/irq/migration.c
parent8cdf067364d88538d70d359a3991138141077b9d (diff)
parent95a3867e897abd7811196123f81a119a75aba863 (diff)
Merge 4.4.226 into android-4.4-p
Changes in 4.4.226 ax25: fix setsockopt(SO_BINDTODEVICE) net: revert "net: get rid of an signed integer overflow in ip_idents_reserve()" sctp: Start shutdown on association restart if in SHUTDOWN-SENT state and socket is closed net/mlx5: Add command entry handling completion net: sun: fix missing release regions in cas_init_one(). net/mlx4_core: fix a memory leak bug. uapi: fix linux/if_pppol2tp.h userspace compilation errors IB/cma: Fix reference count leak when no ipv4 addresses are set cachefiles: Fix race between read_waiter and read_copier involving op->to_do usb: gadget: legacy: fix redundant initialization warnings cifs: Fix null pointer check in cifs_read Input: usbtouchscreen - add support for BonXeon TP Input: evdev - call input_flush_device() on release(), not flush() Input: xpad - add custom init packet for Xbox One S controllers Input: i8042 - add ThinkPad S230u to i8042 reset list IB/qib: Call kobject_put() when kobject_init_and_add() fails ALSA: hwdep: fix a left shifting 1 by 31 UB bug ALSA: usb-audio: mixer: volume quirk for ESS Technology Asus USB DAC exec: Always set cap_ambient in cap_bprm_set_creds fs/binfmt_elf.c: allocate initialized memory in fill_thread_core_info() include/asm-generic/topology.h: guard cpumask_of_node() macro argument iommu: Fix reference count leak in iommu_group_alloc. parisc: Fix kernel panic in mem_init() x86/dma: Fix max PFN arithmetic overflow on 32 bit systems xfrm: allow to accept packets with ipv6 NEXTHDR_HOP in xfrm_input xfrm: fix a warning in xfrm_policy_insert_list xfrm: fix a NULL-ptr deref in xfrm_local_error vti4: eliminated some duplicate code. ip_vti: receive ipip packet by calling ip_tunnel_rcv netfilter: nft_reject_bridge: enable reject with bridge vlan netfilter: ipset: Fix subcounter update skip netfilter: nf_conntrack_pptp: prevent buffer overflows in debug code qlcnic: fix missing release in qlcnic_83xx_interrupt_test. bonding: Fix reference count leak in bond_sysfs_slave_add. netfilter: nf_conntrack_pptp: fix compilation warning with W=1 build mm: remove VM_BUG_ON(PageSlab()) from page_mapcount() drm/fb-helper: Use proper plane mask for fb cleanup genirq/generic_pending: Do not lose pending affinity update usb: renesas_usbhs: gadget: fix spin_lock_init() for &uep->lock mac80211: fix memory leak net: rtnl_configure_link: fix dev flags changes arg to __dev_notify_flags mm/vmalloc.c: don't dereference possible NULL pointer in __vunmap() asm-prototypes: Clear any CPP defines before declaring the functions sc16is7xx: move label 'err_spi' to correct section drm/msm: Fix possible null dereference on failure of get_pages() printk: help pr_debug and pr_devel to optimize out arguments scsi: zfcp: fix request object use-after-free in send path causing wrong traces Linux 4.4.226 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> Change-Id: Ia5473e84bcdec9d8a045a80a1c683fc1072f8c4f
Diffstat (limited to 'kernel/irq/migration.c')
-rw-r--r--kernel/irq/migration.c26
1 files changed, 19 insertions, 7 deletions
diff --git a/kernel/irq/migration.c b/kernel/irq/migration.c
index 37ddb7bda651..ec7c7eda0774 100644
--- a/kernel/irq/migration.c
+++ b/kernel/irq/migration.c
@@ -7,17 +7,18 @@
void irq_move_masked_irq(struct irq_data *idata)
{
struct irq_desc *desc = irq_data_to_desc(idata);
- struct irq_chip *chip = desc->irq_data.chip;
+ struct irq_data *data = &desc->irq_data;
+ struct irq_chip *chip = data->chip;
- if (likely(!irqd_is_setaffinity_pending(&desc->irq_data)))
+ if (likely(!irqd_is_setaffinity_pending(data)))
return;
- irqd_clr_move_pending(&desc->irq_data);
+ irqd_clr_move_pending(data);
/*
* Paranoia: cpu-local interrupts shouldn't be calling in here anyway.
*/
- if (irqd_is_per_cpu(&desc->irq_data)) {
+ if (irqd_is_per_cpu(data)) {
WARN_ON(1);
return;
}
@@ -42,9 +43,20 @@ void irq_move_masked_irq(struct irq_data *idata)
* For correct operation this depends on the caller
* masking the irqs.
*/
- if (cpumask_any_and(desc->pending_mask, cpu_online_mask) < nr_cpu_ids)
- irq_do_set_affinity(&desc->irq_data, desc->pending_mask, false);
-
+ if (cpumask_any_and(desc->pending_mask, cpu_online_mask) < nr_cpu_ids) {
+ int ret;
+
+ ret = irq_do_set_affinity(data, desc->pending_mask, false);
+ /*
+ * If the there is a cleanup pending in the underlying
+ * vector management, reschedule the move for the next
+ * interrupt. Leave desc->pending_mask intact.
+ */
+ if (ret == -EBUSY) {
+ irqd_set_move_pending(data);
+ return;
+ }
+ }
cpumask_clear(desc->pending_mask);
}