mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-09 04:10:18 +09:00
Merge aosp/android14-6.1 to aosp/android14-6.1-lts
* aosp/android14-6.1: BACKPORT: genirq/cpuhotplug, x86/vector: Prevent vector leak during CPU offline UPSTREAM: genirq/cpuhotplug: Retry with cpu_online_mask when migration fails UPSTREAM: genirq/cpuhotplug: Skip suspended interrupts when restoring affinity UPSTREAM: scsi: ufs: core: Perform read back after writing UTP_TASK_REQ_LIST_BASE_H UPSTREAM: mm/userfaultfd: UFFDIO_MOVE implementation should use ptep_get() UPSTREAM: f2fs: fix NULL pointer dereference in f2fs_submit_page_write() UPSTREAM: f2fs: zone: fix to wait completion of last bio in zone correctly UPSTREAM: iommu: Don't reserve 0-length IOVA region UPSTREAM: iommu: Fix printk arg in of_iommu_get_resv_regions() UPSTREAM: iommu: Map reserved memory as cacheable if device is coherent BACKPORT: io_uring/fdinfo: remove need for sqpoll lock for thread/pid retrieval UPSTREAM: wifi: cfg80211: fix assoc response warning on failed links UPSTREAM: usb: typec: tcpm: Add additional checks for contaminant UPSTREAM: mm: remove duplicated vma->vm_flags check when expanding stack ANDROID: Update the ABI symbol list ANDROID: add vendor hook for mapping_shrinkable FROMLIST: sd: Retry START STOP UNIT commands FROMLIST: scsi: core: Retry passthrough commands if SCMD_RETRY_PASSTHROUGH is set ANDROID: GKI: Update symbol list for mtk ANDROID: Update the ABI symbol list ANDROID: GKI: add symbol list for telechips UPSTREAM: ufs: core: bypass quick recovery if need force reset ANDROID: Update the ABI symbol list UPSTREAM: ring-buffer: Fix a race between readers and resize checks UPSTREAM: lib/build_OID_registry: avoid non-destructive substitution for Perl < 5.13.2 compat UPSTREAM: lib/build_OID_registry: don't mention the full path of the script in output ANDROID: GKI: Add symbol list for exynosauto UPSTREAM: erofs: fix race in z_erofs_get_gbuf() ANDROID: fuse: Skip canonical path logic if ENOSYS ANDROID: fsnotify: Do not notify lower fs of open when ENOSYS ANDROID: mm: madvise: Avoid counting swap entry references for migration entries UPSTREAM: scsi: ufs: core: Changing the status to check inflight ANDROID: Update the ABI symbol list ANDROID: power: add vendor hook to handle hibernate failures ANDROID: GKI: remove export of tracing control functions ANDROID: fix kernelci build-break for !CONFIG_ANDROID_VENDOR_OEM_DATA ANDROID: GKI: update symbol list file for xiaomi ANDROID: vendor_hooks: vendor hooks for optimizing the blocking problem caused by rwsem lock contention of reverse mapping during memory recycling. UPSTREAM: of: reserved_mem: Use proper binary prefix BACKPORT: gpio: of: support gpio-ranges for multiple gpiochip devices UPSTREAM: dt-bindings: gpio: brcmstb: add gpio-ranges ANDROID: Incremental fs: Retry page faults on non-fatal errors ANDROID: GKI: Update symbol list for BCMSTB ANDROID: GKI: Update rockchip symbols for dw_hdmi_qp. UPSTREAM: net: usb: ax88179_178a: improve reset check UPSTREAM: net: usb: ax88179_178a: fix link status when link is set to down/up UPSTREAM: usb: gadget: configfs: Prevent OOB read/write in usb_string_copy() UPSTREAM: usb: typec: tcpm: fix use-after-free case in tcpm_register_source_caps UPSTREAM: usb: typec: tcpm: unregister existing source caps before re-registration ANDROID: GKI: Update symbol list for mtk Change-Id: I1b7876def61c1f0a09ec7599aeb64fd2de911619 Signed-off-by: Will McVicker <willmcvicker@google.com>
This commit is contained in:
@@ -120,6 +120,7 @@ filegroup(
|
|||||||
"android/abi_gki_aarch64_qcom",
|
"android/abi_gki_aarch64_qcom",
|
||||||
"android/abi_gki_aarch64_rockchip",
|
"android/abi_gki_aarch64_rockchip",
|
||||||
"android/abi_gki_aarch64_sony",
|
"android/abi_gki_aarch64_sony",
|
||||||
|
"android/abi_gki_aarch64_telechips",
|
||||||
"android/abi_gki_aarch64_tuxera",
|
"android/abi_gki_aarch64_tuxera",
|
||||||
"android/abi_gki_aarch64_type_visibility",
|
"android/abi_gki_aarch64_type_visibility",
|
||||||
"android/abi_gki_aarch64_unisoc",
|
"android/abi_gki_aarch64_unisoc",
|
||||||
|
|||||||
@@ -62,6 +62,8 @@ properties:
|
|||||||
|
|
||||||
interrupt-controller: true
|
interrupt-controller: true
|
||||||
|
|
||||||
|
gpio-ranges: true
|
||||||
|
|
||||||
wakeup-source:
|
wakeup-source:
|
||||||
type: boolean
|
type: boolean
|
||||||
description: >
|
description: >
|
||||||
@@ -88,6 +90,7 @@ examples:
|
|||||||
interrupt-parent = <&irq0_intc>;
|
interrupt-parent = <&irq0_intc>;
|
||||||
interrupts = <0x6>;
|
interrupts = <0x6>;
|
||||||
brcm,gpio-bank-widths = <32 32 32 24>;
|
brcm,gpio-bank-widths = <32 32 32 24>;
|
||||||
|
gpio-ranges = <&pinctrl 0 0 120>;
|
||||||
};
|
};
|
||||||
|
|
||||||
upg_gio_aon: gpio@f04172c0 {
|
upg_gio_aon: gpio@f04172c0 {
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -191,6 +191,8 @@
|
|||||||
gic_nonsecure_priorities
|
gic_nonsecure_priorities
|
||||||
gpiochip_add_data_with_key
|
gpiochip_add_data_with_key
|
||||||
gpiochip_find
|
gpiochip_find
|
||||||
|
gpiochip_generic_free
|
||||||
|
gpiochip_generic_request
|
||||||
gpiochip_get_data
|
gpiochip_get_data
|
||||||
gpiochip_remove
|
gpiochip_remove
|
||||||
gpiod_get_value_cansleep
|
gpiod_get_value_cansleep
|
||||||
@@ -355,6 +357,7 @@
|
|||||||
of_address_to_resource
|
of_address_to_resource
|
||||||
of_alias_get_id
|
of_alias_get_id
|
||||||
of_clk_get_by_name
|
of_clk_get_by_name
|
||||||
|
of_count_phandle_with_args
|
||||||
of_device_get_match_data
|
of_device_get_match_data
|
||||||
of_device_is_available
|
of_device_is_available
|
||||||
of_device_is_big_endian
|
of_device_is_big_endian
|
||||||
@@ -490,6 +493,7 @@
|
|||||||
register_pernet_device
|
register_pernet_device
|
||||||
register_pernet_subsys
|
register_pernet_subsys
|
||||||
register_pm_notifier
|
register_pm_notifier
|
||||||
|
register_reboot_notifier
|
||||||
register_syscore_ops
|
register_syscore_ops
|
||||||
regulator_bulk_disable
|
regulator_bulk_disable
|
||||||
regulator_bulk_enable
|
regulator_bulk_enable
|
||||||
@@ -660,6 +664,7 @@
|
|||||||
unregister_pernet_device
|
unregister_pernet_device
|
||||||
unregister_pernet_subsys
|
unregister_pernet_subsys
|
||||||
unregister_pm_notifier
|
unregister_pm_notifier
|
||||||
|
unregister_reboot_notifier
|
||||||
up_read
|
up_read
|
||||||
up_write
|
up_write
|
||||||
usb_alloc_urb
|
usb_alloc_urb
|
||||||
@@ -816,7 +821,6 @@
|
|||||||
dma_pool_create
|
dma_pool_create
|
||||||
dma_pool_destroy
|
dma_pool_destroy
|
||||||
dma_pool_free
|
dma_pool_free
|
||||||
of_count_phandle_with_args
|
|
||||||
usb_add_gadget_udc
|
usb_add_gadget_udc
|
||||||
usb_del_gadget_udc
|
usb_del_gadget_udc
|
||||||
usb_ep_set_maxpacket_limit
|
usb_ep_set_maxpacket_limit
|
||||||
@@ -1353,6 +1357,7 @@
|
|||||||
scsi_remove_device
|
scsi_remove_device
|
||||||
scsi_remove_host
|
scsi_remove_host
|
||||||
scsi_rescan_device
|
scsi_rescan_device
|
||||||
|
scsi_resume_device
|
||||||
scsi_schedule_eh
|
scsi_schedule_eh
|
||||||
scsi_sense_desc_find
|
scsi_sense_desc_find
|
||||||
scsi_set_sense_field_pointer
|
scsi_set_sense_field_pointer
|
||||||
@@ -1449,8 +1454,6 @@
|
|||||||
gpiochip_disable_irq
|
gpiochip_disable_irq
|
||||||
gpiochip_enable_irq
|
gpiochip_enable_irq
|
||||||
gpiochip_generic_config
|
gpiochip_generic_config
|
||||||
gpiochip_generic_free
|
|
||||||
gpiochip_generic_request
|
|
||||||
gpiochip_irq_relres
|
gpiochip_irq_relres
|
||||||
gpiochip_irq_reqres
|
gpiochip_irq_reqres
|
||||||
of_pinctrl_get
|
of_pinctrl_get
|
||||||
@@ -1527,6 +1530,9 @@
|
|||||||
usb_set_configuration
|
usb_set_configuration
|
||||||
work_busy
|
work_busy
|
||||||
|
|
||||||
|
# required by reboot_data_save.ko
|
||||||
|
ktime_get_real_ts64
|
||||||
|
|
||||||
# required by rfcomm.ko
|
# required by rfcomm.ko
|
||||||
kthread_should_stop
|
kthread_should_stop
|
||||||
kthread_stop
|
kthread_stop
|
||||||
@@ -1543,11 +1549,9 @@
|
|||||||
# required by rtc-brcmstb-waketimer.ko
|
# required by rtc-brcmstb-waketimer.ko
|
||||||
devm_rtc_allocate_device
|
devm_rtc_allocate_device
|
||||||
__devm_rtc_register_device
|
__devm_rtc_register_device
|
||||||
register_reboot_notifier
|
|
||||||
rtc_time64_to_tm
|
rtc_time64_to_tm
|
||||||
rtc_tm_to_time64
|
rtc_tm_to_time64
|
||||||
rtc_update_irq
|
rtc_update_irq
|
||||||
unregister_reboot_notifier
|
|
||||||
|
|
||||||
# required by rtl8150.ko
|
# required by rtl8150.ko
|
||||||
usb_control_msg_send
|
usb_control_msg_send
|
||||||
|
|||||||
@@ -440,7 +440,9 @@
|
|||||||
netdev_err
|
netdev_err
|
||||||
netdev_info
|
netdev_info
|
||||||
netdev_is_rx_handler_busy
|
netdev_is_rx_handler_busy
|
||||||
|
netdev_master_upper_dev_get
|
||||||
netdev_warn
|
netdev_warn
|
||||||
|
nla_append
|
||||||
noop_llseek
|
noop_llseek
|
||||||
nr_cpu_ids
|
nr_cpu_ids
|
||||||
nsecs_to_jiffies
|
nsecs_to_jiffies
|
||||||
|
|||||||
@@ -2261,6 +2261,9 @@
|
|||||||
round_jiffies
|
round_jiffies
|
||||||
round_jiffies_relative
|
round_jiffies_relative
|
||||||
round_jiffies_up
|
round_jiffies_up
|
||||||
|
rpmsg_chrdev_eptdev_create
|
||||||
|
rpmsg_chrdev_eptdev_destroy
|
||||||
|
rpmsg_class
|
||||||
rpmsg_create_ept
|
rpmsg_create_ept
|
||||||
rpmsg_destroy_ept
|
rpmsg_destroy_ept
|
||||||
rpmsg_find_device
|
rpmsg_find_device
|
||||||
@@ -2492,6 +2495,7 @@
|
|||||||
snd_soc_bytes_info_ext
|
snd_soc_bytes_info_ext
|
||||||
snd_soc_bytes_tlv_callback
|
snd_soc_bytes_tlv_callback
|
||||||
snd_soc_card_jack_new
|
snd_soc_card_jack_new
|
||||||
|
snd_soc_cnew
|
||||||
snd_soc_component_exit_regmap
|
snd_soc_component_exit_regmap
|
||||||
snd_soc_component_init_regmap
|
snd_soc_component_init_regmap
|
||||||
snd_soc_component_read
|
snd_soc_component_read
|
||||||
|
|||||||
@@ -76,6 +76,7 @@
|
|||||||
__bitmap_andnot
|
__bitmap_andnot
|
||||||
__bitmap_clear
|
__bitmap_clear
|
||||||
__bitmap_equal
|
__bitmap_equal
|
||||||
|
bitmap_find_free_region
|
||||||
bitmap_find_next_zero_area_off
|
bitmap_find_next_zero_area_off
|
||||||
bitmap_free
|
bitmap_free
|
||||||
bitmap_from_arr32
|
bitmap_from_arr32
|
||||||
@@ -84,6 +85,7 @@
|
|||||||
bitmap_parselist
|
bitmap_parselist
|
||||||
bitmap_parse_user
|
bitmap_parse_user
|
||||||
bitmap_print_to_pagebuf
|
bitmap_print_to_pagebuf
|
||||||
|
bitmap_release_region
|
||||||
__bitmap_set
|
__bitmap_set
|
||||||
__bitmap_subset
|
__bitmap_subset
|
||||||
bitmap_to_arr32
|
bitmap_to_arr32
|
||||||
@@ -367,6 +369,7 @@
|
|||||||
dev_fetch_sw_netstats
|
dev_fetch_sw_netstats
|
||||||
devfreq_add_device
|
devfreq_add_device
|
||||||
devfreq_add_governor
|
devfreq_add_governor
|
||||||
|
devfreq_get_devfreq_by_phandle
|
||||||
devfreq_monitor_resume
|
devfreq_monitor_resume
|
||||||
devfreq_monitor_start
|
devfreq_monitor_start
|
||||||
devfreq_monitor_stop
|
devfreq_monitor_stop
|
||||||
@@ -1520,6 +1523,7 @@
|
|||||||
of_get_parent
|
of_get_parent
|
||||||
of_get_property
|
of_get_property
|
||||||
of_get_regulator_init_data
|
of_get_regulator_init_data
|
||||||
|
of_graph_get_endpoint_by_regs
|
||||||
of_graph_get_next_endpoint
|
of_graph_get_next_endpoint
|
||||||
of_graph_get_port_parent
|
of_graph_get_port_parent
|
||||||
of_graph_get_remote_endpoint
|
of_graph_get_remote_endpoint
|
||||||
@@ -2347,6 +2351,7 @@
|
|||||||
__traceiter_android_rvh_irqs_enable
|
__traceiter_android_rvh_irqs_enable
|
||||||
__traceiter_android_rvh_madvise_pageout_begin
|
__traceiter_android_rvh_madvise_pageout_begin
|
||||||
__traceiter_android_rvh_madvise_pageout_end
|
__traceiter_android_rvh_madvise_pageout_end
|
||||||
|
__traceiter_android_rvh_mapping_shrinkable
|
||||||
__traceiter_android_rvh_meminfo_proc_show
|
__traceiter_android_rvh_meminfo_proc_show
|
||||||
__traceiter_android_rvh_post_init_entity_util_avg
|
__traceiter_android_rvh_post_init_entity_util_avg
|
||||||
__traceiter_android_rvh_preempt_disable
|
__traceiter_android_rvh_preempt_disable
|
||||||
@@ -2376,6 +2381,7 @@
|
|||||||
__traceiter_android_rvh_update_misfit_status
|
__traceiter_android_rvh_update_misfit_status
|
||||||
__traceiter_android_rvh_update_rt_rq_load_avg
|
__traceiter_android_rvh_update_rt_rq_load_avg
|
||||||
__traceiter_android_rvh_usb_dev_suspend
|
__traceiter_android_rvh_usb_dev_suspend
|
||||||
|
__traceiter_android_rvh_util_est_update
|
||||||
__traceiter_android_rvh_util_fits_cpu
|
__traceiter_android_rvh_util_fits_cpu
|
||||||
__traceiter_android_vh_arch_set_freq_scale
|
__traceiter_android_vh_arch_set_freq_scale
|
||||||
__traceiter_android_vh_audio_usb_offload_connect
|
__traceiter_android_vh_audio_usb_offload_connect
|
||||||
@@ -2475,6 +2481,7 @@
|
|||||||
__tracepoint_android_rvh_irqs_enable
|
__tracepoint_android_rvh_irqs_enable
|
||||||
__tracepoint_android_rvh_madvise_pageout_begin
|
__tracepoint_android_rvh_madvise_pageout_begin
|
||||||
__tracepoint_android_rvh_madvise_pageout_end
|
__tracepoint_android_rvh_madvise_pageout_end
|
||||||
|
__tracepoint_android_rvh_mapping_shrinkable
|
||||||
__tracepoint_android_rvh_meminfo_proc_show
|
__tracepoint_android_rvh_meminfo_proc_show
|
||||||
__tracepoint_android_rvh_post_init_entity_util_avg
|
__tracepoint_android_rvh_post_init_entity_util_avg
|
||||||
__tracepoint_android_rvh_preempt_disable
|
__tracepoint_android_rvh_preempt_disable
|
||||||
@@ -2504,6 +2511,7 @@
|
|||||||
__tracepoint_android_rvh_update_misfit_status
|
__tracepoint_android_rvh_update_misfit_status
|
||||||
__tracepoint_android_rvh_update_rt_rq_load_avg
|
__tracepoint_android_rvh_update_rt_rq_load_avg
|
||||||
__tracepoint_android_rvh_usb_dev_suspend
|
__tracepoint_android_rvh_usb_dev_suspend
|
||||||
|
__tracepoint_android_rvh_util_est_update
|
||||||
__tracepoint_android_rvh_util_fits_cpu
|
__tracepoint_android_rvh_util_fits_cpu
|
||||||
__tracepoint_android_vh_arch_set_freq_scale
|
__tracepoint_android_vh_arch_set_freq_scale
|
||||||
__tracepoint_android_vh_audio_usb_offload_connect
|
__tracepoint_android_vh_audio_usb_offload_connect
|
||||||
@@ -2793,6 +2801,7 @@
|
|||||||
vmf_insert_pfn_prot
|
vmf_insert_pfn_prot
|
||||||
vm_iomap_memory
|
vm_iomap_memory
|
||||||
vm_node_stat
|
vm_node_stat
|
||||||
|
vm_unmapped_area
|
||||||
vm_zone_stat
|
vm_zone_stat
|
||||||
vprintk
|
vprintk
|
||||||
vprintk_emit
|
vprintk_emit
|
||||||
|
|||||||
@@ -3445,6 +3445,7 @@
|
|||||||
__traceiter_android_vh_ftrace_size_check
|
__traceiter_android_vh_ftrace_size_check
|
||||||
__traceiter_android_vh_gic_v3_suspend
|
__traceiter_android_vh_gic_v3_suspend
|
||||||
__traceiter_android_vh_hibernate_save_cmp_len
|
__traceiter_android_vh_hibernate_save_cmp_len
|
||||||
|
__traceiter_android_vh_hibernate_state
|
||||||
__traceiter_android_vh_hibernated_do_mem_alloc
|
__traceiter_android_vh_hibernated_do_mem_alloc
|
||||||
__traceiter_android_vh_ignore_dmabuf_vmap_bounds
|
__traceiter_android_vh_ignore_dmabuf_vmap_bounds
|
||||||
__traceiter_android_vh_init_aes_encrypt
|
__traceiter_android_vh_init_aes_encrypt
|
||||||
@@ -3597,6 +3598,7 @@
|
|||||||
__tracepoint_android_vh_ftrace_size_check
|
__tracepoint_android_vh_ftrace_size_check
|
||||||
__tracepoint_android_vh_gic_v3_suspend
|
__tracepoint_android_vh_gic_v3_suspend
|
||||||
__tracepoint_android_vh_hibernate_save_cmp_len
|
__tracepoint_android_vh_hibernate_save_cmp_len
|
||||||
|
__tracepoint_android_vh_hibernate_state
|
||||||
__tracepoint_android_vh_hibernated_do_mem_alloc
|
__tracepoint_android_vh_hibernated_do_mem_alloc
|
||||||
__tracepoint_android_vh_ignore_dmabuf_vmap_bounds
|
__tracepoint_android_vh_ignore_dmabuf_vmap_bounds
|
||||||
__tracepoint_android_vh_init_aes_encrypt
|
__tracepoint_android_vh_init_aes_encrypt
|
||||||
|
|||||||
@@ -3023,3 +3023,9 @@
|
|||||||
# required by wlan_mt7663_usb.ko
|
# required by wlan_mt7663_usb.ko
|
||||||
usb_anchor_empty
|
usb_anchor_empty
|
||||||
usb_reset_endpoint
|
usb_reset_endpoint
|
||||||
|
|
||||||
|
# required by dw_hdmi_qp.ko
|
||||||
|
drm_edid_alloc
|
||||||
|
drm_edid_read_ddc
|
||||||
|
drm_edid_raw
|
||||||
|
drm_edid_connector_update
|
||||||
|
|||||||
1567
android/abi_gki_aarch64_telechips
Normal file
1567
android/abi_gki_aarch64_telechips
Normal file
File diff suppressed because it is too large
Load Diff
@@ -458,3 +458,16 @@
|
|||||||
__d_lookup_unhash_wake
|
__d_lookup_unhash_wake
|
||||||
__fs_parse
|
__fs_parse
|
||||||
__filemap_get_folio
|
__filemap_get_folio
|
||||||
|
|
||||||
|
#required by mi_async_reclaim.ko
|
||||||
|
__traceiter_android_vh_handle_trylock_failed_folio
|
||||||
|
__tracepoint_android_vh_handle_trylock_failed_folio
|
||||||
|
__traceiter_android_vh_folio_trylock_set
|
||||||
|
__tracepoint_android_vh_folio_trylock_set
|
||||||
|
__traceiter_android_vh_folio_trylock_clear
|
||||||
|
__tracepoint_android_vh_folio_trylock_clear
|
||||||
|
__traceiter_android_vh_get_folio_trylock_result
|
||||||
|
__tracepoint_android_vh_get_folio_trylock_result
|
||||||
|
__traceiter_android_vh_do_folio_trylock
|
||||||
|
__tracepoint_android_vh_do_folio_trylock
|
||||||
|
reclaim_pages
|
||||||
|
|||||||
@@ -120,8 +120,10 @@ int arch_hibernation_header_save(void *addr, unsigned int max_size)
|
|||||||
hdr->ttbr1_el1 = __pa_symbol(swapper_pg_dir);
|
hdr->ttbr1_el1 = __pa_symbol(swapper_pg_dir);
|
||||||
hdr->reenter_kernel = _cpu_resume;
|
hdr->reenter_kernel = _cpu_resume;
|
||||||
|
|
||||||
|
#ifdef CONFIG_ANDROID_VENDOR_OEM_DATA
|
||||||
trace_android_vh_save_cpu_resume(&hdr->android_vendor_data1,
|
trace_android_vh_save_cpu_resume(&hdr->android_vendor_data1,
|
||||||
__pa(cpu_resume));
|
__pa(cpu_resume));
|
||||||
|
#endif
|
||||||
|
|
||||||
/* We can't use __hyp_get_vectors() because kvm may still be loaded */
|
/* We can't use __hyp_get_vectors() because kvm may still be loaded */
|
||||||
if (el2_reset_needed())
|
if (el2_reset_needed())
|
||||||
|
|||||||
@@ -336,6 +336,7 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_process_madvise_end);
|
|||||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_madvise_pageout_begin);
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_madvise_pageout_begin);
|
||||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_madvise_pageout_end);
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_madvise_pageout_end);
|
||||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_reclaim_folio_list);
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_reclaim_folio_list);
|
||||||
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_mapping_shrinkable);
|
||||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_smaps_pte_entry);
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_smaps_pte_entry);
|
||||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_show_smap);
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_show_smap);
|
||||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_ctl_dirty_rate);
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_ctl_dirty_rate);
|
||||||
@@ -435,3 +436,9 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_clear_rwsem_reader_owned);
|
|||||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_record_rwsem_writer_owned);
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_record_rwsem_writer_owned);
|
||||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_clear_rwsem_writer_owned);
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_clear_rwsem_writer_owned);
|
||||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_pr_set_vma_name_bypass);
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_pr_set_vma_name_bypass);
|
||||||
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_do_folio_trylock);
|
||||||
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_get_folio_trylock_result);
|
||||||
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_folio_trylock_clear);
|
||||||
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_folio_trylock_set);
|
||||||
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_handle_trylock_failed_folio);
|
||||||
|
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_hibernate_state);
|
||||||
|
|||||||
@@ -895,7 +895,7 @@ static int of_gpiochip_add_pin_range(struct gpio_chip *chip)
|
|||||||
struct device_node *np = chip->of_node;
|
struct device_node *np = chip->of_node;
|
||||||
struct of_phandle_args pinspec;
|
struct of_phandle_args pinspec;
|
||||||
struct pinctrl_dev *pctldev;
|
struct pinctrl_dev *pctldev;
|
||||||
int index = 0, ret;
|
int index = 0, ret, trim;
|
||||||
const char *name;
|
const char *name;
|
||||||
static const char group_names_propname[] = "gpio-ranges-group-names";
|
static const char group_names_propname[] = "gpio-ranges-group-names";
|
||||||
struct property *group_names;
|
struct property *group_names;
|
||||||
@@ -921,7 +921,14 @@ static int of_gpiochip_add_pin_range(struct gpio_chip *chip)
|
|||||||
if (!pctldev)
|
if (!pctldev)
|
||||||
return -EPROBE_DEFER;
|
return -EPROBE_DEFER;
|
||||||
|
|
||||||
|
/* Ignore ranges outside of this GPIO chip */
|
||||||
|
if (pinspec.args[0] >= (chip->offset + chip->ngpio))
|
||||||
|
continue;
|
||||||
|
if (pinspec.args[0] + pinspec.args[2] <= chip->offset)
|
||||||
|
continue;
|
||||||
|
|
||||||
if (pinspec.args[2]) {
|
if (pinspec.args[2]) {
|
||||||
|
/* npins != 0: linear range */
|
||||||
if (group_names) {
|
if (group_names) {
|
||||||
of_property_read_string_index(np,
|
of_property_read_string_index(np,
|
||||||
group_names_propname,
|
group_names_propname,
|
||||||
@@ -932,7 +939,19 @@ static int of_gpiochip_add_pin_range(struct gpio_chip *chip)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* npins != 0: linear range */
|
|
||||||
|
/* Trim the range to fit this GPIO chip */
|
||||||
|
if (chip->offset > pinspec.args[0]) {
|
||||||
|
trim = chip->offset - pinspec.args[0];
|
||||||
|
pinspec.args[2] -= trim;
|
||||||
|
pinspec.args[1] += trim;
|
||||||
|
pinspec.args[0] = 0;
|
||||||
|
} else {
|
||||||
|
pinspec.args[0] -= chip->offset;
|
||||||
|
}
|
||||||
|
if ((pinspec.args[0] + pinspec.args[2]) > chip->ngpio)
|
||||||
|
pinspec.args[2] = chip->ngpio - pinspec.args[0];
|
||||||
|
|
||||||
ret = gpiochip_add_pin_range(chip,
|
ret = gpiochip_add_pin_range(chip,
|
||||||
pinctrl_dev_get_devname(pctldev),
|
pinctrl_dev_get_devname(pctldev),
|
||||||
pinspec.args[0],
|
pinspec.args[0],
|
||||||
|
|||||||
@@ -198,7 +198,7 @@ iommu_resv_region_get_type(struct device *dev,
|
|||||||
if (start == phys->start && end == phys->end)
|
if (start == phys->start && end == phys->end)
|
||||||
return IOMMU_RESV_DIRECT;
|
return IOMMU_RESV_DIRECT;
|
||||||
|
|
||||||
dev_warn(dev, "treating non-direct mapping [%pr] -> [%pap-%pap] as reservation\n", &phys,
|
dev_warn(dev, "treating non-direct mapping [%pr] -> [%pap-%pap] as reservation\n", phys,
|
||||||
&start, &end);
|
&start, &end);
|
||||||
return IOMMU_RESV_RESERVED;
|
return IOMMU_RESV_RESERVED;
|
||||||
}
|
}
|
||||||
@@ -261,7 +261,14 @@ void of_iommu_get_resv_regions(struct device *dev, struct list_head *list)
|
|||||||
phys_addr_t iova;
|
phys_addr_t iova;
|
||||||
size_t length;
|
size_t length;
|
||||||
|
|
||||||
|
if (of_dma_is_coherent(dev->of_node))
|
||||||
|
prot |= IOMMU_CACHE;
|
||||||
|
|
||||||
maps = of_translate_dma_region(np, maps, &iova, &length);
|
maps = of_translate_dma_region(np, maps, &iova, &length);
|
||||||
|
if (length == 0) {
|
||||||
|
dev_warn(dev, "Cannot reserve IOVA region of 0 size\n");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
type = iommu_resv_region_get_type(dev, &phys, iova, length);
|
type = iommu_resv_region_get_type(dev, &phys, iova, length);
|
||||||
|
|
||||||
region = iommu_alloc_resv_region(iova, length, prot, type,
|
region = iommu_alloc_resv_region(iova, length, prot, type,
|
||||||
|
|||||||
@@ -1676,12 +1676,21 @@ static int ax88179_reset(struct usbnet *dev)
|
|||||||
|
|
||||||
static int ax88179_net_reset(struct usbnet *dev)
|
static int ax88179_net_reset(struct usbnet *dev)
|
||||||
{
|
{
|
||||||
struct ax88179_data *ax179_data = dev->driver_priv;
|
u16 tmp16;
|
||||||
|
|
||||||
if (ax179_data->initialized)
|
ax88179_read_cmd(dev, AX_ACCESS_PHY, AX88179_PHY_ID, GMII_PHY_PHYSR,
|
||||||
|
2, &tmp16);
|
||||||
|
if (tmp16) {
|
||||||
|
ax88179_read_cmd(dev, AX_ACCESS_MAC, AX_MEDIUM_STATUS_MODE,
|
||||||
|
2, 2, &tmp16);
|
||||||
|
if (!(tmp16 & AX_MEDIUM_RECEIVE_EN)) {
|
||||||
|
tmp16 |= AX_MEDIUM_RECEIVE_EN;
|
||||||
|
ax88179_write_cmd(dev, AX_ACCESS_MAC, AX_MEDIUM_STATUS_MODE,
|
||||||
|
2, 2, &tmp16);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
ax88179_reset(dev);
|
ax88179_reset(dev);
|
||||||
else
|
}
|
||||||
ax179_data->initialized = 1;
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -290,7 +290,7 @@ void __init fdt_init_reserved_mem(void)
|
|||||||
bool reusable =
|
bool reusable =
|
||||||
(of_get_flat_dt_prop(node, "reusable", NULL)) != NULL;
|
(of_get_flat_dt_prop(node, "reusable", NULL)) != NULL;
|
||||||
|
|
||||||
pr_info("%pa..%pa ( %lu KB ) %s %s %s\n",
|
pr_info("%pa..%pa (%lu KiB) %s %s %s\n",
|
||||||
&rmem->base, &end, (unsigned long)(rmem->size / SZ_1K),
|
&rmem->base, &end, (unsigned long)(rmem->size / SZ_1K),
|
||||||
nomap ? "nomap" : "map",
|
nomap ? "nomap" : "map",
|
||||||
reusable ? "reusable" : "non-reusable",
|
reusable ? "reusable" : "non-reusable",
|
||||||
|
|||||||
@@ -1816,7 +1816,10 @@ check_type:
|
|||||||
* assume caller has checked sense and determined
|
* assume caller has checked sense and determined
|
||||||
* the check condition was retryable.
|
* the check condition was retryable.
|
||||||
*/
|
*/
|
||||||
if (req->cmd_flags & REQ_FAILFAST_DEV || blk_rq_is_passthrough(req))
|
if (req->cmd_flags & REQ_FAILFAST_DEV)
|
||||||
|
return true;
|
||||||
|
if (blk_rq_is_passthrough(req) &&
|
||||||
|
!(scmd->flags & SCMD_RETRY_PASSTHROUGH))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@@ -3626,6 +3626,7 @@ static int sd_start_stop_device(struct scsi_disk *sdkp, int start)
|
|||||||
const struct scsi_exec_args exec_args = {
|
const struct scsi_exec_args exec_args = {
|
||||||
.sshdr = &sshdr,
|
.sshdr = &sshdr,
|
||||||
.req_flags = BLK_MQ_REQ_PM,
|
.req_flags = BLK_MQ_REQ_PM,
|
||||||
|
.scmd_flags = SCMD_RETRY_PASSTHROUGH,
|
||||||
};
|
};
|
||||||
struct scsi_device *sdp = sdkp->device;
|
struct scsi_device *sdp = sdkp->device;
|
||||||
int res;
|
int res;
|
||||||
|
|||||||
@@ -3035,16 +3035,7 @@ static int ufshcd_compose_dev_cmd(struct ufs_hba *hba,
|
|||||||
*/
|
*/
|
||||||
bool ufshcd_cmd_inflight(struct scsi_cmnd *cmd)
|
bool ufshcd_cmd_inflight(struct scsi_cmnd *cmd)
|
||||||
{
|
{
|
||||||
struct request *rq;
|
return cmd && blk_mq_rq_state(scsi_cmd_to_rq(cmd)) == MQ_RQ_IN_FLIGHT;
|
||||||
|
|
||||||
if (!cmd)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
rq = scsi_cmd_to_rq(cmd);
|
|
||||||
if (!blk_mq_request_started(rq))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -6581,7 +6572,8 @@ again:
|
|||||||
if (ufshcd_err_handling_should_stop(hba))
|
if (ufshcd_err_handling_should_stop(hba))
|
||||||
goto skip_err_handling;
|
goto skip_err_handling;
|
||||||
|
|
||||||
if (hba->dev_quirks & UFS_DEVICE_QUIRK_RECOVERY_FROM_DL_NAC_ERRORS) {
|
if ((hba->dev_quirks & UFS_DEVICE_QUIRK_RECOVERY_FROM_DL_NAC_ERRORS) &&
|
||||||
|
!hba->force_reset) {
|
||||||
bool ret;
|
bool ret;
|
||||||
|
|
||||||
spin_unlock_irqrestore(hba->host->host_lock, flags);
|
spin_unlock_irqrestore(hba->host->host_lock, flags);
|
||||||
@@ -10268,7 +10260,7 @@ int ufshcd_system_restore(struct device *dev)
|
|||||||
* are updated with the latest queue addresses. Only after
|
* are updated with the latest queue addresses. Only after
|
||||||
* updating these addresses, we can queue the new commands.
|
* updating these addresses, we can queue the new commands.
|
||||||
*/
|
*/
|
||||||
mb();
|
ufshcd_readl(hba, REG_UTP_TASK_REQ_LIST_BASE_H);
|
||||||
|
|
||||||
/* Resuming from hibernate, assume that link was OFF */
|
/* Resuming from hibernate, assume that link was OFF */
|
||||||
ufshcd_set_link_off(hba);
|
ufshcd_set_link_off(hba);
|
||||||
|
|||||||
@@ -137,9 +137,12 @@ static int usb_string_copy(const char *s, char **s_copy)
|
|||||||
int ret;
|
int ret;
|
||||||
char *str;
|
char *str;
|
||||||
char *copy = *s_copy;
|
char *copy = *s_copy;
|
||||||
|
|
||||||
ret = strlen(s);
|
ret = strlen(s);
|
||||||
if (ret > USB_MAX_STRING_LEN)
|
if (ret > USB_MAX_STRING_LEN)
|
||||||
return -EOVERFLOW;
|
return -EOVERFLOW;
|
||||||
|
if (ret < 1)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
if (copy) {
|
if (copy) {
|
||||||
str = copy;
|
str = copy;
|
||||||
|
|||||||
@@ -2425,7 +2425,7 @@ static int tcpm_register_source_caps(struct tcpm_port *port)
|
|||||||
{
|
{
|
||||||
struct usb_power_delivery_desc desc = { port->negotiated_rev };
|
struct usb_power_delivery_desc desc = { port->negotiated_rev };
|
||||||
struct usb_power_delivery_capabilities_desc caps = { };
|
struct usb_power_delivery_capabilities_desc caps = { };
|
||||||
struct usb_power_delivery_capabilities *cap;
|
struct usb_power_delivery_capabilities *cap = port->partner_source_caps;
|
||||||
|
|
||||||
if (!port->partner_pd)
|
if (!port->partner_pd)
|
||||||
port->partner_pd = usb_power_delivery_register(NULL, &desc);
|
port->partner_pd = usb_power_delivery_register(NULL, &desc);
|
||||||
@@ -2435,6 +2435,11 @@ static int tcpm_register_source_caps(struct tcpm_port *port)
|
|||||||
memcpy(caps.pdo, port->source_caps, sizeof(u32) * port->nr_source_caps);
|
memcpy(caps.pdo, port->source_caps, sizeof(u32) * port->nr_source_caps);
|
||||||
caps.role = TYPEC_SOURCE;
|
caps.role = TYPEC_SOURCE;
|
||||||
|
|
||||||
|
if (cap) {
|
||||||
|
usb_power_delivery_unregister_capabilities(cap);
|
||||||
|
port->partner_source_caps = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
cap = usb_power_delivery_register_capabilities(port->partner_pd, &caps);
|
cap = usb_power_delivery_register_capabilities(port->partner_pd, &caps);
|
||||||
if (IS_ERR(cap))
|
if (IS_ERR(cap))
|
||||||
return PTR_ERR(cap);
|
return PTR_ERR(cap);
|
||||||
@@ -3948,6 +3953,8 @@ static void run_state_machine(struct tcpm_port *port)
|
|||||||
port->potential_contaminant = ((port->enter_state == SRC_ATTACH_WAIT &&
|
port->potential_contaminant = ((port->enter_state == SRC_ATTACH_WAIT &&
|
||||||
port->state == SRC_UNATTACHED) ||
|
port->state == SRC_UNATTACHED) ||
|
||||||
(port->enter_state == SNK_ATTACH_WAIT &&
|
(port->enter_state == SNK_ATTACH_WAIT &&
|
||||||
|
port->state == SNK_UNATTACHED) ||
|
||||||
|
(port->enter_state == SNK_DEBOUNCED &&
|
||||||
port->state == SNK_UNATTACHED));
|
port->state == SNK_UNATTACHED));
|
||||||
|
|
||||||
port->enter_state = port->state;
|
port->enter_state = port->state;
|
||||||
|
|||||||
@@ -38,11 +38,13 @@ void *z_erofs_get_gbuf(unsigned int requiredpages)
|
|||||||
{
|
{
|
||||||
struct z_erofs_gbuf *gbuf;
|
struct z_erofs_gbuf *gbuf;
|
||||||
|
|
||||||
|
migrate_disable();
|
||||||
gbuf = &z_erofs_gbufpool[z_erofs_gbuf_id()];
|
gbuf = &z_erofs_gbufpool[z_erofs_gbuf_id()];
|
||||||
spin_lock(&gbuf->lock);
|
spin_lock(&gbuf->lock);
|
||||||
/* check if the buffer is too small */
|
/* check if the buffer is too small */
|
||||||
if (requiredpages > gbuf->nrpages) {
|
if (requiredpages > gbuf->nrpages) {
|
||||||
spin_unlock(&gbuf->lock);
|
spin_unlock(&gbuf->lock);
|
||||||
|
migrate_enable();
|
||||||
/* (for sparse checker) pretend gbuf->lock is still taken */
|
/* (for sparse checker) pretend gbuf->lock is still taken */
|
||||||
__acquire(gbuf->lock);
|
__acquire(gbuf->lock);
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -57,6 +59,7 @@ void z_erofs_put_gbuf(void *ptr) __releases(gbuf->lock)
|
|||||||
gbuf = &z_erofs_gbufpool[z_erofs_gbuf_id()];
|
gbuf = &z_erofs_gbufpool[z_erofs_gbuf_id()];
|
||||||
DBG_BUGON(gbuf->ptr != ptr);
|
DBG_BUGON(gbuf->ptr != ptr);
|
||||||
spin_unlock(&gbuf->lock);
|
spin_unlock(&gbuf->lock);
|
||||||
|
migrate_enable();
|
||||||
}
|
}
|
||||||
|
|
||||||
int z_erofs_gbuf_growsize(unsigned int nrpages)
|
int z_erofs_gbuf_growsize(unsigned int nrpages)
|
||||||
|
|||||||
@@ -1015,7 +1015,7 @@ void f2fs_submit_page_write(struct f2fs_io_info *fio)
|
|||||||
f2fs_bug_on(sbi, is_read_io(fio->op));
|
f2fs_bug_on(sbi, is_read_io(fio->op));
|
||||||
|
|
||||||
f2fs_down_write(&io->io_rwsem);
|
f2fs_down_write(&io->io_rwsem);
|
||||||
|
next:
|
||||||
#ifdef CONFIG_BLK_DEV_ZONED
|
#ifdef CONFIG_BLK_DEV_ZONED
|
||||||
if (f2fs_sb_has_blkzoned(sbi) && btype < META && io->zone_pending_bio) {
|
if (f2fs_sb_has_blkzoned(sbi) && btype < META && io->zone_pending_bio) {
|
||||||
wait_for_completion_io(&io->zone_wait);
|
wait_for_completion_io(&io->zone_wait);
|
||||||
@@ -1025,7 +1025,6 @@ void f2fs_submit_page_write(struct f2fs_io_info *fio)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
next:
|
|
||||||
if (fio->in_list) {
|
if (fio->in_list) {
|
||||||
spin_lock(&io->io_lock);
|
spin_lock(&io->io_lock);
|
||||||
if (list_empty(&io->io_list)) {
|
if (list_empty(&io->io_list)) {
|
||||||
@@ -1086,10 +1085,6 @@ alloc_new:
|
|||||||
io->last_block_in_bio = fio->new_blkaddr;
|
io->last_block_in_bio = fio->new_blkaddr;
|
||||||
|
|
||||||
trace_f2fs_submit_page_write(fio->page, fio);
|
trace_f2fs_submit_page_write(fio->page, fio);
|
||||||
skip:
|
|
||||||
if (fio->in_list)
|
|
||||||
goto next;
|
|
||||||
out:
|
|
||||||
#ifdef CONFIG_BLK_DEV_ZONED
|
#ifdef CONFIG_BLK_DEV_ZONED
|
||||||
if (f2fs_sb_has_blkzoned(sbi) && btype < META &&
|
if (f2fs_sb_has_blkzoned(sbi) && btype < META &&
|
||||||
is_end_zone_blkaddr(sbi, fio->new_blkaddr)) {
|
is_end_zone_blkaddr(sbi, fio->new_blkaddr)) {
|
||||||
@@ -1102,6 +1097,10 @@ out:
|
|||||||
__submit_merged_bio(io);
|
__submit_merged_bio(io);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
skip:
|
||||||
|
if (fio->in_list)
|
||||||
|
goto next;
|
||||||
|
out:
|
||||||
if (is_sbi_flag_set(sbi, SBI_IS_SHUTDOWN) ||
|
if (is_sbi_flag_set(sbi, SBI_IS_SHUTDOWN) ||
|
||||||
!f2fs_is_checkpoint_ready(sbi))
|
!f2fs_is_checkpoint_ready(sbi))
|
||||||
__submit_merged_bio(io);
|
__submit_merged_bio(io);
|
||||||
|
|||||||
@@ -314,6 +314,11 @@ struct backing_file_context {
|
|||||||
* there is no need to get/put the creds
|
* there is no need to get/put the creds
|
||||||
*/
|
*/
|
||||||
const struct cred *bc_cred;
|
const struct cred *bc_cred;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The file has a bad block, i.e. one that has failed checksumming.
|
||||||
|
*/
|
||||||
|
bool bc_has_bad_block;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct metadata_handler {
|
struct metadata_handler {
|
||||||
|
|||||||
@@ -35,6 +35,7 @@ DECLARE_FEATURE_FLAG(zstd);
|
|||||||
DECLARE_FEATURE_FLAG(v2);
|
DECLARE_FEATURE_FLAG(v2);
|
||||||
DECLARE_FEATURE_FLAG(bugfix_throttling);
|
DECLARE_FEATURE_FLAG(bugfix_throttling);
|
||||||
DECLARE_FEATURE_FLAG(bugfix_inode_eviction);
|
DECLARE_FEATURE_FLAG(bugfix_inode_eviction);
|
||||||
|
DECLARE_FEATURE_FLAG(bugfix_retry_page_fault);
|
||||||
|
|
||||||
static struct attribute *attributes[] = {
|
static struct attribute *attributes[] = {
|
||||||
&corefs_attr.attr,
|
&corefs_attr.attr,
|
||||||
@@ -42,6 +43,7 @@ static struct attribute *attributes[] = {
|
|||||||
&v2_attr.attr,
|
&v2_attr.attr,
|
||||||
&bugfix_throttling_attr.attr,
|
&bugfix_throttling_attr.attr,
|
||||||
&bugfix_inode_eviction_attr.attr,
|
&bugfix_inode_eviction_attr.attr,
|
||||||
|
&bugfix_retry_page_fault_attr.attr,
|
||||||
NULL,
|
NULL,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -121,7 +121,28 @@ static const struct address_space_operations incfs_address_space_ops = {
|
|||||||
|
|
||||||
static vm_fault_t incfs_fault(struct vm_fault *vmf)
|
static vm_fault_t incfs_fault(struct vm_fault *vmf)
|
||||||
{
|
{
|
||||||
vmf->flags &= ~FAULT_FLAG_ALLOW_RETRY;
|
struct file *file = vmf->vma->vm_file;
|
||||||
|
struct data_file *df = get_incfs_data_file(file);
|
||||||
|
struct backing_file_context *bfc = df ? df->df_backing_file_context : NULL;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This is something of a kludge
|
||||||
|
* We want to retry if the read from the underlying file is interrupted,
|
||||||
|
* but not if the read fails because the stored data is corrupt since the
|
||||||
|
* latter causes an infinite loop.
|
||||||
|
*
|
||||||
|
* However, whether we wish to retry must be set before we call
|
||||||
|
* filemap_fault, *and* there is no way of getting the read error code out
|
||||||
|
* of filemap_fault.
|
||||||
|
*
|
||||||
|
* So unless there is a robust solution to both the above problems, we can
|
||||||
|
* solve the actual issues we have encoutered by retrying unless there is
|
||||||
|
* known corruption in the backing file. This does mean that we won't retry
|
||||||
|
* with a corrupt backing file if a (good) read is interrupted, but we
|
||||||
|
* don't really handle corruption well anyway at this time.
|
||||||
|
*/
|
||||||
|
if (bfc && bfc->bc_has_bad_block)
|
||||||
|
vmf->flags &= ~FAULT_FLAG_ALLOW_RETRY;
|
||||||
return filemap_fault(vmf);
|
return filemap_fault(vmf);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -597,6 +618,13 @@ err:
|
|||||||
if (total_read < PAGE_SIZE)
|
if (total_read < PAGE_SIZE)
|
||||||
zero_user(page, total_read, PAGE_SIZE - total_read);
|
zero_user(page, total_read, PAGE_SIZE - total_read);
|
||||||
|
|
||||||
|
if (result == -EBADMSG) {
|
||||||
|
struct backing_file_context *bfc = df ? df->df_backing_file_context : NULL;
|
||||||
|
|
||||||
|
if (bfc)
|
||||||
|
bfc->bc_has_bad_block = 1;
|
||||||
|
}
|
||||||
|
|
||||||
if (result == 0)
|
if (result == 0)
|
||||||
SetPageUptodate(page);
|
SetPageUptodate(page);
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -786,11 +786,13 @@ SYSCALL_DEFINE3(inotify_add_watch, int, fd, const char __user *, pathname,
|
|||||||
if (path.dentry->d_op->d_canonical_path) {
|
if (path.dentry->d_op->d_canonical_path) {
|
||||||
ret = path.dentry->d_op->d_canonical_path(&path,
|
ret = path.dentry->d_op->d_canonical_path(&path,
|
||||||
&alteredpath);
|
&alteredpath);
|
||||||
if (ret)
|
if (ret != -ENOSYS) {
|
||||||
goto path_put_and_out;
|
if (ret) {
|
||||||
|
goto path_put_and_out;
|
||||||
canonical_path = &alteredpath;
|
}
|
||||||
path_put(&path);
|
canonical_path = &alteredpath;
|
||||||
|
path_put(&path);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -107,15 +107,17 @@ static inline int fsnotify_file(struct file *file, __u32 mask)
|
|||||||
|
|
||||||
ret = path->dentry->d_op->d_canonical_path(path,
|
ret = path->dentry->d_op->d_canonical_path(path,
|
||||||
&lower_path);
|
&lower_path);
|
||||||
if (ret)
|
if (ret != -ENOSYS) {
|
||||||
return ret;
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
ret = fsnotify_parent(lower_path.dentry, mask,
|
ret = fsnotify_parent(lower_path.dentry, mask,
|
||||||
&lower_path, FSNOTIFY_EVENT_PATH);
|
&lower_path, FSNOTIFY_EVENT_PATH);
|
||||||
path_put(&lower_path);
|
path_put(&lower_path);
|
||||||
|
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -137,6 +137,8 @@ static inline bool mapping_empty(struct address_space *mapping)
|
|||||||
return xa_empty(&mapping->i_pages);
|
return xa_empty(&mapping->i_pages);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern void _trace_android_rvh_mapping_shrinkable(bool *shrinkable);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* mapping_shrinkable - test if page cache state allows inode reclaim
|
* mapping_shrinkable - test if page cache state allows inode reclaim
|
||||||
* @mapping: the page cache mapping
|
* @mapping: the page cache mapping
|
||||||
@@ -161,7 +163,11 @@ static inline bool mapping_empty(struct address_space *mapping)
|
|||||||
static inline bool mapping_shrinkable(struct address_space *mapping)
|
static inline bool mapping_shrinkable(struct address_space *mapping)
|
||||||
{
|
{
|
||||||
void *head;
|
void *head;
|
||||||
|
bool shrinkable = false;
|
||||||
|
|
||||||
|
_trace_android_rvh_mapping_shrinkable(&shrinkable);
|
||||||
|
if (shrinkable)
|
||||||
|
return true;
|
||||||
/*
|
/*
|
||||||
* On highmem systems, there could be lowmem pressure from the
|
* On highmem systems, there could be lowmem pressure from the
|
||||||
* inodes before there is highmem pressure from the page
|
* inodes before there is highmem pressure from the page
|
||||||
|
|||||||
@@ -54,8 +54,11 @@ struct scsi_pointer {
|
|||||||
#define SCMD_INITIALIZED (1 << 1)
|
#define SCMD_INITIALIZED (1 << 1)
|
||||||
#define SCMD_LAST (1 << 2)
|
#define SCMD_LAST (1 << 2)
|
||||||
#define SCMD_FAIL_IF_RECOVERING (1 << 4)
|
#define SCMD_FAIL_IF_RECOVERING (1 << 4)
|
||||||
|
/* If set, retry a passthrough command in case of a unit attention. */
|
||||||
|
#define SCMD_RETRY_PASSTHROUGH (1 << 5)
|
||||||
/* flags preserved across unprep / reprep */
|
/* flags preserved across unprep / reprep */
|
||||||
#define SCMD_PRESERVED_FLAGS (SCMD_INITIALIZED | SCMD_FAIL_IF_RECOVERING)
|
#define SCMD_PRESERVED_FLAGS \
|
||||||
|
(SCMD_INITIALIZED | SCMD_FAIL_IF_RECOVERING | SCMD_RETRY_PASSTHROUGH)
|
||||||
|
|
||||||
/* for scmd->state */
|
/* for scmd->state */
|
||||||
#define SCMD_STATE_COMPLETE 0
|
#define SCMD_STATE_COMPLETE 0
|
||||||
|
|||||||
@@ -112,6 +112,9 @@ DECLARE_RESTRICTED_HOOK(android_rvh_madvise_pageout_end,
|
|||||||
DECLARE_RESTRICTED_HOOK(android_rvh_reclaim_folio_list,
|
DECLARE_RESTRICTED_HOOK(android_rvh_reclaim_folio_list,
|
||||||
TP_PROTO(struct list_head *folio_list, void *private),
|
TP_PROTO(struct list_head *folio_list, void *private),
|
||||||
TP_ARGS(folio_list, private), 1);
|
TP_ARGS(folio_list, private), 1);
|
||||||
|
DECLARE_RESTRICTED_HOOK(android_rvh_mapping_shrinkable,
|
||||||
|
TP_PROTO(bool *shrinkable),
|
||||||
|
TP_ARGS(shrinkable), 1);
|
||||||
DECLARE_HOOK(android_vh_smaps_pte_entry,
|
DECLARE_HOOK(android_vh_smaps_pte_entry,
|
||||||
TP_PROTO(swp_entry_t entry, unsigned long *writeback,
|
TP_PROTO(swp_entry_t entry, unsigned long *writeback,
|
||||||
unsigned long *same, unsigned long *huge),
|
unsigned long *same, unsigned long *huge),
|
||||||
|
|||||||
@@ -33,6 +33,10 @@ DECLARE_HOOK(android_vh_freq_qos_remove_request,
|
|||||||
TP_PROTO(struct freq_qos_request *req),
|
TP_PROTO(struct freq_qos_request *req),
|
||||||
TP_ARGS(req));
|
TP_ARGS(req));
|
||||||
|
|
||||||
|
DECLARE_HOOK(android_vh_hibernate_state,
|
||||||
|
TP_PROTO(int error),
|
||||||
|
TP_ARGS(error));
|
||||||
|
|
||||||
#endif /* _TRACE_HOOK_POWER_H */
|
#endif /* _TRACE_HOOK_POWER_H */
|
||||||
/* This part must be outside protection */
|
/* This part must be outside protection */
|
||||||
#include <trace/define_trace.h>
|
#include <trace/define_trace.h>
|
||||||
|
|||||||
@@ -53,6 +53,22 @@ DECLARE_HOOK(android_vh_vmscan_kswapd_done,
|
|||||||
TP_PROTO(int node_id, unsigned int highest_zoneidx, unsigned int alloc_order,
|
TP_PROTO(int node_id, unsigned int highest_zoneidx, unsigned int alloc_order,
|
||||||
unsigned int reclaim_order),
|
unsigned int reclaim_order),
|
||||||
TP_ARGS(node_id, highest_zoneidx, alloc_order, reclaim_order));
|
TP_ARGS(node_id, highest_zoneidx, alloc_order, reclaim_order));
|
||||||
|
DECLARE_HOOK(android_vh_handle_trylock_failed_folio,
|
||||||
|
TP_PROTO(struct list_head *folio_list),
|
||||||
|
TP_ARGS(folio_list));
|
||||||
|
DECLARE_HOOK(android_vh_folio_trylock_set,
|
||||||
|
TP_PROTO(struct folio *folio),
|
||||||
|
TP_ARGS(folio));
|
||||||
|
DECLARE_HOOK(android_vh_folio_trylock_clear,
|
||||||
|
TP_PROTO(struct folio *folio),
|
||||||
|
TP_ARGS(folio));
|
||||||
|
DECLARE_HOOK(android_vh_get_folio_trylock_result,
|
||||||
|
TP_PROTO(struct folio *folio, bool *trylock_failed),
|
||||||
|
TP_ARGS(folio, trylock_failed));
|
||||||
|
DECLARE_HOOK(android_vh_do_folio_trylock,
|
||||||
|
TP_PROTO(struct folio *folio, struct rw_semaphore *sem,
|
||||||
|
bool *got_lock, bool *skip),
|
||||||
|
TP_ARGS(folio, sem, got_lock, skip));
|
||||||
#endif /* _TRACE_HOOK_VMSCAN_H */
|
#endif /* _TRACE_HOOK_VMSCAN_H */
|
||||||
/* This part must be outside protection */
|
/* This part must be outside protection */
|
||||||
#include <trace/define_trace.h>
|
#include <trace/define_trace.h>
|
||||||
|
|||||||
@@ -141,13 +141,8 @@ static __cold void __io_uring_show_fdinfo(struct io_ring_ctx *ctx,
|
|||||||
if (has_lock && (ctx->flags & IORING_SETUP_SQPOLL)) {
|
if (has_lock && (ctx->flags & IORING_SETUP_SQPOLL)) {
|
||||||
struct io_sq_data *sq = ctx->sq_data;
|
struct io_sq_data *sq = ctx->sq_data;
|
||||||
|
|
||||||
if (mutex_trylock(&sq->lock)) {
|
sq_pid = sq->task_pid;
|
||||||
if (sq->thread) {
|
sq_cpu = sq->sq_cpu;
|
||||||
sq_pid = task_pid_nr(sq->thread);
|
|
||||||
sq_cpu = task_cpu(sq->thread);
|
|
||||||
}
|
|
||||||
mutex_unlock(&sq->lock);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
seq_printf(m, "SqThread:\t%d\n", sq_pid);
|
seq_printf(m, "SqThread:\t%d\n", sq_pid);
|
||||||
|
|||||||
@@ -214,6 +214,7 @@ static bool io_sqd_handle_event(struct io_sq_data *sqd)
|
|||||||
did_sig = get_signal(&ksig);
|
did_sig = get_signal(&ksig);
|
||||||
cond_resched();
|
cond_resched();
|
||||||
mutex_lock(&sqd->lock);
|
mutex_lock(&sqd->lock);
|
||||||
|
sqd->sq_cpu = raw_smp_processor_id();
|
||||||
}
|
}
|
||||||
return did_sig || test_bit(IO_SQ_THREAD_SHOULD_STOP, &sqd->state);
|
return did_sig || test_bit(IO_SQ_THREAD_SHOULD_STOP, &sqd->state);
|
||||||
}
|
}
|
||||||
@@ -229,10 +230,15 @@ static int io_sq_thread(void *data)
|
|||||||
snprintf(buf, sizeof(buf), "iou-sqp-%d", sqd->task_pid);
|
snprintf(buf, sizeof(buf), "iou-sqp-%d", sqd->task_pid);
|
||||||
set_task_comm(current, buf);
|
set_task_comm(current, buf);
|
||||||
|
|
||||||
if (sqd->sq_cpu != -1)
|
/* reset to our pid after we've set task_comm, for fdinfo */
|
||||||
|
sqd->task_pid = current->pid;
|
||||||
|
|
||||||
|
if (sqd->sq_cpu != -1) {
|
||||||
set_cpus_allowed_ptr(current, cpumask_of(sqd->sq_cpu));
|
set_cpus_allowed_ptr(current, cpumask_of(sqd->sq_cpu));
|
||||||
else
|
} else {
|
||||||
set_cpus_allowed_ptr(current, cpu_online_mask);
|
set_cpus_allowed_ptr(current, cpu_online_mask);
|
||||||
|
sqd->sq_cpu = raw_smp_processor_id();
|
||||||
|
}
|
||||||
current->flags |= PF_NO_SETAFFINITY;
|
current->flags |= PF_NO_SETAFFINITY;
|
||||||
|
|
||||||
mutex_lock(&sqd->lock);
|
mutex_lock(&sqd->lock);
|
||||||
@@ -262,6 +268,7 @@ static int io_sq_thread(void *data)
|
|||||||
mutex_unlock(&sqd->lock);
|
mutex_unlock(&sqd->lock);
|
||||||
cond_resched();
|
cond_resched();
|
||||||
mutex_lock(&sqd->lock);
|
mutex_lock(&sqd->lock);
|
||||||
|
sqd->sq_cpu = raw_smp_processor_id();
|
||||||
}
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -295,6 +302,7 @@ static int io_sq_thread(void *data)
|
|||||||
mutex_unlock(&sqd->lock);
|
mutex_unlock(&sqd->lock);
|
||||||
schedule();
|
schedule();
|
||||||
mutex_lock(&sqd->lock);
|
mutex_lock(&sqd->lock);
|
||||||
|
sqd->sq_cpu = raw_smp_processor_id();
|
||||||
}
|
}
|
||||||
list_for_each_entry(ctx, &sqd->ctx_list, sqd_list)
|
list_for_each_entry(ctx, &sqd->ctx_list, sqd_list)
|
||||||
atomic_andnot(IORING_SQ_NEED_WAKEUP,
|
atomic_andnot(IORING_SQ_NEED_WAKEUP,
|
||||||
|
|||||||
@@ -130,6 +130,22 @@ static bool migrate_one_irq(struct irq_desc *desc)
|
|||||||
* CPU.
|
* CPU.
|
||||||
*/
|
*/
|
||||||
err = irq_do_set_affinity(d, affinity, false);
|
err = irq_do_set_affinity(d, affinity, false);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If there are online CPUs in the affinity mask, but they have no
|
||||||
|
* vectors left to make the migration work, try to break the
|
||||||
|
* affinity by migrating to any online CPU.
|
||||||
|
*/
|
||||||
|
if (err == -ENOSPC && !irqd_affinity_is_managed(d) && affinity != cpu_online_mask) {
|
||||||
|
pr_debug("IRQ%u: set affinity failed for %*pbl, re-try with online CPUs\n",
|
||||||
|
d->irq, cpumask_pr_args(affinity));
|
||||||
|
|
||||||
|
affinity = cpu_online_mask;
|
||||||
|
brokeaff = true;
|
||||||
|
|
||||||
|
err = irq_do_set_affinity(d, affinity, false);
|
||||||
|
}
|
||||||
|
|
||||||
if (err) {
|
if (err) {
|
||||||
pr_warn_ratelimited("IRQ%u: set affinity failed(%d).\n",
|
pr_warn_ratelimited("IRQ%u: set affinity failed(%d).\n",
|
||||||
d->irq, err);
|
d->irq, err);
|
||||||
@@ -195,10 +211,15 @@ static void irq_restore_affinity_of_irq(struct irq_desc *desc, unsigned int cpu)
|
|||||||
!irq_data_get_irq_chip(data) || !cpumask_test_cpu(cpu, affinity))
|
!irq_data_get_irq_chip(data) || !cpumask_test_cpu(cpu, affinity))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (irqd_is_managed_and_shutdown(data)) {
|
/*
|
||||||
irq_startup(desc, IRQ_RESEND, IRQ_START_COND);
|
* Don't restore suspended interrupts here when a system comes back
|
||||||
|
* from S3. They are reenabled via resume_device_irqs().
|
||||||
|
*/
|
||||||
|
if (desc->istate & IRQS_SUSPENDED)
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
|
if (irqd_is_managed_and_shutdown(data))
|
||||||
|
irq_startup(desc, IRQ_RESEND, IRQ_START_COND);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If the interrupt can only be directed to a single target
|
* If the interrupt can only be directed to a single target
|
||||||
|
|||||||
@@ -789,10 +789,14 @@ void __enable_irq(struct irq_desc *desc)
|
|||||||
irq_settings_set_noprobe(desc);
|
irq_settings_set_noprobe(desc);
|
||||||
/*
|
/*
|
||||||
* Call irq_startup() not irq_enable() here because the
|
* Call irq_startup() not irq_enable() here because the
|
||||||
* interrupt might be marked NOAUTOEN. So irq_startup()
|
* interrupt might be marked NOAUTOEN so irq_startup()
|
||||||
* needs to be invoked when it gets enabled the first
|
* needs to be invoked when it gets enabled the first time.
|
||||||
* time. If it was already started up, then irq_startup()
|
* This is also required when __enable_irq() is invoked for
|
||||||
* will invoke irq_enable() under the hood.
|
* a managed and shutdown interrupt from the S3 resume
|
||||||
|
* path.
|
||||||
|
*
|
||||||
|
* If it was already started up, then irq_startup() will
|
||||||
|
* invoke irq_enable() under the hood.
|
||||||
*/
|
*/
|
||||||
irq_startup(desc, IRQ_RESEND, IRQ_START_FORCE);
|
irq_startup(desc, IRQ_RESEND, IRQ_START_FORCE);
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -16,6 +16,8 @@
|
|||||||
#include <linux/suspend.h>
|
#include <linux/suspend.h>
|
||||||
#include <linux/syscalls.h>
|
#include <linux/syscalls.h>
|
||||||
#include <linux/pm_runtime.h>
|
#include <linux/pm_runtime.h>
|
||||||
|
#include <trace/events/power.h>
|
||||||
|
#include <trace/hooks/power.h>
|
||||||
|
|
||||||
#include "power.h"
|
#include "power.h"
|
||||||
|
|
||||||
@@ -639,6 +641,7 @@ static ssize_t state_store(struct kobject *kobj, struct kobj_attribute *attr,
|
|||||||
error = pm_suspend(state);
|
error = pm_suspend(state);
|
||||||
} else if (state == PM_SUSPEND_MAX) {
|
} else if (state == PM_SUSPEND_MAX) {
|
||||||
error = hibernate();
|
error = hibernate();
|
||||||
|
trace_android_vh_hibernate_state(error);
|
||||||
} else {
|
} else {
|
||||||
error = -EINVAL;
|
error = -EINVAL;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -984,7 +984,6 @@ void tracing_on(void)
|
|||||||
{
|
{
|
||||||
tracer_tracing_on(&global_trace);
|
tracer_tracing_on(&global_trace);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(tracing_on);
|
|
||||||
|
|
||||||
|
|
||||||
static __always_inline void
|
static __always_inline void
|
||||||
@@ -1493,7 +1492,6 @@ int tracing_is_on(void)
|
|||||||
{
|
{
|
||||||
return tracer_tracing_is_on(&global_trace);
|
return tracer_tracing_is_on(&global_trace);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(tracing_is_on);
|
|
||||||
|
|
||||||
static int __init set_buf_size(char *str)
|
static int __init set_buf_size(char *str)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
#
|
#
|
||||||
|
|
||||||
use strict;
|
use strict;
|
||||||
|
use Cwd qw(abs_path);
|
||||||
|
|
||||||
my @names = ();
|
my @names = ();
|
||||||
my @oids = ();
|
my @oids = ();
|
||||||
@@ -17,6 +18,8 @@ if ($#ARGV != 1) {
|
|||||||
exit(2);
|
exit(2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
my $abs_srctree = abs_path($ENV{'srctree'});
|
||||||
|
|
||||||
#
|
#
|
||||||
# Open the file to read from
|
# Open the file to read from
|
||||||
#
|
#
|
||||||
@@ -35,7 +38,9 @@ close IN_FILE || die;
|
|||||||
#
|
#
|
||||||
open C_FILE, ">$ARGV[1]" or die;
|
open C_FILE, ">$ARGV[1]" or die;
|
||||||
print C_FILE "/*\n";
|
print C_FILE "/*\n";
|
||||||
print C_FILE " * Automatically generated by ", $0, ". Do not edit\n";
|
my $scriptname = $0;
|
||||||
|
$scriptname =~ s#^\Q$abs_srctree/\E##;
|
||||||
|
print C_FILE " * Automatically generated by ", $scriptname, ". Do not edit\n";
|
||||||
print C_FILE " */\n";
|
print C_FILE " */\n";
|
||||||
|
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -60,6 +60,12 @@
|
|||||||
|
|
||||||
#include <asm/mman.h>
|
#include <asm/mman.h>
|
||||||
|
|
||||||
|
void _trace_android_rvh_mapping_shrinkable(bool *shrinkable)
|
||||||
|
{
|
||||||
|
trace_android_rvh_mapping_shrinkable(shrinkable);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(_trace_android_rvh_mapping_shrinkable);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Shared mappings implemented 30.11.1994. It's not fully working yet,
|
* Shared mappings implemented 30.11.1994. It's not fully working yet,
|
||||||
* though.
|
* though.
|
||||||
|
|||||||
@@ -450,7 +450,8 @@ regular_page:
|
|||||||
|
|
||||||
if (!pte_present(ptent)) {
|
if (!pte_present(ptent)) {
|
||||||
entry = pte_to_swp_entry(ptent);
|
entry = pte_to_swp_entry(ptent);
|
||||||
trace_android_vh_madvise_pageout_swap_entry(entry,
|
if (!is_migration_entry(entry))
|
||||||
|
trace_android_vh_madvise_pageout_swap_entry(entry,
|
||||||
swp_swapcount(entry));
|
swp_swapcount(entry));
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2232,8 +2232,6 @@ struct vm_area_struct *find_extend_vma_locked(struct mm_struct *mm, unsigned lon
|
|||||||
#else
|
#else
|
||||||
int expand_stack_locked(struct vm_area_struct *vma, unsigned long address)
|
int expand_stack_locked(struct vm_area_struct *vma, unsigned long address)
|
||||||
{
|
{
|
||||||
if (unlikely(!(vma->vm_flags & VM_GROWSDOWN)))
|
|
||||||
return -EINVAL;
|
|
||||||
return expand_downwards(vma, address);
|
return expand_downwards(vma, address);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
13
mm/rmap.c
13
mm/rmap.c
@@ -83,6 +83,7 @@
|
|||||||
#include <trace/events/migrate.h>
|
#include <trace/events/migrate.h>
|
||||||
#undef CREATE_TRACE_POINTS
|
#undef CREATE_TRACE_POINTS
|
||||||
#include <trace/hooks/mm.h>
|
#include <trace/hooks/mm.h>
|
||||||
|
#include <trace/hooks/vmscan.h>
|
||||||
|
|
||||||
#include "internal.h"
|
#include "internal.h"
|
||||||
|
|
||||||
@@ -2518,6 +2519,18 @@ static void rmap_walk_file(struct folio *folio,
|
|||||||
pgoff_start = folio_pgoff(folio);
|
pgoff_start = folio_pgoff(folio);
|
||||||
pgoff_end = pgoff_start + folio_nr_pages(folio) - 1;
|
pgoff_end = pgoff_start + folio_nr_pages(folio) - 1;
|
||||||
if (!locked) {
|
if (!locked) {
|
||||||
|
bool got_lock = false;
|
||||||
|
bool skip = false;
|
||||||
|
|
||||||
|
trace_android_vh_do_folio_trylock(folio,
|
||||||
|
&mapping->i_mmap_rwsem, &got_lock, &skip);
|
||||||
|
if (skip) {
|
||||||
|
if (!got_lock)
|
||||||
|
return;
|
||||||
|
else
|
||||||
|
goto lookup;
|
||||||
|
}
|
||||||
|
|
||||||
if (i_mmap_trylock_read(mapping))
|
if (i_mmap_trylock_read(mapping))
|
||||||
goto lookup;
|
goto lookup;
|
||||||
|
|
||||||
|
|||||||
@@ -941,8 +941,8 @@ static int move_present_pte(struct mm_struct *mm,
|
|||||||
|
|
||||||
double_pt_lock(dst_ptl, src_ptl);
|
double_pt_lock(dst_ptl, src_ptl);
|
||||||
|
|
||||||
if (!pte_same(*src_pte, orig_src_pte) ||
|
if (!pte_same(ptep_get(src_pte), orig_src_pte) ||
|
||||||
!pte_same(*dst_pte, orig_dst_pte)) {
|
!pte_same(ptep_get(dst_pte), orig_dst_pte)) {
|
||||||
err = -EAGAIN;
|
err = -EAGAIN;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
@@ -985,8 +985,8 @@ static int move_swap_pte(struct mm_struct *mm,
|
|||||||
|
|
||||||
double_pt_lock(dst_ptl, src_ptl);
|
double_pt_lock(dst_ptl, src_ptl);
|
||||||
|
|
||||||
if (!pte_same(*src_pte, orig_src_pte) ||
|
if (!pte_same(ptep_get(src_pte), orig_src_pte) ||
|
||||||
!pte_same(*dst_pte, orig_dst_pte)) {
|
!pte_same(ptep_get(dst_pte), orig_dst_pte)) {
|
||||||
double_pt_unlock(dst_ptl, src_ptl);
|
double_pt_unlock(dst_ptl, src_ptl);
|
||||||
return -EAGAIN;
|
return -EAGAIN;
|
||||||
}
|
}
|
||||||
@@ -1085,7 +1085,7 @@ retry:
|
|||||||
}
|
}
|
||||||
|
|
||||||
spin_lock(dst_ptl);
|
spin_lock(dst_ptl);
|
||||||
orig_dst_pte = *dst_pte;
|
orig_dst_pte = ptep_get(dst_pte);
|
||||||
spin_unlock(dst_ptl);
|
spin_unlock(dst_ptl);
|
||||||
if (!pte_none(orig_dst_pte)) {
|
if (!pte_none(orig_dst_pte)) {
|
||||||
err = -EEXIST;
|
err = -EEXIST;
|
||||||
@@ -1093,7 +1093,7 @@ retry:
|
|||||||
}
|
}
|
||||||
|
|
||||||
spin_lock(src_ptl);
|
spin_lock(src_ptl);
|
||||||
orig_src_pte = *src_pte;
|
orig_src_pte = ptep_get(src_pte);
|
||||||
spin_unlock(src_ptl);
|
spin_unlock(src_ptl);
|
||||||
if (pte_none(orig_src_pte)) {
|
if (pte_none(orig_src_pte)) {
|
||||||
if (!(mode & UFFDIO_MOVE_MODE_ALLOW_SRC_HOLES))
|
if (!(mode & UFFDIO_MOVE_MODE_ALLOW_SRC_HOLES))
|
||||||
@@ -1131,7 +1131,7 @@ retry:
|
|||||||
* page isn't freed under us
|
* page isn't freed under us
|
||||||
*/
|
*/
|
||||||
spin_lock(src_ptl);
|
spin_lock(src_ptl);
|
||||||
if (!pte_same(orig_src_pte, *src_pte)) {
|
if (!pte_same(orig_src_pte, ptep_get(src_pte))) {
|
||||||
spin_unlock(src_ptl);
|
spin_unlock(src_ptl);
|
||||||
err = -EAGAIN;
|
err = -EAGAIN;
|
||||||
goto out;
|
goto out;
|
||||||
|
|||||||
15
mm/vmscan.c
15
mm/vmscan.c
@@ -1476,14 +1476,19 @@ static enum folio_references folio_check_references(struct folio *folio,
|
|||||||
int referenced_ptes, referenced_folio;
|
int referenced_ptes, referenced_folio;
|
||||||
unsigned long vm_flags;
|
unsigned long vm_flags;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
bool trylock_failed = false;
|
||||||
|
|
||||||
trace_android_vh_check_folio_look_around_ref(folio, &ret);
|
trace_android_vh_check_folio_look_around_ref(folio, &ret);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
trace_android_vh_folio_trylock_set(folio);
|
||||||
referenced_ptes = folio_referenced(folio, 1, sc->target_mem_cgroup,
|
referenced_ptes = folio_referenced(folio, 1, sc->target_mem_cgroup,
|
||||||
&vm_flags);
|
&vm_flags);
|
||||||
referenced_folio = folio_test_clear_referenced(folio);
|
referenced_folio = folio_test_clear_referenced(folio);
|
||||||
|
trace_android_vh_get_folio_trylock_result(folio, &trylock_failed);
|
||||||
|
if (trylock_failed)
|
||||||
|
return FOLIOREF_KEEP;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The supposedly reclaimable folio was found to be in a VM_LOCKED vma.
|
* The supposedly reclaimable folio was found to be in a VM_LOCKED vma.
|
||||||
@@ -1905,6 +1910,8 @@ retry:
|
|||||||
if (folio_test_pmd_mappable(folio))
|
if (folio_test_pmd_mappable(folio))
|
||||||
flags |= TTU_SPLIT_HUGE_PMD;
|
flags |= TTU_SPLIT_HUGE_PMD;
|
||||||
|
|
||||||
|
if (!ignore_references)
|
||||||
|
trace_android_vh_folio_trylock_set(folio);
|
||||||
try_to_unmap(folio, flags);
|
try_to_unmap(folio, flags);
|
||||||
if (folio_mapped(folio)) {
|
if (folio_mapped(folio)) {
|
||||||
stat->nr_unmap_fail += nr_pages;
|
stat->nr_unmap_fail += nr_pages;
|
||||||
@@ -2035,6 +2042,7 @@ retry:
|
|||||||
* increment nr_reclaimed here (and
|
* increment nr_reclaimed here (and
|
||||||
* leave it off the LRU).
|
* leave it off the LRU).
|
||||||
*/
|
*/
|
||||||
|
trace_android_vh_folio_trylock_clear(folio);
|
||||||
nr_reclaimed += nr_pages;
|
nr_reclaimed += nr_pages;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -2071,6 +2079,7 @@ free_it:
|
|||||||
* Is there need to periodically free_folio_list? It would
|
* Is there need to periodically free_folio_list? It would
|
||||||
* appear not as the counts should be low
|
* appear not as the counts should be low
|
||||||
*/
|
*/
|
||||||
|
trace_android_vh_folio_trylock_clear(folio);
|
||||||
if (unlikely(folio_test_large(folio)))
|
if (unlikely(folio_test_large(folio)))
|
||||||
destroy_large_folio(folio);
|
destroy_large_folio(folio);
|
||||||
else
|
else
|
||||||
@@ -2549,6 +2558,7 @@ static unsigned long shrink_inactive_list(unsigned long nr_to_scan,
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
nr_reclaimed = shrink_folio_list(&folio_list, pgdat, sc, &stat, false);
|
nr_reclaimed = shrink_folio_list(&folio_list, pgdat, sc, &stat, false);
|
||||||
|
trace_android_vh_handle_trylock_failed_folio(&folio_list);
|
||||||
|
|
||||||
spin_lock_irq(&lruvec->lru_lock);
|
spin_lock_irq(&lruvec->lru_lock);
|
||||||
move_folios_to_lru(lruvec, &folio_list);
|
move_folios_to_lru(lruvec, &folio_list);
|
||||||
@@ -2673,6 +2683,7 @@ static void shrink_active_list(unsigned long nr_to_scan,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
trace_android_vh_folio_trylock_set(folio);
|
||||||
/* Referenced or rmap lock contention: rotate */
|
/* Referenced or rmap lock contention: rotate */
|
||||||
if (folio_referenced(folio, 0, sc->target_mem_cgroup,
|
if (folio_referenced(folio, 0, sc->target_mem_cgroup,
|
||||||
&vm_flags) != 0) {
|
&vm_flags) != 0) {
|
||||||
@@ -2686,12 +2697,13 @@ static void shrink_active_list(unsigned long nr_to_scan,
|
|||||||
* so we ignore them here.
|
* so we ignore them here.
|
||||||
*/
|
*/
|
||||||
if ((vm_flags & VM_EXEC) && folio_is_file_lru(folio)) {
|
if ((vm_flags & VM_EXEC) && folio_is_file_lru(folio)) {
|
||||||
|
trace_android_vh_folio_trylock_clear(folio);
|
||||||
nr_rotated += folio_nr_pages(folio);
|
nr_rotated += folio_nr_pages(folio);
|
||||||
list_add(&folio->lru, &l_active);
|
list_add(&folio->lru, &l_active);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
trace_android_vh_folio_trylock_clear(folio);
|
||||||
folio_clear_active(folio); /* we are de-activating */
|
folio_clear_active(folio); /* we are de-activating */
|
||||||
folio_set_workingset(folio);
|
folio_set_workingset(folio);
|
||||||
list_add(&folio->lru, &l_inactive);
|
list_add(&folio->lru, &l_inactive);
|
||||||
@@ -2780,6 +2792,7 @@ unsigned long __reclaim_pages(struct list_head *folio_list, void *private)
|
|||||||
|
|
||||||
return nr_reclaimed;
|
return nr_reclaimed;
|
||||||
}
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(reclaim_pages);
|
||||||
|
|
||||||
unsigned long reclaim_pages(struct list_head *folio_list)
|
unsigned long reclaim_pages(struct list_head *folio_list)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -43,10 +43,11 @@ void cfg80211_rx_assoc_resp(struct net_device *dev,
|
|||||||
|
|
||||||
for (link_id = 0; link_id < ARRAY_SIZE(data->links); link_id++) {
|
for (link_id = 0; link_id < ARRAY_SIZE(data->links); link_id++) {
|
||||||
cr.links[link_id].status = data->links[link_id].status;
|
cr.links[link_id].status = data->links[link_id].status;
|
||||||
|
cr.links[link_id].bss = data->links[link_id].bss;
|
||||||
|
|
||||||
WARN_ON_ONCE(cr.links[link_id].status != WLAN_STATUS_SUCCESS &&
|
WARN_ON_ONCE(cr.links[link_id].status != WLAN_STATUS_SUCCESS &&
|
||||||
(!cr.ap_mld_addr || !cr.links[link_id].bss));
|
(!cr.ap_mld_addr || !cr.links[link_id].bss));
|
||||||
|
|
||||||
cr.links[link_id].bss = data->links[link_id].bss;
|
|
||||||
if (!cr.links[link_id].bss)
|
if (!cr.links[link_id].bss)
|
||||||
continue;
|
continue;
|
||||||
cr.links[link_id].bssid = data->links[link_id].bss->bssid;
|
cr.links[link_id].bssid = data->links[link_id].bss->bssid;
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# SPDX-License-Identifier: GPL-2.0
|
# SPDX-License-Identifier: GPL-2.0
|
||||||
CFLAGS += -D_FILE_OFFSET_BITS=64 -Wall -Werror -I../.. -I../../../../.. -fno-omit-frame-pointer -fsanitize=address -g
|
CFLAGS += -D_FILE_OFFSET_BITS=64 -Wall -Wno-deprecated-declarations -Werror -I../.. -I../../../../.. -fno-omit-frame-pointer -g
|
||||||
LDLIBS := -llz4 -lzstd -lcrypto -lpthread -fsanitize=address
|
LDLIBS := -llz4 -lzstd -lcrypto -lpthread
|
||||||
TEST_GEN_PROGS := incfs_test incfs_stress incfs_perf
|
TEST_GEN_PROGS := incfs_test incfs_stress incfs_perf
|
||||||
|
|
||||||
include ../../lib.mk
|
include ../../lib.mk
|
||||||
|
|||||||
Reference in New Issue
Block a user