Linux 5.15.39
Greg Kroah-Hartman
maintainerMakefile +1 -1
@@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 5 PATCHLEVEL = 15 -SUBLEVEL = 38 +SUBLEVEL = 39 EXTRAVERSION = NAME = Trick or Treat
arch/mips/include/asm/timex.h +4 -4
@@ -40,9 +40,9 @@typedef unsigned int cycles_t ;/* -* On R4000/R4400 before version 5.0 an erratum exists such that if the -* cycle counter is read in the exact moment that it is matching the -* compare register, no interrupt will be generated. +* On R4000/R4400 an erratum exists such that if the cycle counter is +* read in the exact moment that it is matching the compare register, +* no interrupt will be generated. * * There is a suggested workaround and also the erratum can't strike if * the compare interrupt isn't being used as the clock source device.
@@ -63,7 +63,7 @@ static inline int can_use_mips_counter(unsigned int prid)if (!__builtin_constant_p (cpu_has_counter)) asmvolatile ("" :"=m" (cpu_data[0 ].options));if (likely (cpu_has_counter && - prid >= (PRID_IMP_R4000 |PRID_REV_ENCODE_44 (5 ,0 )))) + prid > (PRID_IMP_R4000 |PRID_REV_ENCODE_44 (15 ,15 ))))return 1 ;else return 0 ;
arch/mips/kernel/time.c +3 -8
@@ -141,15 +141,10 @@ static __init int cpu_has_mfc0_count_bug(void)case CPU_R4400MC :/* * The published errata for the R4400 up to 3.0 say the CPU -* has the mfc0 from count bug. +* has the mfc0 from count bug. This seems the last version +* produced. */ -if ((current_cpu_data.processor_id &0xff ) <=0x30 ) -return 1 ; - -/* -* we assume newer revisions are ok -*/ -return 0 ; +return 1 ; }return 0 ;
arch/parisc/kernel/processor.c +1 -2
@@ -418,8 +418,7 @@ show_cpuinfo (struct seq_file *m, void *v) }seq_printf (m," (0x%02lx)\n" , boot_cpu_data.pdc.capabilities); -seq_printf (m,"model\t\t: %s\n" -"model name\t: %s\n" , +seq_printf (m,"model\t\t: %s - %s\n" , boot_cpu_data.pdc.sys_model_name, cpuinfo->dev ? cpuinfo->dev->name :"Unknown" );
arch/parisc/kernel/setup.c +2 -0
@@ -150,6 +150,8 @@ void __init setup_arch(char **cmdline_p)#ifdef CONFIG_PA11 dma_ops_init ();#endif + +clear_sched_clock_stable (); }/*
arch/parisc/kernel/time.c +1 -5
@@ -249,13 +249,9 @@ void __init time_init(void)static int __init init_cr16_clocksource (void ) {/* -* The cr16 interval timers are not syncronized across CPUs, even if -* they share the same socket. +* The cr16 interval timers are not synchronized across CPUs. */ if (num_online_cpus () >1 && !running_on_qemu) { -/* mark sched_clock unstable */ -clear_sched_clock_stable (); - clocksource_cr16.name ="cr16_unstable" ; clocksource_cr16.flags =CLOCK_SOURCE_UNSTABLE ; clocksource_cr16.rating =0 ;
arch/riscv/mm/init.c +19 -2
@@ -218,8 +218,25 @@ static void __init setup_bootmem(void)* early_init_fdt_reserve_self() since __pa() does * not work for DTB pointers that are fixmap addresses */ -if (!IS_ENABLED (CONFIG_BUILTIN_DTB )) -memblock_reserve (dtb_early_pa,fdt_totalsize (dtb_early_va)); +if (!IS_ENABLED (CONFIG_BUILTIN_DTB )) { +/* +* In case the DTB is not located in a memory region we won't +* be able to locate it later on via the linear mapping and +* get a segfault when accessing it via __va(dtb_early_pa). +* To avoid this situation copy DTB to a memory region. +* Note that memblock_phys_alloc will also reserve DTB region. +*/ +if (!memblock_is_memory (dtb_early_pa)) { +size_t fdt_size =fdt_totalsize (dtb_early_va); +phys_addr_t new_dtb_early_pa =memblock_phys_alloc (fdt_size,PAGE_SIZE ); +void *new_dtb_early_va =early_memremap (new_dtb_early_pa, fdt_size); + +memcpy (new_dtb_early_va, dtb_early_va, fdt_size); +early_memunmap (new_dtb_early_va, fdt_size); + _dtb_early_pa = new_dtb_early_pa; + }else +memblock_reserve (dtb_early_pa,fdt_totalsize (dtb_early_va)); + }early_init_fdt_scan_reserved_mem ();dma_contiguous_reserve (dma32_phys_limit);
arch/x86/kernel/fpu/core.c +26 -41
85 lines not on this page · raw message
arch/x86/kernel/kvm.c +13 -0
@@ -66,6 +66,7 @@ static DEFINE_PER_CPU_DECRYPTED(struct kvm_vcpu_pv_apf_data, apf_reason) __align DEFINE_PER_CPU_DECRYPTED(struct kvm_steal_time, steal_time) __aligned(64) __visible;static int has_steal_clock =0 ; +static int has_guest_poll =0 ;/* * No need for any "IO delay" on KVM */
@@ -650,14 +651,26 @@ static int kvm_cpu_down_prepare(unsigned int cpu)static int kvm_suspend (void ) { +u64 val =0 ; +kvm_guest_cpu_offline (false); +#ifdef CONFIG_ARCH_CPUIDLE_HALTPOLL +if (kvm_para_has_feature (KVM_FEATURE_POLL_CONTROL )) +rdmsrl (MSR_KVM_POLL_CONTROL , val); + has_guest_poll = !(val &1 ); +#endif return 0 ; }static void kvm_resume (void ) {kvm_cpu_online (raw_smp_processor_id ()); + +#ifdef CONFIG_ARCH_CPUIDLE_HALTPOLL +if (kvm_para_has_feature (KVM_FEATURE_POLL_CONTROL ) && has_guest_poll) +wrmsrl (MSR_KVM_POLL_CONTROL ,0 ); +#endif }static struct syscore_ops kvm_syscore_ops = {
arch/x86/kvm/cpuid.c +5 -0
@@ -725,6 +725,11 @@ static inline int __do_cpuid_func(struct kvm_cpuid_array *array, u32 function)union cpuid10_eax eax;union cpuid10_edx edx; +if (!static_cpu_has (X86_FEATURE_ARCH_PERFMON )) { + entry->eax = entry->ebx = entry->ecx = entry->edx =0 ; +break ; + } +perf_get_x86_pmu_capability (&cap);/*
arch/x86/kvm/lapic.c +5 -5
@@ -113,7 +113,8 @@ static inline u32 kvm_x2apic_id(struct kvm_lapic *apic)static bool kvm_can_post_timer_interrupt (struct kvm_vcpu *vcpu) { -return pi_inject_timer &&kvm_vcpu_apicv_active (vcpu); +return pi_inject_timer &&kvm_vcpu_apicv_active (vcpu) && + (kvm_mwait_in_guest (vcpu->kvm) ||kvm_hlt_in_guest (vcpu->kvm)); }bool kvm_can_use_hv_timer (struct kvm_vcpu *vcpu)
@@ -2125,10 +2126,9 @@ int kvm_lapic_reg_write(struct kvm_lapic *apic, u32 reg, u32 val)break ;case APIC_SELF_IPI : -if (apic_x2apic_mode (apic)) { -kvm_lapic_reg_write (apic,APIC_ICR , -APIC_DEST_SELF | (val &APIC_VECTOR_MASK )); - }else +if (apic_x2apic_mode (apic)) +kvm_apic_send_ipi (apic,APIC_DEST_SELF | (val &APIC_VECTOR_MASK ),0 ); +else ret =1 ;break ;default :
arch/x86/kvm/mmu/mmu.c +2 -0
@@ -3314,6 +3314,8 @@ static void mmu_free_root_page(struct kvm *kvm, hpa_t *root_hpa,return ; sp =to_shadow_page (*root_hpa &PT64_BASE_ADDR_MASK ); +if (WARN_ON (!sp)) +return ;if (is_tdp_mmu_page (sp))kvm_tdp_mmu_put_root (kvm, sp, false);
arch/x86/kvm/svm/pmu.c +25 -3
@@ -44,6 +44,22 @@ static struct kvm_event_hw_type_mapping amd_event_mapping[] = { [7] = { 0xd1, 0x00, PERF_COUNT_HW_STALLED_CYCLES_BACKEND }, }; +/* duplicated from amd_f17h_perfmon_event_map. */ +static struct kvm_event_hw_type_mapping amd_f17h_event_mapping[] = { + [0 ] = {0x76 ,0x00 ,PERF_COUNT_HW_CPU_CYCLES }, + [1 ] = {0xc0 ,0x00 ,PERF_COUNT_HW_INSTRUCTIONS }, + [2 ] = {0x60 ,0xff ,PERF_COUNT_HW_CACHE_REFERENCES }, + [3 ] = {0x64 ,0x09 ,PERF_COUNT_HW_CACHE_MISSES }, + [4 ] = {0xc2 ,0x00 ,PERF_COUNT_HW_BRANCH_INSTRUCTIONS }, + [5 ] = {0xc3 ,0x00 ,PERF_COUNT_HW_BRANCH_MISSES }, + [6 ] = {0x87 ,0x02 ,PERF_COUNT_HW_STALLED_CYCLES_FRONTEND }, + [7 ] = {0x87 ,0x01 ,PERF_COUNT_HW_STALLED_CYCLES_BACKEND }, +}; + +/* amd_pmc_perf_hw_id depends on these being the same size */ +static_assert (ARRAY_SIZE (amd_event_mapping) == +ARRAY_SIZE (amd_f17h_event_mapping)); +static unsigned int get_msr_base (struct kvm_pmu *pmu,enum pmu_type type) {struct kvm_vcpu *vcpu =pmu_to_vcpu (pmu);
@@ -136,19 +152,25 @@ static inline struct kvm_pmc *get_gp_pmc_amd(struct kvm_pmu *pmu, u32 msr,static unsigned int amd_pmc_perf_hw_id (struct kvm_pmc *pmc) { +struct kvm_event_hw_type_mapping *event_mapping;u8 event_select = pmc->eventsel &ARCH_PERFMON_EVENTSEL_EVENT ;u8 unit_mask = (pmc->eventsel &ARCH_PERFMON_EVENTSEL_UMASK ) >>8 ;int i; +if (guest_cpuid_family (pmc->vcpu) >=0x17 ) + event_mapping = amd_f17h_event_mapping; +else + event_mapping = amd_event_mapping; +for (i =0 ; i <ARRAY_SIZE (amd_event_mapping); i++) -if (amd_event_mapping[i].eventsel == event_select - && amd_event_mapping[i].unit_mask == unit_mask) +if (event_mapping[i].eventsel == event_select + && event_mapping[i].unit_mask == unit_mask)break ;if (i ==ARRAY_SIZE (amd_event_mapping))return PERF_COUNT_HW_MAX ; -return amd_event_mapping[i].event_type; +return event_mapping[i].event_type; }/* return PERF_COUNT_HW_MAX as AMD doesn't have fixed events */
drivers/firewire/core-card.c +3 -0
@@ -668,6 +668,7 @@ EXPORT_SYMBOL_GPL(fw_card_release);void fw_core_remove_card (struct fw_card *card) {struct fw_card_driver dummy_driver = dummy_driver_template; +unsigned long flags; card->driver->update_phy_reg (card,4 ,PHY_LINK_ACTIVE |PHY_CONTENDER ,0 );
@@ -682,7 +683,9 @@ void fw_core_remove_card(struct fw_card *card) dummy_driver.stop_iso = card->driver->stop_iso; card->driver = &dummy_driver; +spin_lock_irqsave (&card->lock, flags);fw_destroy_nodes (card); +spin_unlock_irqrestore (&card->lock, flags);/* Wait for all users, especially device workqueue jobs, to finish. */ fw_card_put (card);
drivers/firewire/core-cdev.c +3 -1
@@ -1480,6 +1480,7 @@ static void outbound_phy_packet_callback(struct fw_packet *packet, {struct outbound_phy_packet_event *e = container_of(packet, struct outbound_phy_packet_event, p); +struct client *e_client;switch (status) {/* expected: */
@@ -1496,9 +1497,10 @@ static void outbound_phy_packet_callback(struct fw_packet *packet, } e->phy_packet.data[0 ] = packet->timestamp; + e_client = e->client;queue_event (e->client, &e->event, &e->phy_packet,sizeof (e->phy_packet) + e->phy_packet.length,NULL ,0 ); -client_put (e->client); +client_put (e_client); }static int ioctl_send_phy_packet (struct client *client,union ioctl_arg *arg)
drivers/firewire/core-topology.c +3 -6
@@ -375,16 +375,13 @@ static void report_found_node(struct fw_card *card, card->bm_retries =0 ; } +/* Must be called with card->lock held */ void fw_destroy_nodes (struct fw_card *card) { -unsigned long flags; - -spin_lock_irqsave (&card->lock, flags); card->color++;if (card->local_node !=NULL )for_each_fw_node (card, card->local_node, report_lost_node); card->local_node =NULL ; -spin_unlock_irqrestore (&card->lock, flags); }static void move_tree (struct fw_node *node0,struct fw_node *node1,int port)
@@ -510,6 +507,8 @@ void fw_core_handle_bus_reset(struct fw_card *card, int node_id, int generation,struct fw_node *local_node;unsigned long flags; +spin_lock_irqsave (&card->lock, flags); +/* * If the selfID buffer is not the immediate successor of the * previously processed one, we cannot reliably compare the
@@ -521,8 +520,6 @@ void fw_core_handle_bus_reset(struct fw_card *card, int node_id, int generation, card->bm_retries =0 ; } -spin_lock_irqsave (&card->lock, flags); - card->broadcast_channel_allocated = card->broadcast_channel_auto_allocated; card->node_id = node_id;/*
drivers/firewire/core-transaction.c +16 -14
@@ -73,24 +73,25 @@ static int try_cancel_split_timeout(struct fw_transaction *t)static int close_transaction (struct fw_transaction *transaction,struct fw_card *card,int rcode) { -struct fw_transaction *t; +struct fw_transaction *t =NULL , *iter;unsigned long flags;spin_lock_irqsave (&card->lock, flags); -list_for_each_entry (t, &card->transaction_list, link) { -if (t == transaction) { -if (!try_cancel_split_timeout (t)) { +list_for_each_entry (iter, &card->transaction_list, link) { +if (iter == transaction) { +if (!try_cancel_split_timeout (iter)) {spin_unlock_irqrestore (&card->lock, flags); goto timed_out; } -list_del_init (&t->link); - card->tlabel_mask &= ~(1ULL << t->tlabel); +list_del_init (&iter->link); + card->tlabel_mask &= ~(1ULL << iter->tlabel); + t = iter;break ; } }spin_unlock_irqrestore (&card->lock, flags); -if (&t->link != &card->transaction_list) { +if (t) { t->callback (card, rcode,NULL ,0 , t->callback_data);return 0 ; }
@@ -935,7 +936,7 @@ EXPORT_SYMBOL(fw_core_handle_request);void fw_core_handle_response (struct fw_card *card,struct fw_packet *p) { -struct fw_transaction *t; +struct fw_transaction *t =NULL , *iter;unsigned long flags;u32 *data;size_t data_length;
@@ -947,20 +948,21 @@ void fw_core_handle_response(struct fw_card *card, struct fw_packet *p) rcode =HEADER_GET_RCODE (p->header[1 ]);spin_lock_irqsave (&card->lock, flags); -list_for_each_entry (t, &card->transaction_list, link) { -if (t->node_id == source && t->tlabel == tlabel) { -if (!try_cancel_split_timeout (t)) { +list_for_each_entry (iter, &card->transaction_list, link) { +if (iter->node_id == source && iter->tlabel == tlabel) { +if (!try_cancel_split_timeout (iter)) {spin_unlock_irqrestore (&card->lock, flags); goto timed_out; } -list_del_init (&t->link); - card->tlabel_mask &= ~(1ULL << t->tlabel); +list_del_init (&iter->link); + card->tlabel_mask &= ~(1ULL << iter->tlabel); + t = iter;break ; } }spin_unlock_irqrestore (&card->lock, flags); -if (&t->link == &card->transaction_list) { +if (!t) { timed_out:fw_notice (card,"unsolicited response (source %x, tlabel %x)\n" , source, tlabel);
drivers/firewire/sbp2.c +7 -6
@@ -408,7 +408,7 @@ static void sbp2_status_write(struct fw_card *card, struct fw_request *request, void *payload, size_t length, void *callback_data) { struct sbp2_logical_unit *lu = callback_data; -struct sbp2_orb *orb; +struct sbp2_orb *orb =NULL , *iter;struct sbp2_status status;unsigned long flags;
@@ -433,17 +433,18 @@ static void sbp2_status_write(struct fw_card *card, struct fw_request *request,/* Lookup the orb corresponding to this status write. */ spin_lock_irqsave (&lu->tgt->lock, flags); -list_for_each_entry (orb, &lu->orb_list, link) { +list_for_each_entry (iter, &lu->orb_list, link) {if (STATUS_GET_ORB_HIGH (status) ==0 && -STATUS_GET_ORB_LOW (status) == orb->request_bus) { - orb->rcode =RCODE_COMPLETE ; -list_del (&orb->link); +STATUS_GET_ORB_LOW (status) == iter->request_bus) { + iter->rcode =RCODE_COMPLETE ; +list_del (&iter->link); + orb = iter;break ; } }spin_unlock_irqrestore (&lu->tgt->lock, flags); -if (&orb->link != &lu->orb_list) { +if (orb) { orb->callback (orb, &status);kref_put (&orb->kref, free_orb);/* orb callback reference */ }else {
drivers/gpio/gpio-mvebu.c +0 -7
@@ -871,13 +871,6 @@ static int mvebu_pwm_probe(struct platform_device *pdev, mvpwm->chip.dev = dev; mvpwm->chip.ops = &mvebu_pwm_ops; mvpwm->chip.npwm = mvchip->chip.ngpio; -/* -* There may already be some PWM allocated, so we can't force -* mvpwm->chip.base to a fixed point like mvchip->chip.base. -* So, we let pwmchip_add() do the numbering and take the next free -* region. -*/ - mvpwm->chip.base =-1 ;spin_lock_init (&mvpwm->lock);
drivers/gpio/gpio-pca953x.c +2 -2
@@ -762,11 +762,11 @@ static bool pca953x_irq_pending(struct pca953x_chip *chip, unsigned long *pendinbitmap_xor (cur_stat, new_stat, old_stat, gc->ngpio);bitmap_and (trigger, cur_stat, chip->irq_mask, gc->ngpio); +bitmap_copy (chip->irq_stat, new_stat, gc->ngpio); +if (bitmap_empty (trigger, gc->ngpio))return false; -bitmap_copy (chip->irq_stat, new_stat, gc->ngpio); -bitmap_and (cur_stat, chip->irq_trig_fall, old_stat, gc->ngpio);bitmap_and (old_stat, chip->irq_trig_raise, new_stat, gc->ngpio);bitmap_or (new_stat, old_stat, cur_stat, gc->ngpio);
drivers/gpio/gpio-visconti.c +2 -5
@@ -130,7 +130,6 @@ static int visconti_gpio_probe(struct platform_device *pdev)struct gpio_irq_chip *girq;struct irq_domain *parent;struct device_node *irq_parent; -struct fwnode_handle *fwnode;int ret; priv =devm_kzalloc (dev,sizeof (*priv),GFP_KERNEL );
@@ -150,14 +149,12 @@ static int visconti_gpio_probe(struct platform_device *pdev) } parent =irq_find_host (irq_parent); +of_node_put (irq_parent);if (!parent) {dev_err (dev,"No IRQ parent domain\n" );return -ENODEV ; } - fwnode =of_node_to_fwnode (irq_parent); -of_node_put (irq_parent); - ret = bgpio_init(&priv->gpio_chip, dev, 4, priv->base + GPIO_IDATA, priv->base + GPIO_OSET,
@@ -180,7 +177,7 @@ static int visconti_gpio_probe(struct platform_device *pdev) girq = &priv->gpio_chip.irq; girq->chip = irq_chip; - girq->fwnode = fwnode; + girq->fwnode =of_node_to_fwnode (dev->of_node); girq->parent_domain = parent; girq->child_to_parent_hwirq = visconti_gpio_child_to_parent_hwirq; girq->populate_parent_alloc_arg = visconti_gpio_populate_parent_fwspec;
drivers/gpio/gpiolib-of.c +1 -1
@@ -912,7 +912,7 @@ static void of_gpiochip_init_valid_mask(struct gpio_chip *chip) i, &start);of_property_read_u32_index (np,"gpio-reserved-ranges" , i +1 , &count); -if (start >= chip->ngpio || start + count >= chip->ngpio) +if (start >= chip->ngpio || start + count > chip->ngpio)continue ;bitmap_clear (chip->valid_mask, start, count);
drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c +3 -5
@@ -1176,7 +1176,7 @@ static int amdgpu_debugfs_evict_vram(void *data, u64 *val)return r; } - *val =amdgpu_bo_evict_vram (adev); + *val =amdgpu_ttm_evict_resources (adev,TTM_PL_VRAM );pm_runtime_mark_last_busy (dev->dev);pm_runtime_put_autosuspend (dev->dev);
@@ -1189,17 +1189,15 @@ static int amdgpu_debugfs_evict_gtt(void *data, u64 *val) {struct amdgpu_device *adev = (struct amdgpu_device *)data;struct drm_device *dev =adev_to_drm (adev); -struct ttm_resource_manager *man;int r; r =pm_runtime_get_sync (dev->dev);if (r <0 ) { -pm_runtime_put_autosuspend (adev_to_drm (adev)->dev); +pm_runtime_put_autosuspend (dev->dev);return r; } - man =ttm_manager_type (&adev->mman.bdev,TTM_PL_TT ); - *val =ttm_resource_manager_evict_all (&adev->mman.bdev, man); + *val =amdgpu_ttm_evict_resources (adev,TTM_PL_TT );pm_runtime_mark_last_busy (dev->dev);pm_runtime_put_autosuspend (dev->dev);
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +24 -6
@@ -3928,6 +3928,25 @@ void amdgpu_device_fini_sw(struct amdgpu_device *adev) } +/** +* amdgpu_device_evict_resources - evict device resources +* @adev: amdgpu device object +* +* Evicts all ttm device resources(vram BOs, gart table) from the lru list +* of the vram memory type. Mainly used for evicting device resources +* at suspend time. +* +*/ +static void amdgpu_device_evict_resources (struct amdgpu_device *adev) +{ +/* No need to evict vram on APUs for suspend to ram or s2idle */ +if ((adev->in_s3 || adev->in_s0ix) && (adev->flags &AMD_IS_APU )) +return ; + +if (amdgpu_ttm_evict_resources (adev,TTM_PL_VRAM )) +DRM_WARN ("evicting device resources failed\n" ); + +}/* * Suspend & resume.
@@ -3968,17 +3987,16 @@ int amdgpu_device_suspend(struct drm_device *dev, bool fbcon)if (!adev->in_s0ix)amdgpu_amdkfd_suspend (adev, adev->in_runpm); -/* evict vram memory */ -amdgpu_bo_evict_vram (adev); +/* First evict vram memory */ +amdgpu_device_evict_resources (adev);amdgpu_fence_driver_hw_fini (adev);amdgpu_device_ip_suspend_phase2 (adev); -/* evict remaining vram memory -* This second call to evict vram is to evict the gart page table -* using the CPU. +/* This second call to evict device resources is to evict +* the gart page table using the CPU. */ -amdgpu_bo_evict_vram (adev); +amdgpu_device_evict_resources (adev);return 0 ; }
drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c +16 -8
@@ -2246,18 +2246,23 @@ static int amdgpu_pmops_suspend(struct device *dev) {struct drm_device *drm_dev =dev_get_drvdata (dev);struct amdgpu_device *adev =drm_to_adev (drm_dev); -int r;if (amdgpu_acpi_is_s0ix_active (adev)) adev->in_s0ix = true; - adev->in_s3 = true; - r =amdgpu_device_suspend (drm_dev, true); - adev->in_s3 = false; -if (r) -return r; +else + adev->in_s3 = true; +return amdgpu_device_suspend (drm_dev, true); +} + +static int amdgpu_pmops_suspend_noirq (struct device *dev) +{ +struct drm_device *drm_dev =dev_get_drvdata (dev); +struct amdgpu_device *adev =drm_to_adev (drm_dev); +if (!adev->in_s0ix) - r =amdgpu_asic_reset (adev); -return r; +return amdgpu_asic_reset (adev); + +return 0 ; }static int amdgpu_pmops_resume (struct device *dev)
@@ -2269,6 +2274,8 @@ static int amdgpu_pmops_resume(struct device *dev) r =amdgpu_device_resume (drm_dev, true);if (amdgpu_acpi_is_s0ix_active (adev)) adev->in_s0ix = false; +else + adev->in_s3 = false;return r; }
@@ -2492,6 +2499,7 @@ static const struct dev_pm_ops amdgpu_pm_ops = { .prepare = amdgpu_pmops_prepare, .complete = amdgpu_pmops_complete, .suspend = amdgpu_pmops_suspend, + .suspend_noirq = amdgpu_pmops_suspend_noirq, .resume = amdgpu_pmops_resume, .freeze = amdgpu_pmops_freeze, .thaw = amdgpu_pmops_thaw,
drivers/gpu/drm/amd/amdgpu/amdgpu_object.c +0 -23
@@ -1038,29 +1038,6 @@ void amdgpu_bo_unpin(struct amdgpu_bo *bo) } } -/** -* amdgpu_bo_evict_vram - evict VRAM buffers -* @adev: amdgpu device object -* -* Evicts all VRAM buffers on the lru list of the memory type. -* Mainly used for evicting vram at suspend time. -* -* Returns: -* 0 for success or a negative error code on failure. -*/ -int amdgpu_bo_evict_vram (struct amdgpu_device *adev) -{ -struct ttm_resource_manager *man; - -if (adev->in_s3 && (adev->flags &AMD_IS_APU )) { -/* No need to evict vram on APUs for suspend to ram */ -return 0 ; - } - - man =ttm_manager_type (&adev->mman.bdev,TTM_PL_VRAM ); -return ttm_resource_manager_evict_all (&adev->mman.bdev, man); -} -static const char *amdgpu_vram_names[] = {"UNKNOWN" ,"GDDR1" ,
drivers/gpu/drm/amd/amdgpu/amdgpu_object.h +0 -1
@@ -304,7 +304,6 @@ int amdgpu_bo_pin(struct amdgpu_bo *bo, u32 domain);int amdgpu_bo_pin_restricted (struct amdgpu_bo *bo,u32 domain,u64 min_offset,u64 max_offset);void amdgpu_bo_unpin (struct amdgpu_bo *bo); -int amdgpu_bo_evict_vram (struct amdgpu_device *adev);int amdgpu_bo_init (struct amdgpu_device *adev);void amdgpu_bo_fini (struct amdgpu_device *adev);int amdgpu_bo_set_tiling_flags (struct amdgpu_bo *bo,u64 tiling_flags);
drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c +30 -0
@@ -2036,6 +2036,36 @@ int amdgpu_fill_buffer(struct amdgpu_bo *bo,return r; } +/** +* amdgpu_ttm_evict_resources - evict memory buffers +* @adev: amdgpu device object +* @mem_type: evicted BO's memory type +* +* Evicts all @mem_type buffers on the lru list of the memory type. +* +* Returns: +* 0 for success or a negative error code on failure. +*/ +int amdgpu_ttm_evict_resources (struct amdgpu_device *adev,int mem_type) +{ +struct ttm_resource_manager *man; + +switch (mem_type) { +case TTM_PL_VRAM : +case TTM_PL_TT : +case AMDGPU_PL_GWS : +case AMDGPU_PL_GDS : +case AMDGPU_PL_OA : + man =ttm_manager_type (&adev->mman.bdev, mem_type); +break ; +default : +DRM_ERROR ("Trying to evict invalid memory type\n" ); +return -EINVAL ; + } + +return ttm_resource_manager_evict_all (&adev->mman.bdev, man); +} +#if defined(CONFIG_DEBUG_FS )static int amdgpu_mm_vram_table_show (struct seq_file *m,void *unused)
drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h +1 -0
@@ -190,6 +190,7 @@ bool amdgpu_ttm_tt_is_readonly(struct ttm_tt *ttm);uint64_t amdgpu_ttm_tt_pde_flags (struct ttm_tt *ttm,struct ttm_resource *mem);uint64_t amdgpu_ttm_tt_pte_flags (struct amdgpu_device *adev,struct ttm_tt *ttm,struct ttm_resource *mem); +int amdgpu_ttm_evict_resources (struct amdgpu_device *adev,int mem_type);void amdgpu_ttm_debugfs_init (struct amdgpu_device *adev);
drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c +3 -1
@@ -24,6 +24,7 @@#include <linux/module.h> #include <drm/drm_drv.h> +#include <xen/xen.h> #include "amdgpu.h" #include "amdgpu_ras.h"
@@ -694,7 +695,8 @@ void amdgpu_detect_virtualization(struct amdgpu_device *adev) adev->virt.caps |=AMDGPU_SRIOV_CAPS_ENABLE_IOV ;if (!reg) { -if (is_virtual_machine ())/* passthrough mode exclus sriov mod */ +/* passthrough mode exclus sriov mod */ +if (is_virtual_machine () && !xen_initial_domain ()) adev->virt.caps |=AMDGPU_PASSTHROUGH_MODE ; }
drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c +1 -1
@@ -3118,7 +3118,7 @@ static void dp_test_get_audio_test_data(struct dc_link *link, bool disable_video &dpcd_pattern_type.value, sizeof(dpcd_pattern_type)); - channel_count = dpcd_test_mode.bits.channel_count +1 ; + channel_count =min (dpcd_test_mode.bits.channel_count +1 ,AUDIO_CHANNELS_COUNT );// read pattern periods for requested channels when sawTooth pattern is requested if (dpcd_pattern_type.value == AUDIO_TEST_PATTERN_SAWTOOTH ||
drivers/gpu/drm/msm/dp/dp_display.c +0 -6
@@ -551,12 +551,6 @@ static int dp_hpd_plug_handle(struct dp_display_private *dp, u32 data)mutex_unlock (&dp->event_mutex); -/* -* add fail safe mode outside event_mutex scope -* to avoid potiential circular lock with drm thread -*/ -dp_panel_add_fail_safe_mode (dp->dp_display.connector); -/* uevent will complete connection part */ return 0 ; };
drivers/gpu/drm/msm/dp/dp_panel.c +0 -11
@@ -151,15 +151,6 @@ static int dp_panel_update_modes(struct drm_connector *connector,return rc; } -void dp_panel_add_fail_safe_mode (struct drm_connector *connector) -{ -/* fail safe edid */ -mutex_lock (&connector->dev->mode_config.mutex); -if (drm_add_modes_noedid (connector,640 ,480 )) -drm_set_preferred_mode (connector,640 ,480 ); -mutex_unlock (&connector->dev->mode_config.mutex); -} -int dp_panel_read_sink_caps (struct dp_panel *dp_panel,struct drm_connector *connector) {
@@ -215,8 +206,6 @@ int dp_panel_read_sink_caps(struct dp_panel *dp_panel, rc = -ETIMEDOUT ; goto end; } - -dp_panel_add_fail_safe_mode (connector); }if (panel->aux_cfg_update_done) {
drivers/gpu/drm/msm/dp/dp_panel.h +0 -1
@@ -59,7 +59,6 @@ int dp_panel_init_panel_info(struct dp_panel *dp_panel);int dp_panel_deinit (struct dp_panel *dp_panel);int dp_panel_timing_cfg (struct dp_panel *dp_panel);void dp_panel_dump_regs (struct dp_panel *dp_panel); -void dp_panel_add_fail_safe_mode (struct drm_connector *connector);int dp_panel_read_sink_caps (struct dp_panel *dp_panel,struct drm_connector *connector); u32 dp_panel_get_mode_bpp(struct dp_panel *dp_panel, u32 mode_max_bpp,
drivers/hwmon/adt7470.c +2 -2
@@ -19,6 +19,7 @@#include <linux/log2.h> #include <linux/kthread.h> #include <linux/regmap.h> +#include <linux/sched.h> #include <linux/slab.h> #include <linux/util_macros.h>
@@ -294,11 +295,10 @@ static int adt7470_update_thread(void *p)adt7470_read_temperatures (data);mutex_unlock (&data->lock); -set_current_state (TASK_INTERRUPTIBLE );if (kthread_should_stop ())break ; -schedule_timeout (msecs_to_jiffies (data->auto_update_interval)); +schedule_timeout_interruptible (msecs_to_jiffies (data->auto_update_interval)); }return 0 ;
drivers/hwmon/pmbus/pmbus_core.c +3 -0
@@ -2326,6 +2326,9 @@ static int pmbus_init_common(struct i2c_client *client, struct pmbus_data *data, data->has_status_word = true; } +/* Make sure PEC is disabled, will be enabled later if needed */ + client->flags &= ~I2C_CLIENT_PEC ; +/* Enable PEC if the controller and bus supports it */ if (!(data->flags &PMBUS_NO_CAPABILITY )) { ret =i2c_smbus_read_byte_data (client,PMBUS_CAPABILITY );
drivers/infiniband/hw/irdma/cm.c +9 -17
@@ -2305,10 +2305,8 @@ irdma_make_cm_node(struct irdma_cm_core *cm_core, struct irdma_device *iwdev,return NULL ; } -static void irdma_cm_node_free_cb (struct rcu_head *rcu_head) +static void irdma_destroy_connection (struct irdma_cm_node *cm_node) { -struct irdma_cm_node *cm_node = - container_of(rcu_head, struct irdma_cm_node, rcu_head);struct irdma_cm_core *cm_core = cm_node->cm_core;struct irdma_qp *iwqp;struct irdma_cm_info nfo;
@@ -2356,7 +2354,6 @@ static void irdma_cm_node_free_cb(struct rcu_head *rcu_head) } cm_core->cm_free_ah (cm_node); -kfree (cm_node); }/**
@@ -2384,8 +2381,9 @@ void irdma_rem_ref_cm_node(struct irdma_cm_node *cm_node)spin_unlock_irqrestore (&cm_core->ht_lock, flags); -/* wait for all list walkers to exit their grace period */ -call_rcu (&cm_node->rcu_head, irdma_cm_node_free_cb); +irdma_destroy_connection (cm_node); + +kfree_rcu (cm_node, rcu_head); }/**
@@ -3465,12 +3463,6 @@ static void irdma_cm_disconn_true(struct irdma_qp *iwqp) } cm_id = iwqp->cm_id; -/* make sure we havent already closed this connection */ -if (!cm_id) { -spin_unlock_irqrestore (&iwqp->lock, flags); -return ; - } - original_hw_tcp_state = iwqp->hw_tcp_state; original_ibqp_state = iwqp->ibqp_state; last_ae = iwqp->last_aeq;
@@ -3492,11 +3484,11 @@ static void irdma_cm_disconn_true(struct irdma_qp *iwqp) disconn_status = -ECONNRESET ; } -if ((original_hw_tcp_state ==IRDMA_TCP_STATE_CLOSED || - original_hw_tcp_state ==IRDMA_TCP_STATE_TIME_WAIT || - last_ae ==IRDMA_AE_RDMAP_ROE_BAD_LLP_CLOSE || - last_ae ==IRDMA_AE_BAD_CLOSE || - last_ae ==IRDMA_AE_LLP_CONNECTION_RESET || iwdev->rf->reset)) { +if (original_hw_tcp_state ==IRDMA_TCP_STATE_CLOSED || + original_hw_tcp_state ==IRDMA_TCP_STATE_TIME_WAIT || + last_ae ==IRDMA_AE_RDMAP_ROE_BAD_LLP_CLOSE || + last_ae ==IRDMA_AE_BAD_CLOSE || + last_ae ==IRDMA_AE_LLP_CONNECTION_RESET || iwdev->rf->reset || !cm_id) { issue_close =1 ; iwqp->cm_id =NULL ; qp->term_flags =0 ;
drivers/infiniband/hw/irdma/utils.c +9 -12
@@ -258,18 +258,16 @@ int irdma_net_event(struct notifier_block *notifier, unsigned long event,u32 local_ipaddr[4 ] = {};bool ipv4 = true; - real_dev =rdma_vlan_dev_real_dev (netdev); -if (!real_dev) - real_dev = netdev; - - ibdev =ib_device_get_by_netdev (real_dev,RDMA_DRIVER_IRDMA ); -if (!ibdev) -return NOTIFY_DONE ; - - iwdev =to_iwdev (ibdev); -switch (event) {case NETEVENT_NEIGH_UPDATE : + real_dev =rdma_vlan_dev_real_dev (netdev); +if (!real_dev) + real_dev = netdev; + ibdev =ib_device_get_by_netdev (real_dev,RDMA_DRIVER_IRDMA ); +if (!ibdev) +return NOTIFY_DONE ; + + iwdev =to_iwdev (ibdev); p = (__be32 *)neigh->primary_key;if (neigh->tbl->family ==AF_INET6 ) { ipv4 = false;
@@ -290,13 +288,12 @@ int irdma_net_event(struct notifier_block *notifier, unsigned long event,irdma_manage_arp_cache (iwdev->rf, neigh->ha, local_ipaddr, ipv4,IRDMA_ARP_DELETE ); +ib_device_put (ibdev);break ;default :break ; } -ib_device_put (ibdev); -return NOTIFY_DONE ; }
drivers/infiniband/hw/irdma/verbs.c +2 -2
@@ -1617,13 +1617,13 @@ int irdma_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr, int attr_mask,if (issue_modify_qp && iwqp->ibqp_state >IB_QPS_RTS ) {if (dont_wait) { -if (iwqp->cm_id && iwqp->hw_tcp_state) { +if (iwqp->hw_tcp_state) {spin_lock_irqsave (&iwqp->lock, flags); iwqp->hw_tcp_state =IRDMA_TCP_STATE_CLOSED ; iwqp->last_aeq =IRDMA_AE_RESET_SENT ;spin_unlock_irqrestore (&iwqp->lock, flags); -irdma_cm_disconn (iwqp); } +irdma_cm_disconn (iwqp); }else {int close_timer_started;
drivers/infiniband/sw/siw/siw_cm.c +4 -3
@@ -968,14 +968,15 @@ static void siw_accept_newconn(struct siw_cep *cep)siw_cep_set_inuse (new_cep); rv =siw_proc_mpareq (new_cep); -siw_cep_set_free (new_cep); -if (rv != -EAGAIN ) {siw_cep_put (cep); new_cep->listen_cep =NULL ; -if (rv) +if (rv) { +siw_cep_set_free (new_cep); goto error; + } } +siw_cep_set_free (new_cep); }return ;
drivers/iommu/apple-dart.c +5 -5
@@ -757,6 +757,7 @@ static const struct iommu_ops apple_dart_iommu_ops = { .of_xlate = apple_dart_of_xlate, .def_domain_type = apple_dart_def_domain_type, .pgsize_bitmap = -1UL, /* Restricted during dart probe */ + .owner = THIS_MODULE, };static irqreturn_t apple_dart_irq (int irq,void *dev)
@@ -832,16 +833,15 @@ static int apple_dart_probe(struct platform_device *pdev) dart->dev = dev;spin_lock_init (&dart->lock); - res =platform_get_resource (pdev,IORESOURCE_MEM ,0 ); + dart->regs =devm_platform_get_and_ioremap_resource (pdev,0 , &res); +if (IS_ERR (dart->regs)) +return PTR_ERR (dart->regs); +if (resource_size (res) <0x4000 ) {dev_err (dev,"MMIO region too small (%pr)\n" , res);return -EINVAL ; } - dart->regs =devm_ioremap_resource (dev, res); -if (IS_ERR (dart->regs)) -return PTR_ERR (dart->regs); - dart->irq =platform_get_irq (pdev,0 );if (dart->irq <0 )return -ENODEV ;
drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c +8 -1
@@ -183,7 +183,14 @@ static void arm_smmu_mm_invalidate_range(struct mmu_notifier *mn, {struct arm_smmu_mmu_notifier *smmu_mn =mn_to_smmu (mn);struct arm_smmu_domain *smmu_domain = smmu_mn->domain; -size_t size = end - start +1 ; +size_t size; + +/* +* The mm_types defines vm_end as the first byte after the end address, +* different from IOMMU subsystem using the last address of an address +* range. So do a simple translation here by calculating size correctly. +*/ + size = end - start;if (!(smmu_domain->smmu->features &ARM_SMMU_FEAT_BTM )) arm_smmu_tlb_inv_range_asid(start, size, smmu_mn->cd->asid,
drivers/iommu/intel/iommu.c +24 -3
@@ -1637,7 +1637,8 @@ static void iommu_flush_iotlb_psi(struct intel_iommu *iommu, unsigned long pfn, unsigned int pages, int ih, int map) { - unsigned int mask = ilog2(__roundup_pow_of_two(pages)); + unsigned int aligned_pages = __roundup_pow_of_two(pages); +unsigned int mask =ilog2 (aligned_pages);uint64_t addr = (uint64_t )pfn <<VTD_PAGE_SHIFT ;u16 did = domain->iommu_did[iommu->seq_id];
@@ -1649,10 +1650,30 @@ static void iommu_flush_iotlb_psi(struct intel_iommu *iommu,if (domain_use_first_level (domain)) {domain_flush_piotlb (iommu, domain, addr, pages, ih); }else { +unsigned long bitmask = aligned_pages -1 ; + +/* +* PSI masks the low order bits of the base address. If the +* address isn't aligned to the mask, then compute a mask value +* needed to ensure the target range is flushed. +*/ +if (unlikely (bitmask & pfn)) { +unsigned long end_pfn = pfn + pages -1 , shared_bits; + +/* +* Since end_pfn <= pfn + bitmask, the only way bits +* higher than bitmask can differ in pfn and end_pfn is +* by carrying. This means after masking out bitmask, +* high bits starting with the first set bit in +* shared_bits are all equal in both pfn and end_pfn. +*/ + shared_bits = ~(pfn ^ end_pfn) & ~bitmask; + mask = shared_bits ?__ffs (shared_bits) :BITS_PER_LONG ; + } +/* * Fallback to domain selective flush if no PSI support or -* the size is too big. PSI requires page size to be 2 ^ x, -* and the base address is naturally aligned to the size. +* the size is too big. */ if (!cap_pgsel_inv (iommu->cap) || mask >cap_max_amask_val (iommu->cap))
drivers/iommu/intel/svm.c +4 -0
@@ -978,6 +978,10 @@ static irqreturn_t prq_event_thread(int irq, void *d) goto bad_req; } +/* Drop Stop Marker message. No need for a response. */ +if (unlikely (req->lpig && !req->rd_req && !req->wr_req)) + goto prq_advance; +if (!svm || svm->pasid != req->pasid) {/* * It can't go away, because the driver is not permitted
drivers/mmc/core/mmc.c +19 -4
@@ -1381,13 +1381,17 @@ static int mmc_select_hs400es(struct mmc_card *card) goto out_err; } +/* +* Bump to HS timing and frequency. Some cards don't handle +* SEND_STATUS reliably at the initial frequency. +*/ mmc_set_timing (host,MMC_TIMING_MMC_HS ); +mmc_set_bus_speed (card); + err =mmc_switch_status (card, true);if (err) goto out_err; -mmc_set_clock (host, card->ext_csd.hs_max_dtr); -/* Switch card to DDR with strobe bit */ val =EXT_CSD_DDR_BUS_WIDTH_8 |EXT_CSD_BUS_WIDTH_STROBE ; err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
@@ -1445,7 +1449,7 @@ static int mmc_select_hs400es(struct mmc_card *card)static int mmc_select_hs200 (struct mmc_card *card) {struct mmc_host *host = card->host; -unsigned int old_timing, old_signal_voltage; +unsigned int old_timing, old_signal_voltage, old_clock;int err = -EINVAL ;u8 val;
@@ -1476,8 +1480,17 @@ static int mmc_select_hs200(struct mmc_card *card) false, true, MMC_CMD_RETRIES);if (err) goto err; + +/* +* Bump to HS timing and frequency. Some cards don't handle +* SEND_STATUS reliably at the initial frequency. +* NB: We can't move to full (HS200) speeds until after we've +* successfully switched over. +*/ old_timing = host->ios.timing; + old_clock = host->ios.clock;mmc_set_timing (host,MMC_TIMING_MMC_HS200 ); +mmc_set_clock (card->host, card->ext_csd.hs_max_dtr);/* * For HS200, CRC errors are not a reliable way to know the
@@ -1490,8 +1503,10 @@ static int mmc_select_hs200(struct mmc_card *card)* mmc_select_timing() assumes timing has not changed if * it is a switch error. */ -if (err == -EBADMSG ) +if (err == -EBADMSG ) { +mmc_set_clock (host, old_clock);mmc_set_timing (host, old_timing); + } } err:if (err) {
drivers/mmc/host/rtsx_pci_sdmmc.c +19 -10
@@ -38,10 +38,7 @@ struct realtek_pci_sdmmc {bool double_clk;bool eject;bool initial_mode; -int power_state; -#define SDMMC_POWER_ON 1 -#define SDMMC_POWER_OFF 0 - +int prev_power_state;int sg_count;s32 cookie;int cookie_sg_count;
@@ -905,7 +902,7 @@ static int sd_set_bus_width(struct realtek_pci_sdmmc *host,return err; } -static int sd_power_on (struct realtek_pci_sdmmc *host) +static int sd_power_on (struct realtek_pci_sdmmc *host,unsigned char power_mode) {struct rtsx_pcr *pcr = host->pcr;struct mmc_host *mmc = host->mmc;
@@ -913,9 +910,14 @@ static int sd_power_on(struct realtek_pci_sdmmc *host)u32 val;u8 test_mode; -if (host->power_state ==SDMMC_POWER_ON ) +if (host->prev_power_state ==MMC_POWER_ON )return 0 ; +if (host->prev_power_state ==MMC_POWER_UP ) { +rtsx_pci_write_register (pcr,SD_BUS_STAT ,SD_CLK_TOGGLE_EN ,0 ); + goto finish; + } +msleep (100 );rtsx_pci_init_cmd (pcr);
@@ -936,10 +938,15 @@ static int sd_power_on(struct realtek_pci_sdmmc *host)if (err <0 )return err; +mdelay (1 ); + err =rtsx_pci_write_register (pcr,CARD_OE ,SD_OUTPUT_EN ,SD_OUTPUT_EN );if (err <0 )return err; +/* send at least 74 clocks */ +rtsx_pci_write_register (pcr,SD_BUS_STAT ,SD_CLK_TOGGLE_EN ,SD_CLK_TOGGLE_EN ); +if (PCI_PID (pcr) ==PID_5261 ) {/* * If test mode is set switch to SD Express mandatorily,
@@ -964,7 +971,8 @@ static int sd_power_on(struct realtek_pci_sdmmc *host) } } - host->power_state =SDMMC_POWER_ON ; +finish: + host->prev_power_state = power_mode;return 0 ; }
@@ -973,7 +981,7 @@ static int sd_power_off(struct realtek_pci_sdmmc *host)struct rtsx_pcr *pcr = host->pcr;int err; - host->power_state =SDMMC_POWER_OFF ; + host->prev_power_state =MMC_POWER_OFF ;rtsx_pci_init_cmd (pcr);
@@ -999,7 +1007,7 @@ static int sd_set_power_mode(struct realtek_pci_sdmmc *host,if (power_mode ==MMC_POWER_OFF ) err =sd_power_off (host);else - err =sd_power_on (host); + err =sd_power_on (host, power_mode);return err; }
@@ -1482,10 +1490,11 @@ static int rtsx_pci_sdmmc_drv_probe(struct platform_device *pdev) host =mmc_priv (mmc); host->pcr = pcr; + mmc->ios.power_delay_ms =5 ; host->mmc = mmc; host->pdev = pdev; host->cookie =-1 ; - host->power_state =SDMMC_POWER_OFF ; + host->prev_power_state =MMC_POWER_OFF ;INIT_WORK (&host->work, sd_request);platform_set_drvdata (pdev, host); pcr->slots[RTSX_SD_CARD ].p_dev = pdev;
drivers/mmc/host/sdhci-msm.c +42 -0
60 lines not on this page · raw message
drivers/mmc/host/sunxi-mmc.c +3 -2
@@ -377,8 +377,9 @@ static void sunxi_mmc_init_idma_des(struct sunxi_mmc_host *host, pdes[i].buf_addr_ptr1 =cpu_to_le32 (sg_dma_address (&data->sg[i]) >> host->cfg->idma_des_shift); - pdes[i].buf_addr_ptr2 =cpu_to_le32 ((u32 )next_desc >> - host->cfg->idma_des_shift); + pdes[i].buf_addr_ptr2 = +cpu_to_le32 (next_desc >> + host->cfg->idma_des_shift); } pdes[0 ].config |=cpu_to_le32 (SDXC_IDMAC_DES0_FD );
drivers/net/can/grcan.c +24 -22
129 lines not on this page · raw message
drivers/net/dsa/mt7530.c +1 -0
@@ -2216,6 +2216,7 @@ mt7530_setup(struct dsa_switch *ds) ret =of_get_phy_mode (mac_np, &interface);if (ret && ret != -ENODEV ) {of_node_put (mac_np); +of_node_put (phy_node);return ret; } id =of_mdio_parse_addr (ds->dev, phy_node);
drivers/net/ethernet/broadcom/bnxt/bnxt.c +8 -5
@@ -2699,6 +2699,10 @@ static int bnxt_poll_p5(struct napi_struct *napi, int budget)u32 idx =le32_to_cpu (nqcmp->cq_handle_low);struct bnxt_cp_ring_info *cpr2; +/* No more budget for RX work */ +if (budget && work_done >= budget && idx ==BNXT_RX_HDL ) +break ; + cpr2 = cpr->cp_ring_arr[idx]; work_done +=__bnxt_poll_work (bp, cpr2, budget - work_done);
@@ -10881,7 +10885,7 @@ static bool bnxt_rfs_capable(struct bnxt *bp)if (bp->flags &BNXT_FLAG_CHIP_P5 )return bnxt_rfs_supported (bp); -if (!(bp->flags &BNXT_FLAG_MSIX_CAP ) || !bnxt_can_reserve_rings (bp)) +if (!(bp->flags &BNXT_FLAG_MSIX_CAP ) || !bnxt_can_reserve_rings (bp) || !bp->rx_nr_rings)return false; vnics =1 + bp->rx_nr_rings;
@@ -13087,10 +13091,9 @@ static int bnxt_init_dflt_ring_mode(struct bnxt *bp) goto init_dflt_ring_err; bp->tx_nr_rings_per_tc = bp->tx_nr_rings; -if (bnxt_rfs_supported (bp) &&bnxt_rfs_capable (bp)) { - bp->flags |=BNXT_FLAG_RFS ; - bp->dev->features |=NETIF_F_NTUPLE ; - } + +bnxt_set_dflt_rfs (bp); + init_dflt_ring_err:bnxt_ulp_irq_restart (bp, rc);return rc;
drivers/net/ethernet/huawei/hinic/hinic_hw_wq.c +5 -2
@@ -772,7 +772,7 @@ struct hinic_hw_wqe *hinic_get_wqe(struct hinic_wq *wq, unsigned int wqe_size,/* If we only have one page, still need to get shadown wqe when * wqe rolling-over page */ -if (curr_pg != end_pg ||MASKED_WQE_IDX (wq, end_prod_idx) < *prod_idx) { +if (curr_pg != end_pg || end_prod_idx < *prod_idx) {void *shadow_addr = &wq->shadow_wqe[curr_pg * wq->max_wqe_size];copy_wqe_to_shadow (wq, shadow_addr, num_wqebbs, *prod_idx);
@@ -842,7 +842,10 @@ struct hinic_hw_wqe *hinic_read_wqe(struct hinic_wq *wq, unsigned int wqe_size, *cons_idx = curr_cons_idx; -if (curr_pg != end_pg) { +/* If we only have one page, still need to get shadown wqe when +* wqe rolling-over page +*/ +if (curr_pg != end_pg || end_cons_idx < curr_cons_idx) {void *shadow_addr = &wq->shadow_wqe[curr_pg * wq->max_wqe_size];copy_wqe_to_shadow (wq, shadow_addr, num_wqebbs, *cons_idx);
drivers/net/ethernet/mediatek/mtk_sgmii.c +1 -0
@@ -26,6 +26,7 @@ int mtk_sgmii_init(struct mtk_sgmii *ss, struct device_node *r, u32 ana_rgc3)break ; ss->regmap[i] =syscon_node_to_regmap (np); +of_node_put (np);if (IS_ERR (ss->regmap[i]))return PTR_ERR (ss->regmap[i]); }
drivers/net/ethernet/mellanox/mlx5/core/diag/rsc_dump.c +25 -6
@@ -31,6 +31,7 @@ static const char *const mlx5_rsc_sgmt_name[] = {struct mlx5_rsc_dump {u32 pdn;struct mlx5_core_mkey mkey; +u32 number_of_menu_items;u16 fw_segment_type[MLX5_SGMT_TYPE_NUM ]; };
@@ -50,21 +51,37 @@ static int mlx5_rsc_dump_sgmt_get_by_name(char *name)return -EINVAL ; } -static void mlx5_rsc_dump_read_menu_sgmt (struct mlx5_rsc_dump *rsc_dump,struct page *page) +#define MLX5_RSC_DUMP_MENU_HEADER_SIZE (MLX5_ST_SZ_BYTES(resource_dump_info_segment) + \ + MLX5_ST_SZ_BYTES(resource_dump_command_segment) + \ + MLX5_ST_SZ_BYTES(resource_dump_menu_segment)) + +static int mlx5_rsc_dump_read_menu_sgmt (struct mlx5_rsc_dump *rsc_dump,struct page *page, +int read_size,int start_idx) {void *data =page_address (page);enum mlx5_sgmt_type sgmt_idx;int num_of_items;char *sgmt_name;void *member; +int size =0 ;void *menu;int i; - menu =MLX5_ADDR_OF (menu_resource_dump_response, data, menu); - num_of_items =MLX5_GET (resource_dump_menu_segment, menu, num_of_records); +if (!start_idx) { + menu =MLX5_ADDR_OF (menu_resource_dump_response, data, menu); + rsc_dump->number_of_menu_items =MLX5_GET (resource_dump_menu_segment, menu, + num_of_records); + size =MLX5_RSC_DUMP_MENU_HEADER_SIZE ; + data += size; + } + num_of_items = rsc_dump->number_of_menu_items; + +for (i =0 ; start_idx + i < num_of_items; i++) { + size +=MLX5_ST_SZ_BYTES (resource_dump_menu_record); +if (size >= read_size) +return start_idx + i; -for (i =0 ; i < num_of_items; i++) { - member =MLX5_ADDR_OF (resource_dump_menu_segment, menu, record[i]); + member = data +MLX5_ST_SZ_BYTES (resource_dump_menu_record) * i; sgmt_name =MLX5_ADDR_OF (resource_dump_menu_record, member, segment_name); sgmt_idx =mlx5_rsc_dump_sgmt_get_by_name (sgmt_name);if (sgmt_idx == -EINVAL )
@@ -72,6 +89,7 @@ static void mlx5_rsc_dump_read_menu_sgmt(struct mlx5_rsc_dump *rsc_dump, struct rsc_dump->fw_segment_type[sgmt_idx] =MLX5_GET (resource_dump_menu_record, member, segment_type); } +return 0 ; } static int mlx5_rsc_dump_trigger(struct mlx5_core_dev *dev, struct mlx5_rsc_dump_cmd *cmd,
@@ -168,6 +186,7 @@ static int mlx5_rsc_dump_menu(struct mlx5_core_dev *dev)struct mlx5_rsc_dump_cmd *cmd =NULL ;struct mlx5_rsc_key key = {};struct page *page; +int start_idx =0 ;int size;int err;
@@ -189,7 +208,7 @@ static int mlx5_rsc_dump_menu(struct mlx5_core_dev *dev)if (err <0 ) goto destroy_cmd; -mlx5_rsc_dump_read_menu_sgmt (dev->rsc_dump, page); + start_idx =mlx5_rsc_dump_read_menu_sgmt (dev->rsc_dump, page, size, start_idx); }while (err >0 );
drivers/net/ethernet/mellanox/mlx5/core/en/port_buffer.c +2 -2
@@ -309,8 +309,8 @@ int mlx5e_port_manual_buffer_config(struct mlx5e_priv *priv,if (err)return err; - err =update_buffer_lossy (max_mtu, curr_pfc_en, prio2buffer, port_buff_cell_sz, - xoff, &port_buffer, &update_buffer); + err =update_buffer_lossy (max_mtu, curr_pfc_en, prio2buffer, xoff, + port_buff_cell_sz, &port_buffer, &update_buffer);if (err)return err; }
drivers/net/ethernet/mellanox/mlx5/core/en/tc_ct.c +4 -0
@@ -1699,6 +1699,8 @@ mlx5_tc_ct_flush_ft_entry(void *ptr, void *arg)static void mlx5_tc_ct_del_ft_cb (struct mlx5_tc_ct_priv *ct_priv,struct mlx5_ct_ft *ft) { +struct mlx5e_priv *priv; +if (!refcount_dec_and_test (&ft->refcount))return ;
@@ -1708,6 +1710,8 @@ mlx5_tc_ct_del_ft_cb(struct mlx5_tc_ct_priv *ct_priv, struct mlx5_ct_ft *ft)rhashtable_free_and_destroy (&ft->ct_entries_ht, mlx5_tc_ct_flush_ft_entry, ct_priv); + priv =netdev_priv (ct_priv->netdev); +flush_workqueue (priv->wq);mlx5_tc_ct_free_pre_ct_tables (ft);mapping_remove (ct_priv->zone_mapping, ft->zone_restore_id);kfree (ft);
drivers/net/ethernet/mellanox/mlx5/core/en_dcbnl.c +10 -0
@@ -1198,6 +1198,16 @@ static int mlx5e_trust_initialize(struct mlx5e_priv *priv)if (err)return err; +if (priv->dcbx_dp.trust_state ==MLX5_QPTS_TRUST_PCP && priv->dcbx.dscp_app_cnt) { +/* +* Align the driver state with the register state. +* Temporary state change is required to enable the app list reset. +*/ + priv->dcbx_dp.trust_state =MLX5_QPTS_TRUST_DSCP ; +mlx5e_dcbnl_delete_app (priv); + priv->dcbx_dp.trust_state =MLX5_QPTS_TRUST_PCP ; + } +mlx5e_params_calc_trust_tx_min_inline_mode (priv->mdev, &priv->channels.params, priv->dcbx_dp.trust_state);
drivers/net/ethernet/mellanox/mlx5/core/en_tc.c +11 -0
@@ -2291,6 +2291,17 @@ static int __parse_cls_flower(struct mlx5e_priv *priv, match.key->vlan_priority); *match_level =MLX5_MATCH_L2 ; + +if (!flow_rule_match_key (rule,FLOW_DISSECTOR_KEY_CVLAN ) && + match.mask->vlan_eth_type && +MLX5_CAP_FLOWTABLE_TYPE (priv->mdev, + ft_field_support.outer_second_vid, + fs_type)) { +MLX5_SET (fte_match_set_misc, misc_c, + outer_second_cvlan_tag,1 ); + spec->match_criteria_enable |= +MLX5_MATCH_MISC_PARAMETERS ; + } } }else if (*match_level !=MLX5_MATCH_NONE ) {/* cvlan_tag enabled in match criteria and
drivers/net/ethernet/mellanox/mlx5/core/fw_reset.c +35 -25
114 lines not on this page · raw message
drivers/net/ethernet/mellanox/mlx5/core/lag_mp.c +24 -14
@@ -100,6 +100,14 @@ static void mlx5_lag_fib_event_flush(struct notifier_block *nb)flush_workqueue (mp->wq); } +static void mlx5_lag_fib_set (struct lag_mp *mp,struct fib_info *fi,u32 dst,int dst_len) +{ + mp->fib.mfi = fi; + mp->fib.priority = fi->fib_priority; + mp->fib.dst = dst; + mp->fib.dst_len = dst_len; +} +struct mlx5_fib_event_work {struct work_struct work;struct mlx5_lag *ldev;
@@ -110,10 +118,10 @@ struct mlx5_fib_event_work { }; }; -static void mlx5_lag_fib_route_event (struct mlx5_lag *ldev, -unsigned long event, -struct fib_info *fi) +static void mlx5_lag_fib_route_event (struct mlx5_lag *ldev,unsigned long event, +struct fib_entry_notifier_info *fen_info) { +struct fib_info *fi = fen_info->fi;struct lag_mp *mp = &ldev->lag_mp;struct fib_nh *fib_nh0, *fib_nh1;unsigned int nhs;
@@ -121,13 +129,15 @@ static void mlx5_lag_fib_route_event(struct mlx5_lag *ldev,/* Handle delete event */ if (event ==FIB_EVENT_ENTRY_DEL ) {/* stop track */ -if (mp->mfi == fi) - mp->mfi =NULL ; +if (mp->fib.mfi == fi) + mp->fib.mfi =NULL ;return ; }/* Handle multipath entry with lower priority value */ -if (mp->mfi && mp->mfi != fi && fi->fib_priority >= mp->mfi->fib_priority) +if (mp->fib.mfi && mp->fib.mfi != fi && + (mp->fib.dst != fen_info->dst || mp->fib.dst_len != fen_info->dst_len) && + fi->fib_priority >= mp->fib.priority)return ;/* Handle add/replace event */
@@ -143,9 +153,9 @@ static void mlx5_lag_fib_route_event(struct mlx5_lag *ldev, i++;mlx5_lag_set_port_affinity (ldev, i); +mlx5_lag_fib_set (mp, fi, fen_info->dst, fen_info->dst_len); } - mp->mfi = fi;return ; }
@@ -165,7 +175,7 @@ static void mlx5_lag_fib_route_event(struct mlx5_lag *ldev, }/* First time we see multipath route */ -if (!mp->mfi && !__mlx5_lag_is_active (ldev)) { +if (!mp->fib.mfi && !__mlx5_lag_is_active (ldev)) {struct lag_tracker tracker; tracker = ldev->tracker;
@@ -173,7 +183,7 @@ static void mlx5_lag_fib_route_event(struct mlx5_lag *ldev, }mlx5_lag_set_port_affinity (ldev,MLX5_LAG_NORMAL_AFFINITY ); - mp->mfi = fi; +mlx5_lag_fib_set (mp, fi, fen_info->dst, fen_info->dst_len); } static void mlx5_lag_fib_nexthop_event(struct mlx5_lag *ldev,
@@ -184,7 +194,7 @@ static void mlx5_lag_fib_nexthop_event(struct mlx5_lag *ldev,struct lag_mp *mp = &ldev->lag_mp;/* Check the nh event is related to the route */ -if (!mp->mfi || mp->mfi != fi) +if (!mp->fib.mfi || mp->fib.mfi != fi)return ;/* nh added/removed */
@@ -214,7 +224,7 @@ static void mlx5_lag_fib_update(struct work_struct *work)case FIB_EVENT_ENTRY_REPLACE :case FIB_EVENT_ENTRY_DEL :mlx5_lag_fib_route_event (ldev, fib_work->event, - fib_work->fen_info.fi); + &fib_work->fen_info);fib_info_put (fib_work->fen_info.fi);break ;case FIB_EVENT_NH_ADD :
@@ -313,7 +323,7 @@ void mlx5_lag_mp_reset(struct mlx5_lag *ldev)/* Clear mfi, as it might become stale when a route delete event * has been missed, see mlx5_lag_fib_route_event(). */ - ldev->lag_mp.mfi =NULL ; + ldev->lag_mp.fib.mfi =NULL ; }int mlx5_lag_mp_init (struct mlx5_lag *ldev)
@@ -324,7 +334,7 @@ int mlx5_lag_mp_init(struct mlx5_lag *ldev)/* always clear mfi, as it might become stale when a route delete event * has been missed */ - mp->mfi =NULL ; + mp->fib.mfi =NULL ;if (mp->fib_nb.notifier_call)return 0 ;
@@ -354,5 +364,5 @@ void mlx5_lag_mp_cleanup(struct mlx5_lag *ldev)unregister_fib_notifier (&init_net, &mp->fib_nb);destroy_workqueue (mp->wq); mp->fib_nb.notifier_call =NULL ; - mp->mfi =NULL ; + mp->fib.mfi =NULL ; }
drivers/net/ethernet/mellanox/mlx5/core/lag_mp.h +6 -1
@@ -15,7 +15,12 @@ enum mlx5_lag_port_affinity {struct lag_mp {struct notifier_block fib_nb; -struct fib_info *mfi;/* used in tracking fib events */ +struct { +const void *mfi;/* used in tracking fib events */ +u32 priority; +u32 dst; +int dst_len; + } fib;struct workqueue_struct *wq; };
drivers/net/ethernet/smsc/smsc911x.c +1 -1
@@ -2429,7 +2429,7 @@ static int smsc911x_drv_probe(struct platform_device *pdev)if (irq == -EPROBE_DEFER ) { retval = -EPROBE_DEFER ; goto out_0; - }else if (irq <=0 ) { + }else if (irq <0 ) {pr_warn ("Could not allocate irq resource\n" ); retval = -ENODEV ; goto out_0;
drivers/net/ethernet/stmicro/stmmac/dwmac-intel.c +1 -0
@@ -454,6 +454,7 @@ static int intel_mgbe_common_data(struct pci_dev *pdev, plat->has_gmac4 =1 ; plat->force_sf_dma_mode =0 ; plat->tso_en =1 ; + plat->sph_disable =1 ;/* Multiplying factor to the clk_eee_i clock time * period to make it closer to 100 ns. This value
drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c +1 -0
@@ -916,6 +916,7 @@ static int sun8i_dwmac_register_mdio_mux(struct stmmac_priv *priv) ret =mdio_mux_init (priv->device, mdio_mux, mdio_mux_syscon_switch_fn, &gmac->mux_handle, priv, priv->mii); +of_node_put (mdio_mux);return ret; }
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +1 -1
@@ -7081,7 +7081,7 @@ int stmmac_dvr_probe(struct device *device,dev_info (priv->device,"TSO feature enabled\n" ); } -if (priv->dma_cap.sphen) { +if (priv->dma_cap.sphen && !priv->plat->sph_disable) { ndev->hw_features |=NETIF_F_GRO ; priv->sph_cap = true; priv->sph = priv->sph_cap;
drivers/net/ethernet/ti/cpsw_new.c +4 -1
@@ -1246,8 +1246,10 @@ static int cpsw_probe_dt(struct cpsw_common *cpsw) data->slave_data =devm_kcalloc (dev,CPSW_SLAVE_PORTS_NUM ,sizeof (struct cpsw_slave_data ),GFP_KERNEL ); -if (!data->slave_data) +if (!data->slave_data) { +of_node_put (tmp_node);return -ENOMEM ; + }/* Populate all the child nodes here... */
@@ -1341,6 +1343,7 @@ static int cpsw_probe_dt(struct cpsw_common *cpsw) err_node_put:of_node_put (port_np); +of_node_put (tmp_node);return ret; }
drivers/net/ethernet/xilinx/xilinx_emaclite.c +12 -3
@@ -822,10 +822,10 @@ static int xemaclite_mdio_write(struct mii_bus *bus, int phy_id, int reg,static int xemaclite_mdio_setup (struct net_local *lp,struct device *dev) {struct mii_bus *bus; -int rc;struct resource res;struct device_node *np =of_get_parent (lp->phy_node);struct device_node *npp; +int rc, ret;/* Don't register the MDIO bus if the phy_node or its parent node * can't be found.
@@ -835,8 +835,14 @@ static int xemaclite_mdio_setup(struct net_local *lp, struct device *dev)return -ENODEV ; } npp =of_get_parent (np); - -of_address_to_resource (npp,0 , &res); + ret =of_address_to_resource (npp,0 , &res); +of_node_put (npp); +if (ret) { +dev_err (dev,"%s resource error!\n" , + dev->of_node->full_name); +of_node_put (np); +return ret; + }if (lp->ndev->mem_start != res.start) {struct phy_device *phydev; phydev =of_phy_find_device (lp->phy_node);
@@ -845,6 +851,7 @@ static int xemaclite_mdio_setup(struct net_local *lp, struct device *dev) "MDIO of the phy is not registered yet\n"); else put_device(&phydev->mdio.dev); +of_node_put (np);return 0 ; }
@@ -857,6 +864,7 @@ static int xemaclite_mdio_setup(struct net_local *lp, struct device *dev) bus =mdiobus_alloc ();if (!bus) {dev_err (dev,"Failed to allocate mdiobus\n" ); +of_node_put (np);return -ENOMEM ; }
@@ -869,6 +877,7 @@ static int xemaclite_mdio_setup(struct net_local *lp, struct device *dev) bus->parent = dev; rc =of_mdiobus_register (bus, np); +of_node_put (np);if (rc) {dev_err (dev,"Failed to register mdio bus.\n" ); goto err_register;
drivers/net/mdio/mdio-mux-bcm6368.c +1 -1
@@ -115,7 +115,7 @@ static int bcm6368_mdiomux_probe(struct platform_device *pdev) md->mii_bus =devm_mdiobus_alloc (&pdev->dev);if (!md->mii_bus) {dev_err (&pdev->dev,"mdiomux bus alloc failed\n" ); -return ENOMEM ; +return -ENOMEM ; } bus = md->mii_bus;
drivers/nfc/nfcmrvl/main.c +1 -1
@@ -183,6 +183,7 @@ void nfcmrvl_nci_unregister_dev(struct nfcmrvl_private *priv) {struct nci_dev *ndev = priv->ndev; +nci_unregister_device (ndev);if (priv->ndev->nfc_dev->fw_download_in_progress)nfcmrvl_fw_dnld_abort (priv);
@@ -191,7 +192,6 @@ void nfcmrvl_nci_unregister_dev(struct nfcmrvl_private *priv)if (gpio_is_valid (priv->config.reset_n_io))gpio_free (priv->config.reset_n_io); -nci_unregister_device (ndev);nci_free_device (ndev);kfree (priv); }
drivers/pci/controller/pci-aardvark.c +323 -105
667 lines not on this page · raw message
drivers/pci/pci-bridge-emul.c +48 -1
61 lines not on this page · raw message
drivers/s390/block/dasd.c +15 -3
@@ -1422,6 +1422,13 @@ int dasd_start_IO(struct dasd_ccw_req *cqr)if (!cqr->lpm) cqr->lpm =dasd_path_get_opm (device); } +/* +* remember the amount of formatted tracks to prevent double format on +* ESE devices +*/ +if (cqr->block) + cqr->trkcount =atomic_read (&cqr->block->trkcount); +if (cqr->cpmode ==1 ) { rc =ccw_device_tm_start (device->cdev, cqr->cpaddr, (long ) cqr, cqr->lpm);
@@ -1639,6 +1646,7 @@ void dasd_int_handler(struct ccw_device *cdev, unsigned long intparm,unsigned long now;int nrf_suppressed =0 ;int fp_suppressed =0 ; +struct request *req;u8 *sense =NULL ;int expires;
@@ -1739,7 +1747,12 @@ void dasd_int_handler(struct ccw_device *cdev, unsigned long intparm, }if (dasd_ese_needs_format (cqr->block, irb)) { -if (rq_data_dir ((struct request *)cqr->callback_data) ==READ ) { + req =dasd_get_callback_data (cqr); +if (!req) { + cqr->status =DASD_CQR_ERROR ; +return ; + } +if (rq_data_dir (req) ==READ ) { device->discipline->ese_read (cqr, irb); cqr->status =DASD_CQR_SUCCESS ; cqr->stopclk = now;
@@ -2762,8 +2775,7 @@ static void __dasd_cleanup_cqr(struct dasd_ccw_req *cqr)* complete a request partially. */ if (proc_bytes) { -blk_update_request (req,BLK_STS_OK , -blk_rq_bytes (req) - proc_bytes); +blk_update_request (req,BLK_STS_OK , proc_bytes);blk_mq_requeue_request (req, true); }else if (likely (!blk_should_fake_timeout (req->q))) {blk_mq_complete_request (req);
drivers/s390/block/dasd_eckd.c +21 -7
@@ -3095,13 +3095,24 @@ static int dasd_eckd_format_device(struct dasd_device *base, }static bool test_and_set_format_track (struct dasd_format_entry *to_format, -struct dasd_block *block) +struct dasd_ccw_req *cqr) { +struct dasd_block *block = cqr->block;struct dasd_format_entry *format;unsigned long flags;bool rc = false;spin_lock_irqsave (&block->format_lock, flags); +if (cqr->trkcount !=atomic_read (&block->trkcount)) { +/* +* The number of formatted tracks has changed after request +* start and we can not tell if the current track was involved. +* To avoid data corruption treat it as if the current track is +* involved +*/ + rc = true; + goto out; + }list_for_each_entry (format, &block->format_list, list) {if (format->track == to_format->track) { rc = true;
@@ -3121,6 +3132,7 @@ static void clear_format_track(struct dasd_format_entry *format,unsigned long flags;spin_lock_irqsave (&block->format_lock, flags); +atomic_inc (&block->trkcount);list_del_init (&format->list);spin_unlock_irqrestore (&block->format_lock, flags); }
@@ -3157,7 +3169,7 @@ dasd_eckd_ese_format(struct dasd_device *startdev, struct dasd_ccw_req *cqr,sector_t curr_trk;int rc; - req = cqr->callback_data; + req =dasd_get_callback_data (cqr); block = cqr->block; base = block->base; private = base->private;
@@ -3182,8 +3194,11 @@ dasd_eckd_ese_format(struct dasd_device *startdev, struct dasd_ccw_req *cqr, } format->track = curr_trk;/* test if track is already in formatting by another thread */ -if (test_and_set_format_track (format, block)) +if (test_and_set_format_track (format, cqr)) { +/* this is no real error so do not count down retries */ + cqr->retries++;return ERR_PTR (-EEXIST ); + } fdata.start_unit = curr_trk; fdata.stop_unit = curr_trk;
@@ -3282,12 +3297,11 @@ static int dasd_eckd_ese_read(struct dasd_ccw_req *cqr, struct irb *irb) cqr->proc_bytes = blk_count * blksize;return 0 ; } -if (dst && !skip_block) { - dst += off; +if (dst && !skip_block)memset (dst,0 , blksize); - }else { +else skip_block--; - } + dst += blksize; blk_count++; } }
drivers/s390/block/dasd_int.h +14 -0
@@ -188,6 +188,7 @@ struct dasd_ccw_req {void (*callback)(struct dasd_ccw_req *,void *data);void *callback_data;unsigned int proc_bytes;/* bytes for partial completion */ +unsigned int trkcount;/* count formatted tracks */ };/*
@@ -611,6 +612,7 @@ struct dasd_block {struct list_head format_list;spinlock_t format_lock; +atomic_t trkcount; };struct dasd_attention_data {
@@ -757,6 +759,18 @@ dasd_check_blocksize(int bsize)return 0 ; } +/* +* return the callback data of the original request in case there are +* ERP requests build on top of it +*/ +static inline void *dasd_get_callback_data (struct dasd_ccw_req *cqr) +{ +while (cqr->refers) + cqr = cqr->refers; + +return cqr->callback_data; +} +/* externals in dasd.c */ #define DASD_PROFILE_OFF 0#define DASD_PROFILE_ON 1
drivers/video/fbdev/core/fbmem.c +4 -1
@@ -1436,7 +1436,10 @@ fb_release(struct inode *inode, struct file *file) __acquires(&info->lock) __releases(&info->lock) { -struct fb_info *const info = file->private_data; +struct fb_info *const info =file_fb_info (file); + +if (!info) +return -ENODEV ;lock_fb_info (info);if (info->fbops->fb_release)
fs/btrfs/disk-io.c +11 -0
@@ -3415,6 +3415,17 @@ int __cold open_ctree(struct super_block *sb, struct btrfs_fs_devices *fs_device }if (sectorsize !=PAGE_SIZE ) { +/* +* V1 space cache has some hardcoded PAGE_SIZE usage, and is +* going to be deprecated. +* +* Force to use v2 cache for subpage case. +*/ +btrfs_clear_opt (fs_info->mount_opt,SPACE_CACHE ); +btrfs_set_and_info (fs_info,FREE_SPACE_TREE , +"forcing free space tree for sector size %u with page size %lu" , + sectorsize,PAGE_SIZE ); +btrfs_warn (fs_info,"read-write for sector size %u with page size %lu is experimental" , sectorsize,PAGE_SIZE );
fs/btrfs/tree-log.c +13 -1
@@ -5483,6 +5483,18 @@ static int btrfs_log_inode(struct btrfs_trans_handle *trans,mutex_lock (&inode->log_mutex); } +/* +* For symlinks, we must always log their content, which is stored in an +* inline extent, otherwise we could end up with an empty symlink after +* log replay, which is invalid on linux (symlink(2) returns -ENOENT if +* one attempts to create an empty symlink). +* We don't need to worry about flushing delalloc, because when we create +* the inline extent when the symlink is created (we never have delalloc +* for symlinks). +*/ +if (S_ISLNK (inode->vfs_inode.i_mode)) + inode_only =LOG_INODE_ALL ; +/* * This is for cases where logging a directory could result in losing a * a file after replaying the log. For example, if we move a file from a
@@ -5853,7 +5865,7 @@ static int log_new_dir_dentries(struct btrfs_trans_handle *trans, } ctx->log_new_dentries = false; -if (type ==BTRFS_FT_DIR || type ==BTRFS_FT_SYMLINK ) +if (type ==BTRFS_FT_DIR ) log_mode =LOG_INODE_ALL ; ret =btrfs_log_inode (trans, root,BTRFS_I (di_inode), log_mode, ctx);
fs/btrfs/xattr.c +4 -2
@@ -264,7 +264,8 @@ int btrfs_setxattr_trans(struct inode *inode, const char *name,inode_inc_iversion (inode); inode->i_ctime =current_time (inode); ret =btrfs_update_inode (trans, root,BTRFS_I (inode)); -BUG_ON (ret); +if (ret) +btrfs_abort_transaction (trans, ret); out:if (start_trans)btrfs_end_transaction (trans);
@@ -418,7 +419,8 @@ static int btrfs_xattr_handler_set_prop(const struct xattr_handler *handler,inode_inc_iversion (inode); inode->i_ctime =current_time (inode); ret =btrfs_update_inode (trans, root,BTRFS_I (inode)); -BUG_ON (ret); +if (ret) +btrfs_abort_transaction (trans, ret); }btrfs_end_transaction (trans);
fs/nfs/nfs4proc.c +11 -1
@@ -366,6 +366,14 @@ static void nfs4_setup_readdir(u64 cookie, __be32 *verifier, struct dentry *dentkunmap_atomic (start); } +static void nfs4_fattr_set_prechange (struct nfs_fattr *fattr,u64 version) +{ +if (!(fattr->valid &NFS_ATTR_FATTR_PRECHANGE )) { + fattr->pre_change_attr = version; + fattr->valid |=NFS_ATTR_FATTR_PRECHANGE ; + } +} +static void nfs4_test_and_free_stateid (struct nfs_server *server,nfs4_stateid *stateid,const struct cred *cred)
@@ -6558,7 +6566,9 @@ static void nfs4_delegreturn_release(void *calldata)pnfs_roc_release (&data->lr.arg, &data->lr.res, data->res.lr_ret);if (inode) { -nfs_post_op_update_inode_force_wcc (inode, &data->fattr); +nfs4_fattr_set_prechange (&data->fattr, +inode_peek_iversion_raw (inode)); +nfs_refresh_inode (inode, &data->fattr);nfs_iput_and_deactive (inode); }kfree (calldata);
include/linux/stmmac.h +1 -0
@@ -269,5 +269,6 @@ struct plat_stmmacenet_data {int msi_rx_base_vec;int msi_tx_base_vec;bool use_phy_wol; + bool sph_disable; };#endif
kernel/irq/internals.h +2 -0
@@ -29,12 +29,14 @@ extern struct irqaction chained_action;* IRQTF_WARNED - warning "IRQ_WAKE_THREAD w/o thread_fn" has been printed * IRQTF_AFFINITY - irq thread is requested to adjust affinity * IRQTF_FORCED_THREAD - irq action is force threaded +* IRQTF_READY - signals that irq thread is ready */ enum {IRQTF_RUNTHREAD ,IRQTF_WARNED ,IRQTF_AFFINITY ,IRQTF_FORCED_THREAD , +IRQTF_READY , };/*
kernel/irq/irqdesc.c +2 -0
@@ -407,6 +407,7 @@ static struct irq_desc *alloc_desc(int irq, int node, unsigned int flags,lockdep_set_class (&desc->lock, &irq_desc_lock_class);mutex_init (&desc->request_mutex);init_rcu_head (&desc->rcu); +init_waitqueue_head (&desc->wait_for_threads);desc_set_defaults (irq, desc, node, affinity, owner);irqd_set (&desc->irq_data, flags);
@@ -575,6 +576,7 @@ int __init early_irq_init(void)raw_spin_lock_init (&desc[i].lock);lockdep_set_class (&desc[i].lock, &irq_desc_lock_class);mutex_init (&desc[i].request_mutex); +init_waitqueue_head (&desc[i].wait_for_threads);desc_set_defaults (i, &desc[i], node,NULL ,NULL ); }return arch_early_irq_init ();
kernel/irq/manage.c +29 -10
@@ -1248,6 +1248,31 @@ static void irq_wake_secondary(struct irq_desc *desc, struct irqaction *action)raw_spin_unlock_irq (&desc->lock); } +/* +* Internal function to notify that a interrupt thread is ready. +*/ +static void irq_thread_set_ready (struct irq_desc *desc, +struct irqaction *action) +{ +set_bit (IRQTF_READY , &action->thread_flags); +wake_up (&desc->wait_for_threads); +} + +/* +* Internal function to wake up a interrupt thread and wait until it is +* ready. +*/ +static void wake_up_and_wait_for_irq_thread_ready (struct irq_desc *desc, +struct irqaction *action) +{ +if (!action || !action->thread) +return ; + +wake_up_process (action->thread); +wait_event (desc->wait_for_threads, +test_bit (IRQTF_READY , &action->thread_flags)); +} +/* * Interrupt handler thread */
@@ -1259,6 +1284,8 @@ static int irq_thread(void *data)irqreturn_t (*handler_fn)(struct irq_desc *desc,struct irqaction *action); +irq_thread_set_ready (desc, action); +if (force_irqthreads () &&test_bit (IRQTF_FORCED_THREAD , &action->thread_flags)) handler_fn = irq_forced_thread_fn;
@@ -1683,8 +1710,6 @@ __setup_irq(unsigned int irq, struct irq_desc *desc, struct irqaction *new) }if (!shared) { -init_waitqueue_head (&desc->wait_for_threads); -/* Setup the type (level, edge polarity) if configured: */ if (new->flags &IRQF_TRIGGER_MASK ) { ret = __irq_set_trigger(desc,
@@ -1780,14 +1805,8 @@ __setup_irq(unsigned int irq, struct irq_desc *desc, struct irqaction *new)irq_setup_timings (desc, new); -/* -* Strictly no need to wake it up, but hung_task complains -* when no hard interrupt wakes the thread up. -*/
Lines of this file are not shown. View the raw message.
sound/firewire/fireworks/fireworks_hwdep.c +1 -0
Lines of this file are not shown. View the raw message.
tools/testing/selftests/drivers/net/ocelot/tc_flower_chains.sh +1 -1
Lines of this file are not shown. View the raw message.
tools/testing/selftests/kvm/include/x86_64/processor.h +15 -0
Lines of this file are not shown. View the raw message.
tools/testing/selftests/kvm/kvm_page_table_test.c +1 -1
Lines of this file are not shown. View the raw message.
tools/testing/selftests/kvm/lib/x86_64/processor.c +77 -115
192 lines not on this page · raw message
tools/testing/selftests/net/forwarding/mirror_gre_bridge_1q.sh +3 -0
Lines of this file are not shown. View the raw message.
tools/testing/selftests/net/so_txtime.c +2 -2
Lines of this file are not shown. View the raw message.
tools/testing/selftests/seccomp/seccomp_bpf.c +5 -5
Lines of this file are not shown. View the raw message.
tools/testing/selftests/vm/mremap_test.c +53 -0
53 lines not on this page · raw message
The rest of this diff is not shown. View the raw message.
Part of the diff is not shown here. View the raw message.
Greg Kroah-Hartman
maintainerI'm announcing the release of the 5.15.39 kernel.
All users of the 5.15 kernel series must upgrade.
The updated 5.15.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-5.15.y
and can be browsed at the normal kernel.org git web browser:
https://git.kernel.org/?p=linux/kernel/git/stable/linux-stable.git;a=summary
thanks,
greg k-h
------------
Makefile | 2 arch/mips/include/asm/timex.h | 8 arch/mips/kernel/time.c | 11 arch/parisc/kernel/processor.c | 3 arch/parisc/kernel/setup.c | 2 arch/parisc/kernel/time.c | 6 arch/riscv/mm/init.c | 21 arch/x86/kernel/fpu/core.c | 67 - arch/x86/kernel/kvm.c | 13 arch/x86/kvm/cpuid.c | 5 arch/x86/kvm/lapic.c | 10 arch/x86/kvm/mmu/mmu.c | 2 arch/x86/kvm/svm/pmu.c | 28 drivers/firewire/core-card.c | 3 drivers/firewire/core-cdev.c | 4 drivers/firewire/core-topology.c | 9 drivers/firewire/core-transaction.c | 30 drivers/firewire/sbp2.c | 13 drivers/gpio/gpio-mvebu.c | 7 drivers/gpio/gpio-pca953x.c | 4 drivers/gpio/gpio-visconti.c | 7 drivers/gpio/gpiolib-of.c | 2 drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c | 8 drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 30 drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c | 24 drivers/gpu/drm/amd/amdgpu/amdgpu_object.c | 23 drivers/gpu/drm/amd/amdgpu/amdgpu_object.h | 1 drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 30 drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h | 1 drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c | 4 drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c | 2 drivers/gpu/drm/msm/dp/dp_display.c | 6 drivers/gpu/drm/msm/dp/dp_panel.c | 11 drivers/gpu/drm/msm/dp/dp_panel.h | 1 drivers/hwmon/adt7470.c | 4 drivers/hwmon/pmbus/pmbus_core.c | 3 drivers/infiniband/hw/irdma/cm.c | 26 drivers/infiniband/hw/irdma/utils.c | 21 drivers/infiniband/hw/irdma/verbs.c | 4 drivers/infiniband/sw/siw/siw_cm.c | 7 drivers/iommu/apple-dart.c | 10 drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c | 9 drivers/iommu/intel/iommu.c | 27 drivers/iommu/intel/svm.c | 4 drivers/mmc/core/mmc.c | 23 drivers/mmc/host/rtsx_pci_sdmmc.c | 29 drivers/mmc/host/sdhci-msm.c | 42 drivers/mmc/host/sunxi-mmc.c | 5 drivers/net/can/grcan.c | 46 - drivers/net/dsa/mt7530.c | 1 drivers/net/ethernet/broadcom/bnxt/bnxt.c | 13 drivers/net/ethernet/huawei/hinic/hinic_hw_wq.c | 7 drivers/net/ethernet/mediatek/mtk_sgmii.c | 1 drivers/net/ethernet/mellanox/mlx5/core/diag/rsc_dump.c | 31 drivers/net/ethernet/mellanox/mlx5/core/en/port_buffer.c | 4 drivers/net/ethernet/mellanox/mlx5/core/en/tc_ct.c | 4 drivers/net/ethernet/mellanox/mlx5/core/en_dcbnl.c | 10 drivers/net/ethernet/mellanox/mlx5/core/en_tc.c | 11 drivers/net/ethernet/mellanox/mlx5/core/fw_reset.c | 60 - drivers/net/ethernet/mellanox/mlx5/core/lag_mp.c | 38 drivers/net/ethernet/mellanox/mlx5/core/lag_mp.h | 7 drivers/net/ethernet/smsc/smsc911x.c | 2 drivers/net/ethernet/stmicro/stmmac/dwmac-intel.c | 1 drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c | 1 drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 2 drivers/net/ethernet/ti/cpsw_new.c | 5 drivers/net/ethernet/xilinx/xilinx_emaclite.c | 15 drivers/net/mdio/mdio-mux-bcm6368.c | 2 drivers/nfc/nfcmrvl/main.c | 2 drivers/pci/controller/pci-aardvark.c | 428 +++++++--- drivers/pci/pci-bridge-emul.c | 49 + drivers/s390/block/dasd.c | 18 drivers/s390/block/dasd_eckd.c | 28 drivers/s390/block/dasd_int.h | 14 drivers/video/fbdev/core/fbmem.c | 5 fs/btrfs/disk-io.c | 11 fs/btrfs/tree-log.c | 14 fs/btrfs/xattr.c | 6 fs/nfs/nfs4proc.c | 12 include/linux/stmmac.h | 1 kernel/irq/internals.h | 2 kernel/irq/irqdesc.c | 2 kernel/irq/manage.c | 39 kernel/rcu/tree.c | 31 kernel/time/timekeeping.c | 4 net/can/isotp.c | 22 net/ipv4/igmp.c | 9 net/ipv6/mcast.c | 8 net/nfc/core.c | 29 net/nfc/netlink.c | 4 net/rxrpc/local_object.c | 3 net/sunrpc/clnt.c | 11 net/sunrpc/xprtsock.c | 3 sound/firewire/fireworks/fireworks_hwdep.c | 1 sound/pci/hda/patch_realtek.c | 1 sound/soc/codecs/da7219.c | 14 sound/soc/codecs/wm8958-dsp2.c | 8 sound/soc/meson/aiu-acodec-ctrl.c | 2 sound/soc/meson/aiu-codec-ctrl.c | 2 sound/soc/meson/g12a-tohdmitx.c | 2 sound/soc/soc-generic-dmaengine-pcm.c | 6 sound/soc/soc-ops.c | 2 tools/testing/selftests/drivers/net/ocelot/tc_flower_chains.sh | 2 tools/testing/selftests/kvm/include/x86_64/processor.h | 15 tools/testing/selftests/kvm/kvm_page_table_test.c | 2 tools/testing/selftests/kvm/lib/x86_64/processor.c | 192 +--- tools/testing/selftests/net/forwarding/mirror_gre_bridge_1q.sh | 3 tools/testing/selftests/net/so_txtime.c | 4 tools/testing/selftests/seccomp/seccomp_bpf.c | 10 tools/testing/selftests/vm/mremap_test.c | 53 + 110 files changed, 1292 insertions(+), 655 deletions(-)
Adam Wujek (1):
hwmon: (pmbus) disable PEC if not enabled
Andreas Larsson (2):
can: grcan: grcan_probe(): fix broken system id check for errata workaround needs
can: grcan: only use the NAPI poll budget for RX
Andrei Lalaev (1):
gpiolib: of: fix bounds check for 'gpio-reserved-ranges'
Armin Wolf (1):
hwmon: (adt7470) Fix warning on module removal
Aya Levin (1):
net/mlx5: Fix slab-out-of-bounds while reading resource dump menu
Baruch Siach (1):
gpio: mvebu: drop pwm base assignment
Brian Norris (1):
mmc: core: Set HS clock speed before sending HS CMD13
Cheng Xu (1):
RDMA/siw: Fix a condition race issue in MPA request processing
Chengfeng Ye (1):
firewire: fix potential uaf in outbound_phy_packet_callback()
Codrin Ciubotariu (1):
ASoC: dmaengine: Restore NULL prepare_slave_config() callback
Daniel Hellstrom (1):
can: grcan: use ofdev->dev when allocating DMA memory
David Howells (1):
rxrpc: Enable IPv6 checksums on transport socket
David Stevens (1):
iommu/vt-d: Calculate mask for non-aligned flushes
Duoming Zhou (4):
can: grcan: grcan_close(): fix deadlock
nfc: replace improper check device_is_registered() in netlink related functions
nfc: nfcmrvl: main: reorder destructive operations in nfcmrvl_nci_unregister_dev to avoid bugs
NFC: netlink: fix sleep in atomic bug when firmware download timeout
Eric Dumazet (2):
net: igmp: respect RCU rules in ip_mc_source() and ip_mc_msfilter()
mld: respect RCU rules in ip6_mc_source() and ip6_mc_msfilter()
Filipe Manana (2):
btrfs: do not BUG_ON() on failure to update inode when setting xattr
btrfs: always log symlinks in full mode
Frederic Weisbecker (2):
rcu: Fix callbacks processing time limit retaining cond_resched()
rcu: Apply callbacks processing time limit only on softirq
Greg Kroah-Hartman (1):
Linux 5.15.39
Harry Wentland (1):
drm/amd/display: Avoid reading audio pattern past AUDIO_CHANNELS_COUNT
Hector Martin (1):
iommu/dart: Add missing module owner to ops structure
Helge Deller (2):
parisc: Merge model and model name into one line in /proc/cpuinfo Revert "parisc: Mark sched_clock unstable only if clocks are not syncronized"
Ido Schimmel (1):
selftests: mirror_gre_bridge_1q: Avoid changing PVID while interface is operational
Jakob Koschel (1):
firewire: remove check of list iterator against head past the loop body
Jan Höppner (2):
s390/dasd: Fix read for ESE with blksize < 4k s390/dasd: Fix read inconsistency for ESE DASD devices
Jann Horn (1):
selftests/seccomp: Don't call read() on TTY from background pgrp
Javier Martinez Canillas (1):
fbdev: Make fb_release() return -ENODEV if fbdev was unregistered
Kai-Heng Feng (1):
drm/amdgpu: Ensure HDA function is suspended before ASIC reset
Kuogee Hsieh (1):
drm/msm/dp: remove fail safe mode related code
Kurt Kanzenbach (1):
timekeeping: Mark NMI safe time accessors as notrace
Kyle Huey (1):
KVM: x86/svm: Account for family 17h event renumberings in amd_pmc_perf_hw_id
Lu Baolu (1):
iommu/vt-d: Drop stop marker messages
Maciej W. Rozycki (1):
MIPS: Fix CP0 counter erratum detection for R4k CPUs
Marc Kleine-Budde (2):
selftests/net: so_txtime: fix parsing of start time stamp on 32 bit systems selftests/net: so_txtime: usage(): fix documentation of default clock
Marek Behún (5):
PCI: aardvark: Make MSI irq_chip structures static driver structures
PCI: aardvark: Make msi_domain_info structure a static driver structure
PCI: aardvark: Use dev_fwnode() instead of of_node_to_fwnode(dev->of_node)
PCI: aardvark: Drop __maybe_unused from advk_pcie_disable_phy()
PCI: aardvark: Update comment about link going down after link-up
Marek Marczykowski-Górecki (1):
drm/amdgpu: do not use passthrough mode in Xen dom0
Mario Limonciello (2):
drm/amdgpu: explicitly check for s0ix when evicting resources drm/amdgpu: don't set s3 and s0ix at the same time
Mark Brown (5):
ASoC: da7219: Fix change notifications for tone generator frequency
ASoC: wm8958: Fix change notifications for DSP controls
ASoC: meson: Fix event generation for AUI ACODEC mux
ASoC: meson: Fix event generation for G12A tohdmi mux
ASoC: meson: Fix event generation for AUI CODEC mux
Mark Zhang (1):
net/mlx5e: Fix the calling of update_buffer_lossy() API
Michael Chan (1):
bnxt_en: Fix unnecessary dropping of RX packets
Moshe Shemesh (2):
net/mlx5: Avoid double clear or set of sync reset requested net/mlx5: Fix deadlock in sync reset flow
Moshe Tal (1):
net/mlx5e: Fix trust state reset in reload
Mustafa Ismail (1):
RDMA/irdma: Fix possible crash due to NULL netdev in notifier
Nick Kossifidis (1):
RISC-V: relocate DTB if it's outside memory region
Nicolin Chen (1):
iommu/arm-smmu-v3: Fix size calculation in arm_smmu_mm_invalidate_range()
Niels Dossche (2):
firewire: core: extend card->lock in fw_core_handle_bus_reset
net: mdio: Fix ENOMEM return value in BCM6368 mux bus controller
Nirmoy Das (1):
drm/amdgpu: unify BO evicting method in amdgpu_ttm
Nobuhiro Iwamatsu (1):
gpio: visconti: Fix fwnode of GPIO IRQ
Olga Kornievskaia (1):
SUNRPC release the transport of a relocated task with an assigned transport
Oliver Hartkopp (1):
can: isotp: remove re-binding of bound socket
Pali Rohár (25):
PCI: pci-bridge-emul: Add description for class_revision field
PCI: pci-bridge-emul: Add definitions for missing capabilities registers
PCI: aardvark: Add support for DEVCAP2, DEVCTL2, LNKCAP2 and LNKCTL2 registers on emulated bridge
PCI: aardvark: Clear all MSIs at setup
PCI: aardvark: Comment actions in driver remove method
PCI: aardvark: Disable bus mastering when unbinding driver
PCI: aardvark: Mask all interrupts when unbinding driver
PCI: aardvark: Fix memory leak in driver unbind
PCI: aardvark: Assert PERST# when unbinding driver
PCI: aardvark: Disable link training when unbinding driver
PCI: aardvark: Disable common PHY when unbinding driver
PCI: aardvark: Replace custom PCIE_CORE_INT_* macros with PCI_INTERRUPT_*
PCI: aardvark: Rewrite IRQ code to chained IRQ handler
PCI: aardvark: Check return value of generic_handle_domain_irq() when processing INTx IRQ
PCI: aardvark: Refactor unmasking summary MSI interrupt
PCI: aardvark: Add support for masking MSI interrupts
PCI: aardvark: Fix setting MSI address
PCI: aardvark: Enable MSI-X support
PCI: aardvark: Add support for ERR interrupt on emulated bridge
PCI: aardvark: Optimize writing PCI_EXP_RTCTL_PMEIE and PCI_EXP_RTSTA_PME on emulated bridge
PCI: aardvark: Add support for PME interrupts
PCI: aardvark: Fix support for PME requester on emulated bridge
PCI: aardvark: Use separate INTA interrupt for emulated root bridge
PCI: aardvark: Remove irq_mask_ack() callback for INTx interrupts
PCI: aardvark: Don't mask irq when mapping
Paolo Bonzini (3):
kvm: selftests: do not use bitfields larger than 32-bits for PTEs
KVM: x86: Do not change ICR on write to APIC_SELF_IPI
KVM: x86/mmu: avoid NULL-pointer dereference on page freeing bugs
Paul Blakey (1):
net/mlx5e: CT: Fix queued up restore put() executing after relevant ft release
Pierre-Louis Bossart (1):
ASoC: soc-ops: fix error handling
Puyou Lu (1):
gpio: pca953x: fix irq_stat not updated when irq is disabled (irq_mask not set)
Qiao Ma (1):
hinic: fix bug of wq out of bound access
Qu Wenruo (1):
btrfs: force v2 space cache usage for subpage mount
Ricky WU (1):
mmc: rtsx: add 74 Clocks in power on flow
Samuel Holland (1):
mmc: sunxi-mmc: Fix DMA descriptors allocated above 32 bits
Sandipan Das (1):
kvm: x86/cpuid: Only provide CPUID leaf 0xA if host has architectural PMU
Sergey Shtylyov (1):
smsc911x: allow using IRQ0
Shaik Sajida Bhanu (1):
mmc: sdhci-msm: Reset GCC_SDCC_BCR register for SDHC
Shiraz Saleem (1):
RDMA/irdma: Reduce iWARP QP destroy time
Shravya Kumbham (1):
net: emaclite: Add error handling for of_address_to_resource()
Sidhartha Kumar (2):
selftest/vm: verify mmap addr in mremap_test selftest/vm: verify remap destination address in mremap_test
Somnath Kotur (1):
bnxt_en: Fix possible bnxt_open() failure caused by wrong RFS flag
Stefan Haberland (2):
s390/dasd: fix data corruption for ESE devices s390/dasd: prevent double format of tracks for ESE devices
Takashi Sakamoto (1):
ALSA: fireworks: fix wrong return count shorter than expected by 4 bytes
Tan Tee Min (1):
net: stmmac: disable Split Header (SPH) for Intel platforms
Tatyana Nikolova (1):
RDMA/irdma: Flush iWARP QP if modified to ERR from RTR state
Thomas Gleixner (1):
x86/fpu: Prevent FPU state corruption
Thomas Huth (1):
KVM: selftests: Silence compiler warning in the kvm_page_table_test
Thomas Pfaff (1):
genirq: Synchronize interrupt thread startup
Trond Myklebust (2):
Revert "SUNRPC: attempt AF_LOCAL connect on setup"
NFSv4: Don't invalidate inode attributes on delegation return
Vlad Buslov (4):
net/mlx5e: Don't match double-vlan packets if cvlan is not set net/mlx5e: Lag, Fix use-after-free in fib event handler net/mlx5e: Lag, Fix fib_info pointer assignment net/mlx5e: Lag, Don't skip fib events on current dst
Vladimir Oltean (1):
selftests: ocelot: tc_flower_chains: specify conform-exceed action for policer
Wanpeng Li (2):
x86/kvm: Preserve BSP MSR_KVM_POLL_CONTROL across suspend/resume
KVM: LAPIC: Enable timer posted-interrupt only when mwait/hlt is advertised
Yang Yingliang (5):
iommu/dart: check return value after calling platform_get_resource()
net: ethernet: mediatek: add missing of_node_put() in mtk_sgmii_init()
net: dsa: mt7530: add missing of_node_put() in mt7530_setup()
net: stmmac: dwmac-sun8i: add missing of_node_put() in sun8i_dwmac_register_mdio_mux()
net: cpsw: add missing of_node_put() in cpsw_probe_dt()
Zihao Wang (1):
ALSA: hda/realtek: Add quirk for Yoga Duet 7 13ITL6 speakers