diff --git a/android/abi_gki_aarch64_galaxy b/android/abi_gki_aarch64_galaxy index a6d6c37a2f7a..6370941fad5e 100644 --- a/android/abi_gki_aarch64_galaxy +++ b/android/abi_gki_aarch64_galaxy @@ -94,8 +94,11 @@ __ethtool_get_link_ksettings __fdget __flush_icache_range __free_pages +__genphy_config_aneg __get_free_pages __get_task_comm +__hid_register_driver +__hid_request __hrtimer_get_remaining __hvc_resize __hwspin_lock_timeout @@ -343,6 +346,8 @@ __traceiter_gpu_mem_total __traceiter_sched_util_est_se_tp __traceiter_xdp_exception __tracepoint_android_rvh_account_irq +__tracepoint_android_rvh_arm64_serror_panic +__tracepoint_android_rvh_bad_mode __tracepoint_android_rvh_build_perf_domains __tracepoint_android_rvh_can_migrate_task __tracepoint_android_rvh_check_preempt_wakeup @@ -352,9 +357,12 @@ __tracepoint_android_rvh_cpu_cgroup_online __tracepoint_android_rvh_cpu_overutilized __tracepoint_android_rvh_cpufreq_transition __tracepoint_android_rvh_dequeue_task +__tracepoint_android_rvh_dequeue_task_idle __tracepoint_android_rvh_die_kernel_fault __tracepoint_android_rvh_do_mem_abort +__tracepoint_android_rvh_do_sea __tracepoint_android_rvh_do_sp_pc_abort +__tracepoint_android_rvh_do_undefinstr __tracepoint_android_rvh_enqueue_task __tracepoint_android_rvh_find_busiest_queue __tracepoint_android_rvh_find_energy_efficient_cpu @@ -408,6 +416,7 @@ __tracepoint_android_vh_binder_restore_priority __tracepoint_android_vh_binder_set_priority __tracepoint_android_vh_binder_transaction_init __tracepoint_android_vh_binder_wakeup_ilocked +__tracepoint_android_vh_cgroup_attach __tracepoint_android_vh_cma_alloc_finish __tracepoint_android_vh_cma_alloc_start __tracepoint_android_vh_cpu_idle_enter @@ -429,10 +438,19 @@ __tracepoint_android_vh_kfree_skb __tracepoint_android_vh_logbuf __tracepoint_android_vh_logbuf_pr_cont __tracepoint_android_vh_meminfo_proc_show +__tracepoint_android_vh_mutex_wait_finish +__tracepoint_android_vh_mutex_wait_start __tracepoint_android_vh_pagecache_get_page __tracepoint_android_vh_printk_hotplug __tracepoint_android_vh_ptype_head __tracepoint_android_vh_rmqueue +__tracepoint_android_vh_rtmutex_wait_finish +__tracepoint_android_vh_rtmutex_wait_start +__tracepoint_android_vh_rwsem_read_wait_finish +__tracepoint_android_vh_rwsem_read_wait_start +__tracepoint_android_vh_rwsem_write_wait_finish +__tracepoint_android_vh_rwsem_write_wait_start +__tracepoint_android_vh_sched_show_task __tracepoint_android_vh_scheduler_tick __tracepoint_android_vh_show_max_freq __tracepoint_android_vh_show_mem @@ -440,6 +458,8 @@ __tracepoint_android_vh_show_resume_epoch_val __tracepoint_android_vh_show_suspend_epoch_val __tracepoint_android_vh_timer_calc_index __tracepoint_android_vh_timerfd_create +__tracepoint_android_vh_try_to_freeze_todo +__tracepoint_android_vh_try_to_freeze_todo_unfrozen __tracepoint_android_vh_typec_store_partner_src_caps __tracepoint_android_vh_typec_tcpci_override_toggling __tracepoint_android_vh_typec_tcpm_adj_current_limit @@ -453,6 +473,8 @@ __tracepoint_android_vh_ufs_send_tm_command __tracepoint_android_vh_ufs_send_uic_command __tracepoint_android_vh_ufs_update_sdev __tracepoint_android_vh_ufs_update_sysfs +__tracepoint_android_vh_watchdog_timer_softlockup +__tracepoint_android_vh_wq_lockup_pool __tracepoint_binder_transaction_received __tracepoint_clock_set_rate __tracepoint_cpu_frequency @@ -489,12 +511,14 @@ __tracepoint_suspend_resume __tracepoint_workqueue_execute_end __tracepoint_workqueue_execute_start __tracepoint_xdp_exception +__tty_alloc_driver __tty_insert_flip_char __udelay __uio_register_device __unregister_chrdev __update_load_avg_blocked_se __usb_create_hcd +__usb_get_extra_descriptor __usecs_to_jiffies __v4l2_device_register_subdev_nodes __video_register_device @@ -774,6 +798,14 @@ cancel_delayed_work cancel_delayed_work_sync cancel_work_sync capable +cdc_ncm_bind_common +cdc_ncm_change_mtu +cdc_ncm_fill_tx_frame +cdc_ncm_rx_verify_ndp16 +cdc_ncm_rx_verify_nth16 +cdc_ncm_select_altsetting +cdc_ncm_unbind +cdc_parse_cdc_header cdev_add cdev_alloc cdev_del @@ -946,6 +978,7 @@ cpumask_next_wrap cpupri_find_fitness cpus_read_lock cpus_read_unlock +crc16 crc32_le crc8 crc8_populate_msb @@ -1051,6 +1084,7 @@ dev_pm_opp_adjust_voltage dev_pm_opp_disable dev_pm_opp_enable dev_pm_opp_find_freq_ceil +dev_pm_opp_find_freq_ceil_by_volt dev_pm_opp_find_freq_exact dev_pm_opp_find_freq_floor dev_pm_opp_free_cpufreq_table @@ -1389,6 +1423,7 @@ down_write downgrade_write dput drain_workqueue +driver_attach driver_create_file driver_find_device driver_register @@ -1691,6 +1726,7 @@ drm_mode_object_put drm_mode_probed_add drm_mode_set_crtcinfo drm_mode_set_name +drm_mode_sort drm_mode_vrefresh drm_modeset_acquire_fini drm_modeset_acquire_init @@ -1919,7 +1955,10 @@ genl_notify genl_register_family genl_unregister_family genlmsg_put +genphy_read_status genphy_resume +genphy_soft_reset +genphy_suspend get_cpu_device get_cpu_idle_time get_cpu_idle_time_us @@ -2028,6 +2067,13 @@ hdmi_infoframe_pack hex2bin hex_dump_to_buffer hex_to_bin +hid_hw_close +hid_hw_open +hid_hw_start +hid_hw_stop +hid_open_report +hid_report_raw_event +hid_unregister_driver hmm_range_fault hrtimer_active hrtimer_cancel @@ -2135,6 +2181,7 @@ iio_read_channel_processed iio_read_channel_raw import_iovec in4_pton +in6_dev_finish_destroy in6_pton in_aton in_egroup_p @@ -2156,6 +2203,7 @@ input_allocate_device input_close_device input_event input_ff_create +input_ff_create_memless input_ff_destroy input_free_device input_mt_assign_slots @@ -2315,6 +2363,7 @@ kernel_sendmsg kernel_sigaction kernfs_find_and_get_ns kernfs_notify +kernfs_path_from_node kernfs_put kfree kfree_const @@ -2353,6 +2402,7 @@ kobject_uevent kobject_uevent_env krealloc kset_create_and_add +kset_unregister ksize ksoftirqd kstat @@ -2448,7 +2498,9 @@ mbox_request_channel mbox_send_message mdiobus_alloc_size mdiobus_free +mdiobus_read mdiobus_unregister +mdiobus_write media_device_cleanup media_device_init media_device_unregister @@ -2930,16 +2982,24 @@ perf_pmu_unregister perf_trace_buf_alloc perf_trace_run_bpf_submit pfn_valid +phy_attached_info phy_calibrate phy_configure phy_connect +phy_connect_direct phy_disconnect phy_do_ioctl_running +phy_drivers_register +phy_drivers_unregister phy_ethtool_get_link_ksettings phy_ethtool_nway_reset phy_ethtool_set_link_ksettings phy_exit +phy_find_first +phy_get_pause phy_init +phy_init_hw +phy_mii_ioctl phy_pm_runtime_get_sync phy_pm_runtime_put_sync phy_power_off @@ -3078,11 +3138,13 @@ ps2_sliced_command pskb_expand_head pstore_register pstore_unregister +public_key_verify_signature put_device put_disk put_iova_domain put_pid put_sg_io_hdr +put_tty_driver put_unused_fd put_vaddr_frames pwm_apply_state @@ -3539,6 +3601,7 @@ smp_call_function smp_call_function_any smp_call_function_many smp_call_function_single +smp_call_function_single_async smp_call_on_cpu smpboot_register_percpu_thread smpboot_unregister_percpu_thread @@ -3755,6 +3818,7 @@ spmi_register_read spmi_register_write spmi_register_zero_write sprint_symbol +sprint_symbol_no_offset sprintf srcu_barrier srcu_batches_completed @@ -3767,6 +3831,7 @@ srcutorture_get_gp_data sscanf stack_trace_print stack_trace_save +stack_trace_save_regs stack_trace_save_tsk static_key_disable static_key_disable_cpuslocked @@ -3864,6 +3929,12 @@ tasklet_init tasklet_kill tasklet_setup tasklist_lock +tcp_register_congestion_control +tcp_reno_cong_avoid +tcp_reno_ssthresh +tcp_reno_undo_cwnd +tcp_slow_start +tcp_unregister_congestion_control tcpci_get_tcpm_port tcpci_irq tcpci_register_port @@ -3967,9 +4038,26 @@ ttm_unmap_and_unpopulate_pages tty_flip_buffer_push tty_insert_flip_string_fixed_flag tty_kref_put +tty_ldisc_deref +tty_ldisc_ref +tty_port_close +tty_port_destroy +tty_port_hangup +tty_port_init +tty_port_open +tty_port_register_device tty_port_tty_get +tty_port_tty_wakeup +tty_register_driver +tty_set_operations +tty_standard_install +tty_std_termios tty_termios_baud_rate +tty_termios_copy_hw tty_termios_encode_baud_rate +tty_unregister_device +tty_unregister_driver +tty_vhangup typec_altmode_get_partner typec_altmode_update_active typec_get_drvdata @@ -4095,6 +4183,7 @@ usb_amd_quirk_pll_enable usb_asmedia_modifyflowcontrol usb_assign_descriptors usb_autopm_get_interface +usb_autopm_get_interface_no_resume usb_autopm_put_interface usb_bulk_msg usb_calc_bus_time @@ -4107,6 +4196,7 @@ usb_debug_root usb_decode_ctrl usb_del_gadget_udc usb_deregister +usb_deregister_dev usb_disable_xhci_ports usb_disabled usb_enable_autosuspend @@ -4124,6 +4214,7 @@ usb_ep_queue usb_ep_set_halt usb_ep_set_maxpacket_limit usb_find_common_endpoints +usb_find_interface usb_free_all_descriptors usb_free_coherent usb_free_urb @@ -4140,8 +4231,10 @@ usb_gadget_vbus_connect usb_gadget_vbus_disconnect usb_gadget_vbus_draw usb_gadget_wakeup +usb_get_dev usb_get_dr_mode usb_get_gadget_udc_name +usb_get_intf usb_get_maximum_speed usb_get_urb usb_gstrings_attach @@ -4169,12 +4262,17 @@ usb_ifnum_to_if usb_initialize_gadget usb_interface_id usb_kill_urb +usb_match_id +usb_match_one_id usb_otg_state_string usb_phy_set_charger_current +usb_poison_anchored_urbs usb_poison_urb usb_put_dev usb_put_function_instance usb_put_hcd +usb_put_intf +usb_register_dev usb_register_driver usb_register_notify usb_remove_hcd @@ -4188,12 +4286,17 @@ usb_role_switch_set_role usb_role_switch_unregister usb_root_hub_lost_power usb_set_device_state +usb_set_interface +usb_show_dynids usb_speed_string +usb_store_new_id usb_string_id usb_submit_urb +usb_unpoison_urb usb_unregister_notify usb_wakeup_notification usbnet_change_mtu +usbnet_defer_kevent usbnet_disconnect usbnet_get_drvinfo usbnet_get_endpoints diff --git a/android/abi_gki_aarch64_generic b/android/abi_gki_aarch64_generic index f7b519e42ac4..f19b3266a8cf 100644 --- a/android/abi_gki_aarch64_generic +++ b/android/abi_gki_aarch64_generic @@ -398,6 +398,7 @@ __devm_regmap_init_spi devm_regulator_bulk_get devm_regulator_get + devm_regulator_get_exclusive devm_regulator_get_optional devm_regulator_put devm_regulator_register @@ -967,6 +968,7 @@ __ioremap io_schedule_timeout iounmap + iov_iter_bvec ip_send_check iput __irq_alloc_descs @@ -1052,6 +1054,7 @@ kstrtouint kstrtouint_from_user kstrtoull + kstrtoull_from_user kthread_bind kthread_bind_mask kthread_cancel_delayed_work_sync @@ -1246,6 +1249,7 @@ of_get_regulator_init_data of_iomap of_irq_find_parent + of_irq_get of_irq_get_byname of_irq_parse_one of_machine_is_compatible @@ -1280,6 +1284,7 @@ of_root of_thermal_get_ntrips of_thermal_get_trip_points + of_thermal_is_trip_valid of_translate_address of_usb_host_tpl_support page_endio @@ -1355,6 +1360,7 @@ pinctrl_remove_gpio_range pinctrl_select_state pin_get_name + pin_user_pages pin_user_pages_fast pin_user_pages_remote pktgen_xfrm_outer_mode_output @@ -1582,6 +1588,9 @@ rtc_tm_to_time64 rtc_update_irq rtc_valid_tm + __rt_mutex_init + rt_mutex_lock + rt_mutex_unlock rtnl_is_locked rtnl_lock rtnl_unlock @@ -1923,6 +1932,7 @@ __traceiter_android_rvh_typec_tcpci_chk_contaminant __traceiter_android_rvh_typec_tcpci_get_vbus __traceiter_android_rvh_uclamp_eff_get + __traceiter_android_rvh_ufs_complete_init __traceiter_android_rvh_ufs_reprogram_all_keys __traceiter_android_rvh_util_est_update __traceiter_android_vh_arch_set_freq_scale @@ -1956,6 +1966,8 @@ __traceiter_android_vh_ufs_send_tm_command __traceiter_android_vh_ufs_send_uic_command __traceiter_android_vh_ufs_update_sysfs + __traceiter_android_vh_usb_dev_resume + __traceiter_android_vh_usb_dev_suspend __traceiter_clock_set_rate __traceiter_cpu_frequency __traceiter_device_pm_callback_end @@ -1998,6 +2010,7 @@ __tracepoint_android_rvh_typec_tcpci_chk_contaminant __tracepoint_android_rvh_typec_tcpci_get_vbus __tracepoint_android_rvh_uclamp_eff_get + __tracepoint_android_rvh_ufs_complete_init __tracepoint_android_rvh_ufs_reprogram_all_keys __tracepoint_android_rvh_util_est_update __tracepoint_android_vh_arch_set_freq_scale @@ -2031,6 +2044,8 @@ __tracepoint_android_vh_ufs_send_tm_command __tracepoint_android_vh_ufs_send_uic_command __tracepoint_android_vh_ufs_update_sysfs + __tracepoint_android_vh_usb_dev_resume + __tracepoint_android_vh_usb_dev_suspend __tracepoint_clock_set_rate __tracepoint_cpu_frequency __tracepoint_device_pm_callback_end diff --git a/android/abi_gki_aarch64_mtk b/android/abi_gki_aarch64_mtk index cc0be9e998f0..13db90146503 100644 --- a/android/abi_gki_aarch64_mtk +++ b/android/abi_gki_aarch64_mtk @@ -452,6 +452,7 @@ devres_alloc_node devres_free devres_release + dev_set_mac_address dev_set_name _dev_warn disable_irq @@ -2195,6 +2196,7 @@ usbnet_write_cmd usbnet_write_cmd_async usbnet_write_cmd_nopm + usb_os_desc_prepare_interf_dir usb_put_function usb_put_function_instance usb_put_hcd @@ -2235,6 +2237,7 @@ v4l2_ctrl_request_complete v4l2_ctrl_request_setup __v4l2_ctrl_s_ctrl + __v4l2_ctrl_s_ctrl_compound v4l2_ctrl_subdev_subscribe_event v4l2_ctrl_subscribe_event v4l2_device_register diff --git a/android/abi_gki_aarch64_oplus b/android/abi_gki_aarch64_oplus index 263aa6fcf46a..a0f221271a40 100644 --- a/android/abi_gki_aarch64_oplus +++ b/android/abi_gki_aarch64_oplus @@ -1,18 +1,30 @@ -[abi_symbol_list] +[abi_symbol_list] + access_process_vm activate_task add_cpu add_device_randomness add_memory add_memory_subsection + add_taint add_timer add_uevent_var add_wait_queue + adjust_managed_page_count + alarm_cancel + alarm_init + alarm_start + alarm_start_relative + alarm_try_to_cancel alloc_anon_inode alloc_chrdev_region __alloc_disk_node + alloc_etherdev_mqs alloc_io_pgtable_ops + alloc_netdev_mqs + alloc_pages_exact __alloc_pages_nodemask __alloc_percpu + __alloc_percpu_gfp __alloc_skb alloc_skb_with_frags alloc_workqueue @@ -22,7 +34,10 @@ android_debug_per_cpu_symbol android_debug_symbol android_rvh_probe_register + anon_inode_getfd anon_inode_getfile + arc4_crypt + arc4_setkey __arch_copy_from_user __arch_copy_in_user __arch_copy_to_user @@ -32,29 +47,47 @@ argv_split arm64_const_caps_ready arm64_use_ng_mappings + __arm_smccc_hvc __arm_smccc_smc + arp_tbl + async_schedule_node atomic_notifier_call_chain atomic_notifier_chain_register atomic_notifier_chain_unregister autoremove_wake_function available_idle_cpu + bcmp bdget_disk bdput + bio_add_pc_page + bio_alloc_bioset bio_endio + bio_put + bio_reset bitmap_allocate_region __bitmap_andnot __bitmap_clear + bitmap_find_free_region bitmap_find_next_zero_area_off + bitmap_free + bitmap_from_arr32 __bitmap_or bitmap_parselist_user bitmap_print_to_pagebuf bitmap_release_region __bitmap_set + bitmap_to_arr32 + __bitmap_weight + bitmap_zalloc blk_alloc_queue blk_cleanup_queue + blk_execute_rq blk_execute_rq_nowait blk_get_request + blk_mq_free_request blk_mq_rq_cpu + blk_mq_sched_mark_restart_hctx + blk_mq_start_request blk_put_request blk_queue_flag_clear blk_queue_flag_set @@ -64,6 +97,8 @@ blk_queue_max_discard_sectors blk_queue_max_write_zeroes_sectors blk_queue_physical_block_size + blk_rq_append_bio + blk_rq_map_kern blk_rq_map_user blk_rq_map_user_iov blk_rq_unmap_user @@ -87,6 +122,7 @@ bus_register bus_set_iommu bus_unregister + call_rcu cancel_delayed_work cancel_delayed_work_sync cancel_work_sync @@ -121,9 +157,11 @@ clk_bulk_unprepare __clk_determine_rate clk_disable + clk_divider_ops clk_enable clk_fixed_factor_ops clk_fixed_rate_ops + clk_gate_ops clk_get __clk_get_hw __clk_get_name @@ -142,15 +180,23 @@ clk_hw_unregister __clk_is_enabled __clk_mux_determine_rate_closest + clk_mux_ops clk_notifier_register clk_notifier_unregister clk_prepare clk_put + clk_register + clk_register_composite + clk_register_divider_table + clk_register_fixed_factor + clk_register_fixed_rate clk_round_rate clk_set_parent clk_set_rate clk_sync_state clk_unprepare + clocks_calc_mult_shift + __close_fd cma_alloc cma_get_name cma_release @@ -160,11 +206,13 @@ complete_all completion_done component_add + component_add_typed component_bind_all component_del component_master_add_with_match component_master_del component_match_add_release + component_match_add_typed component_unbind_all config_ep_by_speed configfs_register_subsystem @@ -173,16 +221,22 @@ config_group_init_type_name config_item_get config_item_put + console_drivers console_printk console_stop console_suspend_enabled + console_unlock __const_udelay consume_skb contig_page_data _copy_from_iter _copy_from_iter_full + copy_from_kernel_nofault + _copy_to_iter __cpu_active_mask + cpu_all_bits cpu_bit_bitmap + cpufreq_add_update_util_hook cpufreq_cooling_unregister cpufreq_cpu_get cpufreq_cpu_get_raw @@ -194,15 +248,24 @@ cpufreq_enable_fast_switch cpufreq_freq_attr_scaling_available_freqs cpufreq_freq_attr_scaling_boost_freqs + cpufreq_frequency_table_get_index + cpufreq_generic_attr cpufreq_generic_frequency_table_verify cpufreq_get_policy + cpufreq_policy_transition_delay_us cpufreq_quick_get cpufreq_register_driver cpufreq_register_governor cpufreq_register_notifier + cpufreq_remove_update_util_hook cpufreq_table_index_unsorted + cpufreq_this_cpu_can_update cpufreq_unregister_driver + cpufreq_unregister_governor cpufreq_unregister_notifier + cpufreq_update_limits + cpu_hotplug_disable + cpu_hotplug_enable __cpuhp_remove_state __cpuhp_setup_state __cpuhp_setup_state_cpuslocked @@ -210,8 +273,12 @@ __cpuhp_state_remove_instance cpu_hwcap_keys cpu_hwcaps + cpuidle_driver_state_disabled + cpuidle_get_driver cpuidle_governor_latency_req + cpuidle_pause_and_lock cpuidle_register_governor + cpuidle_resume_and_unlock cpu_irqtime cpu_latency_qos_add_request cpu_latency_qos_remove_request @@ -219,6 +286,7 @@ cpu_latency_qos_update_request cpu_maps_update_begin cpu_maps_update_done + cpumask_any_but cpumask_next cpumask_next_and cpu_number @@ -233,33 +301,57 @@ cpus_read_unlock cpu_subsys cpu_topology + crc32_be crc32_le crc8 crc8_populate_msb + crypto_aead_decrypt + crypto_aead_encrypt + crypto_aead_setauthsize + crypto_aead_setkey + crypto_alloc_aead crypto_alloc_base crypto_alloc_shash + crypto_alloc_skcipher crypto_comp_compress crypto_comp_decompress crypto_destroy_tfm crypto_has_alg + __crypto_memneq crypto_register_alg crypto_register_rngs crypto_register_scomp crypto_shash_digest + crypto_shash_final + crypto_shash_finup + crypto_shash_setkey + crypto_shash_update + crypto_skcipher_decrypt + crypto_skcipher_encrypt + crypto_skcipher_setkey crypto_unregister_alg crypto_unregister_rngs crypto_unregister_scomp + __crypto_xor css_next_child _ctype + dapm_clock_event + dapm_kcontrol_get_value + dapm_regulator_event datagram_poll deactivate_task debugfs_attr_read debugfs_attr_write + debugfs_create_blob debugfs_create_bool + debugfs_create_devm_seqfile debugfs_create_dir debugfs_create_file debugfs_create_file_unsafe + debugfs_create_regset32 + debugfs_create_symlink debugfs_create_u32 + debugfs_create_u64 debugfs_create_u8 debugfs_create_x32 debugfs_create_x8 @@ -267,6 +359,7 @@ debugfs_file_put debugfs_lookup debugfs_remove + debugfs_rename dec_zone_page_state default_llseek deferred_free @@ -276,35 +369,56 @@ del_timer_sync desc_to_gpio destroy_workqueue + dev_alloc_name + dev_base_lock + dev_change_net_namespace + dev_close dev_coredumpv _dev_crit dev_driver_string + _dev_emerg _dev_err dev_err_probe + dev_fetch_sw_netstats devfreq_add_device devfreq_add_governor devfreq_cooling_unregister devfreq_get_devfreq_by_node + devfreq_get_devfreq_by_phandle + devfreq_monitor_resume + devfreq_monitor_start + devfreq_monitor_stop + devfreq_monitor_suspend + devfreq_recommended_opp devfreq_remove_device devfreq_remove_governor devfreq_resume_device devfreq_suspend_device + devfreq_update_interval dev_fwnode + __dev_get_by_index + dev_get_by_index dev_get_by_name dev_get_regmap + dev_get_stats device_add device_add_disk device_add_groups device_create + device_create_bin_file device_create_file + device_create_with_groups device_del device_destroy device_find_child device_for_each_child + device_get_child_node_count device_get_match_data + device_get_next_child_node device_initialize device_init_wakeup device_link_add + device_link_remove device_match_fwnode device_match_name device_property_present @@ -312,32 +426,56 @@ device_property_read_u16_array device_property_read_u32_array device_register + device_remove_bin_file device_remove_file + device_rename + device_set_of_node_from_dev + device_set_wakeup_capable + device_show_bool device_show_int + device_store_bool device_store_int device_unregister device_wakeup_disable device_wakeup_enable _dev_info + __dev_kfree_skb_any devm_add_action + __devm_alloc_percpu devm_blk_ksm_init + devm_clk_bulk_get devm_clk_bulk_get_all + devm_clk_bulk_get_optional devm_clk_get + devm_clk_get_optional devm_clk_hw_register devm_clk_put devm_clk_register + devm_devfreq_add_device + devm_devfreq_register_notifier + devm_devfreq_remove_device + devm_devfreq_unregister_notifier devm_device_add_group devm_device_remove_group devm_extcon_dev_allocate devm_extcon_dev_register devm_extcon_dev_unregister + devm_extcon_register_notifier devm_free_irq + devm_fwnode_pwm_get + devm_gpiochip_add_data_with_key + devm_gpiod_get + devm_gpiod_get_index devm_gpiod_get_optional + devm_gpiod_put devm_gpio_free devm_gpio_request devm_gpio_request_one + devm_hwrng_register devm_hwspin_lock_register + devm_i2c_new_dummy_device devm_iio_channel_get + devm_iio_channel_get_all devm_iio_device_alloc __devm_iio_device_register devm_input_allocate_device @@ -351,11 +489,16 @@ devm_kmemdup devm_kstrdup devm_led_classdev_register_ext + devm_led_classdev_unregister + devm_mbox_controller_register + devm_memremap + devm_mfd_add_devices devm_nvmem_cell_get devm_nvmem_device_get devm_nvmem_register devm_of_clk_add_hw_provider devm_of_icc_get + devm_of_phy_get_by_index __devm_of_phy_provider_register devm_of_platform_populate devm_of_pwm_get @@ -365,29 +508,40 @@ devm_pinctrl_get devm_pinctrl_put devm_pinctrl_register + devm_pinctrl_register_and_init + devm_platform_get_and_ioremap_resource devm_platform_ioremap_resource devm_platform_ioremap_resource_byname + devm_power_supply_get_by_phandle devm_power_supply_register + devm_regmap_add_irq_chip devm_regmap_field_alloc __devm_regmap_init __devm_regmap_init_i2c __devm_regmap_init_mmio_clk devm_regulator_bulk_get devm_regulator_get + devm_regulator_get_exclusive devm_regulator_get_optional devm_regulator_put devm_regulator_register devm_regulator_register_notifier + devm_regulator_unregister_notifier devm_request_any_context_irq devm_request_threaded_irq __devm_reset_control_get devm_reset_controller_register devm_rtc_allocate_device + devm_snd_soc_register_card + devm_snd_soc_register_component + devm_spi_register_controller devm_thermal_of_cooling_device_register devm_thermal_zone_of_sensor_register devm_usb_get_phy_by_node + devm_watchdog_register_device _dev_notice dev_pm_domain_attach + dev_pm_domain_attach_by_id dev_pm_domain_attach_by_name dev_pm_domain_detach dev_pm_genpd_add_notifier @@ -396,16 +550,22 @@ dev_pm_genpd_set_performance_state dev_pm_opp_add dev_pm_opp_find_freq_ceil + dev_pm_opp_find_freq_ceil_by_volt dev_pm_opp_find_freq_exact dev_pm_opp_find_freq_floor + dev_pm_opp_get_freq + dev_pm_opp_get_level dev_pm_opp_get_opp_count + dev_pm_opp_get_opp_table dev_pm_opp_get_voltage dev_pm_opp_of_add_table + dev_pm_opp_of_add_table_indexed dev_pm_opp_of_find_icc_paths dev_pm_opp_of_register_em dev_pm_opp_of_remove_table dev_pm_opp_put dev_pm_opp_put_clkname + dev_pm_opp_put_opp_table dev_pm_opp_remove_all_dynamic dev_pm_opp_set_clkname dev_pm_opp_set_rate @@ -416,6 +576,8 @@ dev_pm_qos_remove_notifier dev_pm_qos_remove_request dev_pm_qos_update_request + dev_printk + dev_queue_xmit devres_add devres_alloc_node devres_destroy @@ -446,6 +608,10 @@ dma_buf_fd dma_buf_get dma_buf_map_attachment + dmabuf_page_pool_alloc + dmabuf_page_pool_create + dmabuf_page_pool_destroy + dmabuf_page_pool_free dma_buf_put dma_buf_unmap_attachment dma_buf_vmap @@ -464,23 +630,33 @@ dma_fence_remove_callback dma_fence_signal dma_fence_signal_locked + dma_fence_signal_timestamp_locked dma_fence_wait_timeout dma_free_attrs dma_get_sgtable_attrs dma_get_slave_channel dma_heap_add dma_heap_buffer_alloc + dma_heap_bufferfd_alloc dma_heap_find dma_heap_get_dev dma_heap_get_drvdata dma_heap_get_name + dma_heap_put dmam_alloc_attrs dma_map_page_attrs dma_map_resource dma_map_sg_attrs dmam_free_coherent + dma_mmap_attrs + dma_pool_alloc + dma_pool_create + dma_pool_destroy + dma_pool_free dma_release_channel dma_request_chan + dma_resv_wait_timeout_rcu + dma_run_dependencies dma_set_coherent_mask dma_set_mask dma_sync_sg_for_cpu @@ -491,15 +667,156 @@ dma_unmap_resource dma_unmap_sg_attrs do_exit + do_wait_intr_irq + down + down_interruptible down_read + down_timeout + down_trylock down_write d_path dput drain_workqueue + driver_create_file driver_find_device driver_register + driver_remove_file driver_unregister + drm_add_edid_modes + drm_add_modes_noedid + drm_atomic_add_affected_connectors + drm_atomic_get_crtc_state + drm_atomic_helper_check + drm_atomic_helper_check_plane_state + drm_atomic_helper_cleanup_planes + drm_atomic_helper_commit_modeset_disables + drm_atomic_helper_commit_modeset_enables + drm_atomic_helper_commit_planes + drm_atomic_helper_connector_destroy_state + drm_atomic_helper_connector_duplicate_state + drm_atomic_helper_connector_reset + __drm_atomic_helper_crtc_destroy_state + __drm_atomic_helper_crtc_duplicate_state + drm_atomic_helper_disable_plane + drm_atomic_helper_legacy_gamma_set + drm_atomic_helper_page_flip + __drm_atomic_helper_plane_destroy_state + __drm_atomic_helper_plane_duplicate_state + drm_atomic_helper_prepare_planes + drm_atomic_helper_resume + drm_atomic_helper_set_config + drm_atomic_helper_shutdown + drm_atomic_helper_suspend + drm_atomic_helper_swap_state + drm_atomic_helper_update_plane + drm_atomic_helper_wait_for_vblanks + drm_atomic_state_clear + drm_atomic_state_default_release + __drm_atomic_state_free + drm_atomic_state_init + drm_bridge_attach + drm_calc_timestamping_constants + drm_compat_ioctl + drm_connector_attach_encoder + drm_connector_cleanup + drm_connector_init + drm_connector_update_edid_property + drm_crtc_cleanup + drm_crtc_handle_vblank + drm_crtc_init_with_planes + drm_crtc_send_vblank_event + drm_crtc_vblank_get + drm_crtc_vblank_off + drm_crtc_vblank_on + drm_crtc_vblank_put + drm_crtc_vblank_waitqueue + __drm_dbg + drm_dev_alloc + drm_dev_put + drm_dev_register + drm_dev_unregister + drm_display_mode_to_videomode + drm_dp_aux_init + drm_dp_aux_register + drm_dp_channel_eq_ok + drm_dp_clock_recovery_ok + drm_dp_dpcd_read + drm_dp_dpcd_write + drm_dp_link_train_channel_eq_delay + drm_dp_link_train_clock_recovery_delay + drm_edid_duplicate + drm_edid_to_sad + drm_encoder_cleanup + drm_encoder_init + __drm_err + drm_format_info + drm_framebuffer_cleanup + drm_framebuffer_init + drm_framebuffer_lookup + drm_framebuffer_remove + drm_gem_cma_vm_ops + drm_gem_create_mmap_offset + drm_gem_dumb_destroy + drm_gem_handle_create + drm_gem_mmap + drm_gem_mmap_obj + drm_gem_object_free + drm_gem_object_init + drm_gem_object_lookup + drm_gem_object_release + drm_gem_prime_export + drm_gem_prime_fd_to_handle + drm_gem_prime_handle_to_fd + drm_gem_prime_import + drm_gem_vm_close + drm_get_edid + drm_helper_hpd_irq_event + drm_helper_mode_fill_fb_struct + drm_helper_probe_single_connector_modes + drm_ioctl + drm_is_current_master + drm_kms_helper_poll_disable + drm_kms_helper_poll_enable + drm_kms_helper_poll_fini + drm_kms_helper_poll_init + drmm_mode_config_init + drm_mode_config_cleanup + drm_mode_config_reset + drm_mode_copy + drm_mode_crtc_set_gamma_size + drm_mode_duplicate + drm_mode_object_find + drm_mode_object_put + drm_mode_probed_add + drm_mode_set_crtcinfo + drm_mode_set_name + drm_mode_vrefresh + drm_object_attach_property + drm_open + drm_panel_add + drm_panel_disable + drm_panel_enable + drm_panel_get_modes + drm_panel_init + drm_panel_prepare + drm_panel_remove + drm_panel_unprepare + drm_plane_cleanup + drm_poll + drm_prime_gem_destroy + drm_property_blob_put + drm_property_create_blob + drm_property_create_range + drm_property_lookup_blob + drm_read + drm_release + drm_universal_plane_init + drm_vblank_init + drm_writeback_connector_init + drm_writeback_queue_job + drm_writeback_signal_completion dump_stack + __dynamic_pr_debug edac_device_add_device edac_device_alloc_ctl_info edac_device_alloc_index @@ -508,8 +825,20 @@ edac_device_handle_ce_count edac_device_handle_ue_count em_cpu_get + em_dev_register_perf_domain enable_irq enable_percpu_irq + ether_setup + eth_header + eth_header_cache + eth_header_cache_update + eth_header_parse + eth_mac_addr + eth_platform_get_mac_address + ethtool_op_get_link + ethtool_op_get_ts_info + eth_type_trans + eth_validate_addr eventfd_ctx_fdget eventfd_ctx_fileget eventfd_ctx_put @@ -529,6 +858,7 @@ fget filp_close filp_open_block + find_get_pid find_last_bit find_next_bit find_next_zero_bit @@ -543,32 +873,62 @@ flush_delayed_work flush_work flush_workqueue + follow_pfn + font_vga_8x16 + for_each_kernel_tracepoint fput + frame_vector_create + frame_vector_destroy + frame_vector_to_pages + frame_vector_to_pfns free_io_pgtable_ops free_irq + free_netdev __free_pages free_pages + free_pages_exact free_percpu free_percpu_irq freezing_slow_path + freq_qos_add_notifier freq_qos_add_request freq_qos_remove_request freq_qos_update_request freq_scale + fs_bio_set + fsg_common_create_luns + fsg_common_set_cdev + fsg_common_set_inquiry_string + fsg_common_set_sysfs + fsg_config_from_params fsync_bdev + fwnode_device_is_available fwnode_find_reference + fwnode_get_name fwnode_get_next_child_node + fwnode_graph_get_next_endpoint + fwnode_graph_get_port_parent + fwnode_graph_get_remote_endpoint + fwnode_graph_get_remote_port_parent + fwnode_graph_parse_endpoint fwnode_handle_get fwnode_handle_put + fwnode_property_get_reference_args fwnode_property_present fwnode_property_read_string fwnode_property_read_u32_array + fwnode_property_read_u64_array + gcd generic_device_group + generic_file_llseek generic_handle_irq generic_iommu_put_resv_regions + generic_mii_ioctl + genlmsg_multicast_allns genlmsg_put genl_register_family genl_unregister_family + genphy_resume gen_pool_add_owner gen_pool_alloc_algo_owner gen_pool_avail @@ -583,13 +943,18 @@ gen_pool_virt_to_phys getboottime64 get_cpu_device + get_cpu_idle_time get_cpu_idle_time_us get_cpu_iowait_time_us get_device get_each_dmabuf get_each_object_track + get_freelist_nr_pages __get_free_pages get_governor_parent_kobj + get_kernel_pages + get_net_ns_by_fd + get_net_ns_by_pid get_option get_page_owner_handle get_pfnblock_flags_mask @@ -600,13 +965,17 @@ get_sg_io_hdr get_slabinfo __get_task_comm + get_task_exe_file get_task_mm get_task_pid get_unmapped_area get_unused_fd_flags get_user_pages get_user_pages_remote + get_vaddr_frames + get_zeroed_page gic_nonsecure_priorities + gov_attr_set_get gov_attr_set_init gov_attr_set_put governor_sysfs_ops @@ -625,12 +994,16 @@ gpiod_get_optional gpiod_get_raw_value gpiod_get_value + gpiod_get_value_cansleep + gpiod_set_debounce gpiod_set_raw_value + gpiod_set_raw_value_cansleep gpiod_set_value gpiod_set_value_cansleep gpiod_to_irq gpio_free gpio_request + gpio_request_one gpio_to_desc handle_bad_irq handle_edge_irq @@ -641,6 +1014,8 @@ handle_simple_irq handle_sysrq hashlen_string + have_governor_per_policy + hex_asc hex_dump_to_buffer hrtimer_active hrtimer_cancel @@ -653,6 +1028,9 @@ hvc_kick hvc_poll hvc_remove + __hw_addr_init + __hw_addr_sync + __hw_addr_unsync hwrng_register hwrng_unregister hwspin_lock_free @@ -663,6 +1041,7 @@ i2c_add_adapter i2c_del_adapter i2c_del_driver + i2c_get_adapter i2c_get_dma_safe_msg_buf i2c_put_dma_safe_msg_buf i2c_register_driver @@ -674,6 +1053,7 @@ i2c_smbus_write_word_data i2c_transfer i2c_transfer_buffer_flags + i2c_unregister_device icc_get icc_link_create icc_node_add @@ -685,7 +1065,9 @@ icc_put icc_set_bw icc_set_tag + icc_sync_state ida_alloc_range + ida_destroy ida_free idr_alloc idr_alloc_cyclic @@ -696,14 +1078,28 @@ idr_preload idr_remove idr_replace + iio_alloc_pollfunc + iio_buffer_init + iio_buffer_put iio_channel_get iio_channel_get_all iio_channel_release + iio_dealloc_pollfunc + iio_device_attach_buffer + __iio_device_register + iio_device_unregister + iio_get_channel_type + iio_get_time_ns + iio_push_to_buffers + iio_read_channel_attribute iio_read_channel_processed + iio_read_channel_raw + iio_trigger_notify_done import_iovec inc_node_page_state inc_zone_page_state in_egroup_p + inet_csk_get_port init_iova_domain init_net init_pseudo @@ -715,6 +1111,8 @@ init_uts_ns init_wait_entry __init_waitqueue_head + inode_permission + inode_owner_or_capable input_alloc_absinfo input_allocate_device input_close_device @@ -756,6 +1154,7 @@ iommu_get_dma_cookie iommu_get_domain_for_dev iommu_get_msi_cookie + iommu_group_alloc iommu_group_for_each_dev iommu_group_get iommu_group_get_iommudata @@ -771,12 +1170,14 @@ iommu_unmap __ioread32_copy __ioremap + ioremap_cache iounmap __iowrite32_copy ipi_desc_get ip_route_me_harder iput ipv6_find_hdr + ipv6_skip_exthdr irq_chip_ack_parent irq_chip_disable_parent irq_chip_enable_parent @@ -791,6 +1192,8 @@ irq_chip_set_wake_parent irq_chip_unmask_parent irq_create_fwspec_mapping + irq_create_mapping_affinity + irq_create_of_mapping irq_dispose_mapping __irq_domain_add irq_domain_alloc_irqs_parent @@ -801,7 +1204,9 @@ irq_domain_remove irq_domain_set_hwirq_and_chip irq_domain_set_info + irq_domain_simple_ops irq_domain_update_bus_token + irq_domain_xlate_onetwocell irq_domain_xlate_twocell irq_do_set_affinity irq_find_mapping @@ -813,6 +1218,7 @@ irq_set_affinity_hint irq_set_affinity_notifier irq_set_chained_handler_and_data + irq_set_chip irq_set_chip_and_handler_name irq_set_chip_data irq_set_irqchip_state @@ -838,19 +1244,29 @@ kernel_cpustat kernel_getsockname kernel_kobj + kernel_param_lock + kernel_param_unlock kernel_power_off kernel_recvmsg kernel_restart kernel_sendmsg + kernel_sigaction + kernfs_path_from_node kern_mount kern_unmount + key_create_or_update + key_put + keyring_alloc __kfifo_alloc + __kfifo_free __kfifo_in __kfifo_out + __kfifo_to_user kfree kfree_const kfree_sensitive kfree_skb + kfree_skb_list kill_anon_super kill_fasync kimage_vaddr @@ -870,6 +1286,7 @@ kobject_add kobject_create_and_add kobject_del + kobject_get kobject_init kobject_init_and_add kobject_put @@ -888,7 +1305,10 @@ kstrdup_const kstrndup kstrtobool + kstrtobool_from_user kstrtoint + kstrtoint_from_user + kstrtol_from_user kstrtoll kstrtou16 kstrtou16_from_user @@ -899,45 +1319,71 @@ kstrtoul_from_user kstrtoull kstrtoull_from_user + ksys_sync_helper + kthread_bind kthread_bind_mask + kthread_cancel_delayed_work_sync kthread_cancel_work_sync kthread_create_on_node kthread_create_worker + kthread_delayed_work_timer_fn kthread_destroy_worker + kthread_flush_work kthread_flush_worker __kthread_init_worker + kthread_queue_delayed_work kthread_queue_work kthread_should_stop kthread_stop kthread_worker_fn ktime_get ktime_get_coarse_real_ts64 + ktime_get_coarse_with_offset ktime_get_mono_fast_ns + ktime_get_raw + ktime_get_raw_ts64 ktime_get_real_seconds ktime_get_real_ts64 + ktime_get_seconds + ktime_get_ts64 ktime_get_with_offset kvfree + kvfree_call_rcu kvmalloc_node led_classdev_flash_register_ext led_classdev_flash_unregister led_classdev_unregister + led_get_flash_fault + led_set_brightness_sync + led_set_flash_brightness + led_set_flash_timeout + led_sysfs_disable + led_sysfs_enable + led_trigger_remove + led_update_brightness + led_update_flash_brightness __list_add_valid __list_del_entry_valid list_sort llist_add_batch llist_reverse_order + __local_bh_enable_ip __lock_page lock_sock_nested log_buf_addr_get log_buf_len_get __log_post_read_mmio __log_read_mmio + log_threaded_irq_wakeup_reason __log_write_mmio lookup_page_ext lzo1x_1_compress lzo1x_decompress_safe lzorle1x_1_compress + match_hex + match_int match_string + match_token mbox_chan_received_data mbox_chan_txdone mbox_client_txdone @@ -946,9 +1392,35 @@ mbox_free_channel mbox_request_channel mbox_send_message + mdiobus_alloc_size + mdiobus_free + __mdiobus_register + mdiobus_unregister + media_create_intf_link + media_create_pad_link + media_device_cleanup + media_device_init + __media_device_register + media_device_unregister + media_devnode_create + media_devnode_remove + media_entity_pads_init + media_entity_remote_pad + media_entity_remove_links + __media_entity_setup_link + media_graph_walk_next + media_graph_walk_start + media_pipeline_start + media_pipeline_stop + media_request_get_by_fd + media_request_object_complete + media_request_put memblock_end_of_DRAM __memcat_p + memcg_kmem_enabled_key memchr + memchr_inv + memcmp memcpy __memcpy_fromio __memcpy_toio @@ -971,18 +1443,46 @@ memunmap migrate_pages migrate_swap + mii_check_media + mii_ethtool_get_link_ksettings + mii_ethtool_gset + mii_ethtool_set_link_ksettings + mii_link_ok + mii_nway_restart + mipi_dsi_attach + mipi_dsi_dcs_read + mipi_dsi_dcs_write + mipi_dsi_dcs_write_buffer + mipi_dsi_detach + mipi_dsi_driver_register_full + mipi_dsi_driver_unregister + mipi_dsi_generic_write + mipi_dsi_host_register + mipi_dsi_host_unregister misc_deregister misc_register + mktime64 + mmc_add_host + mmc_alloc_host + mmc_can_gpio_cd mmc_cqe_request_done + mmc_detect_change + mmc_free_host + mmc_gpio_get_cd + mmc_gpio_get_ro + mmc_hw_reset mmc_of_parse mmc_regulator_get_supply mmc_regulator_set_ocr mmc_regulator_set_vqmmc + mmc_remove_host + mmc_request_done mmc_send_tuning mmput mod_delayed_work_on mod_node_page_state mod_timer + mod_timer_pending __module_get module_layout module_put @@ -993,18 +1493,47 @@ mutex_is_locked mutex_lock mutex_lock_interruptible + mutex_lock_killable mutex_trylock mutex_unlock + napi_disable + napi_gro_flush + napi_gro_receive + __napi_schedule + napi_schedule_prep + nd_tbl + netdev_alloc_frag + __netdev_alloc_skb + netdev_err + netdev_info + netdev_set_default_ethtool_ops + netdev_warn + netif_carrier_off + netif_carrier_on + netif_napi_add + netif_receive_skb + netif_receive_skb_list + netif_rx + netif_rx_ni + netif_tx_stop_all_queues + netif_tx_wake_queue netlink_broadcast __netlink_kernel_create netlink_kernel_release + netlink_register_notifier netlink_unicast + netlink_unregister_notifier net_namespace_list + net_ns_type_operations + net_ratelimit nf_ct_delete nf_register_net_hooks nf_unregister_net_hooks nla_find + nla_memcpy + __nla_parse nla_put + nla_put_64bit nla_reserve nla_reserve_64bit __nla_validate @@ -1024,6 +1553,8 @@ nvmem_cell_read nvmem_cell_read_u32 nvmem_cell_write + nvmem_device_get + nvmem_device_put nvmem_device_read nvmem_device_write of_address_to_resource @@ -1031,7 +1562,11 @@ of_clk_add_hw_provider of_clk_add_provider of_clk_del_provider + of_clk_get + of_clk_get_by_name + of_clk_get_from_provider of_clk_hw_simple_get + of_clk_src_onecell_get of_clk_src_simple_get of_count_phandle_with_args of_cpufreq_cooling_register @@ -1044,7 +1579,10 @@ of_dma_controller_free of_dma_controller_register of_dma_is_coherent + of_dma_xlate_by_chan_id + of_drm_find_bridge of_drm_find_panel + of_find_backlight_by_node of_find_compatible_node of_find_device_by_node of_find_i2c_device_by_node @@ -1055,6 +1593,7 @@ of_find_node_with_property of_find_property of_fwnode_ops + of_genpd_add_device of_genpd_add_provider_onecell of_genpd_del_provider of_get_address @@ -1064,11 +1603,14 @@ of_get_next_available_child of_get_next_child of_get_next_parent + of_get_parent of_get_property of_get_regulator_init_data of_graph_get_next_endpoint of_graph_get_port_parent of_graph_get_remote_endpoint + of_graph_get_remote_node + of_graph_get_remote_port_parent of_graph_is_present of_graph_parse_endpoint of_hwspin_lock_get_id @@ -1079,6 +1621,8 @@ of_irq_get of_irq_get_byname of_irq_parse_one + of_irq_to_resource_table + of_machine_is_compatible of_match_device of_match_node of_n_addr_cells @@ -1099,11 +1643,15 @@ of_property_read_string of_property_read_string_helper of_property_read_u32_index + of_property_read_u64 of_property_read_u64_index + of_property_read_variable_u16_array of_property_read_variable_u32_array + of_property_read_variable_u64_array of_property_read_variable_u8_array of_prop_next_string of_prop_next_u32 + of_remove_property of_reserved_mem_device_init_by_idx of_reserved_mem_device_release of_reserved_mem_lookup @@ -1113,6 +1661,7 @@ of_thermal_is_trip_valid of_translate_address on_each_cpu + on_each_cpu_cond oops_in_progress overflowuid page_endio @@ -1121,12 +1670,21 @@ panic panic_notifier_list panic_timeout + param_array_ops + param_get_bool + param_get_charp param_get_int + param_get_uint + param_get_ulong param_ops_bool + param_ops_charp param_ops_int param_ops_string param_ops_uint param_set_bool + param_set_charp + param_set_uint + param_set_ulong pause_cpus pci_alloc_irq_vectors_affinity pci_assign_resource @@ -1169,36 +1727,60 @@ perf_aux_output_end perf_aux_output_flag perf_event_create_kernel_counter + perf_event_disable perf_event_enable perf_event_read_local perf_event_read_value perf_event_release_kernel + perf_event_update_userpage perf_get_aux + perf_pmu_migrate_context perf_pmu_register perf_pmu_unregister perf_trace_buf_alloc perf_trace_run_bpf_submit pfn_valid phy_calibrate + phy_connect + phy_disconnect + phy_do_ioctl_running + phy_ethtool_get_link_ksettings + phy_ethtool_nway_reset + phy_ethtool_set_link_ksettings phy_exit + phy_get phy_init phy_power_off phy_power_on + phy_print_status + phy_put phy_set_mode_ext + phy_start + phy_stop pick_highest_pushable_task pid_nr_ns pid_task pinconf_generic_dt_node_to_map + pinconf_generic_parse_dt_config pinctrl_dev_get_drvdata + pinctrl_enable pinctrl_force_default pinctrl_force_sleep + pinctrl_gpio_direction_input + pinctrl_gpio_direction_output pinctrl_lookup_state pinctrl_pm_select_default_state pinctrl_pm_select_sleep_state + pinctrl_put pinctrl_select_state + pinctrl_utils_add_map_configs pinctrl_utils_free_map + pinctrl_utils_reserve_map + pin_user_pages + pin_user_pages_fast platform_bus_type platform_device_add + platform_device_add_data platform_device_alloc platform_device_del platform_device_put @@ -1207,20 +1789,28 @@ platform_device_unregister __platform_driver_register platform_driver_unregister + platform_find_device_by_driver platform_get_irq platform_get_irq_byname + platform_get_irq_byname_optional + platform_get_irq_optional platform_get_resource platform_get_resource_byname platform_irq_count + __platform_register_drivers + platform_unregister_drivers pm_clk_add pm_clk_create pm_clk_destroy pm_clk_resume pm_clk_suspend + pm_genpd_add_device pm_genpd_add_subdomain pm_genpd_init pm_genpd_remove + pm_genpd_remove_device pm_genpd_remove_subdomain + pm_get_active_wakeup_sources pm_power_off __pm_relax pm_relax @@ -1231,6 +1821,7 @@ pm_runtime_forbid pm_runtime_force_resume pm_runtime_force_suspend + pm_runtime_get_if_active __pm_runtime_idle pm_runtime_irq_safe pm_runtime_no_callbacks @@ -1241,18 +1832,22 @@ __pm_runtime_use_autosuspend __pm_stay_awake pm_stay_awake + pm_suspend_default_s2idle pm_system_wakeup pm_wakeup_dev_event pm_wakeup_ws_event + pm_wq power_supply_changed power_supply_get_by_name power_supply_get_drvdata power_supply_get_property power_supply_put + power_supply_register power_supply_reg_notifier power_supply_set_property power_supply_unregister power_supply_unreg_notifier + prandom_bytes prandom_u32 preempt_schedule preempt_schedule_notrace @@ -1263,26 +1858,33 @@ printk_deferred proc_create proc_create_data + proc_create_single_data proc_dointvec proc_dointvec_minmax proc_dostring proc_douintvec_minmax proc_mkdir proc_remove + proc_set_user proc_symlink proto_register proto_unregister + pskb_expand_head __pskb_pull_tail + ___pskb_trim public_key_verify_signature putback_movable_pages put_device put_disk put_iova_domain + __put_net __put_page put_pid put_sg_io_hdr + put_task_stack __put_task_struct put_unused_fd + put_vaddr_frames pwm_apply_state pwmchip_add pwmchip_remove @@ -1305,6 +1907,7 @@ _raw_read_lock_bh _raw_read_lock_irq _raw_read_lock_irqsave + _raw_read_trylock _raw_read_unlock _raw_read_unlock_bh _raw_read_unlock_irq @@ -1333,23 +1936,43 @@ rb_last rb_next rb_prev + rcu_barrier + rcu_idle_enter + rcu_idle_exit + rcu_is_watching __rcu_read_lock __rcu_read_unlock + rdev_get_dev rdev_get_drvdata + rdev_get_id + rdev_get_regmap reboot_mode refcount_dec_and_lock refcount_dec_not_one refcount_warn_saturate + __refrigerator + regcache_cache_only + regcache_mark_dirty + regcache_sync register_blkdev __register_chrdev register_chrdev_region register_console register_die_notifier register_ftrace_export + register_inet6addr_notifier + register_inetaddr_notifier + register_kprobe register_kretprobe register_memory_notifier register_module_notifier + register_netdev + register_netdevice + register_netdevice_notifier register_net_sysctl + register_oom_notifier + register_pernet_device + register_pernet_subsys register_pm_notifier register_reboot_notifier register_restart_handler @@ -1357,13 +1980,18 @@ register_shrinker register_syscore_ops register_sysctl_table + register_virtio_device + register_virtio_driver regmap_bulk_read regmap_bulk_write regmap_check_range_table regmap_field_read regmap_field_update_bits_base __regmap_init + regmap_irq_get_domain regmap_mmio_detach_clk + regmap_raw_read + regmap_raw_write regmap_read regmap_update_bits_base regmap_write @@ -1371,31 +1999,52 @@ regulator_bulk_disable regulator_count_voltages regulator_disable + regulator_disable_regmap regulator_enable + regulator_enable_regmap regulator_force_disable regulator_get + regulator_get_current_limit_regmap regulator_get_drvdata regulator_get_mode + regulator_get_optional regulator_get_voltage regulator_get_voltage_rdev + regulator_get_voltage_sel_regmap regulator_is_enabled + regulator_is_enabled_regmap regulator_is_supported_voltage + regulator_list_voltage regulator_list_voltage_linear + regulator_list_voltage_linear_range + regulator_list_voltage_table + regulator_map_voltage_iterate + regulator_map_voltage_linear + regulator_map_voltage_linear_range regulator_notifier_call_chain regulator_put regulator_register_notifier + regulator_set_active_discharge_regmap regulator_set_current_limit + regulator_set_current_limit_regmap regulator_set_load regulator_set_mode regulator_set_voltage + regulator_set_voltage_sel_regmap + regulator_set_voltage_time + regulator_set_voltage_time_sel + regulator_sync_voltage regulator_unregister_notifier release_firmware + release_pages release_sock remap_pfn_range + remap_vmalloc_range remove_cpu remove_memory_subsection remove_proc_entry remove_proc_subtree + remove_wait_queue report_iommu_fault request_any_context_irq request_firmware @@ -1407,13 +2056,25 @@ resched_curr reset_control_assert reset_control_deassert + reset_controller_register + reset_control_reset resume_cpus revalidate_disk_size rfkill_alloc + rfkill_blocked rfkill_destroy rfkill_init_sw_state + rfkill_pause_polling rfkill_register + rfkill_resume_polling + rfkill_set_hw_state rfkill_unregister + rhashtable_free_and_destroy + rhashtable_insert_slow + rhltable_init + __rht_bucket_nested + rht_bucket_nested + rht_bucket_nested_insert rndis_deregister rndis_free_response rndis_get_next_response @@ -1426,7 +2087,12 @@ rndis_signal_connect rndis_uninit root_task_group + round_jiffies round_jiffies_relative + round_jiffies_up + rpmsg_create_ept + rpmsg_destroy_ept + rpmsg_find_device rpmsg_get_signals rpmsg_poll rpmsg_register_device @@ -1450,45 +2116,63 @@ rproc_remove_subdev rproc_report_crash rproc_shutdown + rps_needed rtc_class_close rtc_class_open + rtc_ktime_to_tm + rtc_nvmem_register + rtc_read_alarm rtc_read_time __rtc_register_device + rtc_set_alarm rtc_time64_to_tm + rtc_tm_to_ktime rtc_tm_to_time64 rtc_update_irq rtc_valid_tm + rtnl_is_locked rtnl_lock rtnl_unlock runqueues + __sbitmap_queue_get sched_clock sched_feat_keys sched_feat_names + sched_setattr_nocheck sched_set_fifo sched_set_normal sched_setscheduler sched_setscheduler_nocheck + sched_show_task sched_trace_rd_span sched_uclamp_used schedule schedule_timeout schedule_timeout_interruptible + schedutil_cpu_util + scmi_driver_register + scmi_driver_unregister + scmi_protocol_register scnprintf scsi_autopm_get_device scsi_autopm_put_device + scsi_block_requests scsi_block_when_processing_errors scsi_command_size_tbl scsi_compat_ioctl scsi_device_get scsi_device_put scsi_device_quiesce + __scsi_execute scsi_ioctl scsi_ioctl_block_when_processing_errors __scsi_iterate_devices scsi_normalize_sense __scsi_print_sense + scsi_print_sense_hdr scsi_register_interface scsi_remove_device + scsi_unblock_requests sdev_prefix_printk __sdhci_add_host sdhci_add_host @@ -1506,11 +2190,16 @@ sdhci_set_bus_width sdhci_set_power_noreg sdhci_setup_host + sdio_signal_irq + sdio_writeb_readb + send_sig send_sig_info seq_buf_printf + seq_hex_dump seq_lseek seq_open __seq_open_private + seq_open_private seq_printf seq_putc seq_puts @@ -1518,6 +2207,16 @@ seq_release seq_release_private seq_write + serial8250_do_set_termios + serial8250_do_shutdown + serial8250_do_startup + serial8250_get_port + serial8250_register_8250_port + serial8250_resume_port + serial8250_rpm_get + serial8250_rpm_put + serial8250_suspend_port + serial8250_unregister_port set_cpus_allowed_ptr set_normalized_timespec64 set_page_dirty_lock @@ -1542,7 +2241,9 @@ si_mem_available si_meminfo simple_attr_open + simple_attr_read simple_attr_release + simple_attr_write simple_open simple_read_from_buffer simple_strtol @@ -1552,14 +2253,25 @@ single_release si_swapinfo sk_alloc + skb_add_rx_frag + skb_checksum_help skb_clone + skb_clone_sk + skb_complete_wifi_ack + skb_copy skb_copy_bits skb_copy_datagram_iter + skb_copy_expand skb_dequeue + skb_ensure_writable skb_free_datagram + __skb_get_hash + __skb_gso_segment __skb_pad + skb_pull skb_push skb_put + skb_queue_head skb_queue_purge skb_queue_tail skb_recv_datagram @@ -1568,17 +2280,63 @@ skb_trim sk_free skip_spaces + smp_call_function smp_call_function_single + smp_call_on_cpu + snd_card_add_dev_attr + snd_ctl_boolean_mono_info + snd_jack_set_key + snd_pcm_format_physical_width snd_pcm_format_width + snd_pcm_hw_constraint_integer + snd_pcm_hw_constraint_list + snd_pcm_hw_constraint_mask64 + snd_pcm_hw_constraint_minmax + snd_pcm_hw_constraint_step + snd_pcm_lib_free_pages + snd_pcm_lib_malloc_pages + snd_pcm_lib_preallocate_free_for_all + snd_pcm_lib_preallocate_pages_for_all + snd_pcm_period_elapsed + snd_pcm_set_ops snd_soc_add_component_controls + snd_soc_bytes_info_ext + snd_soc_bytes_tlv_callback + snd_soc_card_jack_new + snd_soc_component_exit_regmap + snd_soc_component_init_regmap + snd_soc_dai_set_sysclk + snd_soc_dapm_add_routes + snd_soc_dapm_disable_pin + snd_soc_dapm_get_enum_double + snd_soc_dapm_get_pin_switch + snd_soc_dapm_get_volsw + snd_soc_dapm_info_pin_switch + snd_soc_dapm_new_controls + snd_soc_dapm_new_widgets + snd_soc_dapm_put_enum_double + snd_soc_dapm_put_pin_switch + snd_soc_dapm_put_volsw + snd_soc_find_dai + snd_soc_get_volsw + snd_soc_info_enum_double snd_soc_info_volsw + snd_soc_jack_report + snd_soc_new_compress + snd_soc_of_get_dai_link_codecs + snd_soc_poweroff + snd_soc_put_volsw snd_soc_register_component + snd_soc_resume + snd_soc_rtdcom_lookup + snd_soc_set_runtime_hwparams snd_soc_unregister_component snd_usb_enable_audio_stream snprintf soc_device_register soc_device_unregister sock_alloc_send_skb + __sock_create sock_create_kern sock_gettstamp sock_init_data @@ -1595,6 +2353,8 @@ sock_unregister sort __spi_alloc_controller + spi_bus_type + spi_finalize_current_transfer spi_register_controller __spi_register_driver spi_setup @@ -1623,7 +2383,10 @@ __stack_chk_fail __stack_chk_guard stack_depot_fetch + stack_trace_save static_key_disable + static_key_slow_dec + static_key_slow_inc stop_machine stop_one_cpu_nowait stpcpy @@ -1632,11 +2395,13 @@ strchr strcmp strcpy + strcspn strim strlcat strlcpy strlen strncasecmp + strncat strnchr strncmp strncpy @@ -1645,18 +2410,23 @@ strnstr strpbrk strrchr + strreplace strscpy strsep strstr + suspend_set_ops + __sw_hweight16 __sw_hweight32 __sw_hweight64 __sw_hweight8 sync_file_create sync_file_get_fence synchronize_irq + synchronize_net synchronize_rcu synchronize_srcu syscon_node_to_regmap + syscon_regmap_lookup_by_compatible syscon_regmap_lookup_by_phandle sysctl_sched_features sysctl_sched_latency @@ -1680,12 +2450,15 @@ sysfs_remove_link_from_group sysfs_streq sysrq_mask + system_freezable_power_efficient_wq system_freezable_wq system_freezing_cnt system_highpri_wq system_power_efficient_wq + system_state system_unbound_wq system_wq + sys_tz task_active_pid_ns __tasklet_hi_schedule tasklet_init @@ -1711,8 +2484,13 @@ thermal_zone_get_zone_by_name thermal_zone_of_sensor_register thermal_zone_of_sensor_unregister + tick_nohz_get_idle_calls_cpu tick_nohz_get_sleep_length time64_to_tm + timecounter_init + timecounter_read + timer_unstable_counter_workaround + timespec64_to_jiffies topology_set_thermal_pressure topology_update_done _totalram_pages @@ -1720,6 +2498,8 @@ trace_array_get_by_name trace_array_put trace_array_set_clr_event + __trace_bprintk + __trace_bputs trace_event_buffer_commit trace_event_buffer_reserve trace_event_ignore_this_pid @@ -1727,25 +2507,35 @@ trace_event_reg trace_handle_return __traceiter_android_rvh_account_irq + __traceiter_android_rvh_after_enqueue_task __traceiter_android_rvh_build_perf_domains __traceiter_android_rvh_can_migrate_task __traceiter_android_rvh_check_preempt_wakeup __traceiter_android_rvh_cpu_cgroup_attach __traceiter_android_rvh_cpu_cgroup_online + __traceiter_android_rvh_cpu_overutilized __traceiter_android_rvh_dequeue_task + __traceiter_android_rvh_dequeue_task_fair __traceiter_android_rvh_enqueue_task + __traceiter_android_rvh_enqueue_task_fair + __traceiter_android_rvh_find_busiest_group __traceiter_android_rvh_find_busiest_queue + __traceiter_android_rvh_find_energy_efficient_cpu __traceiter_android_rvh_find_lowest_rq + __traceiter_android_rvh_finish_prio_fork __traceiter_android_rvh_flush_task __traceiter_android_rvh_force_compatible_post __traceiter_android_rvh_force_compatible_pre __traceiter_android_rvh_gic_v3_set_affinity + __traceiter_android_rvh_media_device_setup_link __traceiter_android_rvh_migrate_queued_task __traceiter_android_rvh_new_task_stats __traceiter_android_rvh_pick_next_entity __traceiter_android_rvh_place_entity + __traceiter_android_rvh_prepare_prio_fork __traceiter_android_rvh_replace_next_task_fair __traceiter_android_rvh_resume_cpus + __traceiter_android_rvh_rtmutex_prepare_setprio __traceiter_android_rvh_sched_cpu_dying __traceiter_android_rvh_sched_cpu_starting __traceiter_android_rvh_sched_exec @@ -1759,21 +2549,29 @@ __traceiter_android_rvh_select_task_rq_rt __traceiter_android_rvh_set_gfp_zone_flags __traceiter_android_rvh_set_readahead_gfp_mask + __traceiter_android_rvh_setscheduler __traceiter_android_rvh_set_skip_swapcache_flags __traceiter_android_rvh_set_task_cpu + __traceiter_android_rvh_set_user_nice __traceiter_android_rvh_show_max_freq __traceiter_android_rvh_tick_entry __traceiter_android_rvh_try_to_wake_up __traceiter_android_rvh_try_to_wake_up_success __traceiter_android_rvh_ttwu_cond + __traceiter_android_rvh_uclamp_eff_get __traceiter_android_rvh_update_cpu_capacity __traceiter_android_rvh_update_cpus_allowed __traceiter_android_rvh_update_misfit_status + __traceiter_android_rvh_v4l2subdev_set_fmt + __traceiter_android_rvh_v4l2subdev_set_frame_interval + __traceiter_android_rvh_v4l2subdev_set_selection __traceiter_android_rvh_wake_up_new_task __traceiter_android_vh_account_task_time __traceiter_android_vh_allow_domain_state + __traceiter_android_vh_alter_futex_plist_add __traceiter_android_vh_alter_mutex_list_add __traceiter_android_vh_alter_rwsem_list_add + __traceiter_android_vh_arch_set_freq_scale __traceiter_android_vh_binder_alloc_new_buf_locked __traceiter_android_vh_binder_preset __traceiter_android_vh_binder_priority_skip @@ -1781,16 +2579,28 @@ __traceiter_android_vh_binder_restore_priority __traceiter_android_vh_binder_set_priority __traceiter_android_vh_binder_trans + __traceiter_android_vh_binder_transaction_init __traceiter_android_vh_binder_wait_for_work __traceiter_android_vh_binder_wakeup_ilocked __traceiter_android_vh_build_sched_domains + __traceiter_android_vh_cgroup_set_task + __traceiter_android_vh_check_bpf_syscall + __traceiter_android_vh_check_file_open + __traceiter_android_vh_check_mmap_file __traceiter_android_vh_check_uninterruptible_tasks __traceiter_android_vh_check_uninterruptible_tasks_dn + __traceiter_android_vh_clear_mask_adjust + __traceiter_android_vh_clear_reserved_fmt_fields + __traceiter_android_vh_commit_creds __traceiter_android_vh_cpu_idle_enter __traceiter_android_vh_cpu_idle_exit __traceiter_android_vh_do_send_sig_info + __traceiter_android_vh_em_cpu_energy __traceiter_android_vh_exclude_reserved_zone + __traceiter_android_vh_exit_creds __traceiter_android_vh_exit_mm + __traceiter_android_vh_fill_ext_fmtdesc + __traceiter_android_vh_finish_update_load_avg_se __traceiter_android_vh_ftrace_dump_buffer __traceiter_android_vh_ftrace_format_check __traceiter_android_vh_ftrace_oops_enter @@ -1799,35 +2609,64 @@ __traceiter_android_vh_get_from_fragment_pool __traceiter_android_vh_gpio_block_read __traceiter_android_vh_include_reserved_zone + __traceiter_android_vh_iommu_alloc_iova + __traceiter_android_vh_iommu_free_iova __traceiter_android_vh_iommu_setup_dma_ops __traceiter_android_vh_ipi_stop + __traceiter_android_vh_ipv6_gen_linklocal_addr __traceiter_android_vh_jiffies_update + __traceiter_android_vh_kmalloc_slab __traceiter_android_vh_logbuf __traceiter_android_vh_mutex_unlock_slowpath __traceiter_android_vh_mutex_wait_finish __traceiter_android_vh_mutex_wait_start + __traceiter_android_vh_override_creds + __traceiter_android_vh_prepare_update_load_avg_se __traceiter_android_vh_printk_hotplug __traceiter_android_vh_process_killed + __traceiter_android_vh_revert_creds + __traceiter_android_vh_rwsem_init __traceiter_android_vh_rwsem_wake __traceiter_android_vh_rwsem_wake_finish + __traceiter_android_vh_rwsem_write_finished + __traceiter_android_vh_save_track_hash + __traceiter_android_vh_save_vmalloc_stack __traceiter_android_vh_scheduler_tick + __traceiter_android_vh_selinux_avc_insert + __traceiter_android_vh_selinux_avc_lookup + __traceiter_android_vh_selinux_avc_node_delete + __traceiter_android_vh_selinux_avc_node_replace + __traceiter_android_vh_selinux_is_initialized + __traceiter_android_vh_set_memory_nx + __traceiter_android_vh_set_memory_ro + __traceiter_android_vh_set_memory_rw + __traceiter_android_vh_set_memory_x + __traceiter_android_vh_set_module_permit_after_init + __traceiter_android_vh_set_module_permit_before_init + __traceiter_android_vh_setscheduler_uclamp + __traceiter_android_vh_set_wake_flags __traceiter_android_vh_show_max_freq __traceiter_android_vh_show_resume_epoch_val + __traceiter_android_vh_show_stack_hash __traceiter_android_vh_show_suspend_epoch_val __traceiter_android_vh_sync_txn_recvd + __traceiter_android_vh_syscall_prctl_finished __traceiter_android_vh_timer_calc_index __traceiter_android_vh_tune_inactive_ratio __traceiter_android_vh_tune_swappiness __traceiter_android_vh_ufs_compl_command __traceiter_android_vh_ufs_send_command + __traceiter_android_vh_ufs_send_tm_command __traceiter_android_vh_update_topology_flags_workfn __traceiter_binder_transaction_received + __traceiter_cpu_frequency __traceiter_cpu_frequency_limits __traceiter_dma_fence_emit __traceiter_gpu_mem_total __traceiter_ipi_entry __traceiter_ipi_raise __traceiter_irq_handler_entry + __traceiter_pelt_se_tp __traceiter_rwmmio_post_read __traceiter_rwmmio_read __traceiter_rwmmio_write @@ -1836,28 +2675,41 @@ __traceiter_sched_stat_iowait __traceiter_sched_stat_wait __traceiter_sched_switch + __traceiter_sched_update_nr_running_tp __traceiter_suspend_resume + __traceiter_task_newtask __traceiter_task_rename + __traceiter_xhci_urb_giveback __tracepoint_android_rvh_account_irq + __tracepoint_android_rvh_after_enqueue_task __tracepoint_android_rvh_build_perf_domains __tracepoint_android_rvh_can_migrate_task __tracepoint_android_rvh_check_preempt_wakeup __tracepoint_android_rvh_cpu_cgroup_attach __tracepoint_android_rvh_cpu_cgroup_online + __tracepoint_android_rvh_cpu_overutilized __tracepoint_android_rvh_dequeue_task + __tracepoint_android_rvh_dequeue_task_fair __tracepoint_android_rvh_enqueue_task + __tracepoint_android_rvh_enqueue_task_fair + __tracepoint_android_rvh_find_busiest_group __tracepoint_android_rvh_find_busiest_queue + __tracepoint_android_rvh_find_energy_efficient_cpu __tracepoint_android_rvh_find_lowest_rq + __tracepoint_android_rvh_finish_prio_fork __tracepoint_android_rvh_flush_task __tracepoint_android_rvh_force_compatible_post __tracepoint_android_rvh_force_compatible_pre __tracepoint_android_rvh_gic_v3_set_affinity + __tracepoint_android_rvh_media_device_setup_link __tracepoint_android_rvh_migrate_queued_task __tracepoint_android_rvh_new_task_stats __tracepoint_android_rvh_pick_next_entity __tracepoint_android_rvh_place_entity + __tracepoint_android_rvh_prepare_prio_fork __tracepoint_android_rvh_replace_next_task_fair __tracepoint_android_rvh_resume_cpus + __tracepoint_android_rvh_rtmutex_prepare_setprio __tracepoint_android_rvh_sched_cpu_dying __tracepoint_android_rvh_sched_cpu_starting __tracepoint_android_rvh_sched_exec @@ -1871,21 +2723,29 @@ __tracepoint_android_rvh_select_task_rq_rt __tracepoint_android_rvh_set_gfp_zone_flags __tracepoint_android_rvh_set_readahead_gfp_mask + __tracepoint_android_rvh_setscheduler __tracepoint_android_rvh_set_skip_swapcache_flags __tracepoint_android_rvh_set_task_cpu + __tracepoint_android_rvh_set_user_nice __tracepoint_android_rvh_show_max_freq __tracepoint_android_rvh_tick_entry __tracepoint_android_rvh_try_to_wake_up __tracepoint_android_rvh_try_to_wake_up_success __tracepoint_android_rvh_ttwu_cond + __tracepoint_android_rvh_uclamp_eff_get __tracepoint_android_rvh_update_cpu_capacity __tracepoint_android_rvh_update_cpus_allowed __tracepoint_android_rvh_update_misfit_status + __tracepoint_android_rvh_v4l2subdev_set_fmt + __tracepoint_android_rvh_v4l2subdev_set_frame_interval + __tracepoint_android_rvh_v4l2subdev_set_selection __tracepoint_android_rvh_wake_up_new_task __tracepoint_android_vh_account_task_time __tracepoint_android_vh_allow_domain_state + __tracepoint_android_vh_alter_futex_plist_add __tracepoint_android_vh_alter_mutex_list_add __tracepoint_android_vh_alter_rwsem_list_add + __tracepoint_android_vh_arch_set_freq_scale __tracepoint_android_vh_binder_alloc_new_buf_locked __tracepoint_android_vh_binder_preset __tracepoint_android_vh_binder_priority_skip @@ -1893,16 +2753,28 @@ __tracepoint_android_vh_binder_restore_priority __tracepoint_android_vh_binder_set_priority __tracepoint_android_vh_binder_trans + __tracepoint_android_vh_binder_transaction_init __tracepoint_android_vh_binder_wait_for_work __tracepoint_android_vh_binder_wakeup_ilocked __tracepoint_android_vh_build_sched_domains + __tracepoint_android_vh_cgroup_set_task + __tracepoint_android_vh_check_bpf_syscall + __tracepoint_android_vh_check_file_open + __tracepoint_android_vh_check_mmap_file __tracepoint_android_vh_check_uninterruptible_tasks __tracepoint_android_vh_check_uninterruptible_tasks_dn + __tracepoint_android_vh_clear_mask_adjust + __tracepoint_android_vh_clear_reserved_fmt_fields + __tracepoint_android_vh_commit_creds __tracepoint_android_vh_cpu_idle_enter __tracepoint_android_vh_cpu_idle_exit __tracepoint_android_vh_do_send_sig_info + __tracepoint_android_vh_em_cpu_energy __tracepoint_android_vh_exclude_reserved_zone + __tracepoint_android_vh_exit_creds __tracepoint_android_vh_exit_mm + __tracepoint_android_vh_fill_ext_fmtdesc + __tracepoint_android_vh_finish_update_load_avg_se __tracepoint_android_vh_ftrace_dump_buffer __tracepoint_android_vh_ftrace_format_check __tracepoint_android_vh_ftrace_oops_enter @@ -1911,35 +2783,64 @@ __tracepoint_android_vh_get_from_fragment_pool __tracepoint_android_vh_gpio_block_read __tracepoint_android_vh_include_reserved_zone + __tracepoint_android_vh_iommu_alloc_iova + __tracepoint_android_vh_iommu_free_iova __tracepoint_android_vh_iommu_setup_dma_ops __tracepoint_android_vh_ipi_stop + __tracepoint_android_vh_ipv6_gen_linklocal_addr __tracepoint_android_vh_jiffies_update + __tracepoint_android_vh_kmalloc_slab __tracepoint_android_vh_logbuf __tracepoint_android_vh_mutex_unlock_slowpath __tracepoint_android_vh_mutex_wait_finish __tracepoint_android_vh_mutex_wait_start + __tracepoint_android_vh_override_creds + __tracepoint_android_vh_prepare_update_load_avg_se __tracepoint_android_vh_printk_hotplug __tracepoint_android_vh_process_killed + __tracepoint_android_vh_revert_creds + __tracepoint_android_vh_rwsem_init __tracepoint_android_vh_rwsem_wake __tracepoint_android_vh_rwsem_wake_finish + __tracepoint_android_vh_rwsem_write_finished + __tracepoint_android_vh_save_track_hash + __tracepoint_android_vh_save_vmalloc_stack __tracepoint_android_vh_scheduler_tick + __tracepoint_android_vh_selinux_avc_insert + __tracepoint_android_vh_selinux_avc_lookup + __tracepoint_android_vh_selinux_avc_node_delete + __tracepoint_android_vh_selinux_avc_node_replace + __tracepoint_android_vh_selinux_is_initialized + __tracepoint_android_vh_set_memory_nx + __tracepoint_android_vh_set_memory_ro + __tracepoint_android_vh_set_memory_rw + __tracepoint_android_vh_set_memory_x + __tracepoint_android_vh_set_module_permit_after_init + __tracepoint_android_vh_set_module_permit_before_init + __tracepoint_android_vh_setscheduler_uclamp + __tracepoint_android_vh_set_wake_flags __tracepoint_android_vh_show_max_freq __tracepoint_android_vh_show_resume_epoch_val + __tracepoint_android_vh_show_stack_hash __tracepoint_android_vh_show_suspend_epoch_val __tracepoint_android_vh_sync_txn_recvd + __tracepoint_android_vh_syscall_prctl_finished __tracepoint_android_vh_timer_calc_index __tracepoint_android_vh_tune_inactive_ratio __tracepoint_android_vh_tune_swappiness __tracepoint_android_vh_ufs_compl_command __tracepoint_android_vh_ufs_send_command + __tracepoint_android_vh_ufs_send_tm_command __tracepoint_android_vh_update_topology_flags_workfn __tracepoint_binder_transaction_received + __tracepoint_cpu_frequency __tracepoint_cpu_frequency_limits __tracepoint_dma_fence_emit __tracepoint_gpu_mem_total __tracepoint_ipi_entry __tracepoint_ipi_raise __tracepoint_irq_handler_entry + __tracepoint_pelt_se_tp tracepoint_probe_register tracepoint_probe_register_prio tracepoint_probe_unregister @@ -1951,23 +2852,50 @@ __tracepoint_sched_stat_iowait __tracepoint_sched_stat_wait __tracepoint_sched_switch + __tracepoint_sched_update_nr_running_tp + tracepoint_srcu __tracepoint_suspend_resume + __tracepoint_task_newtask __tracepoint_task_rename + __tracepoint_xhci_urb_giveback trace_print_array_seq trace_print_flags_seq + trace_print_hex_seq trace_print_symbols_seq + __trace_puts trace_raw_output_prep trace_seq_printf trace_seq_putc + tracing_off try_module_get try_wait_for_completion tty_flip_buffer_push __tty_insert_flip_char tty_insert_flip_string_fixed_flag + tty_termios_baud_rate + tty_termios_encode_baud_rate + typec_get_drvdata + typec_mux_get_drvdata + typec_mux_register + typec_mux_set + typec_mux_unregister + typec_partner_set_identity + typec_register_partner + typec_register_port + typec_set_data_role + typec_set_orientation + typec_set_pwr_opmode + typec_set_pwr_role + typec_set_vconn_role + typec_switch_get_drvdata + typec_switch_register + typec_switch_unregister + typec_unregister_partner uart_add_one_port uart_console_device uart_console_write uart_get_baud_rate + uart_get_divisor uart_insert_char uart_parse_options uart_register_driver @@ -1989,21 +2917,30 @@ ucsi_unregister __udelay ufshcd_auto_hibern8_update + ufshcd_delay_us ufshcd_dme_get_attr ufshcd_dme_set_attr ufshcd_dump_regs ufshcd_fixup_dev_quirks ufshcd_get_local_unipro_ver + ufshcd_get_pwr_dev_param + ufshcd_hba_enable + ufshcd_hba_stop ufshcd_hold + ufshcd_link_recovery + ufshcd_make_hba_operational ufshcd_pltfrm_init ufshcd_pltfrm_resume ufshcd_pltfrm_runtime_idle ufshcd_pltfrm_runtime_resume ufshcd_pltfrm_runtime_suspend + ufshcd_pltfrm_shutdown ufshcd_pltfrm_suspend ufshcd_query_attr + ufshcd_query_attr_retry ufshcd_query_descriptor_retry ufshcd_query_flag + ufshcd_read_desc_param ufshcd_release ufshcd_remove ufshcd_shutdown @@ -2012,15 +2949,27 @@ __uio_register_device uio_unregister_device unlock_page + unpin_user_page + unpin_user_pages unregister_blkdev __unregister_chrdev unregister_chrdev_region unregister_console unregister_die_notifier unregister_ftrace_export + unregister_inet6addr_notifier + unregister_inetaddr_notifier + unregister_kprobe unregister_kretprobe unregister_module_notifier + unregister_netdev + unregister_netdevice_many + unregister_netdevice_notifier + unregister_netdevice_queue unregister_net_sysctl_table + unregister_oom_notifier + unregister_pernet_device + unregister_pernet_subsys unregister_pm_notifier unregister_reboot_notifier unregister_restart_handler @@ -2028,18 +2977,33 @@ unregister_shrinker unregister_syscore_ops unregister_sysctl_table + unregister_virtio_device + unregister_virtio_driver + up update_devfreq update_rq_clock up_read up_write + usb_add_config + usb_add_function + usb_add_gadget_udc + usb_add_hcd usb_add_phy_dev usb_alloc_coherent usb_alloc_dev usb_alloc_urb usb_assign_descriptors + usb_composite_probe usb_composite_setup_continue + usb_composite_unregister usb_control_msg + usb_copy_descriptors + usb_create_hcd + usb_create_shared_hcd + usb_debug_root + usb_del_gadget_udc usb_deregister + usb_disabled usb_ep_alloc_request usb_ep_autoconfig usb_ep_dequeue @@ -2048,23 +3012,70 @@ usb_ep_free_request usb_ep_queue usb_ep_set_halt + usb_ep_set_maxpacket_limit usb_find_common_endpoints usb_free_all_descriptors usb_free_coherent usb_free_urb usb_function_register usb_function_unregister + usb_gadget_connect + usb_gadget_disconnect + usb_gadget_giveback_request + usb_gadget_map_request + usb_gadget_probe_driver + usb_gadget_set_selfpowered + usb_gadget_set_state + usb_gadget_unmap_request usb_gadget_wakeup + usb_get_dr_mode + usb_get_function + usb_get_function_instance + usb_get_maximum_speed + usb_hcd_is_primary_hcd + usb_hcd_poll_rh_status usb_ifnum_to_if usb_interface_id + usbnet_change_mtu + usbnet_disconnect + usbnet_get_drvinfo + usbnet_get_endpoints + usbnet_get_link + usbnet_get_link_ksettings + usbnet_get_msglevel + usbnet_get_stats64 + usbnet_link_change + usbnet_nway_reset + usbnet_open + usbnet_probe + usbnet_read_cmd + usbnet_read_cmd_nopm + usbnet_resume + usbnet_set_link_ksettings + usbnet_set_msglevel + usbnet_skb_return + usbnet_start_xmit + usbnet_stop + usbnet_suspend + usbnet_tx_timeout + usbnet_unlink_rx_urbs + usbnet_update_max_qlen + usbnet_write_cmd + usbnet_write_cmd_async + usbnet_write_cmd_nopm usb_phy_set_charger_current usb_poison_urb usb_put_dev + usb_put_function usb_put_function_instance + usb_put_hcd usb_register_driver usb_register_notify + usb_remove_function + usb_remove_hcd usb_remove_phy usb_role_switch_find_by_fwnode + usb_role_switch_get usb_role_switch_get_drvdata usb_role_switch_register usb_role_switch_set_role @@ -2076,53 +3087,190 @@ usb_unregister_notify __usecs_to_jiffies usleep_range + uuid_null + v4l2_async_notifier_add_fwnode_subdev + v4l2_async_notifier_add_subdev + v4l2_async_notifier_cleanup + v4l2_async_notifier_init + v4l2_async_notifier_register + v4l2_async_notifier_unregister + v4l2_async_register_subdev + v4l2_async_subdev_notifier_register + v4l2_async_unregister_subdev v4l2_compat_ioctl32 + v4l2_ctrl_find + v4l2_ctrl_g_ctrl + v4l2_ctrl_g_ctrl_int64 v4l2_ctrl_handler_free + v4l2_ctrl_handler_init_class + v4l2_ctrl_handler_setup + __v4l2_ctrl_modify_range + v4l2_ctrl_new_custom + v4l2_ctrl_new_std + v4l2_ctrl_new_std_menu + v4l2_ctrl_new_std_menu_items + v4l2_ctrl_request_complete + v4l2_ctrl_request_setup + __v4l2_ctrl_s_ctrl + v4l2_ctrl_subdev_subscribe_event + v4l2_ctrl_subscribe_event v4l2_device_register + v4l2_device_register_subdev + __v4l2_device_register_subdev_nodes v4l2_device_unregister + v4l2_device_unregister_subdev + v4l2_event_queue + v4l2_event_queue_fh + v4l2_event_subdev_unsubscribe + v4l2_event_subscribe + v4l2_event_unsubscribe + v4l2_fh_add + v4l2_fh_del + v4l2_fh_exit + v4l2_fh_init + v4l2_fh_is_singular + v4l2_fh_open + __v4l2_find_nearest_size + v4l2_format_info + v4l2_i2c_subdev_init + v4l2_m2m_buf_copy_metadata + v4l2_m2m_buf_queue + v4l2_m2m_buf_remove + v4l2_m2m_ctx_init + v4l2_m2m_ctx_release + v4l2_m2m_dqbuf + v4l2_m2m_fop_mmap + v4l2_m2m_fop_poll + v4l2_m2m_get_curr_priv + v4l2_m2m_get_vq + v4l2_m2m_init + v4l2_m2m_ioctl_create_bufs + v4l2_m2m_ioctl_dqbuf + v4l2_m2m_ioctl_expbuf + v4l2_m2m_ioctl_prepare_buf + v4l2_m2m_ioctl_qbuf + v4l2_m2m_ioctl_querybuf + v4l2_m2m_ioctl_reqbufs + v4l2_m2m_ioctl_streamoff + v4l2_m2m_ioctl_streamon + v4l2_m2m_job_finish + v4l2_m2m_next_buf + v4l2_m2m_qbuf + v4l2_m2m_register_media_controller + v4l2_m2m_release + v4l2_m2m_request_queue + v4l2_m2m_resume + v4l2_m2m_streamoff + v4l2_m2m_suspend + v4l2_m2m_try_schedule + v4l2_m2m_unregister_media_controller + v4l2_pipeline_link_notify + v4l2_src_change_event_subscribe + v4l2_subdev_call_wrappers + v4l2_subdev_init + v4l2_subdev_link_validate + v4l2_subdev_link_validate_default + v4l_bound_align_image vabits_actual + vb2_buffer_done + vb2_common_vm_ops + vb2_create_framevec + vb2_destroy_framevec + vb2_dma_contig_memops + vb2_fop_mmap + vb2_fop_poll + vb2_fop_release + vb2_ioctl_create_bufs + vb2_ioctl_dqbuf + vb2_ioctl_expbuf + vb2_ioctl_prepare_buf + vb2_ioctl_qbuf + vb2_ioctl_querybuf + vb2_ioctl_reqbufs + vb2_ioctl_streamoff + vb2_ioctl_streamon + vb2_ops_wait_finish + vb2_ops_wait_prepare + vb2_plane_cookie + vb2_plane_vaddr + vb2_queue_init + vb2_queue_release + vb2_request_object_is_buffer + vb2_request_queue + vb2_request_validate vchan_dma_desc_free_list vchan_find_desc vchan_init vchan_tx_desc_free vchan_tx_submit + verify_pkcs7_signature vfree vfs_fsync video_devdata + video_device_alloc + video_device_release video_device_release_empty video_ioctl2 __video_register_device video_unregister_device + virtqueue_add_inbuf + virtqueue_add_outbuf + virtqueue_detach_unused_buf + virtqueue_get_buf + virtqueue_get_vring_size + virtqueue_kick + virtqueue_kick_prepare + virtqueue_notify vmalloc vmalloc_nr_pages vmalloc_to_page vmalloc_to_pfn + vmalloc_user vmap + vm_event_states vmf_insert_pfn + vm_get_page_prot vm_insert_page vm_iomap_memory vm_map_pages + vm_map_ram vm_node_stat vm_unmapped_area + vm_unmap_ram vm_zone_stat + vring_del_virtqueue + vring_interrupt + vring_new_virtqueue vscnprintf vsnprintf + vsprintf vunmap vzalloc wait_for_completion wait_for_completion_interruptible wait_for_completion_interruptible_timeout + wait_for_completion_io_timeout wait_for_completion_killable wait_for_completion_killable_timeout wait_for_completion_timeout + wait_woken __wake_up wake_up_if_idle + __wake_up_locked wake_up_process wakeup_source_add + wakeup_source_create + wakeup_source_destroy wakeup_source_register wakeup_source_remove wakeup_source_unregister __warn_printk + watchdog_init_timeout + watchdog_set_restart_priority + wireless_nlevent_flush + woken_wake_function + work_busy + work_on_cpu ww_mutex_lock ww_mutex_unlock __xa_alloc @@ -2132,11 +3280,18 @@ xa_find_after xa_load xa_store + xhci_add_endpoint xhci_alloc_command xhci_alloc_erst + xhci_check_bandwidth + xhci_drop_endpoint xhci_free_command + xhci_gen_setup xhci_get_endpoint_index + xhci_get_ep_ctx + xhci_init_driver xhci_queue_stop_endpoint + xhci_reset_bandwidth xhci_ring_alloc xhci_ring_cmd_db xhci_ring_free diff --git a/android/abi_gki_aarch64_qcom b/android/abi_gki_aarch64_qcom index ad24f569f97a..7877587eee69 100644 --- a/android/abi_gki_aarch64_qcom +++ b/android/abi_gki_aarch64_qcom @@ -1784,6 +1784,8 @@ platform_get_resource platform_get_resource_byname platform_irq_count + platform_msi_domain_alloc_irqs + platform_msi_domain_free_irqs pm_clk_add pm_clk_create pm_clk_destroy @@ -1958,6 +1960,7 @@ register_kretprobe register_memory_notifier register_module_notifier + register_qdisc register_netdev register_netdevice register_netdevice_notifier @@ -2086,8 +2089,10 @@ rproc_remove_subdev rproc_report_crash rproc_shutdown + rtc_ktime_to_tm __rtc_register_device rtc_time64_to_tm + rtc_tm_to_ktime rtc_tm_to_time64 rtc_update_irq rt_mutex_lock @@ -2810,6 +2815,7 @@ unregister_oom_notifier unregister_pernet_device unregister_pm_notifier + unregister_qdisc unregister_reboot_notifier unregister_restart_handler unregister_rpmsg_driver @@ -2983,6 +2989,8 @@ vprintk vscnprintf vsnprintf + vsock_addr_init + vsock_remove_sock vunmap vzalloc wait_for_completion diff --git a/android/abi_gki_aarch64_rockchip b/android/abi_gki_aarch64_rockchip index 6c4b0be95bf0..5981963cf68d 100644 --- a/android/abi_gki_aarch64_rockchip +++ b/android/abi_gki_aarch64_rockchip @@ -1,286 +1,47 @@ [abi_symbol_list] - __ClearPageMovable - __SetPageMovable - ___ratelimit +# commonly used symbols + add_uevent_var + aes_encrypt + alloc_chrdev_region __alloc_disk_node __alloc_pages_nodemask - __alloc_percpu - __alloc_percpu_gfp - __alloc_skb + alloc_workqueue __arch_copy_from_user __arch_copy_to_user - __arm_smccc_hvc - __arm_smccc_smc - __bitmap_and - __bitmap_andnot - __bitmap_clear - __bitmap_set - __bitmap_weight - __blk_rq_map_sg - __cfi_slowpath - __check_object_size - __class_create - __class_register - __clk_get_name - __const_udelay - __cpu_online_mask - __cpu_possible_mask - __cpufreq_driver_target - __cpuhp_remove_state - __cpuhp_setup_state - __cpuhp_state_add_instance - __cpuhp_state_remove_instance - __crypto_memneq - __crypto_xor - __dev_kfree_skb_any - __devm_iio_device_register - __devm_of_phy_provider_register - __devm_regmap_init - __devm_regmap_init_i2c - __devm_regmap_init_mmio_clk - __devm_reset_control_get - __do_once_done - __do_once_start - __drm_err - __fdget - __free_pages - __get_free_pages - __getblk_gfp - __i2c_smbus_xfer - __i2c_transfer - __init_rwsem - __init_swait_queue_head - __init_waitqueue_head - __ioremap - __ipv6_addr_type - __kfifo_alloc - __kfifo_free - __kfifo_in - __kfifo_out - __kfifo_to_user - __kmalloc - __list_add_valid - __list_del_entry_valid - __lock_buffer - __lock_page - __log_post_read_mmio - __log_read_mmio - __log_write_mmio - __mdiobus_register - __memcpy_fromio - __memcpy_toio - __memset_io - __module_get - __msecs_to_jiffies - __mutex_init - __napi_alloc_skb - __napi_schedule - __netdev_alloc_skb - __netif_napi_del - __num_online_cpus - __of_reset_control_get - __page_pinner_migration_failed - __pci_register_driver - __per_cpu_offset - __platform_driver_register - __pm_runtime_disable - __pm_runtime_idle - __pm_runtime_resume - __pm_runtime_set_status - __pm_runtime_suspend - __pm_runtime_use_autosuspend - __printk_ratelimit - __pskb_pull_tail - __put_net - __put_page - __put_task_struct - __rcu_read_lock - __rcu_read_unlock - __refrigerator - __register_chrdev - __rtc_register_device - __scsi_add_device - __scsi_execute - __scsi_print_sense - __sdhci_add_host - __sg_page_iter_next - __sg_page_iter_start - __sock_create - __spi_alloc_controller - __spi_register_driver - __srcu_read_unlock - __stack_chk_fail - __stack_chk_guard - __sw_hweight64 - __sysfs_match_string - __task_pid_nr_ns - __tasklet_hi_schedule - __tasklet_schedule - __traceiter_rwmmio_post_read - __traceiter_rwmmio_read - __traceiter_rwmmio_write - __tracepoint_rwmmio_post_read - __tracepoint_rwmmio_read - __tracepoint_rwmmio_write - __tty_insert_flip_char - __unregister_chrdev - __usecs_to_jiffies - __v4l2_ctrl_modify_range - __v4l2_find_nearest_size - __wait_on_buffer - __wake_up - __warn_printk - _copy_from_iter_full - _copy_to_iter - _ctype - _dev_crit - _dev_err - _dev_info - _dev_warn - _raw_read_lock - _raw_read_lock_bh - _raw_read_lock_irqsave - _raw_read_unlock - _raw_read_unlock_bh - _raw_read_unlock_irqrestore - _raw_spin_lock - _raw_spin_lock_bh - _raw_spin_lock_irq - _raw_spin_lock_irqsave - _raw_spin_trylock - _raw_spin_trylock_bh - _raw_spin_unlock - _raw_spin_unlock_bh - _raw_spin_unlock_irq - _raw_spin_unlock_irqrestore - _raw_write_lock - _raw_write_lock_bh - _raw_write_lock_irq - _raw_write_lock_irqsave - _raw_write_unlock - _raw_write_unlock_bh - _raw_write_unlock_irq - _raw_write_unlock_irqrestore - add_timer - add_uevent_var - add_wait_queue - aes_encrypt - aes_expandkey - alloc_anon_inode - alloc_chrdev_region - alloc_etherdev_mqs - alloc_netdev_mqs - alloc_pages_exact - alloc_workqueue - amba_driver_register - amba_driver_unregister - arc4_crypt - arc4_setkey arm64_const_caps_ready arm64_use_ng_mappings - async_schedule_node + __arm_smccc_smc atomic_notifier_chain_register - atomic_notifier_chain_unregister - autoremove_wake_function - backlight_device_register - backlight_device_unregister - bcmp - bd_set_nr_sectors bdget_disk bdput - bio_endio - bitmap_find_next_zero_area_off - bitmap_free - bitmap_zalloc - blk_alloc_queue blk_cleanup_queue - blk_execute_rq blk_execute_rq_nowait - blk_freeze_queue_start - blk_get_queue - blk_get_request - blk_mq_alloc_request - blk_mq_alloc_request_hctx - blk_mq_alloc_tag_set - blk_mq_complete_request - blk_mq_complete_request_remote - blk_mq_delay_kick_requeue_list - blk_mq_end_request blk_mq_free_request - blk_mq_free_tag_set - blk_mq_freeze_queue - blk_mq_freeze_queue_wait - blk_mq_freeze_queue_wait_timeout blk_mq_init_queue - blk_mq_map_queues - blk_mq_pci_map_queues blk_mq_quiesce_queue - blk_mq_requeue_request - blk_mq_start_request - blk_mq_tag_to_rq blk_mq_tagset_busy_iter blk_mq_tagset_wait_completed_request - blk_mq_unfreeze_queue - blk_mq_unique_tag blk_mq_unquiesce_queue - blk_mq_update_nr_hw_queues - blk_poll - blk_put_queue - blk_put_request - blk_queue_chunk_sectors - blk_queue_dma_alignment blk_queue_flag_clear blk_queue_flag_set - blk_queue_flag_test_and_set blk_queue_io_min blk_queue_io_opt blk_queue_logical_block_size blk_queue_max_discard_sectors - blk_queue_max_discard_segments - blk_queue_max_hw_sectors - blk_queue_max_segments blk_queue_max_write_zeroes_sectors blk_queue_physical_block_size - blk_queue_virt_boundary - blk_queue_write_cache - blk_rq_map_kern blk_rq_map_user - blk_rq_map_user_iov blk_rq_unmap_user - blk_set_queue_dying - blk_status_to_errno - blk_sync_queue - blk_verify_command - bpf_trace_run1 - bpf_trace_run2 - bpf_trace_run3 - bpf_trace_run4 - bpf_trace_run5 - bpf_trace_run6 - bpf_trace_run7 - bt_err - bus_register - bus_register_notifier - bus_unregister - bus_unregister_notifier - call_netdevice_notifiers - call_rcu - cancel_delayed_work cancel_delayed_work_sync cancel_work_sync capable - cdev_add - cdev_alloc - cdev_del cdev_device_add cdev_device_del cdev_init - ce_aes_expandkey + __cfi_slowpath + __check_object_size + __class_create class_destroy - class_find_device - class_interface_unregister - class_unregister - cleanup_srcu_struct clk_bulk_disable clk_bulk_enable clk_bulk_prepare @@ -288,372 +49,169 @@ clk_disable clk_enable clk_get + __clk_get_name clk_get_rate clk_hw_get_name - clk_hw_set_rate_range clk_notifier_register clk_notifier_unregister clk_prepare clk_put clk_register clk_round_rate + clk_set_phase clk_set_rate clk_unprepare clk_unregister - cma_alloc - cma_get_name - cma_release compat_ptr_ioctl complete completion_done - consume_skb - contig_page_data + __const_udelay + __cpufreq_driver_target + cpufreq_register_governor + cpufreq_unregister_governor cpu_have_feature + __cpuhp_remove_state + __cpuhp_setup_state cpu_hwcap_keys cpu_hwcaps - cpu_number - cpufreq_cpu_get_raw - cpufreq_enable_boost_support - cpufreq_freq_attr_scaling_available_freqs - cpufreq_freq_attr_scaling_boost_freqs - cpufreq_generic_frequency_table_verify - cpufreq_generic_get - cpufreq_generic_suspend - cpufreq_register_driver - cpufreq_register_governor - cpufreq_table_index_unsorted - cpufreq_unregister_driver - cpufreq_unregister_governor cpumask_next + cpu_number + __cpu_online_mask + __cpu_possible_mask cpus_read_lock cpus_read_unlock - crc32_be - crc32_le - crypto_aead_decrypt - crypto_aead_encrypt - crypto_aead_setauthsize - crypto_aead_setkey - crypto_ahash_digest - crypto_ahash_setkey - crypto_alloc_aead - crypto_alloc_ahash - crypto_alloc_base - crypto_alloc_shash - crypto_comp_compress - crypto_comp_decompress - crypto_dequeue_request crypto_destroy_tfm - crypto_enqueue_request - crypto_has_alg crypto_inc - crypto_init_queue + __crypto_memneq crypto_register_aead - crypto_register_ahash crypto_register_alg crypto_register_scomp crypto_register_shash - crypto_register_skcipher - crypto_req_done - crypto_sha1_finup - crypto_sha1_update - crypto_shash_final - crypto_shash_setkey - crypto_shash_update crypto_unregister_aead - crypto_unregister_ahash crypto_unregister_alg crypto_unregister_scomp crypto_unregister_shash - crypto_unregister_skcipher - csum_partial - current_time - d_add - d_make_root - datagram_poll - deactivate_locked_super + __crypto_xor debugfs_create_dir debugfs_create_file - debugfs_create_regset32 - debugfs_create_u32 - debugfs_create_x64 debugfs_remove - debugfs_rename - dec_zone_page_state - default_llseek - default_wake_function - deferred_free - del_gendisk - del_timer - del_timer_sync delayed_work_timer_fn - desc_to_gpio + del_gendisk + del_timer_sync destroy_workqueue - dev_close - dev_driver_string + _dev_err dev_err_probe - dev_fetch_sw_netstats + devfreq_recommended_opp dev_fwnode - dev_get_by_name - dev_get_by_name_rcu - dev_get_regmap - dev_open - dev_pm_opp_free_cpufreq_table - dev_pm_opp_get_max_transition_latency - dev_pm_opp_get_opp_count - dev_pm_opp_get_opp_table - dev_pm_opp_get_sharing_cpus - dev_pm_opp_get_suspend_opp_freq - dev_pm_opp_init_cpufreq_table - dev_pm_opp_of_cpumask_add_table - dev_pm_opp_of_cpumask_remove_table - dev_pm_opp_of_get_sharing_cpus - dev_pm_opp_of_register_em - dev_pm_opp_put_opp_table - dev_pm_opp_put_regulators - dev_pm_opp_set_rate - dev_pm_opp_set_regulators - dev_pm_opp_set_sharing_cpus - dev_pm_qos_expose_latency_tolerance - dev_pm_qos_hide_latency_tolerance - dev_pm_qos_update_user_latency_tolerance - dev_printk - dev_queue_xmit - dev_set_name - device_add device_add_disk device_create - device_del device_destroy - device_for_each_child device_get_child_node_count device_get_next_child_node - device_get_phy_mode - device_init_wakeup device_initialize + device_init_wakeup device_property_present - device_property_read_string - device_property_read_string_array device_property_read_u32_array - device_property_read_u8_array - device_register - device_release_driver - device_remove_file_self - device_set_wakeup_capable - device_set_wakeup_enable - device_wakeup_enable + _dev_info devm_add_action - devm_blk_ksm_init devm_clk_bulk_get + devm_clk_bulk_get_all devm_clk_get devm_clk_get_optional devm_clk_hw_register devm_clk_register + devm_devfreq_event_add_edev devm_extcon_dev_allocate devm_extcon_dev_register - devm_extcon_register_notifier - devm_free_irq - devm_get_clk_from_child - devm_gpio_request_one - devm_gpiochip_add_data_with_key + devm_fwnode_gpiod_get_index devm_gpiod_get devm_gpiod_get_index + devm_gpiod_get_index_optional devm_gpiod_get_optional - devm_iio_channel_get - devm_iio_device_alloc devm_input_allocate_device devm_ioremap devm_ioremap_resource - devm_kasprintf devm_kfree devm_kmalloc devm_kmemdup - devm_kstrdup - devm_kvasprintf devm_led_classdev_register_ext - devm_mfd_add_devices devm_nvmem_register devm_of_clk_add_hw_provider + __devm_of_phy_provider_register devm_phy_create - devm_phy_get - devm_pinctrl_register + devm_pinctrl_get devm_platform_get_and_ioremap_resource devm_platform_ioremap_resource devm_power_supply_register devm_pwm_get - devm_regmap_field_alloc + __devm_regmap_init_i2c + __devm_regmap_init_mmio_clk devm_regulator_bulk_get devm_regulator_get devm_regulator_get_optional devm_regulator_register - devm_request_any_context_irq devm_request_threaded_irq devm_reset_control_array_get - devm_rtc_allocate_device + __devm_reset_control_get devm_snd_dmaengine_pcm_register - devm_snd_soc_register_card devm_snd_soc_register_component - devm_spi_register_controller - devm_thermal_zone_of_sensor_register - devm_usb_get_phy + dev_pm_opp_find_freq_ceil + dev_pm_opp_get_opp_count + dev_pm_opp_get_voltage + dev_pm_opp_put + dev_pm_opp_remove devres_add devres_alloc_node devres_free - devres_release + dev_set_name + _dev_warn disable_irq - disk_end_io_acct - disk_start_io_acct dma_alloc_attrs - dma_async_device_register - dma_async_device_unregister - dma_async_tx_descriptor_init dma_buf_export - dma_buf_fd - dma_buf_put - dma_contiguous_default_area dma_free_attrs - dma_get_required_mask - dma_get_slave_channel dma_heap_add - dma_heap_get_dev - dma_heap_get_drvdata dma_heap_get_name - dma_map_page_attrs - dma_map_resource + dmam_alloc_attrs dma_map_sg_attrs - dma_max_mapping_size - dma_pool_alloc - dma_pool_create - dma_pool_destroy - dma_pool_free dma_release_channel dma_request_chan dma_set_coherent_mask dma_set_mask dma_sync_sg_for_cpu dma_sync_sg_for_device - dma_sync_single_for_cpu - dma_sync_single_for_device - dma_unmap_page_attrs - dma_unmap_resource dma_unmap_sg_attrs - dmabuf_page_pool_alloc - dmabuf_page_pool_create - dmabuf_page_pool_destroy - dmabuf_page_pool_free - dmaengine_unmap_put - dmam_alloc_attrs - dmam_free_coherent - down down_read down_write - dput - dql_completed - dql_reset - driver_register driver_unregister drm_add_edid_modes - drm_atomic_helper_connector_destroy_state - drm_atomic_helper_connector_duplicate_state - drm_atomic_helper_connector_reset - drm_bridge_add - drm_bridge_remove - drm_connector_attach_encoder - drm_connector_cleanup - drm_connector_init drm_connector_update_edid_property - drm_detect_hdmi_monitor - drm_display_mode_from_videomode + drm_display_info_set_bus_formats drm_get_edid - drm_hdmi_avi_infoframe_from_display_mode - drm_helper_hpd_irq_event - drm_helper_probe_single_connector_modes - drm_mode_create - drm_mode_duplicate - drm_mode_probed_add - drm_mode_set_name drm_mode_vrefresh - drm_panel_add - drm_panel_disable - drm_panel_init - drm_panel_remove - drm_panel_unprepare - dump_stack enable_irq - eth_commit_mac_addr_change - eth_mac_addr - eth_platform_get_mac_address - eth_prepare_mac_addr_change - eth_type_trans - eth_validate_addr - ether_setup - ethtool_op_get_ts_info - event_triggers_call extcon_get_edev_by_phandle - extcon_get_property extcon_get_state extcon_set_state_sync failure_tracking - fasync_helper find_next_bit find_next_zero_bit - find_vma finish_wait - flush_dcache_page + flush_delayed_work flush_work - flush_workqueue fpsimd_context_busy - fput - free_irq - free_netdev + __free_pages free_pages - free_pages_exact - free_percpu - freezing_slow_path - fsync_bdev - full_name_hash - fwnode_device_is_available - fwnode_get_name - fwnode_graph_get_next_endpoint - fwnode_graph_get_port_parent - fwnode_graph_get_remote_endpoint - fwnode_graph_get_remote_port_parent - fwnode_graph_parse_endpoint fwnode_handle_put - fwnode_property_get_reference_args fwnode_property_present fwnode_property_read_string fwnode_property_read_u32_array - fwnode_property_read_u64_array - gcd - gen_pool_add_owner - gen_pool_alloc_algo_owner - gen_pool_best_fit - gen_pool_create - gen_pool_destroy - gen_pool_dma_alloc_align - gen_pool_dma_zalloc_align - gen_pool_free_owner - gen_pool_set_algo - gen_pool_virt_to_phys - generic_mii_ioctl - genphy_resume - get_cpu_device - get_cpu_idle_time_us get_device - get_kernel_pages - get_random_bytes - get_random_u32 - get_sg_io_hdr - get_zeroed_page - gf128mul_lle gic_nonsecure_priorities - glob_match - gpio_to_desc gpiochip_add_pin_range gpiochip_generic_free gpiochip_generic_request gpiochip_get_data - gpiod_count + gpiod_cansleep gpiod_direction_output gpiod_get_optional gpiod_get_value @@ -661,454 +219,192 @@ gpiod_set_consumer_name gpiod_set_value gpiod_set_value_cansleep - hdmi_audio_infoframe_init - hdmi_audio_infoframe_pack - hdmi_avi_infoframe_pack - hex_asc_upper - hid_add_device - hid_allocate_device hid_debug - hid_destroy_device - hid_input_report - hid_parse_report - hrtimer_cancel - hrtimer_init - hrtimer_start_range_ns - hwrng_register - hwrng_unregister + hid_hw_close + hid_hw_open + hid_hw_start + hid_hw_stop + hid_open_report + __hid_register_driver + __hid_request + hid_unregister_driver + hid_validate_values i2c_adapter_type i2c_add_adapter - i2c_add_numbered_adapter - i2c_bus_type i2c_del_adapter i2c_del_driver - i2c_for_each_dev i2c_get_adapter - i2c_parse_fw_timings i2c_put_adapter i2c_register_driver - i2c_smbus_read_byte - i2c_smbus_read_byte_data + __i2c_smbus_xfer i2c_smbus_xfer i2c_transfer i2c_transfer_buffer_flags - i2c_verify_client - ida_alloc_range - ida_destroy - ida_free idr_alloc idr_destroy idr_find - idr_for_each - idr_get_next idr_preload idr_remove - iio_alloc_pollfunc iio_buffer_init iio_buffer_put - iio_channel_get_all - iio_dealloc_pollfunc - iio_device_attach_buffer - iio_get_channel_type - iio_get_time_ns - iio_push_to_buffers - iio_read_channel_processed - iio_trigger_notify_done - import_iovec - in4_pton - in6_pton - in_egroup_p - inc_zone_page_state - init_net - init_pseudo - init_srcu_struct + __init_rwsem + __init_swait_queue_head init_timer_key - init_uts_ns init_wait_entry - input_alloc_absinfo - input_allocate_device + __init_waitqueue_head input_event - input_free_device - input_mt_init_slots - input_mt_report_slot_state - input_mt_sync_frame + input_ff_create_memless input_register_device input_set_abs_params - input_set_capability - input_unregister_device + __ioremap iounmap - iput - ipv6_stub irq_get_irq_data irq_set_irq_wake - irq_stat - is_vmalloc_addr jiffies - jiffies_to_msecs kasan_flag_enabled - kasprintf - kern_mount - kern_unmount kernel_neon_begin kernel_neon_end - kernel_sendmsg - kernel_sigaction - key_put - keyring_alloc kfree kfree_const - kfree_sensitive - kfree_skb - kill_anon_super - kill_fasync - kimage_voffset + __kmalloc kmalloc_caches - kmalloc_order_trace - kmem_cache_alloc kmem_cache_alloc_trace - kmem_cache_create - kmem_cache_create_usercopy - kmem_cache_destroy - kmem_cache_free - kmemdup - kobject_get - kobject_put - kobject_uevent_env - kstrdup kstrdup_const - kstrndup - kstrtobool - kstrtobool_from_user kstrtoint - kstrtoll - kstrtou16 - kstrtou8 kstrtouint kstrtoull - kthread_cancel_delayed_work_sync - kthread_create_on_node - kthread_create_worker - kthread_delayed_work_timer_fn - kthread_destroy_worker - kthread_mod_delayed_work - kthread_queue_delayed_work ktime_get - ktime_get_coarse_real_ts64 ktime_get_mono_fast_ns - ktime_get_real_ts64 - ktime_get_snapshot - ktime_get_with_offset kvfree kvmalloc_node led_classdev_register_ext led_classdev_unregister - list_sort - lock_sock_nested - lockref_get - loops_per_jiffy - lzo1x_1_compress + led_set_brightness_nosleep + led_trigger_register + led_trigger_unregister + __list_add_valid + __list_del_entry_valid + __log_post_read_mmio + __log_read_mmio + __log_write_mmio lzo1x_decompress_safe - lzorle1x_1_compress - match_int - match_token - mdiobus_alloc_size - mdiobus_free - mdiobus_get_phy - mdiobus_read - mdiobus_unregister - mdiobus_write media_entity_pads_init - memchr - memchr_inv + media_entity_remote_pad memcpy memdup_user - memmove - memparse - mempool_alloc - mempool_alloc_slab - mempool_create - mempool_create_node - mempool_destroy - mempool_free - mempool_free_slab - mempool_kfree - mempool_kmalloc - memremap memset - memset64 memstart_addr - memunmap - mii_check_media - mii_ethtool_get_link_ksettings - mii_ethtool_gset - mii_ethtool_set_link_ksettings - mii_link_ok - mii_nway_restart - mipi_dsi_attach - mipi_dsi_detach - mipi_dsi_driver_register_full - mipi_dsi_driver_unregister - mktime64 - mmc_add_host - mmc_alloc_host - mmc_can_gpio_cd - mmc_cqe_request_done - mmc_detect_change - mmc_free_host - mmc_gpio_get_cd - mmc_gpio_get_ro mmc_of_parse - mmc_regulator_get_supply - mmc_regulator_set_ocr - mmc_regulator_set_vqmmc - mmc_remove_host - mmc_request_done - mmc_send_tuning - mod_delayed_work_on mod_timer module_layout module_put + __msecs_to_jiffies msleep msleep_interruptible - mutex_is_locked + __mutex_init mutex_lock - mutex_lock_interruptible mutex_unlock - n_tty_ioctl_helper - napi_complete_done - napi_disable - napi_gro_receive - napi_schedule_prep - net_ratelimit - netdev_alert - netdev_err - netdev_info - netdev_pick_tx - netdev_update_features - netdev_upper_dev_link - netdev_upper_dev_unlink - netdev_warn - netif_carrier_off - netif_carrier_on - netif_device_attach - netif_device_detach - netif_napi_add - netif_rx - netif_rx_ni - netif_schedule_queue - netif_set_real_num_rx_queues - netif_set_real_num_tx_queues - netif_stacked_transfer_operstate - netif_tx_stop_all_queues - netif_tx_wake_queue - new_inode no_llseek - nonseekable_open - noop_llseek nr_cpu_ids - ns_to_timespec64 + nvmem_cell_put + nvmem_cell_read of_alias_get_id - of_clk_add_hw_provider of_clk_add_provider of_clk_del_provider of_clk_get of_clk_get_by_name - of_clk_hw_onecell_get - of_clk_hw_simple_get of_clk_src_simple_get of_count_phandle_with_args of_device_get_match_data of_device_is_available of_device_is_compatible - of_dma_controller_free - of_dma_controller_register - of_find_device_by_node - of_find_i2c_adapter_by_node + of_find_node_by_name of_find_property of_get_child_by_name - of_get_compatible_child - of_get_mac_address - of_get_named_gpio_flags of_get_next_available_child of_get_next_child of_get_parent of_get_property of_get_regulator_init_data - of_graph_parse_endpoint + of_iomap of_irq_get_byname of_machine_is_compatible of_match_device of_match_node - of_mdiobus_register of_node_name_eq + of_nvmem_cell_get of_parse_phandle - of_parse_phandle_with_args - of_phy_is_fixed_link of_phy_simple_xlate - of_platform_device_create of_property_count_elems_of_size of_property_read_string of_property_read_string_helper of_property_read_u32_index - of_property_read_variable_u16_array of_property_read_variable_u32_array - of_property_read_variable_u8_array - of_pwm_xlate_with_flags - page_endio - page_mapping + of_regulator_match + of_usb_get_dr_mode_by_phy + __page_pinner_migration_failed panic_notifier_list - param_array_ops - param_get_int - param_get_uint param_ops_bool - param_ops_byte - param_ops_charp param_ops_int - param_ops_string param_ops_uint - param_ops_ulong - param_ops_ushort - param_set_uint - pci_alloc_irq_vectors_affinity - pci_device_is_present - pci_disable_device - pci_disable_pcie_error_reporting - pci_enable_device_mem - pci_enable_pcie_error_reporting - pci_free_irq - pci_free_irq_vectors - pci_intx - pci_irq_vector - pci_load_saved_state - pci_match_id - pci_read_config_byte - pci_read_config_dword - pci_read_config_word - pci_release_selected_regions - pci_request_irq - pci_request_selected_regions - pci_restore_state - pci_save_state - pci_select_bars - pci_set_master - pci_set_power_state - pci_unregister_driver - pci_write_config_dword - pci_write_config_word - pcibios_resource_to_bus - pcie_aspm_enabled - pcim_enable_device - perf_trace_buf_alloc - perf_trace_run_bpf_submit + __per_cpu_offset pfn_valid - phy_attached_info - phy_disconnect - phy_ethtool_get_link_ksettings - phy_ethtool_nway_reset - phy_ethtool_set_link_ksettings - phy_exit - phy_init - phy_init_eee - phy_mii_ioctl - phy_power_off - phy_power_on - phy_print_status - phy_reset - phy_set_mode_ext - phy_start - phy_stop - phylink_connect_phy - phylink_create - phylink_destroy - phylink_of_phy_connect - phylink_set_port_modes - pin_user_pages_fast - pinconf_generic_dt_node_to_map pinctrl_dev_get_drvdata - pinctrl_gpio_direction_input - pinctrl_gpio_direction_output - pinctrl_pm_select_default_state - pinctrl_pm_select_sleep_state - pinctrl_utils_free_map - platform_device_put - platform_device_register_full + pinctrl_lookup_state + pinctrl_select_state + __platform_driver_probe + __platform_driver_register platform_driver_unregister platform_get_irq - platform_get_irq_byname - platform_get_irq_byname_optional - platform_get_irq_optional platform_get_resource platform_get_resource_byname pm_power_off + __pm_relax + __pm_runtime_disable pm_runtime_enable - pm_runtime_forbid pm_runtime_force_resume pm_runtime_force_suspend - pm_runtime_get_if_active - pm_runtime_irq_safe + __pm_runtime_idle + __pm_runtime_resume pm_runtime_set_autosuspend_delay - pm_suspend_global_flags - pm_wakeup_dev_event - policy_has_boost_freq - posix_clock_register - posix_clock_unregister + __pm_runtime_set_status + __pm_runtime_suspend + __pm_runtime_use_autosuspend + __pm_stay_awake power_supply_changed power_supply_get_drvdata - power_supply_register - power_supply_unregister preempt_schedule preempt_schedule_notrace - prepare_to_wait prepare_to_wait_event print_hex_dump printk - proc_create - proc_create_single_data - proc_mkdir - proto_register - proto_unregister - pskb_expand_head put_device put_disk - put_sg_io_hdr + __put_page + __put_task_struct + pwm_adjust_config pwm_apply_state - pwmchip_add - pwmchip_remove queue_delayed_work_on queue_work_on + ___ratelimit rational_best_approximation - rb_erase - rb_first - rb_insert_color - rb_next - rcu_barrier + _raw_spin_lock + _raw_spin_lock_bh + _raw_spin_lock_irqsave + _raw_spin_unlock + _raw_spin_unlock_bh + _raw_spin_unlock_irqrestore rdev_get_drvdata rdev_get_id - read_cache_page refcount_warn_saturate regcache_cache_only regcache_mark_dirty regcache_sync - register_blkdev + __register_chrdev register_chrdev_region - register_filesystem - register_netdev - register_netdevice - register_netdevice_notifier - register_pernet_device - register_pernet_subsys register_reboot_notifier - register_shrinker - regmap_add_irq_chip regmap_bulk_read regmap_bulk_write - regmap_del_irq_chip - regmap_field_read - regmap_field_update_bits_base - regmap_irq_get_domain - regmap_multi_reg_write - regmap_raw_read - regmap_raw_write regmap_read regmap_update_bits_base regmap_write @@ -1118,244 +414,462 @@ regulator_disable_regmap regulator_enable regulator_enable_regmap - regulator_get regulator_get_voltage regulator_get_voltage_sel_regmap regulator_is_enabled regulator_is_enabled_regmap regulator_list_voltage_linear regulator_list_voltage_linear_range - regulator_map_voltage_iterate regulator_map_voltage_linear regulator_map_voltage_linear_range - regulator_put - regulator_register_notifier - regulator_set_active_discharge_regmap + regulator_set_voltage regulator_set_voltage_sel_regmap regulator_set_voltage_time_sel - regulator_unregister_notifier - release_firmware - release_sock remap_pfn_range - remove_proc_entry - remove_wait_queue - request_firmware - request_threaded_irq reset_control_assert reset_control_deassert - reset_control_put - reset_control_reset revalidate_disk_size - rfkill_alloc - rfkill_destroy - rfkill_register - rfkill_unregister - round_jiffies_relative - rt_mutex_lock - rt_mutex_trylock - rt_mutex_unlock - rtc_time64_to_tm - rtc_tm_to_time64 - rtc_update_irq - rtnl_lock - rtnl_trylock - rtnl_unlock - sb800_prefetch scatterwalk_map_and_copy schedule schedule_timeout - schedule_timeout_interruptible - schedule_timeout_uninterruptible - scmi_driver_register - scmi_driver_unregister scnprintf - scsi_add_host_with_dma - scsi_autopm_get_device - scsi_autopm_put_device - scsi_block_when_processing_errors - scsi_command_size_tbl scsi_compat_ioctl scsi_device_get - scsi_device_lookup scsi_device_put - scsi_host_put scsi_ioctl scsi_ioctl_block_when_processing_errors - scsi_normalize_sense - scsi_print_sense_hdr - scsi_remove_device - scsi_remove_host sdev_prefix_printk sdhci_add_host - sdhci_cleanup_host - sdhci_cqe_disable - sdhci_cqe_enable - sdhci_cqe_irq - sdhci_enable_clk sdhci_get_property + sdhci_pltfm_clk_get_max_clock sdhci_pltfm_free sdhci_pltfm_init - sdhci_remove_host sdhci_reset + sdhci_resume_host sdhci_set_bus_width - sdhci_setup_host - sdio_signal_irq - send_sig + sdhci_set_clock + sdhci_suspend_host seq_lseek seq_printf - seq_putc - seq_puts seq_read - set_capacity_revalidate_and_notify - set_disk_ro - set_freezable - set_page_dirty - set_user_nice - sg_alloc_table - sg_alloc_table_from_pages - sg_copy_from_buffer - sg_copy_to_buffer sg_free_table - sg_init_one - sg_init_table - sg_miter_next - sg_miter_start - sg_miter_stop sg_next - sg_pcopy_from_buffer - sg_pcopy_to_buffer - sg_scsi_ioctl - sigprocmask - simple_dir_operations - simple_read_from_buffer - simple_strtoul + simple_strtol single_open single_release - sk_alloc - sk_free - skb_add_rx_frag - skb_clone - skb_copy_bits - skb_copy_datagram_iter - skb_copy_expand - skb_dequeue - skb_pull - skb_pull_rcsum - skb_push - skb_put - skb_queue_purge - skb_queue_tail - skb_recv_datagram - skb_trim - skb_tstamp_tx skcipher_walk_aead_decrypt skcipher_walk_aead_encrypt skcipher_walk_done - snd_ctl_add - snd_ctl_new1 - snd_pcm_add_chmap_ctls - snd_pcm_create_iec958_consumer_hw_params snd_pcm_format_width - snd_pcm_hw_constraint_eld - snd_pcm_hw_constraint_list - snd_soc_card_jack_new + snd_soc_component_read snd_soc_component_update_bits snd_soc_component_write - snd_soc_dai_link_set_capabilities - snd_soc_dai_set_sysclk - snd_soc_dai_set_tdm_slot - snd_soc_dapm_add_routes - snd_soc_dapm_disable_pin_unlocked snd_soc_dapm_force_enable_pin_unlocked snd_soc_dapm_get_enum_double - snd_soc_dapm_get_pin_switch snd_soc_dapm_get_volsw - snd_soc_dapm_info_pin_switch snd_soc_dapm_put_enum_double - snd_soc_dapm_put_pin_switch snd_soc_dapm_put_volsw - snd_soc_dapm_sync_unlocked snd_soc_get_enum_double snd_soc_get_volsw snd_soc_info_enum_double snd_soc_info_volsw snd_soc_jack_add_gpios snd_soc_jack_report - snd_soc_of_get_dai_name - snd_soc_of_parse_audio_routing - snd_soc_of_parse_audio_simple_widgets - snd_soc_of_parse_aux_devs - snd_soc_of_parse_card_name - snd_soc_of_parse_daifmt - snd_soc_of_parse_node_prefix - snd_soc_of_parse_tdm_slot - snd_soc_params_to_frame_size - snd_soc_pm_ops snd_soc_put_enum_double snd_soc_put_volsw - snd_soc_runtime_calc_hw snprintf - sock_init_data - sock_no_accept - sock_no_listen - sock_no_mmap - sock_no_shutdown - sock_no_socketpair - sock_queue_rcv_skb - sock_release - sort - spi_controller_resume - spi_controller_suspend - spi_finalize_current_transfer - spi_setup - spi_sync sprintf sscanf - stpcpy - strcasecmp - strchr + __stack_chk_fail + __stack_chk_guard strcmp - strcpy - strcspn - stream_open - strim - strlcat strlcpy strlen - strncasecmp - strnchr strncmp - strncpy strnlen - strpbrk - strscpy - strsep - strspn - synchronize_irq - synchronize_net synchronize_rcu - synchronize_srcu - sys_tz syscon_node_to_regmap syscon_regmap_lookup_by_phandle - sysfs_add_file_to_group + sysfs_create_file_ns sysfs_create_group sysfs_create_link - sysfs_remove_file_from_group sysfs_remove_group sysfs_remove_link - sysfs_streq - system_freezing_cnt - system_long_wq - system_state system_wq + __tasklet_schedule + thermal_zone_get_zone_by_name + __traceiter_rwmmio_post_read + __traceiter_rwmmio_read + __traceiter_rwmmio_write + __tracepoint_rwmmio_post_read + __tracepoint_rwmmio_read + __tracepoint_rwmmio_write + __unregister_chrdev + unregister_chrdev_region + unregister_reboot_notifier + update_devfreq + up_read + up_write + usleep_range + uuid_null + v4l2_async_notifier_cleanup + v4l2_async_notifier_init + v4l2_async_register_subdev + v4l2_async_subdev_notifier_register + v4l2_async_unregister_subdev + v4l2_ctrl_handler_free + v4l2_ctrl_handler_init_class + v4l2_ctrl_handler_setup + v4l2_ctrl_new_std + v4l2_ctrl_new_std_menu_items + v4l2_i2c_subdev_init + vabits_actual + vfree + vmap + vunmap + wait_for_completion + __wake_up + wakeup_source_add + __warn_printk + +# required by act8865-regulator.ko + regulator_set_pull_down_regmap + +# required by adc-keys.ko + devm_iio_channel_get + iio_get_channel_type + iio_read_channel_processed + input_set_poll_interval + input_setup_polling + +# required by aes-ce-ccm.ko + ce_aes_expandkey + +# required by ch.ko + noop_llseek + param_array_ops + scsi_device_lookup + __scsi_execute + scsi_print_sense_hdr + scsi_register_driver + +# required by clk-pwm.ko + of_clk_add_hw_provider + of_clk_hw_simple_get + +# required by clk-rockchip.ko + clk_divider_ops + clk_divider_ro_ops + clk_fixed_factor_ops + clk_fractional_divider_ops + clk_gate_ops + __clk_get_hw + clk_get_parent + clk_hw_get_flags + clk_hw_get_parent + clk_hw_get_rate + clk_hw_register_composite + clk_hw_round_rate + __clk_mux_determine_rate + clk_mux_ops + clk_mux_ro_ops + clk_register_composite + clk_register_divider_table + clk_register_fixed_factor + clk_register_gate + clk_register_mux_table + divider_get_val + gcd + kmemdup + match_string + of_clk_src_onecell_get + register_restart_handler + reset_controller_register + __udelay + +# required by clk-scmi.ko + clk_hw_set_rate_range + of_clk_hw_onecell_get + scmi_driver_register + scmi_driver_unregister + +# required by cma_heap.ko + cma_alloc + cma_get_name + cma_release + dma_contiguous_default_area + dma_heap_get_drvdata + sg_alloc_table_from_pages + +# required by cpufreq-dt.ko + cpufreq_enable_boost_support + cpufreq_freq_attr_scaling_available_freqs + cpufreq_freq_attr_scaling_boost_freqs + cpufreq_generic_frequency_table_verify + cpufreq_generic_get + cpufreq_generic_suspend + cpufreq_register_driver + cpufreq_unregister_driver + dev_pm_opp_free_cpufreq_table + dev_pm_opp_get_max_transition_latency + dev_pm_opp_get_sharing_cpus + dev_pm_opp_get_suspend_opp_freq + dev_pm_opp_init_cpufreq_table + dev_pm_opp_of_cpumask_add_table + dev_pm_opp_of_cpumask_remove_table + dev_pm_opp_of_get_sharing_cpus + dev_pm_opp_of_register_em + dev_pm_opp_put_regulators + dev_pm_opp_set_rate + dev_pm_opp_set_regulators + dev_pm_opp_set_sharing_cpus + get_cpu_device + policy_has_boost_freq + +# required by cpufreq_ondemand.ko + cpufreq_cpu_get_raw + cpufreq_dbs_governor_exit + cpufreq_dbs_governor_init + cpufreq_dbs_governor_limits + cpufreq_dbs_governor_start + cpufreq_dbs_governor_stop + cpufreq_table_index_unsorted + dbs_update + get_cpu_idle_time_us + gov_update_cpu_data + store_sampling_rate + +# required by cqhci.ko + devm_blk_ksm_init + dmam_free_coherent + mmc_cqe_request_done + +# required by cw2015_battery.ko + device_property_read_u8_array + power_supply_am_i_supplied + power_supply_get_battery_info + power_supply_put_battery_info + regmap_raw_read + regmap_raw_write + +# required by dw_mmc-rockchip.ko + clk_get_phase + mmc_send_tuning + +# required by dw_mmc.ko + debugfs_create_u32 + debugfs_create_x64 + del_timer + device_property_read_string_array + mmc_add_host + mmc_alloc_host + mmc_can_gpio_cd + mmc_detect_change + mmc_free_host + mmc_gpio_get_cd + mmc_gpio_get_ro + mmc_regulator_get_supply + mmc_regulator_set_ocr + mmc_regulator_set_vqmmc + mmc_remove_host + mmc_request_done + sdio_signal_irq + sg_miter_next + sg_miter_start + sg_miter_stop tasklet_init - tasklet_kill - tasklet_setup - thermal_zone_device_disable - thermal_zone_device_enable - thermal_zone_device_update - time64_to_tm + +# required by dw_wdt.ko + debugfs_create_regset32 + platform_get_irq_optional + watchdog_init_timeout + watchdog_register_device + watchdog_set_restart_priority + watchdog_unregister_device + +# required by fan53555.ko + gpiod_get_raw_value + gpiod_set_raw_value + +# required by ghash-ce.ko + aes_expandkey + gf128mul_lle + +# required by gpio-regulator.ko + devm_kstrdup + gpiod_count + +# required by gpio-rockchip.ko + generic_handle_irq + gpiochip_add_data_with_key + gpiochip_remove + handle_edge_irq + handle_level_irq + __irq_alloc_domain_generic_chips + irq_create_mapping_affinity + __irq_domain_add + irq_domain_remove + irq_find_mapping + irq_gc_ack_set_bit + irq_gc_mask_clr_bit + irq_gc_mask_set_bit + irq_gc_set_wake + irq_generic_chip_ops + irq_get_domain_generic_chip + irq_of_parse_and_map + irq_set_chained_handler_and_data + of_address_to_resource + of_pinctrl_get + +# required by grf.ko + of_find_matching_node_and_match + +# required by hid-alps.ko + down + input_alloc_absinfo + input_allocate_device + input_free_device + input_mt_init_slots + input_mt_report_slot_state + input_mt_sync_frame + up + +# required by hid-holtek-kbd.ko + usb_ifnum_to_if + +# required by hid-ntrig.ko + usb_control_msg + +# required by hid-primax.ko + hid_report_raw_event + +# required by i2c-dev.ko + bus_register_notifier + bus_unregister_notifier + device_for_each_child + i2c_bus_type + i2c_for_each_dev + i2c_verify_client + +# required by i2c-gpio.ko + desc_to_gpio + i2c_bit_add_numbered_bus + +# required by i2c-hid.ko + dev_printk + free_irq + hid_add_device + hid_allocate_device + hid_destroy_device + hid_input_report + hid_parse_report + i2c_smbus_read_byte + request_threaded_irq + +# required by i2c-mux.ko + i2c_add_numbered_adapter + __i2c_transfer + rt_mutex_lock + rt_mutex_trylock + rt_mutex_unlock + +# required by i2c-rk3x.ko + i2c_parse_fw_timings + +# required by industrialio-buffer-cb.ko + bitmap_free + bitmap_zalloc + iio_channel_get_all + iio_channel_release_all + iio_update_buffers + +# required by industrialio-triggered-buffer.ko + iio_alloc_pollfunc + iio_dealloc_pollfunc + iio_device_attach_buffer + +# required by io-domain.ko + _dev_crit + regulator_register_notifier + regulator_unregister_notifier + +# required by kfifo_buf.ko + __kfifo_alloc + __kfifo_free + __kfifo_in + __kfifo_to_user + mutex_lock_interruptible + +# required by leds-gpio.ko + devm_gpio_request_one + gpio_to_desc + +# required by ledtrig-heartbeat.ko + atomic_notifier_chain_unregister + avenrun + +# required by lzo-rle.ko + lzorle1x_1_compress + +# required by lzo.ko + lzo1x_1_compress + +# required by nvme-core.ko + bd_set_nr_sectors + blk_execute_rq + blk_freeze_queue_start + blk_mq_alloc_request + blk_mq_alloc_request_hctx + blk_mq_complete_request + blk_mq_delay_kick_requeue_list + blk_mq_end_request + blk_mq_freeze_queue + blk_mq_freeze_queue_wait + blk_mq_freeze_queue_wait_timeout + blk_mq_requeue_request + blk_mq_unfreeze_queue + blk_mq_unique_tag + blk_poll + blk_queue_chunk_sectors + blk_queue_dma_alignment + blk_queue_flag_test_and_set + blk_queue_max_discard_segments + blk_queue_max_hw_sectors + blk_queue_max_segments + blk_queue_virt_boundary + blk_queue_write_cache + blk_rq_map_kern + blk_set_queue_dying + blk_status_to_errno + blk_sync_queue + bpf_trace_run1 + bpf_trace_run2 + bpf_trace_run3 + cleanup_srcu_struct + device_add + device_del + device_remove_file_self + dev_pm_qos_expose_latency_tolerance + dev_pm_qos_hide_latency_tolerance + dev_pm_qos_update_user_latency_tolerance + event_triggers_call + ida_alloc_range + ida_destroy + ida_free + init_srcu_struct + kasprintf + kobject_uevent_env + ktime_get_with_offset + list_sort + memchr_inv + param_ops_byte + param_ops_ulong + perf_trace_buf_alloc + perf_trace_run_bpf_submit + set_capacity_revalidate_and_notify + set_disk_ro + __srcu_read_unlock + synchronize_srcu trace_event_buffer_commit trace_event_buffer_reserve trace_event_ignore_this_pid @@ -1367,152 +881,636 @@ trace_seq_printf trace_seq_putc try_module_get - try_wait_for_completion - tty_flip_buffer_push - tty_hangup - tty_insert_flip_string_fixed_flag - tty_kref_put - tty_mode_ioctl - tty_port_tty_get - tty_register_ldisc - tty_termios_baud_rate - tty_termios_encode_baud_rate - tty_unregister_ldisc - unlock_page - unpin_user_pages - unregister_blkdev - unregister_chrdev_region - unregister_filesystem - unregister_netdev - unregister_netdevice_many - unregister_netdevice_notifier - unregister_netdevice_queue - unregister_pernet_device - unregister_pernet_subsys - unregister_reboot_notifier - unregister_shrinker - up - up_read - up_write - usb_add_gadget_udc - usb_add_hcd - usb_alloc_coherent - usb_alloc_urb - usb_amd_dev_put - usb_amd_quirk_pll_disable - usb_amd_quirk_pll_enable - usb_anchor_urb - usb_bulk_msg - usb_calc_bus_time - usb_control_msg - usb_create_hcd - usb_debug_root - usb_del_gadget_udc - usb_deregister - usb_disabled - usb_ep_set_maxpacket_limit - usb_find_common_endpoints - usb_free_coherent - usb_free_urb - usb_gadget_giveback_request - usb_gadget_map_request - usb_gadget_set_state - usb_gadget_unmap_request - usb_get_dr_mode - usb_hc_died - usb_hcd_check_unlink_urb - usb_hcd_giveback_urb - usb_hcd_link_urb_to_ep - usb_hcd_map_urb_for_dma - usb_hcd_platform_shutdown - usb_hcd_poll_rh_status - usb_hcd_resume_root_hub - usb_hcd_unlink_urb_from_ep - usb_hcds_loaded - usb_hub_clear_tt_buffer - usb_ifnum_to_if - usb_kill_anchored_urbs - usb_kill_urb - usb_phy_set_charger_current - usb_poison_urb - usb_put_dev - usb_put_hcd - usb_register_driver - usb_remove_hcd - usb_role_switch_get_drvdata - usb_role_switch_register - usb_role_switch_unregister - usb_root_hub_lost_power - usb_speed_string - usb_submit_urb - usb_unanchor_urb - usbnet_change_mtu - usbnet_disconnect - usbnet_get_drvinfo - usbnet_get_endpoints - usbnet_get_link - usbnet_get_link_ksettings - usbnet_get_msglevel - usbnet_get_stats64 - usbnet_link_change - usbnet_nway_reset - usbnet_open - usbnet_probe - usbnet_read_cmd - usbnet_read_cmd_nopm - usbnet_resume - usbnet_set_link_ksettings - usbnet_set_msglevel - usbnet_skb_return - usbnet_start_xmit - usbnet_stop - usbnet_suspend - usbnet_tx_timeout - usbnet_write_cmd - usbnet_write_cmd_async - usbnet_write_cmd_nopm - usleep_range - utf16s_to_utf8s - uuid_null - v4l2_async_notifier_add_fwnode_subdev - v4l2_async_notifier_add_subdev - v4l2_async_notifier_cleanup - v4l2_async_notifier_init - v4l2_async_notifier_unregister - v4l2_async_register_subdev - v4l2_async_subdev_notifier_register - v4l2_async_unregister_subdev - v4l2_ctrl_auto_cluster - v4l2_ctrl_handler_free - v4l2_ctrl_handler_init_class - v4l2_ctrl_handler_setup - v4l2_ctrl_new_std - v4l2_ctrl_new_std_menu - v4l2_ctrl_new_std_menu_items - v4l2_i2c_subdev_init - vabits_actual - vfree - vmalloc - vmalloc_to_page - vmap - vscnprintf - vunmap - vzalloc - wait_for_completion - wait_for_completion_interruptible - wait_for_completion_io_timeout - wait_for_completion_killable - wait_for_completion_timeout - wait_woken - wake_up_process - watchdog_init_timeout - watchdog_register_device - watchdog_set_restart_priority - watchdog_unregister_device - woken_wake_function xa_destroy xa_erase xa_find xa_find_after xa_load xa_store + +# required by nvme.ko + async_schedule_node + blk_get_queue + blk_mq_alloc_tag_set + blk_mq_complete_request_remote + blk_mq_free_tag_set + blk_mq_map_queues + blk_mq_pci_map_queues + blk_mq_start_request + blk_mq_tag_to_rq + blk_mq_update_nr_hw_queues + blk_put_queue + __blk_rq_map_sg + device_release_driver + dma_map_page_attrs + dma_max_mapping_size + dma_pool_alloc + dma_pool_create + dma_pool_destroy + dma_pool_free + dma_unmap_page_attrs + __do_once_done + __do_once_start + flush_workqueue + mempool_alloc + mempool_create_node + mempool_destroy + mempool_free + mempool_kfree + mempool_kmalloc + param_get_uint + param_set_uint + pci_alloc_irq_vectors_affinity + pcibios_resource_to_bus + pci_device_is_present + pci_disable_device + pci_disable_pcie_error_reporting + pcie_aspm_enabled + pci_enable_device_mem + pci_enable_pcie_error_reporting + pci_free_irq + pci_free_irq_vectors + pci_irq_vector + pci_load_saved_state + pci_read_config_word + __pci_register_driver + pci_release_selected_regions + pci_request_irq + pci_request_selected_regions + pci_restore_state + pci_save_state + pci_select_bars + pci_set_master + pci_sriov_configure_simple + pci_unregister_driver + pm_suspend_global_flags + sg_init_table + __sw_hweight64 + sysfs_remove_file_from_group + wait_for_completion_io_timeout + +# required by nvmem-rockchip-otp.ko + __bitmap_set + +# required by optee-rng.ko + driver_register + hwrng_register + hwrng_unregister + +# required by optee.ko + alloc_pages_exact + __arm_smccc_hvc + device_property_read_string + device_register + find_vma + free_pages_exact + idr_get_next + kimage_voffset + ktime_get_real_ts64 + memremap + memunmap + wait_for_completion_interruptible + +# required by ov2680.ko + v4l2_ctrl_auto_cluster + v4l2_ctrl_new_std_menu + __v4l2_find_nearest_size + +# required by ov5695.ko + pm_runtime_get_if_active + strscpy + __v4l2_ctrl_modify_range + v4l2_ctrl_new_int_menu + +# required by panel-simple.ko + drm_bus_flags_from_videomode + drm_connector_set_panel_orientation + drm_display_mode_from_videomode + drm_mode_create + drm_mode_duplicate + drm_mode_probed_add + drm_mode_set_name + drm_panel_add + drm_panel_disable + drm_panel_init + drm_panel_of_backlight + drm_panel_remove + drm_panel_unprepare + mipi_dsi_attach + mipi_dsi_dcs_write_buffer + mipi_dsi_detach + mipi_dsi_driver_register_full + mipi_dsi_driver_unregister + mipi_dsi_generic_write + of_drm_get_panel_orientation + of_find_i2c_adapter_by_node + of_get_display_timing + of_get_drm_display_mode + videomode_from_timing + +# required by pcie-dw-rockchip.ko + dw_pcie_host_init + dw_pcie_link_up + dw_pcie_read + dw_pcie_read_dbi + dw_pcie_setup_rc + dw_pcie_write + dw_pcie_write_dbi + kthread_create_on_node + of_prop_next_string + phy_set_mode_ext + wake_up_process + +# required by pcierockchiphost.ko + devm_of_phy_get + devm_pci_alloc_host_bridge + devm_pci_remap_cfg_resource + jiffies_to_usecs + of_pci_get_max_link_speed + pci_host_probe + pci_remove_root_bus + pci_stop_root_bus + regulator_get_current_limit + +# required by phy-rockchip-csi2-dphy.ko + media_create_pad_link + of_find_device_by_node + v4l2_ctrl_find + v4l2_ctrl_g_ctrl + v4l2_querymenu + v4l2_subdev_call_wrappers + v4l2_subdev_init + +# required by phy-rockchip-inno-dsidphy.ko + devm_platform_ioremap_resource_byname + phy_mipi_dphy_config_validate + +# required by phy-rockchip-inno-hdmi-phy.ko + nvmem_cell_get + +# required by phy-rockchip-inno-usb2.ko + devm_extcon_register_notifier + extcon_set_state + extcon_sync + wakeup_source_remove + +# required by phy-rockchip-inno-usb3.ko + atomic_notifier_call_chain + strcasecmp + usb_add_phy + +# required by phy-rockchip-typec.ko + extcon_get_property + +# required by phy-rockchip-usb.ko + __of_reset_control_get + +# required by pinctrl-rk805.ko + devm_gpiochip_add_data_with_key + devm_pinctrl_register + pinconf_generic_dt_node_to_map + pinctrl_gpio_direction_input + pinctrl_gpio_direction_output + pinctrl_utils_free_map + +# required by pl330.ko + amba_driver_register + amba_driver_unregister + devm_free_irq + dma_async_device_register + dma_async_device_unregister + dma_async_tx_descriptor_init + dmaengine_unmap_put + dma_get_slave_channel + dma_map_resource + dma_unmap_resource + loops_per_jiffy + of_dma_controller_free + of_dma_controller_register + pm_runtime_irq_safe + seq_puts + tasklet_kill + tasklet_setup + +# required by pm_domains.ko + clk_bulk_put + of_clk_get_parent_count + of_genpd_add_provider_onecell + panic + pm_clk_add_clk + pm_clk_create + pm_clk_destroy + pm_genpd_add_subdomain + pm_genpd_init + pm_genpd_remove + strrchr + +# required by pwm-regulator.ko + regulator_map_voltage_iterate + +# required by pwm-rockchip.ko + of_pwm_xlate_with_flags + pwmchip_add + pwmchip_remove + +# required by pwm_bl.ko + backlight_device_register + backlight_device_unregister + gpiod_get_direction + pwm_free + pwm_request + +# required by reboot-mode.ko + devres_release + kernel_kobj + +# required by rk805-pwrkey.ko + devm_request_any_context_irq + input_set_capability + +# required by rk808-regulator.ko + gpiod_is_active_low + +# required by rk808.ko + devm_mfd_add_devices + i2c_smbus_read_byte_data + kobject_create_and_add + platform_device_add + platform_device_alloc + platform_device_put + regmap_add_irq_chip + regmap_del_irq_chip + regmap_irq_get_domain + +# required by rockchip-rng.ko + devm_hwrng_register + devm_of_iomap + +# required by rockchip.ko + __genphy_config_aneg + genphy_resume + genphy_soft_reset + genphy_suspend + mdiobus_read + mdiobus_write + phy_drivers_register + phy_drivers_unregister + +# required by rockchip_bus.ko + cpufreq_register_notifier + cpu_topology + +# required by rockchip_dmc.ko + cpufreq_cpu_get + cpufreq_cpu_put + cpufreq_quick_get + cpu_latency_qos_add_request + cpu_latency_qos_update_request + devfreq_add_governor + devfreq_event_disable_edev + devfreq_event_enable_edev + devfreq_event_get_edev_by_phandle + devfreq_event_get_edev_count + devfreq_event_get_event + devfreq_monitor_resume + devfreq_monitor_start + devfreq_monitor_stop + devfreq_monitor_suspend + devfreq_resume_device + devfreq_suspend_device + devfreq_update_interval + devm_devfreq_add_device + devm_devfreq_register_opp_notifier + _dev_notice + dev_pm_opp_add + input_close_device + input_open_device + input_register_handle + input_register_handler + input_unregister_handle + __memset_io + of_devfreq_cooling_register_power + platform_get_irq_byname + +# required by rockchip_dmc_common.ko + down_write_trylock + +# required by rockchip_opp_select.ko + dev_pm_opp_get_opp_table + dev_pm_opp_of_add_table + dev_pm_opp_put_opp_table + dev_pm_opp_set_prop_name + of_find_node_opts_by_path + regulator_get_optional + regulator_put + +# required by rockchip_saradc.ko + devm_iio_device_alloc + __devm_iio_device_register + iio_get_time_ns + iio_push_to_buffers + iio_trigger_notify_done + wait_for_completion_timeout + +# required by rockchip_sip.ko + sched_clock + +# required by rockchip_thermal.ko + devm_thermal_zone_of_sensor_register + thermal_zone_device_disable + thermal_zone_device_enable + thermal_zone_device_update + +# required by rtc-rk808.ko + _bcd2bin + _bin2bcd + devm_rtc_allocate_device + __rtc_register_device + rtc_time64_to_tm + rtc_tm_to_time64 + rtc_update_irq + +# required by sdhci-of-arasan.ko + devm_phy_get + phy_exit + phy_init + phy_power_off + phy_power_on + __sdhci_add_host + sdhci_cleanup_host + sdhci_cqe_disable + sdhci_cqe_enable + sdhci_cqe_irq + sdhci_dumpregs + sdhci_enable_clk + sdhci_execute_tuning + sdhci_pltfm_unregister + sdhci_set_power_and_bus_voltage + sdhci_set_uhs_signaling + sdhci_setup_host + +# required by sdhci-of-dwcmshc.ko + devm_clk_bulk_get_optional + dma_get_required_mask + sdhci_adma_write_desc + sdhci_remove_host + sdhci_request + +# required by sg.ko + blk_get_request + blk_put_request + blk_rq_map_user_iov + blk_verify_command + cdev_add + cdev_alloc + cdev_del + class_interface_unregister + fasync_helper + get_sg_io_hdr + import_iovec + jiffies_to_msecs + kill_fasync + __module_get + nonseekable_open + put_sg_io_hdr + _raw_read_lock_irqsave + _raw_read_unlock_irqrestore + _raw_write_lock_irq + _raw_write_lock_irqsave + _raw_write_unlock_irq + _raw_write_unlock_irqrestore + scsi_autopm_get_device + scsi_autopm_put_device + scsi_block_when_processing_errors + scsi_command_size_tbl + scsi_normalize_sense + __scsi_print_sense + scsi_register_interface + sg_scsi_ioctl + __task_pid_nr_ns + +# required by sha1-ce.ko + crypto_sha1_finup + crypto_sha1_update + irq_stat + +# required by sii902x.ko + drm_atomic_helper_connector_destroy_state + drm_atomic_helper_connector_duplicate_state + drm_atomic_helper_connector_reset + drm_bridge_add + drm_bridge_remove + drm_connector_attach_encoder + drm_connector_cleanup + drm_connector_init + drm_detect_hdmi_monitor + __drm_err + drm_hdmi_avi_infoframe_from_display_mode + drm_helper_hpd_irq_event + drm_helper_probe_single_connector_modes + hdmi_audio_infoframe_pack + hdmi_avi_infoframe_pack + of_graph_parse_endpoint + of_property_read_variable_u8_array + platform_device_register_full + +# required by slip.ko + alloc_netdev_mqs + consume_skb + dev_close + free_netdev + __netdev_alloc_skb + netif_rx_ni + netif_tx_wake_queue + __rcu_read_lock + __rcu_read_unlock + register_netdevice + rtnl_lock + rtnl_unlock + skb_put + tty_hangup + tty_mode_ioctl + tty_register_ldisc + tty_unregister_ldisc + unregister_netdev + +# required by snd-soc-cx2072x.ko + __devm_regmap_init + regmap_multi_reg_write + snd_soc_params_to_frame_size + +# required by snd-soc-es8316.ko + snd_pcm_hw_constraint_list + snd_soc_dapm_disable_pin_unlocked + snd_soc_dapm_sync_unlocked + +# required by snd-soc-hdmi-codec.ko + hdmi_audio_infoframe_init + snd_ctl_add + snd_ctl_new1 + snd_pcm_add_chmap_ctls + snd_pcm_create_iec958_consumer_hw_params + snd_pcm_hw_constraint_eld + snd_soc_dapm_add_routes + +# required by snd-soc-simple-card-utils.ko + devm_get_clk_from_child + devm_kasprintf + devm_kvasprintf + of_get_named_gpio_flags + snd_soc_card_jack_new + snd_soc_dai_set_sysclk + snd_soc_dai_set_tdm_slot + snd_soc_dapm_get_pin_switch + snd_soc_dapm_info_pin_switch + snd_soc_dapm_put_pin_switch + snd_soc_of_parse_audio_routing + snd_soc_of_parse_audio_simple_widgets + snd_soc_of_parse_card_name + snd_soc_of_parse_daifmt + snd_soc_runtime_calc_hw + +# required by snd-soc-simple-card.ko + devm_snd_soc_register_card + of_parse_phandle_with_args + snd_soc_dai_link_set_capabilities + snd_soc_of_get_dai_name + snd_soc_of_parse_aux_devs + snd_soc_of_parse_node_prefix + snd_soc_of_parse_tdm_slot + snd_soc_pm_ops + +# required by spi-rockchip.ko + devm_spi_register_controller + of_property_read_variable_u16_array + pinctrl_pm_select_default_state + pinctrl_pm_select_sleep_state + __spi_alloc_controller + spi_controller_resume + spi_controller_suspend + spi_finalize_current_transfer + +# required by spidev.ko + _raw_spin_lock_irq + _raw_spin_unlock_irq + __spi_register_driver + spi_setup + spi_sync + stream_open + +# required by system_heap.ko + deferred_free + dmabuf_page_pool_alloc + dmabuf_page_pool_create + dmabuf_page_pool_destroy + dmabuf_page_pool_free + dma_heap_get_dev + sg_alloc_table + __sg_page_iter_next + __sg_page_iter_start + vmalloc + +# required by tee.ko + bus_register + bus_unregister + class_find_device + crypto_alloc_shash + crypto_shash_final + crypto_shash_update + dma_buf_fd + dma_buf_put + gen_pool_add_owner + gen_pool_alloc_algo_owner + gen_pool_best_fit + gen_pool_create + gen_pool_destroy + gen_pool_free_owner + gen_pool_set_algo + gen_pool_virt_to_phys + get_kernel_pages + in_egroup_p + pin_user_pages_fast + unpin_user_pages + +# required by test_power.ko + param_get_int + power_supply_register + power_supply_unregister + strncasecmp + strncpy + +# required by tps65132-regulator.ko + regulator_set_active_discharge_regmap + +# required by v4l2-fwnode.ko + fwnode_device_is_available + fwnode_get_name + fwnode_graph_get_next_endpoint + fwnode_graph_get_port_parent + fwnode_graph_get_remote_endpoint + fwnode_graph_get_remote_port_parent + fwnode_graph_parse_endpoint + fwnode_property_get_reference_args + fwnode_property_read_u64_array + v4l2_async_notifier_add_fwnode_subdev + v4l2_async_notifier_add_subdev + v4l2_async_notifier_unregister + +# required by zram.ko + __alloc_percpu + bio_endio + blk_alloc_queue + __class_register + class_unregister + __cpuhp_state_add_instance + __cpuhp_state_remove_instance + crypto_alloc_base + crypto_comp_compress + crypto_comp_decompress + crypto_has_alg + disk_end_io_acct + disk_start_io_acct + flush_dcache_page + free_percpu + fsync_bdev + __get_free_pages + idr_for_each + kstrtou16 + memparse + memset64 + mutex_is_locked + __num_online_cpus + page_endio + register_blkdev + strcpy + __sysfs_match_string + sysfs_streq + unregister_blkdev + vzalloc + +# required by zsmalloc.ko + alloc_anon_inode + __ClearPageMovable + contig_page_data + dec_zone_page_state + inc_zone_page_state + init_pseudo + iput + kern_mount + kern_unmount + kill_anon_super + kmem_cache_alloc + kmem_cache_create + kmem_cache_destroy + kmem_cache_free + kstrdup + __lock_page + page_mapping + _raw_read_lock + _raw_read_unlock + _raw_write_lock + _raw_write_unlock + register_shrinker + __SetPageMovable + unlock_page + unregister_shrinker diff --git a/android/abi_gki_aarch64_vivo b/android/abi_gki_aarch64_vivo index 5f3433d6f311..464ac490992d 100644 --- a/android/abi_gki_aarch64_vivo +++ b/android/abi_gki_aarch64_vivo @@ -869,6 +869,7 @@ kstrtou8_from_user kstrtouint kstrtouint_from_user + _kstrtoul kstrtoul_from_user kstrtoull kstrtoull_from_user @@ -1226,6 +1227,8 @@ proc_dointvec_minmax proc_dostring proc_douintvec_minmax + profile_event_register + profile_event_unregister proto_register proto_unregister __pskb_pull_tail @@ -1761,6 +1764,7 @@ __tracepoint_android_rvh_flush_task __tracepoint_android_rvh_migrate_queued_task __tracepoint_android_rvh_new_task_stats + __tracepoint_android_rvh_refrigerator __tracepoint_android_rvh_replace_next_task_fair __tracepoint_android_rvh_resume_cpus __tracepoint_android_rvh_sched_cpu_dying @@ -1786,12 +1790,15 @@ __tracepoint_android_rvh_update_cpus_allowed __tracepoint_android_rvh_update_misfit_status __tracepoint_android_rvh_wake_up_new_task + __tracepoint_android_vh_account_task_time __tracepoint_android_vh_allow_domain_state __tracepoint_android_vh_binder_restore_priority __tracepoint_android_vh_binder_set_priority + __tracepoint_android_vh_binder_trans __tracepoint_android_vh_binder_wakeup_ilocked __tracepoint_android_vh_cpu_idle_enter __tracepoint_android_vh_cpu_idle_exit + __tracepoint_android_vh_dup_task_struct __tracepoint_android_vh_ftrace_dump_buffer __tracepoint_android_vh_ftrace_format_check __tracepoint_android_vh_ftrace_oops_enter @@ -1799,6 +1806,7 @@ __tracepoint_android_vh_ftrace_size_check __tracepoint_android_vh_iommu_setup_dma_ops __tracepoint_android_vh_ipi_stop + __tracepoint_android_vh_irqtime_account_process_tick __tracepoint_android_vh_jiffies_update __tracepoint_android_vh_mmc_attach_sd __tracepoint_android_vh_mmc_blk_mq_rw_recovery @@ -1812,10 +1820,13 @@ __tracepoint_android_vh_show_resume_epoch_val __tracepoint_android_vh_show_suspend_epoch_val __tracepoint_android_vh_timer_calc_index + __tracepoint_android_vh_tune_scan_type + __tracepoint_android_vh_tune_swappiness __tracepoint_android_vh_ufs_check_int_errors __tracepoint_android_vh_ufs_compl_command __tracepoint_android_vh_ufs_send_command __tracepoint_android_vh_ufs_update_sdev + __tracepoint_android_vh_vmpressure __tracepoint_binder_transaction_received __tracepoint_cpu_frequency_limits __tracepoint_cpu_idle @@ -1865,6 +1876,7 @@ ucsi_destroy ucsi_get_drvdata ucsi_register + ucsi_send_command ucsi_set_drvdata ucsi_unregister __udelay diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig index cf21e80963b5..3007e975270c 100644 --- a/arch/arm64/Kconfig +++ b/arch/arm64/Kconfig @@ -139,6 +139,7 @@ config ARM64 select HAVE_ARCH_JUMP_LABEL select HAVE_ARCH_JUMP_LABEL_RELATIVE select HAVE_ARCH_KASAN if !(ARM64_16K_PAGES && ARM64_VA_BITS_48) + select HAVE_ARCH_KASAN_VMALLOC if HAVE_ARCH_KASAN select HAVE_ARCH_KASAN_SW_TAGS if HAVE_ARCH_KASAN select HAVE_ARCH_KASAN_HW_TAGS if (HAVE_ARCH_KASAN && ARM64_MTE) select HAVE_ARCH_KFENCE @@ -194,6 +195,7 @@ config ARM64 select IOMMU_DMA if IOMMU_SUPPORT select IRQ_DOMAIN select IRQ_FORCED_THREADING + select KASAN_VMALLOC if KASAN_GENERIC select MODULES_USE_ELF_RELA select NEED_DMA_MAP_STATE select NEED_SG_DMA_LENGTH diff --git a/arch/arm64/include/asm/memory.h b/arch/arm64/include/asm/memory.h index f50e752d31f9..b864fdb79df0 100644 --- a/arch/arm64/include/asm/memory.h +++ b/arch/arm64/include/asm/memory.h @@ -236,7 +236,6 @@ static inline const void *__tag_set(const void *addr, u8 tag) #define arch_enable_tagging_async() mte_enable_kernel_async() #define arch_set_tagging_report_once(state) mte_set_report_once(state) #define arch_force_async_tag_fault() mte_check_tfsr_exit() -#define arch_init_tags(max_tag) mte_init_tags(max_tag) #define arch_get_random_tag() mte_get_random_tag() #define arch_get_mem_tag(addr) mte_get_mem_tag(addr) #define arch_set_mem_tag_range(addr, size, tag, init) \ diff --git a/arch/arm64/include/asm/mte-kasan.h b/arch/arm64/include/asm/mte-kasan.h index d952352bd008..82fa4ac4ad4e 100644 --- a/arch/arm64/include/asm/mte-kasan.h +++ b/arch/arm64/include/asm/mte-kasan.h @@ -130,7 +130,6 @@ static inline void mte_set_mem_tag_range(void *addr, size_t size, u8 tag, void mte_enable_kernel_sync(void); void mte_enable_kernel_async(void); -void mte_init_tags(u64 max_tag); void mte_set_report_once(bool state); bool mte_report_once(void); @@ -165,10 +164,6 @@ static inline void mte_enable_kernel_async(void) { } -static inline void mte_init_tags(u64 max_tag) -{ -} - static inline void mte_set_report_once(bool state) { } diff --git a/arch/arm64/include/asm/mte.h b/arch/arm64/include/asm/mte.h index 67bf259ae768..c0857e61e9e8 100644 --- a/arch/arm64/include/asm/mte.h +++ b/arch/arm64/include/asm/mte.h @@ -16,8 +16,6 @@ #include -extern u64 gcr_kernel_excl; - void mte_clear_page_tags(void *addr); unsigned long mte_copy_tags_from_user(void *to, const void __user *from, unsigned long n); @@ -43,7 +41,6 @@ void mte_copy_page_tags(void *kto, const void *kfrom); void mte_thread_init_user(void); void mte_thread_switch(struct task_struct *next); void mte_suspend_enter(void); -void mte_suspend_exit(void); long set_mte_ctrl(struct task_struct *task, unsigned long arg); long get_mte_ctrl(struct task_struct *task); int mte_ptrace_copy_tags(struct task_struct *child, long request, @@ -72,9 +69,6 @@ static inline void mte_thread_switch(struct task_struct *next) static inline void mte_suspend_enter(void) { } -static inline void mte_suspend_exit(void) -{ -} static inline long set_mte_ctrl(struct task_struct *task, unsigned long arg) { return 0; @@ -105,11 +99,17 @@ void mte_check_tfsr_el1(void); static inline void mte_check_tfsr_entry(void) { + if (!system_supports_mte()) + return; + mte_check_tfsr_el1(); } static inline void mte_check_tfsr_exit(void) { + if (!system_supports_mte()) + return; + /* * The asynchronous faults are sync'ed automatically with * TFSR_EL1 on kernel entry but for exit an explicit dsb() diff --git a/arch/arm64/include/asm/sysreg.h b/arch/arm64/include/asm/sysreg.h index 2f09c856b6bc..c41e6f7fcab2 100644 --- a/arch/arm64/include/asm/sysreg.h +++ b/arch/arm64/include/asm/sysreg.h @@ -11,6 +11,7 @@ #include #include +#include /* * ARMv8 ARM reserves the following encoding for system registers: @@ -1044,6 +1045,21 @@ #define SYS_GCR_EL1_RRND (BIT(16)) #define SYS_GCR_EL1_EXCL_MASK 0xffffUL +#ifdef CONFIG_KASAN_HW_TAGS +/* + * KASAN always uses a whole byte for its tags. With CONFIG_KASAN_HW_TAGS it + * only uses tags in the range 0xF0-0xFF, which we map to MTE tags 0x0-0xF. + */ +#define __MTE_TAG_MIN (KASAN_TAG_MIN & 0xf) +#define __MTE_TAG_MAX (KASAN_TAG_MAX & 0xf) +#define __MTE_TAG_INCL GENMASK(__MTE_TAG_MAX, __MTE_TAG_MIN) +#define KERNEL_GCR_EL1_EXCL (SYS_GCR_EL1_EXCL_MASK & ~__MTE_TAG_INCL) +#else +#define KERNEL_GCR_EL1_EXCL SYS_GCR_EL1_EXCL_MASK +#endif + +#define KERNEL_GCR_EL1 (SYS_GCR_EL1_RRND | KERNEL_GCR_EL1_EXCL) + /* RGSR_EL1 Definitions */ #define SYS_RGSR_EL1_TAG_MASK 0xfUL #define SYS_RGSR_EL1_SEED_SHIFT 8 diff --git a/arch/arm64/kernel/entry.S b/arch/arm64/kernel/entry.S index 5369db4b53a4..2dd31309f7e6 100644 --- a/arch/arm64/kernel/entry.S +++ b/arch/arm64/kernel/entry.S @@ -193,21 +193,20 @@ alternative_else_nop_endif .macro mte_set_kernel_gcr, tmp, tmp2 #ifdef CONFIG_KASAN_HW_TAGS -alternative_if_not ARM64_MTE +alternative_cb kasan_hw_tags_enable b 1f -alternative_else_nop_endif - ldr_l \tmp, gcr_kernel_excl - - mte_set_gcr \tmp, \tmp2 +alternative_cb_end + mov \tmp, KERNEL_GCR_EL1 + msr_s SYS_GCR_EL1, \tmp 1: #endif .endm .macro mte_set_user_gcr, tsk, tmp, tmp2 -#ifdef CONFIG_ARM64_MTE -alternative_if_not ARM64_MTE +#ifdef CONFIG_KASAN_HW_TAGS +alternative_cb kasan_hw_tags_enable b 1f -alternative_else_nop_endif +alternative_cb_end ldr \tmp, [\tsk, #THREAD_MTE_CTRL] mte_set_gcr \tmp, \tmp2 diff --git a/arch/arm64/kernel/kaslr.c b/arch/arm64/kernel/kaslr.c index 27f8939deb1b..341342b207f6 100644 --- a/arch/arm64/kernel/kaslr.c +++ b/arch/arm64/kernel/kaslr.c @@ -128,15 +128,17 @@ u64 __init kaslr_early_init(void) /* use the top 16 bits to randomize the linear region */ memstart_offset_seed = seed >> 48; - if (IS_ENABLED(CONFIG_KASAN_GENERIC) || - IS_ENABLED(CONFIG_KASAN_SW_TAGS)) + if (!IS_ENABLED(CONFIG_KASAN_VMALLOC) && + (IS_ENABLED(CONFIG_KASAN_GENERIC) || + IS_ENABLED(CONFIG_KASAN_SW_TAGS))) /* - * KASAN does not expect the module region to intersect the - * vmalloc region, since shadow memory is allocated for each - * module at load time, whereas the vmalloc region is shadowed - * by KASAN zero pages. So keep modules out of the vmalloc - * region if KASAN is enabled, and put the kernel well within - * 4 GB of the module region. + * KASAN without KASAN_VMALLOC does not expect the module region + * to intersect the vmalloc region, since shadow memory is + * allocated for each module at load time, whereas the vmalloc + * region is shadowed by KASAN zero pages. So keep modules + * out of the vmalloc region if KASAN is enabled without + * KASAN_VMALLOC, and put the kernel well within 4 GB of the + * module region. */ return offset % SZ_2G; diff --git a/arch/arm64/kernel/module.c b/arch/arm64/kernel/module.c index fe21e0f06492..b5ec010c481f 100644 --- a/arch/arm64/kernel/module.c +++ b/arch/arm64/kernel/module.c @@ -40,14 +40,16 @@ void *module_alloc(unsigned long size) NUMA_NO_NODE, __builtin_return_address(0)); if (!p && IS_ENABLED(CONFIG_ARM64_MODULE_PLTS) && - !IS_ENABLED(CONFIG_KASAN_GENERIC) && - !IS_ENABLED(CONFIG_KASAN_SW_TAGS)) + (IS_ENABLED(CONFIG_KASAN_VMALLOC) || + (!IS_ENABLED(CONFIG_KASAN_GENERIC) && + !IS_ENABLED(CONFIG_KASAN_SW_TAGS)))) /* - * KASAN can only deal with module allocations being served - * from the reserved module region, since the remainder of - * the vmalloc region is already backed by zero shadow pages, - * and punching holes into it is non-trivial. Since the module - * region is not randomized when KASAN is enabled, it is even + * KASAN without KASAN_VMALLOC can only deal with module + * allocations being served from the reserved module region, + * since the remainder of the vmalloc region is already + * backed by zero shadow pages, and punching holes into it + * is non-trivial. Since the module region is not randomized + * when KASAN is enabled without KASAN_VMALLOC, it is even * less likely that the module region gets exhausted, so we * can simply omit this fallback in that case. */ diff --git a/arch/arm64/kernel/mte.c b/arch/arm64/kernel/mte.c index 859c1fcefdf4..acd43c57d9a0 100644 --- a/arch/arm64/kernel/mte.c +++ b/arch/arm64/kernel/mte.c @@ -23,8 +23,6 @@ #include #include -u64 gcr_kernel_excl __ro_after_init; - static bool report_fault_once = true; static DEFINE_PER_CPU_READ_MOSTLY(u64, mte_tcf_preferred); @@ -96,26 +94,6 @@ int memcmp_pages(struct page *page1, struct page *page2) return ret; } -void mte_init_tags(u64 max_tag) -{ - static bool gcr_kernel_excl_initialized; - - if (!gcr_kernel_excl_initialized) { - /* - * The format of the tags in KASAN is 0xFF and in MTE is 0xF. - * This conversion extracts an MTE tag from a KASAN tag. - */ - u64 incl = GENMASK(FIELD_GET(MTE_TAG_MASK >> MTE_TAG_SHIFT, - max_tag), 0); - - gcr_kernel_excl = ~incl & SYS_GCR_EL1_EXCL_MASK; - gcr_kernel_excl_initialized = true; - } - - /* Enable the kernel exclude mask for random tags generation. */ - write_sysreg_s(SYS_GCR_EL1_RRND | gcr_kernel_excl, SYS_GCR_EL1); -} - static inline void __mte_enable_kernel(const char *mode, unsigned long tcf) { /* Enable MTE Sync Mode for EL1. */ @@ -168,12 +146,7 @@ bool mte_report_once(void) #ifdef CONFIG_KASAN_HW_TAGS void mte_check_tfsr_el1(void) { - u64 tfsr_el1; - - if (!system_supports_mte()) - return; - - tfsr_el1 = read_sysreg_s(SYS_TFSR_EL1); + u64 tfsr_el1 = read_sysreg_s(SYS_TFSR_EL1); if (unlikely(tfsr_el1 & SYS_TFSR_EL1_TF1)) { /* @@ -210,6 +183,30 @@ static void mte_update_sctlr_user(struct task_struct *task) task->thread.sctlr_user = sctlr; } +static void mte_update_gcr_excl(struct task_struct *task) +{ + /* + * SYS_GCR_EL1 will be set to current->thread.mte_ctrl value by + * mte_set_user_gcr() in kernel_exit, but only if KASAN is enabled. + */ + if (kasan_hw_tags_enabled()) + return; + + write_sysreg_s( + ((task->thread.mte_ctrl >> MTE_CTRL_GCR_USER_EXCL_SHIFT) & + SYS_GCR_EL1_EXCL_MASK) | SYS_GCR_EL1_RRND, + SYS_GCR_EL1); +} + +void __init kasan_hw_tags_enable(struct alt_instr *alt, __le32 *origptr, + __le32 *updptr, int nr_inst) +{ + BUG_ON(nr_inst != 1); /* Branch -> NOP */ + + if (kasan_hw_tags_enabled()) + *updptr = cpu_to_le32(aarch64_insn_gen_nop()); +} + void mte_thread_init_user(void) { if (!system_supports_mte()) @@ -225,7 +222,11 @@ void mte_thread_init_user(void) void mte_thread_switch(struct task_struct *next) { + if (!system_supports_mte()) + return; + mte_update_sctlr_user(next); + mte_update_gcr_excl(next); /* * Check if an async tag exception occurred at EL1. @@ -254,15 +255,6 @@ void mte_suspend_enter(void) mte_check_tfsr_el1(); } -void mte_suspend_exit(void) -{ - if (!system_supports_mte()) - return; - - sysreg_clear_set_s(SYS_GCR_EL1, SYS_GCR_EL1_EXCL_MASK, gcr_kernel_excl); - isb(); -} - long set_mte_ctrl(struct task_struct *task, unsigned long arg) { u64 mte_ctrl = (~((arg & PR_MTE_TAG_MASK) >> PR_MTE_TAG_SHIFT) & @@ -280,6 +272,7 @@ long set_mte_ctrl(struct task_struct *task, unsigned long arg) if (task == current) { preempt_disable(); mte_update_sctlr_user(task); + mte_update_gcr_excl(task); update_sctlr_el1(task->thread.sctlr_user); preempt_enable(); } diff --git a/arch/arm64/kernel/suspend.c b/arch/arm64/kernel/suspend.c index 1e8dc6f7d178..ea019a852adc 100644 --- a/arch/arm64/kernel/suspend.c +++ b/arch/arm64/kernel/suspend.c @@ -76,7 +76,6 @@ void notrace __cpu_suspend_exit(void) spectre_v4_enable_mitigation(NULL); /* Restore additional feature-specific configuration */ - mte_suspend_exit(); ptrauth_suspend_exit(); } diff --git a/arch/arm64/mm/kasan_init.c b/arch/arm64/mm/kasan_init.c index d8e66c78440e..1cc2cde94e94 100644 --- a/arch/arm64/mm/kasan_init.c +++ b/arch/arm64/mm/kasan_init.c @@ -214,15 +214,18 @@ static void __init kasan_init_shadow(void) { u64 kimg_shadow_start, kimg_shadow_end; u64 mod_shadow_start, mod_shadow_end; + u64 vmalloc_shadow_end; phys_addr_t pa_start, pa_end; u64 i; - kimg_shadow_start = (u64)kasan_mem_to_shadow(_text) & PAGE_MASK; - kimg_shadow_end = PAGE_ALIGN((u64)kasan_mem_to_shadow(_end)); + kimg_shadow_start = (u64)kasan_mem_to_shadow(KERNEL_START) & PAGE_MASK; + kimg_shadow_end = PAGE_ALIGN((u64)kasan_mem_to_shadow(KERNEL_END)); mod_shadow_start = (u64)kasan_mem_to_shadow((void *)MODULES_VADDR); mod_shadow_end = (u64)kasan_mem_to_shadow((void *)MODULES_END); + vmalloc_shadow_end = (u64)kasan_mem_to_shadow((void *)VMALLOC_END); + /* * We are going to perform proper setup of shadow memory. * At first we should unmap early shadow (clear_pgds() call below). @@ -237,16 +240,22 @@ static void __init kasan_init_shadow(void) clear_pgds(KASAN_SHADOW_START, KASAN_SHADOW_END); kasan_map_populate(kimg_shadow_start, kimg_shadow_end, - early_pfn_to_nid(virt_to_pfn(lm_alias(_text)))); + early_pfn_to_nid(virt_to_pfn(lm_alias(KERNEL_START)))); kasan_populate_early_shadow(kasan_mem_to_shadow((void *)PAGE_END), (void *)mod_shadow_start); - kasan_populate_early_shadow((void *)kimg_shadow_end, - (void *)KASAN_SHADOW_END); - if (kimg_shadow_start > mod_shadow_end) - kasan_populate_early_shadow((void *)mod_shadow_end, - (void *)kimg_shadow_start); + if (IS_ENABLED(CONFIG_KASAN_VMALLOC)) { + BUILD_BUG_ON(VMALLOC_START != MODULES_END); + kasan_populate_early_shadow((void *)vmalloc_shadow_end, + (void *)KASAN_SHADOW_END); + } else { + kasan_populate_early_shadow((void *)kimg_shadow_end, + (void *)KASAN_SHADOW_END); + if (kimg_shadow_start > mod_shadow_end) + kasan_populate_early_shadow((void *)mod_shadow_end, + (void *)kimg_shadow_start); + } for_each_mem_range(i, &pa_start, &pa_end) { void *start = (void *)__phys_to_virt(pa_start); diff --git a/arch/arm64/mm/mmu.c b/arch/arm64/mm/mmu.c index 57d4539a7d2c..542f14c61fb3 100644 --- a/arch/arm64/mm/mmu.c +++ b/arch/arm64/mm/mmu.c @@ -1501,6 +1501,11 @@ int arch_add_memory(int nid, u64 start, u64 size, if (ret) __remove_pgd_mapping(swapper_pg_dir, __phys_to_virt(start), size); + else { + max_pfn = PFN_UP(start + size); + max_low_pfn = max_pfn; + } + return ret; } diff --git a/arch/arm64/mm/proc.S b/arch/arm64/mm/proc.S index 6e175dbbb474..c188a9eb3ea6 100644 --- a/arch/arm64/mm/proc.S +++ b/arch/arm64/mm/proc.S @@ -445,8 +445,7 @@ SYM_FUNC_START(__cpu_setup) mov x10, #MAIR_ATTR_NORMAL_TAGGED bfi x5, x10, #(8 * MT_NORMAL_TAGGED), #8 - /* initialize GCR_EL1: all non-zero tags excluded by default */ - mov x10, #(SYS_GCR_EL1_RRND | SYS_GCR_EL1_EXCL_MASK) + mov x10, #KERNEL_GCR_EL1 msr_s SYS_GCR_EL1, x10 /* diff --git a/drivers/android/binder.c b/drivers/android/binder.c index d565081d2f3d..2cc96a0e75ae 100644 --- a/drivers/android/binder.c +++ b/drivers/android/binder.c @@ -3196,9 +3196,8 @@ static void binder_transaction(struct binder_proc *proc, if (reply) { binder_enqueue_thread_work(thread, tcomplete); binder_inner_proc_lock(target_proc); - if (target_thread->is_dead || target_proc->is_frozen) { - return_error = target_thread->is_dead ? - BR_DEAD_REPLY : BR_FROZEN_REPLY; + if (target_thread->is_dead) { + return_error = BR_DEAD_REPLY; binder_inner_proc_unlock(target_proc); goto err_dead_proc_or_thread; } @@ -4806,6 +4805,22 @@ static int binder_ioctl_get_node_debug_info(struct binder_proc *proc, return 0; } +static bool binder_txns_pending_ilocked(struct binder_proc *proc) +{ + struct rb_node *n; + struct binder_thread *thread; + + if (proc->outstanding_txns > 0) + return true; + + for (n = rb_first(&proc->threads); n; n = rb_next(n)) { + thread = rb_entry(n, struct binder_thread, rb_node); + if (thread->transaction_stack) + return true; + } + return false; +} + static int binder_ioctl_freeze(struct binder_freeze_info *info, struct binder_proc *target_proc) { @@ -4837,8 +4852,13 @@ static int binder_ioctl_freeze(struct binder_freeze_info *info, (!target_proc->outstanding_txns), msecs_to_jiffies(info->timeout_ms)); - if (!ret && target_proc->outstanding_txns) - ret = -EAGAIN; + /* Check pending transactions that wait for reply */ + if (ret >= 0) { + binder_inner_proc_lock(target_proc); + if (binder_txns_pending_ilocked(target_proc)) + ret = -EAGAIN; + binder_inner_proc_unlock(target_proc); + } if (ret < 0) { binder_inner_proc_lock(target_proc); @@ -4854,6 +4874,7 @@ static int binder_ioctl_get_freezer_info( { struct binder_proc *target_proc; bool found = false; + __u32 txns_pending; info->sync_recv = 0; info->async_recv = 0; @@ -4863,7 +4884,9 @@ static int binder_ioctl_get_freezer_info( if (target_proc->pid == info->pid) { found = true; binder_inner_proc_lock(target_proc); - info->sync_recv |= target_proc->sync_recv; + txns_pending = binder_txns_pending_ilocked(target_proc); + info->sync_recv |= target_proc->sync_recv | + (txns_pending << 1); info->async_recv |= target_proc->async_recv; binder_inner_proc_unlock(target_proc); } diff --git a/drivers/android/binder_internal.h b/drivers/android/binder_internal.h index 2ddbec09d2f9..8508a7e45865 100644 --- a/drivers/android/binder_internal.h +++ b/drivers/android/binder_internal.h @@ -399,6 +399,8 @@ struct binder_priority { * binder transactions * (protected by @inner_lock) * @sync_recv: process received sync transactions since last frozen + * bit 0: received sync transaction after being frozen + * bit 1: new pending sync transaction during freezing * (protected by @inner_lock) * @async_recv: process received async transactions since last frozen * (protected by @inner_lock) diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index f0ca247d88df..b7f23ab2dec7 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -214,6 +214,7 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_filemap_fault_cache_page); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_enable_thermal_genl_check); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_thermal_pm_notify_suspend); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_ufs_fill_prdt); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_ufs_complete_init); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_ufs_reprogram_all_keys); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_ufs_prepare_command); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_ufs_update_sysfs); diff --git a/drivers/dma-buf/dma-buf.c b/drivers/dma-buf/dma-buf.c index d9948d58b3f4..0ee38382ba17 100644 --- a/drivers/dma-buf/dma-buf.c +++ b/drivers/dma-buf/dma-buf.c @@ -348,6 +348,25 @@ out: return events; } +static long _dma_buf_set_name(struct dma_buf *dmabuf, const char *name) +{ + long ret = 0; + + dma_resv_lock(dmabuf->resv, NULL); + if (!list_empty(&dmabuf->attachments)) { + ret = -EBUSY; + goto out_unlock; + } + spin_lock(&dmabuf->name_lock); + kfree(dmabuf->name); + dmabuf->name = name; + spin_unlock(&dmabuf->name_lock); + +out_unlock: + dma_resv_unlock(dmabuf->resv); + return ret; +} + /** * dma_buf_set_name - Set a name to a specific dma_buf to track the usage. * The name of the dma-buf buffer can only be set when the dma-buf is not @@ -363,7 +382,23 @@ out: * devices, return -EBUSY. * */ -static long dma_buf_set_name(struct dma_buf *dmabuf, const char __user *buf) +long dma_buf_set_name(struct dma_buf *dmabuf, const char *name) +{ + long ret = 0; + char *buf = kstrndup(name, DMA_BUF_NAME_LEN, GFP_KERNEL); + + if (!buf) + return -ENOMEM; + + ret = _dma_buf_set_name(dmabuf, buf); + if (ret) + kfree(buf); + + return ret; +} +EXPORT_SYMBOL_GPL(dma_buf_set_name); + +static long dma_buf_set_name_user(struct dma_buf *dmabuf, const char __user *buf) { char *name = strndup_user(buf, DMA_BUF_NAME_LEN); long ret = 0; @@ -371,19 +406,10 @@ static long dma_buf_set_name(struct dma_buf *dmabuf, const char __user *buf) if (IS_ERR(name)) return PTR_ERR(name); - dma_resv_lock(dmabuf->resv, NULL); - if (!list_empty(&dmabuf->attachments)) { - ret = -EBUSY; + ret = _dma_buf_set_name(dmabuf, name); + if (ret) kfree(name); - goto out_unlock; - } - spin_lock(&dmabuf->name_lock); - kfree(dmabuf->name); - dmabuf->name = name; - spin_unlock(&dmabuf->name_lock); -out_unlock: - dma_resv_unlock(dmabuf->resv); return ret; } @@ -428,7 +454,7 @@ static long dma_buf_ioctl(struct file *file, case DMA_BUF_SET_NAME_A: case DMA_BUF_SET_NAME_B: - return dma_buf_set_name(dmabuf, (const char __user *)arg); + return dma_buf_set_name_user(dmabuf, (const char __user *)arg); default: return -ENOTTY; diff --git a/drivers/md/dm-verity-target.c b/drivers/md/dm-verity-target.c index 808a98ef624c..9d5c6dd5b756 100644 --- a/drivers/md/dm-verity-target.c +++ b/drivers/md/dm-verity-target.c @@ -475,6 +475,7 @@ static int verity_verify_io(struct dm_verity_io *io) struct bvec_iter start; unsigned b; struct crypto_wait wait; + struct bio *bio = dm_bio_from_per_bio_data(io, v->ti->per_io_data_size); for (b = 0; b < io->n_blocks; b++) { int r; @@ -529,9 +530,17 @@ static int verity_verify_io(struct dm_verity_io *io) else if (verity_fec_decode(v, io, DM_VERITY_BLOCK_TYPE_DATA, cur_block, NULL, &start) == 0) continue; - else if (verity_handle_err(v, DM_VERITY_BLOCK_TYPE_DATA, + else { + if (bio->bi_status) { + /* + * Error correction failed; Just return error + */ + return -EIO; + } + if (verity_handle_err(v, DM_VERITY_BLOCK_TYPE_DATA, cur_block)) - return -EIO; + return -EIO; + } } return 0; diff --git a/drivers/scsi/ufs/ufshcd-add-info.h b/drivers/scsi/ufs/ufshcd-add-info.h new file mode 100644 index 000000000000..72ed34de6a61 --- /dev/null +++ b/drivers/scsi/ufs/ufshcd-add-info.h @@ -0,0 +1,25 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ + +#ifndef _UFSHCD_ADD_INFO_H_ +#define _UFSHCD_ADD_INFO_H_ + +/* + * Compared to the upstream equivalent, @hpb_dev has been moved from struct + * ufs_hba into struct ufs_hba_add_info to satisfy the Android ABI checks. + * Do NOT use this data structure in any out-of-tree driver since it is not + * covered by the GKI. + */ +struct ufs_hba_add_info { + struct ufs_hba hba; + struct request **tmf_rqs; +#ifdef CONFIG_SCSI_UFS_HPB + struct ufshpb_dev_info hpb_dev; +#endif +}; + +static inline struct ufs_hba_add_info *ufs_hba_add_info(struct ufs_hba *hba) +{ + return container_of(hba, struct ufs_hba_add_info, hba); +} + +#endif /* _UFSHCD_ADD_INFO_H_ */ diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c index 9f848fa73eb3..f160d0fcdc59 100644 --- a/drivers/scsi/ufs/ufshcd.c +++ b/drivers/scsi/ufs/ufshcd.c @@ -17,6 +17,7 @@ #include #include #include "ufshcd.h" +#include "ufshcd-add-info.h" #include "ufs_quirks.h" #include "unipro.h" #include "ufs-sysfs.h" @@ -6363,27 +6364,6 @@ static irqreturn_t ufshcd_check_errors(struct ufs_hba *hba, u32 intr_status) return retval; } -struct ctm_info { - struct ufs_hba *hba; - unsigned long pending; - unsigned int ncpl; -}; - -static bool ufshcd_compl_tm(struct request *req, void *priv, bool reserved) -{ - struct ctm_info *const ci = priv; - struct completion *c; - - WARN_ON_ONCE(reserved); - if (test_bit(req->tag, &ci->pending)) - return true; - ci->ncpl++; - c = req->end_io_data; - if (c) - complete(c); - return true; -} - /** * ufshcd_tmc_handler - handle task management function completion * @hba: per adapter instance @@ -6394,18 +6374,25 @@ static bool ufshcd_compl_tm(struct request *req, void *priv, bool reserved) */ static irqreturn_t ufshcd_tmc_handler(struct ufs_hba *hba) { - unsigned long flags; - struct request_queue *q = hba->tmf_queue; - struct ctm_info ci = { - .hba = hba, - }; + struct request **tmf_rqs = ufs_hba_add_info(hba)->tmf_rqs; + unsigned long flags, pending, issued; + irqreturn_t ret = IRQ_NONE; + int tag; + + pending = ufshcd_readl(hba, REG_UTP_TASK_REQ_DOOR_BELL); spin_lock_irqsave(hba->host->host_lock, flags); - ci.pending = ufshcd_readl(hba, REG_UTP_TASK_REQ_DOOR_BELL); - blk_mq_tagset_busy_iter(q->tag_set, ufshcd_compl_tm, &ci); + issued = hba->outstanding_tasks & ~pending; + for_each_set_bit(tag, &issued, hba->nutmrs) { + struct request *req = tmf_rqs[tag]; + struct completion *c = req->end_io_data; + + complete(c); + ret = IRQ_HANDLED; + } spin_unlock_irqrestore(hba->host->host_lock, flags); - return ci.ncpl ? IRQ_HANDLED : IRQ_NONE; + return ret; } /** @@ -6510,6 +6497,7 @@ out: static int __ufshcd_issue_tm_cmd(struct ufs_hba *hba, struct utp_task_req_desc *treq, u8 tm_function) { + struct request **tmf_rqs = ufs_hba_add_info(hba)->tmf_rqs; struct request_queue *q = hba->tmf_queue; struct Scsi_Host *host = hba->host; DECLARE_COMPLETION_ONSTACK(wait); @@ -6528,9 +6516,9 @@ static int __ufshcd_issue_tm_cmd(struct ufs_hba *hba, ufshcd_hold(hba, false); spin_lock_irqsave(host->host_lock, flags); - blk_mq_start_request(req); task_tag = req->tag; + tmf_rqs[req->tag] = req; treq->req_header.dword_0 |= cpu_to_be32(task_tag); memcpy(hba->utmrdl_base_addr + task_tag, treq, sizeof(*treq)); @@ -6574,6 +6562,7 @@ static int __ufshcd_issue_tm_cmd(struct ufs_hba *hba, } spin_lock_irqsave(hba->host->host_lock, flags); + tmf_rqs[req->tag] = NULL; __clear_bit(task_tag, &hba->outstanding_tasks); spin_unlock_irqrestore(hba->host->host_lock, flags); @@ -8042,6 +8031,8 @@ static int ufshcd_probe_hba(struct ufs_hba *hba, bool async) ufshcd_auto_hibern8_enable(hba); ufshpb_reset(hba); + + trace_android_rvh_ufs_complete_init(hba); out: spin_lock_irqsave(hba->host->host_lock, flags); if (ret) @@ -9323,7 +9314,7 @@ int ufshcd_alloc_host(struct device *dev, struct ufs_hba **hba_handle) } host = scsi_host_alloc(&ufshcd_driver_template, - sizeof(struct ufs_hba_with_hpb)); + sizeof(struct ufs_hba_add_info)); if (!host) { dev_err(dev, "scsi_host_alloc failed\n"); err = -ENOMEM; @@ -9364,6 +9355,7 @@ static const struct blk_mq_ops ufshcd_tmf_ops = { */ int ufshcd_init(struct ufs_hba *hba, void __iomem *mmio_base, unsigned int irq) { + struct request ***tmf_rqs = &ufs_hba_add_info(hba)->tmf_rqs; int err; struct Scsi_Host *host = hba->host; struct device *dev = hba->dev; @@ -9501,6 +9493,12 @@ int ufshcd_init(struct ufs_hba *hba, void __iomem *mmio_base, unsigned int irq) err = PTR_ERR(hba->tmf_queue); goto free_tmf_tag_set; } + *tmf_rqs = devm_kcalloc(hba->dev, hba->nutmrs, sizeof(**tmf_rqs), + GFP_KERNEL); + if (!*tmf_rqs) { + err = -ENOMEM; + goto free_tmf_queue; + } /* Reset the attached device */ ufshcd_vops_device_reset(hba); diff --git a/drivers/scsi/ufs/ufshcd.h b/drivers/scsi/ufs/ufshcd.h index c75c5cd7b973..7150c886283e 100644 --- a/drivers/scsi/ufs/ufshcd.h +++ b/drivers/scsi/ufs/ufshcd.h @@ -843,6 +843,12 @@ struct ufs_hba { struct blk_mq_tag_set tmf_tag_set; struct request_queue *tmf_queue; +#if 0 + /* + * This has been moved into struct ufs_hba_add_info because of the GKI. + */ + struct request **tmf_rqs; +#endif struct uic_command *active_uic_cmd; struct mutex uic_cmd_mutex; @@ -913,7 +919,7 @@ struct ufs_hba { struct delayed_work rpm_dev_flush_recheck_work; #if 0 - /* This has been moved into struct ufs_hba_with_hpb. */ + /* This has been moved into struct ufs_hba_add_info. */ struct ufshpb_dev_info ufshpb_dev; #endif @@ -935,17 +941,6 @@ struct ufs_hba { ANDROID_KABI_RESERVE(4); }; -/* - * Compared to the upstream equivalent, @hpb_dev has been moved from struct - * ufs_hba into struct ufs_hba_with_hpb to satisfy the Android ABI checks. - */ -struct ufs_hba_with_hpb { - struct ufs_hba hba; -#ifdef CONFIG_SCSI_UFS_HPB - struct ufshpb_dev_info hpb_dev; -#endif -}; - /* Returns true if clocks can be gated. Otherwise false */ static inline bool ufshcd_is_clkgating_allowed(struct ufs_hba *hba) { diff --git a/drivers/scsi/ufs/ufshpb.c b/drivers/scsi/ufs/ufshpb.c index 9755317c3301..10d8b3dde976 100644 --- a/drivers/scsi/ufs/ufshpb.c +++ b/drivers/scsi/ufs/ufshpb.c @@ -13,6 +13,7 @@ #include #include "ufshcd.h" +#include "ufshcd-add-info.h" #include "ufshpb.h" #include "../sd.h" @@ -37,7 +38,7 @@ static void ufshpb_update_active_info(struct ufshpb_lu *hpb, int rgn_idx, static inline struct ufshpb_dev_info *ufs_hba_to_hpb(struct ufs_hba *hba) { - return &container_of(hba, struct ufs_hba_with_hpb, hba)->hpb_dev; + return &ufs_hba_add_info(hba)->hpb_dev; } bool ufshpb_is_allowed(struct ufs_hba *hba) diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c index b56e99122da4..cb514a3bd449 100644 --- a/drivers/usb/dwc3/core.c +++ b/drivers/usb/dwc3/core.c @@ -1526,15 +1526,17 @@ static int dwc3_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; struct resource *res, dwc_res; + struct dwc3_vendor *vdwc; struct dwc3 *dwc; int ret; void __iomem *regs; - dwc = devm_kzalloc(dev, sizeof(*dwc), GFP_KERNEL); - if (!dwc) + vdwc = devm_kzalloc(dev, sizeof(*vdwc), GFP_KERNEL); + if (!vdwc) return -ENOMEM; + dwc = &vdwc->dwc; dwc->dev = dev; diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h index d938f85c5847..f66fefaf401a 100644 --- a/drivers/usb/dwc3/core.h +++ b/drivers/usb/dwc3/core.h @@ -1319,6 +1319,16 @@ struct dwc3 { ANDROID_KABI_RESERVE(4); }; +/** + * struct dwc3_vendor - contains parameters without modifying the format of DWC3 core + * @dwc: contains dwc3 core reference + * @softconnect: true when gadget connect is called, false when disconnect runs + */ +struct dwc3_vendor { + struct dwc3 dwc; + unsigned softconnect:1; +}; + #define INCRX_BURST_MODE 0 #define INCRX_UNDEF_LENGTH_BURST_MODE 1 diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c index 2867c923a805..0c38791da695 100644 --- a/drivers/usb/dwc3/gadget.c +++ b/drivers/usb/dwc3/gadget.c @@ -2411,10 +2411,12 @@ static int __dwc3_gadget_start(struct dwc3 *dwc); static int dwc3_gadget_pullup(struct usb_gadget *g, int is_on) { struct dwc3 *dwc = gadget_to_dwc(g); + struct dwc3_vendor *vdwc = container_of(dwc, struct dwc3_vendor, dwc); unsigned long flags; int ret; is_on = !!is_on; + vdwc->softconnect = is_on; /* * Per databook, when we want to stop the gadget, if a control transfer @@ -4366,9 +4368,10 @@ int dwc3_gadget_suspend(struct dwc3 *dwc) int dwc3_gadget_resume(struct dwc3 *dwc) { + struct dwc3_vendor *vdwc = container_of(dwc, struct dwc3_vendor, dwc); int ret; - if (!dwc->gadget_driver) + if (!dwc->gadget_driver || !vdwc->softconnect) return 0; ret = __dwc3_gadget_start(dwc); diff --git a/drivers/usb/gadget/function/f_fs.c b/drivers/usb/gadget/function/f_fs.c index 19303c4cebdc..725e35167837 100644 --- a/drivers/usb/gadget/function/f_fs.c +++ b/drivers/usb/gadget/function/f_fs.c @@ -3226,10 +3226,6 @@ static int _ffs_func_bind(struct usb_configuration *c, func->function.os_desc_n = c->cdev->use_os_string ? ffs->interfaces_count : 0; - if (likely(super)) { - func->function.ssp_descriptors = - usb_copy_descriptors(func->function.ss_descriptors); - } /* And we're done */ ffs_event_add(ffs, FUNCTIONFS_BIND); return 0; diff --git a/drivers/usb/gadget/function/f_uac2.c b/drivers/usb/gadget/function/f_uac2.c index 4b506412e273..53cb6b2637a0 100644 --- a/drivers/usb/gadget/function/f_uac2.c +++ b/drivers/usb/gadget/function/f_uac2.c @@ -348,6 +348,14 @@ static struct usb_endpoint_descriptor ss_epin_fback_desc = { .bInterval = 4, }; +static struct usb_ss_ep_comp_descriptor ss_epin_fback_desc_comp = { + .bLength = sizeof(ss_epin_fback_desc_comp), + .bDescriptorType = USB_DT_SS_ENDPOINT_COMP, + .bMaxBurst = 0, + .bmAttributes = 0, + .wBytesPerInterval = cpu_to_le16(4), +}; + /* Audio Streaming IN Interface - Alt0 */ static struct usb_interface_descriptor std_as_in_if0_desc = { @@ -527,7 +535,7 @@ static struct usb_descriptor_header *ss_audio_desc[] = { (struct usb_descriptor_header *)&ss_epout_desc_comp, (struct usb_descriptor_header *)&as_iso_out_desc, (struct usb_descriptor_header *)&ss_epin_fback_desc, - (struct usb_descriptor_header *)&ss_epin_desc_comp, + (struct usb_descriptor_header *)&ss_epin_fback_desc_comp, (struct usb_descriptor_header *)&std_as_in_if0_desc, (struct usb_descriptor_header *)&std_as_in_if1_desc, @@ -611,6 +619,7 @@ static void setup_headers(struct f_uac2_opts *opts, { struct usb_ss_ep_comp_descriptor *epout_desc_comp = NULL; struct usb_ss_ep_comp_descriptor *epin_desc_comp = NULL; + struct usb_ss_ep_comp_descriptor *epin_fback_desc_comp = NULL; struct usb_endpoint_descriptor *epout_desc; struct usb_endpoint_descriptor *epin_desc; struct usb_endpoint_descriptor *epin_fback_desc; @@ -633,6 +642,7 @@ static void setup_headers(struct f_uac2_opts *opts, epout_desc_comp = &ss_epout_desc_comp; epin_desc_comp = &ss_epin_desc_comp; epin_fback_desc = &ss_epin_fback_desc; + epin_fback_desc_comp = &ss_epin_fback_desc_comp; } i = 0; @@ -663,8 +673,8 @@ static void setup_headers(struct f_uac2_opts *opts, if (EPOUT_FBACK_IN_EN(opts)) { headers[i++] = USBDHDR(epin_fback_desc); - if (epin_desc_comp) - headers[i++] = USBDHDR(epin_desc_comp); + if (epin_fback_desc_comp) + headers[i++] = USBDHDR(epin_fback_desc_comp); } } if (EPIN_EN(opts)) { @@ -947,6 +957,9 @@ afunc_bind(struct usb_configuration *cfg, struct usb_function *fn) agdev->out_ep_maxpsize = max_t(u16, agdev->out_ep_maxpsize, le16_to_cpu(ss_epout_desc.wMaxPacketSize)); + ss_epin_desc_comp.wBytesPerInterval = ss_epin_desc.wMaxPacketSize; + ss_epout_desc_comp.wBytesPerInterval = ss_epout_desc.wMaxPacketSize; + hs_epout_desc.bEndpointAddress = fs_epout_desc.bEndpointAddress; hs_epin_fback_desc.bEndpointAddress = fs_epin_fback_desc.bEndpointAddress; hs_epin_desc.bEndpointAddress = fs_epin_desc.bEndpointAddress; diff --git a/fs/buffer.c b/fs/buffer.c index 63afd6ddb85f..7b096c90ae53 100644 --- a/fs/buffer.c +++ b/fs/buffer.c @@ -1454,12 +1454,16 @@ void invalidate_bh_lrus(void) } EXPORT_SYMBOL_GPL(invalidate_bh_lrus); -void invalidate_bh_lrus_cpu(int cpu) +/* + * It's called from workqueue context so we need a bh_lru_lock to close + * the race with preemption/irq. + */ +void invalidate_bh_lrus_cpu(void) { struct bh_lru *b; bh_lru_lock(); - b = per_cpu_ptr(&bh_lrus, cpu); + b = this_cpu_ptr(&bh_lrus); __invalidate_bh_lrus(b); bh_lru_unlock(); } diff --git a/fs/erofs/Kconfig b/fs/erofs/Kconfig index 74b0aaa7114c..858b3339f381 100644 --- a/fs/erofs/Kconfig +++ b/fs/erofs/Kconfig @@ -76,17 +76,3 @@ config EROFS_FS_ZIP If you don't want to enable compression feature, say N. -config EROFS_FS_CLUSTER_PAGE_LIMIT - int "EROFS Cluster Pages Hard Limit" - depends on EROFS_FS_ZIP - range 1 256 - default "1" - help - Indicates maximum # of pages of a compressed - physical cluster. - - For example, if files in a image were compressed - into 8k-unit, hard limit should not be configured - less than 2. Otherwise, the image will be refused - to mount on this kernel. - diff --git a/fs/erofs/Makefile b/fs/erofs/Makefile index 46f2aa4ba46c..1f9aced49070 100644 --- a/fs/erofs/Makefile +++ b/fs/erofs/Makefile @@ -1,11 +1,6 @@ # SPDX-License-Identifier: GPL-2.0-only -EROFS_VERSION = "1.0" - -ccflags-y += -DEROFS_VERSION=\"$(EROFS_VERSION)\" - obj-$(CONFIG_EROFS_FS) += erofs.o -erofs-objs := super.o inode.o data.o namei.o dir.o utils.o +erofs-objs := super.o inode.o data.o namei.o dir.o utils.o pcpubuf.o erofs-$(CONFIG_EROFS_FS_XATTR) += xattr.o erofs-$(CONFIG_EROFS_FS_ZIP) += decompressor.o zmap.o zdata.o - diff --git a/fs/erofs/data.c b/fs/erofs/data.c index ea4f693bee22..76c47c34b09f 100644 --- a/fs/erofs/data.c +++ b/fs/erofs/data.c @@ -109,21 +109,6 @@ err_out: return err; } -int erofs_map_blocks(struct inode *inode, - struct erofs_map_blocks *map, int flags) -{ - if (erofs_inode_is_data_compressed(EROFS_I(inode)->datalayout)) { - int err = z_erofs_map_blocks_iter(inode, map, flags); - - if (map->mpage) { - put_page(map->mpage); - map->mpage = NULL; - } - return err; - } - return erofs_map_blocks_flatmode(inode, map, flags); -} - static inline struct bio *erofs_read_raw_page(struct bio *bio, struct address_space *mapping, struct page *page, @@ -159,7 +144,7 @@ submit_bio_retry: erofs_blk_t blknr; unsigned int blkoff; - err = erofs_map_blocks(inode, &map, EROFS_GET_BLOCKS_RAW); + err = erofs_map_blocks_flatmode(inode, &map, EROFS_GET_BLOCKS_RAW); if (err) goto err_out; @@ -326,7 +311,7 @@ static sector_t erofs_bmap(struct address_space *mapping, sector_t block) return 0; } - if (!erofs_map_blocks(inode, &map, EROFS_GET_BLOCKS_RAW)) + if (!erofs_map_blocks_flatmode(inode, &map, EROFS_GET_BLOCKS_RAW)) return erofs_blknr(map.m_pa); return 0; diff --git a/fs/erofs/decompressor.c b/fs/erofs/decompressor.c index 04624954a119..88e33addf229 100644 --- a/fs/erofs/decompressor.c +++ b/fs/erofs/decompressor.c @@ -29,14 +29,39 @@ struct z_erofs_decompressor { }; int z_erofs_load_lz4_config(struct super_block *sb, - struct erofs_super_block *dsb) + struct erofs_super_block *dsb, + struct z_erofs_lz4_cfgs *lz4, int size) { - u16 distance = le16_to_cpu(dsb->lz4_max_distance); + struct erofs_sb_info *sbi = EROFS_SB(sb); + u16 distance; - EROFS_SB(sb)->lz4.max_distance_pages = distance ? + if (lz4) { + if (size < sizeof(struct z_erofs_lz4_cfgs)) { + erofs_err(sb, "invalid lz4 cfgs, size=%u", size); + return -EINVAL; + } + distance = le16_to_cpu(lz4->max_distance); + + sbi->lz4.max_pclusterblks = le16_to_cpu(lz4->max_pclusterblks); + if (!sbi->lz4.max_pclusterblks) { + sbi->lz4.max_pclusterblks = 1; /* reserved case */ + } else if (sbi->lz4.max_pclusterblks > + Z_EROFS_PCLUSTER_MAX_SIZE / EROFS_BLKSIZ) { + erofs_err(sb, "too large lz4 pclusterblks %u", + sbi->lz4.max_pclusterblks); + return -EINVAL; + } else if (sbi->lz4.max_pclusterblks >= 2) { + erofs_info(sb, "EXPERIMENTAL big pcluster feature in use. Use at your own risk!"); + } + } else { + distance = le16_to_cpu(dsb->u1.lz4_max_distance); + sbi->lz4.max_pclusterblks = 1; + } + + sbi->lz4.max_distance_pages = distance ? DIV_ROUND_UP(distance, PAGE_SIZE) + 1 : LZ4_MAX_DISTANCE_PAGES; - return 0; + return erofs_pcpubuf_growsize(sbi->lz4.max_pclusterblks); } static int z_erofs_lz4_prepare_destpages(struct z_erofs_decompress_req *rq, @@ -95,96 +120,123 @@ static int z_erofs_lz4_prepare_destpages(struct z_erofs_decompress_req *rq, return kaddr ? 1 : 0; } -static void *generic_copy_inplace_data(struct z_erofs_decompress_req *rq, - u8 *src, unsigned int pageofs_in) +static void *z_erofs_handle_inplace_io(struct z_erofs_decompress_req *rq, + void *inpage, unsigned int *inputmargin, int *maptype, + bool support_0padding) { - /* - * if in-place decompression is ongoing, those decompressed - * pages should be copied in order to avoid being overlapped. - */ - struct page **in = rq->in; - u8 *const tmp = erofs_get_pcpubuf(0); - u8 *tmpp = tmp; - unsigned int inlen = rq->inputsize - pageofs_in; - unsigned int count = min_t(uint, inlen, PAGE_SIZE - pageofs_in); + unsigned int nrpages_in, nrpages_out; + unsigned int ofull, oend, inputsize, total, i, j; + struct page **in; + void *src, *tmp; - while (tmpp < tmp + inlen) { - if (!src) - src = kmap_atomic(*in); - memcpy(tmpp, src + pageofs_in, count); - kunmap_atomic(src); - src = NULL; - tmpp += count; - pageofs_in = 0; - count = PAGE_SIZE; - ++in; + inputsize = rq->inputsize; + nrpages_in = PAGE_ALIGN(inputsize) >> PAGE_SHIFT; + oend = rq->pageofs_out + rq->outputsize; + ofull = PAGE_ALIGN(oend); + nrpages_out = ofull >> PAGE_SHIFT; + + if (rq->inplace_io) { + if (rq->partial_decoding || !support_0padding || + ofull - oend < LZ4_DECOMPRESS_INPLACE_MARGIN(inputsize)) + goto docopy; + + for (i = 0; i < nrpages_in; ++i) { + DBG_BUGON(rq->in[i] == NULL); + for (j = 0; j < nrpages_out - nrpages_in + i; ++j) + if (rq->out[j] == rq->in[i]) + goto docopy; + } } - return tmp; + + if (nrpages_in <= 1) { + *maptype = 0; + return inpage; + } + kunmap_atomic(inpage); + might_sleep(); + src = erofs_vm_map_ram(rq->in, nrpages_in); + if (!src) + return ERR_PTR(-ENOMEM); + *maptype = 1; + return src; + +docopy: + /* Or copy compressed data which can be overlapped to per-CPU buffer */ + in = rq->in; + src = erofs_get_pcpubuf(nrpages_in); + if (!src) { + DBG_BUGON(1); + kunmap_atomic(inpage); + return ERR_PTR(-EFAULT); + } + + tmp = src; + total = rq->inputsize; + while (total) { + unsigned int page_copycnt = + min_t(unsigned int, total, PAGE_SIZE - *inputmargin); + + if (!inpage) + inpage = kmap_atomic(*in); + memcpy(tmp, inpage + *inputmargin, page_copycnt); + kunmap_atomic(inpage); + inpage = NULL; + tmp += page_copycnt; + total -= page_copycnt; + ++in; + *inputmargin = 0; + } + *maptype = 2; + return src; } static int z_erofs_lz4_decompress(struct z_erofs_decompress_req *rq, u8 *out) { - unsigned int inputmargin, inlen; - u8 *src; - bool copied, support_0padding; - int ret; + unsigned int inputmargin; + u8 *headpage, *src; + bool support_0padding; + int ret, maptype; - if (rq->inputsize > PAGE_SIZE) - return -EOPNOTSUPP; - - src = kmap_atomic(*rq->in); + DBG_BUGON(*rq->in == NULL); + headpage = kmap_atomic(*rq->in); inputmargin = 0; support_0padding = false; /* decompression inplace is only safe when 0padding is enabled */ - if (EROFS_SB(rq->sb)->feature_incompat & - EROFS_FEATURE_INCOMPAT_LZ4_0PADDING) { + if (erofs_sb_has_lz4_0padding(EROFS_SB(rq->sb))) { support_0padding = true; - while (!src[inputmargin & ~PAGE_MASK]) + while (!headpage[inputmargin & ~PAGE_MASK]) if (!(++inputmargin & ~PAGE_MASK)) break; if (inputmargin >= rq->inputsize) { - kunmap_atomic(src); + kunmap_atomic(headpage); return -EIO; } } - copied = false; - inlen = rq->inputsize - inputmargin; - if (rq->inplace_io) { - const uint oend = (rq->pageofs_out + - rq->outputsize) & ~PAGE_MASK; - const uint nr = PAGE_ALIGN(rq->pageofs_out + - rq->outputsize) >> PAGE_SHIFT; - - if (rq->partial_decoding || !support_0padding || - rq->out[nr - 1] != rq->in[0] || - rq->inputsize - oend < - LZ4_DECOMPRESS_INPLACE_MARGIN(inlen)) { - src = generic_copy_inplace_data(rq, src, inputmargin); - inputmargin = 0; - copied = true; - } - } + rq->inputsize -= inputmargin; + src = z_erofs_handle_inplace_io(rq, headpage, &inputmargin, &maptype, + support_0padding); + if (IS_ERR(src)) + return PTR_ERR(src); /* legacy format could compress extra data in a pcluster. */ if (rq->partial_decoding || !support_0padding) ret = LZ4_decompress_safe_partial(src + inputmargin, out, - inlen, rq->outputsize, - rq->outputsize); + rq->inputsize, rq->outputsize, rq->outputsize); else ret = LZ4_decompress_safe(src + inputmargin, out, - inlen, rq->outputsize); + rq->inputsize, rq->outputsize); if (ret != rq->outputsize) { erofs_err(rq->sb, "failed to decompress %d in[%u, %u] out[%u]", - ret, inlen, inputmargin, rq->outputsize); + ret, rq->inputsize, inputmargin, rq->outputsize); WARN_ON(1); print_hex_dump(KERN_DEBUG, "[ in]: ", DUMP_PREFIX_OFFSET, - 16, 1, src + inputmargin, inlen, true); + 16, 1, src + inputmargin, rq->inputsize, true); print_hex_dump(KERN_DEBUG, "[out]: ", DUMP_PREFIX_OFFSET, 16, 1, out, rq->outputsize, true); @@ -193,10 +245,16 @@ static int z_erofs_lz4_decompress(struct z_erofs_decompress_req *rq, u8 *out) ret = -EIO; } - if (copied) - erofs_put_pcpubuf(src); - else + if (maptype == 0) { kunmap_atomic(src); + } else if (maptype == 1) { + vm_unmap_ram(src, PAGE_ALIGN(rq->inputsize) >> PAGE_SHIFT); + } else if (maptype == 2) { + erofs_put_pcpubuf(src); + } else { + DBG_BUGON(1); + return -EFAULT; + } return ret; } @@ -246,57 +304,51 @@ static int z_erofs_decompress_generic(struct z_erofs_decompress_req *rq, const struct z_erofs_decompressor *alg = decompressors + rq->alg; unsigned int dst_maptype; void *dst; - int ret, i; + int ret; - if (nrpages_out == 1 && !rq->inplace_io) { - DBG_BUGON(!*rq->out); - dst = kmap_atomic(*rq->out); - dst_maptype = 0; - goto dstmap_out; - } - - /* - * For the case of small output size (especially much less - * than PAGE_SIZE), memcpy the decompressed data rather than - * compressed data is preferred. - */ - if (rq->outputsize <= PAGE_SIZE * 7 / 8) { - dst = erofs_get_pcpubuf(0); - if (IS_ERR(dst)) - return PTR_ERR(dst); - - rq->inplace_io = false; - ret = alg->decompress(rq, dst); - if (!ret) - copy_from_pcpubuf(rq->out, dst, rq->pageofs_out, - rq->outputsize); - - erofs_put_pcpubuf(dst); - return ret; + /* two optimized fast paths only for non bigpcluster cases yet */ + if (rq->inputsize <= PAGE_SIZE) { + if (nrpages_out == 1 && !rq->inplace_io) { + DBG_BUGON(!*rq->out); + dst = kmap_atomic(*rq->out); + dst_maptype = 0; + goto dstmap_out; + } + + /* + * For the case of small output size (especially much less + * than PAGE_SIZE), memcpy the decompressed data rather than + * compressed data is preferred. + */ + if (rq->outputsize <= PAGE_SIZE * 7 / 8) { + dst = erofs_get_pcpubuf(1); + if (IS_ERR(dst)) + return PTR_ERR(dst); + + rq->inplace_io = false; + ret = alg->decompress(rq, dst); + if (!ret) + copy_from_pcpubuf(rq->out, dst, rq->pageofs_out, + rq->outputsize); + + erofs_put_pcpubuf(dst); + return ret; + } } + /* general decoding path which can be used for all cases */ ret = alg->prepare_destpages(rq, pagepool); - if (ret < 0) { + if (ret < 0) return ret; - } else if (ret) { + if (ret) { dst = page_address(*rq->out); dst_maptype = 1; goto dstmap_out; } - i = 0; - while (1) { - dst = vm_map_ram(rq->out, nrpages_out, -1); - - /* retry two more times (totally 3 times) */ - if (dst || ++i >= 3) - break; - vm_unmap_aliases(); - } - + dst = erofs_vm_map_ram(rq->out, nrpages_out); if (!dst) return -ENOMEM; - dst_maptype = 2; dstmap_out: diff --git a/fs/erofs/erofs_fs.h b/fs/erofs/erofs_fs.h index dc7cc79410df..8739d3adf51f 100644 --- a/fs/erofs/erofs_fs.h +++ b/fs/erofs/erofs_fs.h @@ -18,15 +18,22 @@ * be incompatible with this kernel version. */ #define EROFS_FEATURE_INCOMPAT_LZ4_0PADDING 0x00000001 -#define EROFS_ALL_FEATURE_INCOMPAT EROFS_FEATURE_INCOMPAT_LZ4_0PADDING +#define EROFS_FEATURE_INCOMPAT_COMPR_CFGS 0x00000002 +#define EROFS_FEATURE_INCOMPAT_BIG_PCLUSTER 0x00000002 +#define EROFS_ALL_FEATURE_INCOMPAT \ + (EROFS_FEATURE_INCOMPAT_LZ4_0PADDING | \ + EROFS_FEATURE_INCOMPAT_COMPR_CFGS | \ + EROFS_FEATURE_INCOMPAT_BIG_PCLUSTER) -/* 128-byte erofs on-disk super block */ +#define EROFS_SB_EXTSLOT_SIZE 16 + +/* erofs on-disk super block (currently 128 bytes) */ struct erofs_super_block { __le32 magic; /* file system magic number */ __le32 checksum; /* crc32c(super_block) */ __le32 feature_compat; __u8 blkszbits; /* support block_size == PAGE_SIZE only */ - __u8 reserved; + __u8 sb_extslots; /* superblock size = 128 + sb_extslots * 16 */ __le16 root_nid; /* nid of root directory */ __le64 inos; /* total valid ino # (== f_files - f_favail) */ @@ -39,8 +46,12 @@ struct erofs_super_block { __u8 uuid[16]; /* 128-bit uuid for volume */ __u8 volume_name[16]; /* volume name */ __le32 feature_incompat; - /* customized lz4 sliding window size instead of 64k by default */ - __le16 lz4_max_distance; + union { + /* bitmap for available compression algorithms */ + __le16 available_compr_algs; + /* customized sliding window size instead of 64k by default */ + __le16 lz4_max_distance; + } __packed u1; __u8 reserved2[42]; }; @@ -194,20 +205,33 @@ static inline unsigned int erofs_xattr_entry_size(struct erofs_xattr_entry *e) e->e_name_len + le16_to_cpu(e->e_value_size)); } +/* maximum supported size of a physical compression cluster */ +#define Z_EROFS_PCLUSTER_MAX_SIZE (1024 * 1024) + /* available compression algorithm types (for h_algorithmtype) */ enum { Z_EROFS_COMPRESSION_LZ4 = 0, Z_EROFS_COMPRESSION_MAX }; +#define Z_EROFS_ALL_COMPR_ALGS (1 << (Z_EROFS_COMPRESSION_MAX - 1)) + +/* 14 bytes (+ length field = 16 bytes) */ +struct z_erofs_lz4_cfgs { + __le16 max_distance; + __le16 max_pclusterblks; + u8 reserved[10]; +} __packed; /* * bit 0 : COMPACTED_2B indexes (0 - off; 1 - on) * e.g. for 4k logical cluster size, 4B if compacted 2B is off; * (4B) + 2B + (4B) if compacted 2B is on. + * bit 1 : HEAD1 big pcluster (0 - off; 1 - on) + * bit 2 : HEAD2 big pcluster (0 - off; 1 - on) */ -#define Z_EROFS_ADVISE_COMPACTED_2B_BIT 0 - -#define Z_EROFS_ADVISE_COMPACTED_2B (1 << Z_EROFS_ADVISE_COMPACTED_2B_BIT) +#define Z_EROFS_ADVISE_COMPACTED_2B 0x0001 +#define Z_EROFS_ADVISE_BIG_PCLUSTER_1 0x0002 +#define Z_EROFS_ADVISE_BIG_PCLUSTER_2 0x0004 struct z_erofs_map_header { __le32 h_reserved1; @@ -219,9 +243,7 @@ struct z_erofs_map_header { __u8 h_algorithmtype; /* * bit 0-2 : logical cluster bits - 12, e.g. 0 for 4096; - * bit 3-4 : (physical - logical) cluster bits of head 1: - * For example, if logical clustersize = 4096, 1 for 8192. - * bit 5-7 : (physical - logical) cluster bits of head 2. + * bit 3-7 : reserved. */ __u8 h_clusterbits; }; @@ -264,6 +286,13 @@ enum { #define Z_EROFS_VLE_DI_CLUSTER_TYPE_BITS 2 #define Z_EROFS_VLE_DI_CLUSTER_TYPE_BIT 0 +/* + * D0_CBLKCNT will be marked _only_ at the 1st non-head lcluster to store the + * compressed block count of a compressed extent (in logical clusters, aka. + * block count of a pcluster). + */ +#define Z_EROFS_VLE_DI_D0_CBLKCNT (1 << 11) + struct z_erofs_vle_decompressed_index { __le16 di_advise; /* where to decompress in the head cluster */ diff --git a/fs/erofs/internal.h b/fs/erofs/internal.h index 4758b3ceeee4..e2120c740be9 100644 --- a/fs/erofs/internal.h +++ b/fs/erofs/internal.h @@ -63,6 +63,8 @@ struct erofs_fs_context { struct erofs_sb_lz4_info { /* # of pages needed for EROFS lz4 rolling decompression */ u16 max_distance_pages; + /* maximum possible blocks for pclusters in the filesystem */ + u16 max_pclusterblks; }; struct erofs_sb_info { @@ -75,6 +77,7 @@ struct erofs_sb_info { struct xarray managed_pslots; unsigned int shrinker_run_no; + u16 available_compr_algs; /* pseudo inode to manage cached pages */ struct inode *managed_cache; @@ -90,6 +93,7 @@ struct erofs_sb_info { /* inode slot unit size in bit shift */ unsigned char islotbits; + u32 sb_size; /* total superblock size */ u32 build_time_nsec; u64 build_time; @@ -192,12 +196,6 @@ static inline int erofs_wait_on_workgroup_freezed(struct erofs_workgroup *grp) return v; } #endif /* !CONFIG_SMP */ - -/* hard limit of pages per compressed cluster */ -#define Z_EROFS_CLUSTER_MAX_PAGES (CONFIG_EROFS_FS_CLUSTER_PAGE_LIMIT) -#define EROFS_PCPUBUF_NR_PAGES Z_EROFS_CLUSTER_MAX_PAGES -#else -#define EROFS_PCPUBUF_NR_PAGES 0 #endif /* !CONFIG_EROFS_FS_ZIP */ /* we strictly follow PAGE_SIZE and no buffer head yet */ @@ -226,6 +224,17 @@ static inline erofs_off_t iloc(struct erofs_sb_info *sbi, erofs_nid_t nid) return blknr_to_addr(sbi->meta_blkaddr) + (nid << sbi->islotbits); } +#define EROFS_FEATURE_FUNCS(name, compat, feature) \ +static inline bool erofs_sb_has_##name(struct erofs_sb_info *sbi) \ +{ \ + return sbi->feature_##compat & EROFS_FEATURE_##feature; \ +} + +EROFS_FEATURE_FUNCS(lz4_0padding, incompat, INCOMPAT_LZ4_0PADDING) +EROFS_FEATURE_FUNCS(compr_cfgs, incompat, INCOMPAT_COMPR_CFGS) +EROFS_FEATURE_FUNCS(big_pcluster, incompat, INCOMPAT_BIG_PCLUSTER) +EROFS_FEATURE_FUNCS(sb_chksum, compat, COMPAT_SB_CHKSUM) + /* atomic flag definitions */ #define EROFS_I_EA_INITED_BIT 0 #define EROFS_I_Z_INITED_BIT 1 @@ -254,7 +263,6 @@ struct erofs_inode { unsigned short z_advise; unsigned char z_algorithmtype[2]; unsigned char z_logical_clusterbits; - unsigned char z_physical_clusterbits[2]; }; #endif /* CONFIG_EROFS_FS_ZIP */ }; @@ -297,7 +305,7 @@ extern const struct address_space_operations erofs_raw_access_aops; extern const struct address_space_operations z_erofs_aops; /* - * Logical to physical block mapping, used by erofs_map_blocks() + * Logical to physical block mapping * * Different with other file systems, it is used for 2 access modes: * @@ -344,7 +352,7 @@ struct erofs_map_blocks { struct page *mpage; }; -/* Flags used by erofs_map_blocks() */ +/* Flags used by erofs_map_blocks_flatmode() */ #define EROFS_GET_BLOCKS_RAW 0x0001 /* zmap.c */ @@ -366,8 +374,6 @@ static inline int z_erofs_map_blocks_iter(struct inode *inode, /* data.c */ struct page *erofs_get_meta_page(struct super_block *sb, erofs_blk_t blkaddr); -int erofs_map_blocks(struct inode *, struct erofs_map_blocks *, int); - /* inode.c */ static inline unsigned long erofs_inode_hash(erofs_nid_t nid) { @@ -395,23 +401,30 @@ int erofs_namei(struct inode *dir, struct qstr *name, /* dir.c */ extern const struct file_operations erofs_dir_fops; -/* utils.c / zdata.c */ -struct page *erofs_allocpage(struct list_head *pool, gfp_t gfp); - -#if (EROFS_PCPUBUF_NR_PAGES > 0) -void *erofs_get_pcpubuf(unsigned int pagenr); -#define erofs_put_pcpubuf(buf) do { \ - (void)&(buf); \ - preempt_enable(); \ -} while (0) -#else -static inline void *erofs_get_pcpubuf(unsigned int pagenr) +static inline void *erofs_vm_map_ram(struct page **pages, unsigned int count) { - return ERR_PTR(-EOPNOTSUPP); + int retried = 0; + + while (1) { + void *p = vm_map_ram(pages, count, -1); + + /* retry two more times (totally 3 times) */ + if (p || ++retried >= 3) + return p; + vm_unmap_aliases(); + } + return NULL; } -#define erofs_put_pcpubuf(buf) do {} while (0) -#endif +/* pcpubuf.c */ +void *erofs_get_pcpubuf(unsigned int requiredpages); +void erofs_put_pcpubuf(void *ptr); +int erofs_pcpubuf_growsize(unsigned int nrpages); +void erofs_pcpubuf_init(void); +void erofs_pcpubuf_exit(void); + +/* utils.c / zdata.c */ +struct page *erofs_allocpage(struct list_head *pool, gfp_t gfp); #ifdef CONFIG_EROFS_FS_ZIP int erofs_workgroup_put(struct erofs_workgroup *grp); @@ -431,7 +444,8 @@ int erofs_try_to_free_all_cached_pages(struct erofs_sb_info *sbi, int erofs_try_to_free_cached_page(struct address_space *mapping, struct page *page); int z_erofs_load_lz4_config(struct super_block *sb, - struct erofs_super_block *dsb); + struct erofs_super_block *dsb, + struct z_erofs_lz4_cfgs *lz4, int len); #else static inline void erofs_shrinker_register(struct super_block *sb) {} static inline void erofs_shrinker_unregister(struct super_block *sb) {} @@ -440,9 +454,10 @@ static inline void erofs_exit_shrinker(void) {} static inline int z_erofs_init_zip_subsystem(void) { return 0; } static inline void z_erofs_exit_zip_subsystem(void) {} static inline int z_erofs_load_lz4_config(struct super_block *sb, - struct erofs_super_block *dsb) + struct erofs_super_block *dsb, + struct z_erofs_lz4_cfgs *lz4, int len) { - if (dsb->lz4_max_distance) { + if (lz4 || dsb->u1.lz4_max_distance) { erofs_err(sb, "lz4 algorithm isn't enabled"); return -EINVAL; } diff --git a/fs/erofs/pcpubuf.c b/fs/erofs/pcpubuf.c new file mode 100644 index 000000000000..6c885575128a --- /dev/null +++ b/fs/erofs/pcpubuf.c @@ -0,0 +1,148 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Copyright (C) Gao Xiang + * + * For low-latency decompression algorithms (e.g. lz4), reserve consecutive + * per-CPU virtual memory (in pages) in advance to store such inplace I/O + * data if inplace decompression is failed (due to unmet inplace margin for + * example). + */ +#include "internal.h" + +struct erofs_pcpubuf { + raw_spinlock_t lock; + void *ptr; + struct page **pages; + unsigned int nrpages; +}; + +static DEFINE_PER_CPU(struct erofs_pcpubuf, erofs_pcb); + +void *erofs_get_pcpubuf(unsigned int requiredpages) + __acquires(pcb->lock) +{ + struct erofs_pcpubuf *pcb = &get_cpu_var(erofs_pcb); + + raw_spin_lock(&pcb->lock); + /* check if the per-CPU buffer is too small */ + if (requiredpages > pcb->nrpages) { + raw_spin_unlock(&pcb->lock); + put_cpu_var(erofs_pcb); + /* (for sparse checker) pretend pcb->lock is still taken */ + __acquire(pcb->lock); + return NULL; + } + return pcb->ptr; +} + +void erofs_put_pcpubuf(void *ptr) __releases(pcb->lock) +{ + struct erofs_pcpubuf *pcb = &per_cpu(erofs_pcb, smp_processor_id()); + + DBG_BUGON(pcb->ptr != ptr); + raw_spin_unlock(&pcb->lock); + put_cpu_var(erofs_pcb); +} + +/* the next step: support per-CPU page buffers hotplug */ +int erofs_pcpubuf_growsize(unsigned int nrpages) +{ + static DEFINE_MUTEX(pcb_resize_mutex); + static unsigned int pcb_nrpages; + LIST_HEAD(pagepool); + int delta, cpu, ret, i; + + mutex_lock(&pcb_resize_mutex); + delta = nrpages - pcb_nrpages; + ret = 0; + /* avoid shrinking pcpubuf, since no idea how many fses rely on */ + if (delta <= 0) + goto out; + + for_each_possible_cpu(cpu) { + struct erofs_pcpubuf *pcb = &per_cpu(erofs_pcb, cpu); + struct page **pages, **oldpages; + void *ptr, *old_ptr; + + pages = kmalloc_array(nrpages, sizeof(*pages), GFP_KERNEL); + if (!pages) { + ret = -ENOMEM; + break; + } + + for (i = 0; i < nrpages; ++i) { + pages[i] = erofs_allocpage(&pagepool, GFP_KERNEL); + if (!pages[i]) { + ret = -ENOMEM; + oldpages = pages; + goto free_pagearray; + } + } + ptr = vmap(pages, nrpages, VM_MAP, PAGE_KERNEL); + if (!ptr) { + ret = -ENOMEM; + oldpages = pages; + goto free_pagearray; + } + raw_spin_lock(&pcb->lock); + old_ptr = pcb->ptr; + pcb->ptr = ptr; + oldpages = pcb->pages; + pcb->pages = pages; + i = pcb->nrpages; + pcb->nrpages = nrpages; + raw_spin_unlock(&pcb->lock); + + if (!oldpages) { + DBG_BUGON(old_ptr); + continue; + } + + if (old_ptr) + vunmap(old_ptr); +free_pagearray: + while (i) + list_add(&oldpages[--i]->lru, &pagepool); + kfree(oldpages); + if (ret) + break; + } + pcb_nrpages = nrpages; + put_pages_list(&pagepool); +out: + mutex_unlock(&pcb_resize_mutex); + return ret; +} + +void erofs_pcpubuf_init(void) +{ + int cpu; + + for_each_possible_cpu(cpu) { + struct erofs_pcpubuf *pcb = &per_cpu(erofs_pcb, cpu); + + raw_spin_lock_init(&pcb->lock); + } +} + +void erofs_pcpubuf_exit(void) +{ + int cpu, i; + + for_each_possible_cpu(cpu) { + struct erofs_pcpubuf *pcb = &per_cpu(erofs_pcb, cpu); + + if (pcb->ptr) { + vunmap(pcb->ptr); + pcb->ptr = NULL; + } + if (!pcb->pages) + continue; + + for (i = 0; i < pcb->nrpages; ++i) + if (pcb->pages[i]) + put_page(pcb->pages[i]); + kfree(pcb->pages); + pcb->pages = NULL; + } +} diff --git a/fs/erofs/super.c b/fs/erofs/super.c index b7ac8510feba..22991d22af5a 100644 --- a/fs/erofs/super.c +++ b/fs/erofs/super.c @@ -122,6 +122,136 @@ static bool check_layout_compatibility(struct super_block *sb, return true; } +#ifdef CONFIG_EROFS_FS_ZIP +/* read variable-sized metadata, offset will be aligned by 4-byte */ +static void *erofs_read_metadata(struct super_block *sb, struct page **pagep, + erofs_off_t *offset, int *lengthp) +{ + struct page *page = *pagep; + u8 *buffer, *ptr; + int len, i, cnt; + erofs_blk_t blk; + + *offset = round_up(*offset, 4); + blk = erofs_blknr(*offset); + + if (!page || page->index != blk) { + if (page) { + unlock_page(page); + put_page(page); + } + page = erofs_get_meta_page(sb, blk); + if (IS_ERR(page)) + goto err_nullpage; + } + + ptr = kmap(page); + len = le16_to_cpu(*(__le16 *)&ptr[erofs_blkoff(*offset)]); + if (!len) + len = U16_MAX + 1; + buffer = kmalloc(len, GFP_KERNEL); + if (!buffer) { + buffer = ERR_PTR(-ENOMEM); + goto out; + } + *offset += sizeof(__le16); + *lengthp = len; + + for (i = 0; i < len; i += cnt) { + cnt = min(EROFS_BLKSIZ - (int)erofs_blkoff(*offset), len - i); + blk = erofs_blknr(*offset); + + if (!page || page->index != blk) { + if (page) { + kunmap(page); + unlock_page(page); + put_page(page); + } + page = erofs_get_meta_page(sb, blk); + if (IS_ERR(page)) { + kfree(buffer); + goto err_nullpage; + } + ptr = kmap(page); + } + memcpy(buffer + i, ptr + erofs_blkoff(*offset), cnt); + *offset += cnt; + } +out: + kunmap(page); + *pagep = page; + return buffer; +err_nullpage: + *pagep = NULL; + return page; +} + +static int erofs_load_compr_cfgs(struct super_block *sb, + struct erofs_super_block *dsb) +{ + struct erofs_sb_info *sbi; + struct page *page; + unsigned int algs, alg; + erofs_off_t offset; + int size, ret; + + sbi = EROFS_SB(sb); + sbi->available_compr_algs = le16_to_cpu(dsb->u1.available_compr_algs); + + if (sbi->available_compr_algs & ~Z_EROFS_ALL_COMPR_ALGS) { + erofs_err(sb, "try to load compressed fs with unsupported algorithms %x", + sbi->available_compr_algs & ~Z_EROFS_ALL_COMPR_ALGS); + return -EINVAL; + } + + offset = EROFS_SUPER_OFFSET + sbi->sb_size; + page = NULL; + alg = 0; + ret = 0; + + for (algs = sbi->available_compr_algs; algs; algs >>= 1, ++alg) { + void *data; + + if (!(algs & 1)) + continue; + + data = erofs_read_metadata(sb, &page, &offset, &size); + if (IS_ERR(data)) { + ret = PTR_ERR(data); + goto err; + } + + switch (alg) { + case Z_EROFS_COMPRESSION_LZ4: + ret = z_erofs_load_lz4_config(sb, dsb, data, size); + break; + default: + DBG_BUGON(1); + ret = -EFAULT; + } + kfree(data); + if (ret) + goto err; + } +err: + if (page) { + unlock_page(page); + put_page(page); + } + return ret; +} +#else +static int erofs_load_compr_cfgs(struct super_block *sb, + struct erofs_super_block *dsb) +{ + if (dsb->u1.available_compr_algs) { + erofs_err(sb, "try to load compressed fs when compression is disabled"); + return -EINVAL; + } + return 0; +} +#endif + static int erofs_read_superblock(struct super_block *sb) { struct erofs_sb_info *sbi; @@ -149,7 +279,7 @@ static int erofs_read_superblock(struct super_block *sb) } sbi->feature_compat = le32_to_cpu(dsb->feature_compat); - if (sbi->feature_compat & EROFS_FEATURE_COMPAT_SB_CHKSUM) { + if (erofs_sb_has_sb_chksum(sbi)) { ret = erofs_superblock_csum_verify(sb, data); if (ret) goto out; @@ -167,6 +297,12 @@ static int erofs_read_superblock(struct super_block *sb) if (!check_layout_compatibility(sb, dsb)) goto out; + sbi->sb_size = 128 + dsb->sb_extslots * EROFS_SB_EXTSLOT_SIZE; + if (sbi->sb_size > EROFS_BLKSIZ) { + erofs_err(sb, "invalid sb_extslots %u (more than a fs block)", + sbi->sb_size); + goto out; + } sbi->blocks = le32_to_cpu(dsb->blocks); sbi->meta_blkaddr = le32_to_cpu(dsb->meta_blkaddr); #ifdef CONFIG_EROFS_FS_XATTR @@ -190,7 +326,10 @@ static int erofs_read_superblock(struct super_block *sb) } /* parse on-disk compression configurations */ - ret = z_erofs_load_lz4_config(sb, dsb); + if (erofs_sb_has_compr_cfgs(sbi)) + ret = erofs_load_compr_cfgs(sb, dsb); + else + ret = z_erofs_load_lz4_config(sb, dsb, NULL, 0); out: kunmap(page); put_page(page); @@ -517,6 +656,7 @@ static int __init erofs_module_init(void) if (err) goto shrinker_err; + erofs_pcpubuf_init(); err = z_erofs_init_zip_subsystem(); if (err) goto zip_err; @@ -546,6 +686,7 @@ static void __exit erofs_module_exit(void) /* Ensure all RCU free inodes are safe before cache is destroyed. */ rcu_barrier(); kmem_cache_destroy(erofs_inode_cachep); + erofs_pcpubuf_exit(); } /* get filesystem statistics */ diff --git a/fs/erofs/utils.c b/fs/erofs/utils.c index de9986d2f82f..6758c5b19f7c 100644 --- a/fs/erofs/utils.c +++ b/fs/erofs/utils.c @@ -21,18 +21,6 @@ struct page *erofs_allocpage(struct list_head *pool, gfp_t gfp) return page; } -#if (EROFS_PCPUBUF_NR_PAGES > 0) -static struct { - u8 data[PAGE_SIZE * EROFS_PCPUBUF_NR_PAGES]; -} ____cacheline_aligned_in_smp erofs_pcpubuf[NR_CPUS]; - -void *erofs_get_pcpubuf(unsigned int pagenr) -{ - preempt_disable(); - return &erofs_pcpubuf[smp_processor_id()].data[pagenr * PAGE_SIZE]; -} -#endif - #ifdef CONFIG_EROFS_FS_ZIP /* global shrink count (for all mounted EROFS instances) */ static atomic_long_t erofs_global_shrink_cnt; diff --git a/fs/erofs/zdata.c b/fs/erofs/zdata.c index 59a969d7ed1f..a17bae1e7ad6 100644 --- a/fs/erofs/zdata.c +++ b/fs/erofs/zdata.c @@ -10,6 +10,93 @@ #include +/* + * since pclustersize is variable for big pcluster feature, introduce slab + * pools implementation for different pcluster sizes. + */ +struct z_erofs_pcluster_slab { + struct kmem_cache *slab; + unsigned int maxpages; + char name[48]; +}; + +#define _PCLP(n) { .maxpages = n } + +static struct z_erofs_pcluster_slab pcluster_pool[] __read_mostly = { + _PCLP(1), _PCLP(4), _PCLP(16), _PCLP(64), _PCLP(128), + _PCLP(Z_EROFS_PCLUSTER_MAX_PAGES) +}; + +static void z_erofs_destroy_pcluster_pool(void) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(pcluster_pool); ++i) { + if (!pcluster_pool[i].slab) + continue; + kmem_cache_destroy(pcluster_pool[i].slab); + pcluster_pool[i].slab = NULL; + } +} + +static int z_erofs_create_pcluster_pool(void) +{ + struct z_erofs_pcluster_slab *pcs; + struct z_erofs_pcluster *a; + unsigned int size; + + for (pcs = pcluster_pool; + pcs < pcluster_pool + ARRAY_SIZE(pcluster_pool); ++pcs) { + size = struct_size(a, compressed_pages, pcs->maxpages); + + sprintf(pcs->name, "erofs_pcluster-%u", pcs->maxpages); + pcs->slab = kmem_cache_create(pcs->name, size, 0, + SLAB_RECLAIM_ACCOUNT, NULL); + if (pcs->slab) + continue; + + z_erofs_destroy_pcluster_pool(); + return -ENOMEM; + } + return 0; +} + +static struct z_erofs_pcluster *z_erofs_alloc_pcluster(unsigned int nrpages) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(pcluster_pool); ++i) { + struct z_erofs_pcluster_slab *pcs = pcluster_pool + i; + struct z_erofs_pcluster *pcl; + + if (nrpages > pcs->maxpages) + continue; + + pcl = kmem_cache_zalloc(pcs->slab, GFP_NOFS); + if (!pcl) + return ERR_PTR(-ENOMEM); + pcl->pclusterpages = nrpages; + return pcl; + } + return ERR_PTR(-EINVAL); +} + +static void z_erofs_free_pcluster(struct z_erofs_pcluster *pcl) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(pcluster_pool); ++i) { + struct z_erofs_pcluster_slab *pcs = pcluster_pool + i; + + if (pcl->pclusterpages > pcs->maxpages) + continue; + + kmem_cache_free(pcs->slab, pcl); + return; + } + DBG_BUGON(1); +} + /* * a compressed_pages[] placeholder in order to avoid * being filled with file pages for in-place decompression. @@ -37,12 +124,11 @@ typedef tagptr1_t compressed_page_t; tagptr_fold(compressed_page_t, page, 1) static struct workqueue_struct *z_erofs_workqueue __read_mostly; -static struct kmem_cache *pcluster_cachep __read_mostly; void z_erofs_exit_zip_subsystem(void) { destroy_workqueue(z_erofs_workqueue); - kmem_cache_destroy(pcluster_cachep); + z_erofs_destroy_pcluster_pool(); } static inline int z_erofs_init_workqueue(void) @@ -59,32 +145,16 @@ static inline int z_erofs_init_workqueue(void) return z_erofs_workqueue ? 0 : -ENOMEM; } -static void z_erofs_pcluster_init_once(void *ptr) -{ - struct z_erofs_pcluster *pcl = ptr; - struct z_erofs_collection *cl = z_erofs_primarycollection(pcl); - unsigned int i; - - mutex_init(&cl->lock); - cl->nr_pages = 0; - cl->vcnt = 0; - for (i = 0; i < Z_EROFS_CLUSTER_MAX_PAGES; ++i) - pcl->compressed_pages[i] = NULL; -} - int __init z_erofs_init_zip_subsystem(void) { - pcluster_cachep = kmem_cache_create("erofs_compress", - Z_EROFS_WORKGROUP_SIZE, 0, - SLAB_RECLAIM_ACCOUNT, - z_erofs_pcluster_init_once); - if (pcluster_cachep) { - if (!z_erofs_init_workqueue()) - return 0; + int err = z_erofs_create_pcluster_pool(); - kmem_cache_destroy(pcluster_cachep); - } - return -ENOMEM; + if (err) + return err; + err = z_erofs_init_workqueue(); + if (err) + z_erofs_destroy_pcluster_pool(); + return err; } enum z_erofs_collectmode { @@ -104,6 +174,12 @@ enum z_erofs_collectmode { * |_______PRIMARY_FOLLOWED_______|________PRIMARY_HOOKED___________| */ COLLECT_PRIMARY_HOOKED, + /* + * a weak form of COLLECT_PRIMARY_FOLLOWED, the difference is that it + * could be dispatched into bypass queue later due to uptodated managed + * pages. All related online pages cannot be reused for inplace I/O (or + * pagevec) since it can be directly decoded without I/O submission. + */ COLLECT_PRIMARY_FOLLOWED_NOINPLACE, /* * The current collection has been linked with the owned chain, and @@ -128,7 +204,8 @@ struct z_erofs_collector { struct z_erofs_pcluster *pcl, *tailpcl; struct z_erofs_collection *cl; - struct page **compressedpages; + /* a pointer used to pick up inplace I/O pages */ + struct page **icpage_ptr; z_erofs_next_pcluster_t owned_head; enum z_erofs_collectmode mode; @@ -162,18 +239,19 @@ static void preload_compressed_pages(struct z_erofs_collector *clt, enum z_erofs_cache_alloctype type, struct list_head *pagepool) { - const struct z_erofs_pcluster *pcl = clt->pcl; - const unsigned int clusterpages = BIT(pcl->clusterbits); - struct page **pages = clt->compressedpages; - pgoff_t index = pcl->obj.index + (pages - pcl->compressed_pages); + struct z_erofs_pcluster *pcl = clt->pcl; bool standalone = true; gfp_t gfp = (mapping_gfp_mask(mc) & ~__GFP_DIRECT_RECLAIM) | __GFP_NOMEMALLOC | __GFP_NORETRY | __GFP_NOWARN; + struct page **pages; + pgoff_t index; if (clt->mode < COLLECT_PRIMARY_FOLLOWED) return; - for (; pages < pcl->compressed_pages + clusterpages; ++pages) { + pages = pcl->compressed_pages; + index = pcl->obj.index; + for (; index < pcl->obj.index + pcl->pclusterpages; ++index, ++pages) { struct page *page; compressed_page_t t; struct page *newpage = NULL; @@ -186,21 +264,25 @@ static void preload_compressed_pages(struct z_erofs_collector *clt, if (page) { t = tag_compressed_page_justfound(page); - } else if (type == DELAYEDALLOC) { - t = tagptr_init(compressed_page_t, PAGE_UNALLOCATED); - } else if (type == TRYALLOC) { - newpage = erofs_allocpage(pagepool, gfp); - if (!newpage) - goto dontalloc; - - set_page_private(newpage, Z_EROFS_PREALLOCATED_PAGE); - t = tag_compressed_page_justfound(newpage); - } else { /* DONTALLOC */ -dontalloc: - if (standalone) - clt->compressedpages = pages; + } else { + /* I/O is needed, no possible to decompress directly */ standalone = false; - continue; + switch (type) { + case DELAYEDALLOC: + t = tagptr_init(compressed_page_t, + PAGE_UNALLOCATED); + break; + case TRYALLOC: + newpage = erofs_allocpage(pagepool, gfp); + if (!newpage) + continue; + set_page_private(newpage, + Z_EROFS_PREALLOCATED_PAGE); + t = tag_compressed_page_justfound(newpage); + break; + default: /* DONTALLOC */ + continue; + } } if (!cmpxchg_relaxed(pages, NULL, tagptr_cast_ptr(t))) @@ -214,7 +296,11 @@ dontalloc: } } - if (standalone) /* downgrade to PRIMARY_FOLLOWED_NOINPLACE */ + /* + * don't do inplace I/O if all compressed pages are available in + * managed cache since it can be moved to the bypass queue instead. + */ + if (standalone) clt->mode = COLLECT_PRIMARY_FOLLOWED_NOINPLACE; } @@ -225,14 +311,13 @@ int erofs_try_to_free_all_cached_pages(struct erofs_sb_info *sbi, struct z_erofs_pcluster *const pcl = container_of(grp, struct z_erofs_pcluster, obj); struct address_space *const mapping = MNGD_MAPPING(sbi); - const unsigned int clusterpages = BIT(pcl->clusterbits); int i; /* * refcount of workgroup is now freezed as 1, * therefore no need to worry about available decompression users. */ - for (i = 0; i < clusterpages; ++i) { + for (i = 0; i < pcl->pclusterpages; ++i) { struct page *page = pcl->compressed_pages[i]; if (!page) @@ -257,13 +342,12 @@ int erofs_try_to_free_cached_page(struct address_space *mapping, struct page *page) { struct z_erofs_pcluster *const pcl = (void *)page_private(page); - const unsigned int clusterpages = BIT(pcl->clusterbits); int ret = 0; /* 0 - busy */ if (erofs_workgroup_try_to_freeze(&pcl->obj, 1)) { unsigned int i; - for (i = 0; i < clusterpages; ++i) { + for (i = 0; i < pcl->pclusterpages; ++i) { if (pcl->compressed_pages[i] == page) { WRITE_ONCE(pcl->compressed_pages[i], NULL); ret = 1; @@ -279,16 +363,14 @@ int erofs_try_to_free_cached_page(struct address_space *mapping, } /* page_type must be Z_EROFS_PAGE_TYPE_EXCLUSIVE */ -static inline bool z_erofs_try_inplace_io(struct z_erofs_collector *clt, - struct page *page) +static bool z_erofs_try_inplace_io(struct z_erofs_collector *clt, + struct page *page) { struct z_erofs_pcluster *const pcl = clt->pcl; - const unsigned int clusterpages = BIT(pcl->clusterbits); - while (clt->compressedpages < pcl->compressed_pages + clusterpages) { - if (!cmpxchg(clt->compressedpages++, NULL, page)) + while (clt->icpage_ptr > pcl->compressed_pages) + if (!cmpxchg(--clt->icpage_ptr, NULL, page)) return true; - } return false; } @@ -402,10 +484,10 @@ static int z_erofs_register_collection(struct z_erofs_collector *clt, struct erofs_workgroup *grp; int err; - /* no available workgroup, let's allocate one */ - pcl = kmem_cache_alloc(pcluster_cachep, GFP_NOFS); - if (!pcl) - return -ENOMEM; + /* no available pcluster, let's allocate one */ + pcl = z_erofs_alloc_pcluster(map->m_plen >> PAGE_SHIFT); + if (IS_ERR(pcl)) + return PTR_ERR(pcl); atomic_set(&pcl->obj.refcount, 1); pcl->obj.index = map->m_pa >> PAGE_SHIFT; @@ -419,25 +501,18 @@ static int z_erofs_register_collection(struct z_erofs_collector *clt, else pcl->algorithmformat = Z_EROFS_COMPRESSION_SHIFTED; - pcl->clusterbits = EROFS_I(inode)->z_physical_clusterbits[0]; - pcl->clusterbits -= PAGE_SHIFT; - /* new pclusters should be claimed as type 1, primary and followed */ pcl->next = clt->owned_head; clt->mode = COLLECT_PRIMARY_FOLLOWED; cl = z_erofs_primarycollection(pcl); - - /* must be cleaned before freeing to slab */ - DBG_BUGON(cl->nr_pages); - DBG_BUGON(cl->vcnt); - cl->pageofs = map->m_la & ~PAGE_MASK; /* * lock all primary followed works before visible to others * and mutex_trylock *never* fails for a new pcluster. */ + mutex_init(&cl->lock); DBG_BUGON(!mutex_trylock(&cl->lock)); grp = erofs_insert_workgroup(inode->i_sb, &pcl->obj); @@ -461,7 +536,7 @@ static int z_erofs_register_collection(struct z_erofs_collector *clt, err_out: mutex_unlock(&cl->lock); - kmem_cache_free(pcluster_cachep, pcl); + z_erofs_free_pcluster(pcl); return err; } @@ -505,9 +580,8 @@ out: z_erofs_pagevec_ctor_init(&clt->vector, Z_EROFS_NR_INLINE_PAGEVECS, clt->cl->pagevec, clt->cl->vcnt); - clt->compressedpages = clt->pcl->compressed_pages; - if (clt->mode <= COLLECT_PRIMARY) /* cannot do in-place I/O */ - clt->compressedpages += Z_EROFS_CLUSTER_MAX_PAGES; + /* since file-backed online pages are traversed in reverse order */ + clt->icpage_ptr = clt->pcl->compressed_pages + clt->pcl->pclusterpages; return 0; } @@ -520,9 +594,8 @@ static void z_erofs_rcu_callback(struct rcu_head *head) struct z_erofs_collection *const cl = container_of(head, struct z_erofs_collection, rcu); - kmem_cache_free(pcluster_cachep, - container_of(cl, struct z_erofs_pcluster, - primary_collection)); + z_erofs_free_pcluster(container_of(cl, struct z_erofs_pcluster, + primary_collection)); } void erofs_workgroup_free_rcu(struct erofs_workgroup *grp) @@ -774,9 +847,8 @@ static int z_erofs_decompress_pcluster(struct super_block *sb, struct list_head *pagepool) { struct erofs_sb_info *const sbi = EROFS_SB(sb); - const unsigned int clusterpages = BIT(pcl->clusterbits); struct z_erofs_pagevec_ctor ctor; - unsigned int i, outputsize, llen, nr_pages; + unsigned int i, inputsize, outputsize, llen, nr_pages; struct page *pages_onstack[Z_EROFS_VMAP_ONSTACK_PAGES]; struct page **pages, **compressed_pages, *page; @@ -856,7 +928,7 @@ static int z_erofs_decompress_pcluster(struct super_block *sb, overlapped = false; compressed_pages = pcl->compressed_pages; - for (i = 0; i < clusterpages; ++i) { + for (i = 0; i < pcl->pclusterpages; ++i) { unsigned int pagenr; page = compressed_pages[i]; @@ -909,12 +981,13 @@ static int z_erofs_decompress_pcluster(struct super_block *sb, partial = true; } + inputsize = pcl->pclusterpages * PAGE_SIZE; err = z_erofs_decompress(&(struct z_erofs_decompress_req) { .sb = sb, .in = compressed_pages, .out = pages, .pageofs_out = cl->pageofs, - .inputsize = PAGE_SIZE, + .inputsize = inputsize, .outputsize = outputsize, .alg = pcl->algorithmformat, .inplace_io = overlapped, @@ -922,8 +995,8 @@ static int z_erofs_decompress_pcluster(struct super_block *sb, }, pagepool); out: - /* must handle all compressed pages before endding pages */ - for (i = 0; i < clusterpages; ++i) { + /* must handle all compressed pages before ending pages */ + for (i = 0; i < pcl->pclusterpages; ++i) { page = compressed_pages[i]; if (erofs_page_is_managed(sbi, page)) @@ -1226,7 +1299,7 @@ static void z_erofs_submit_queue(struct super_block *sb, pcl = container_of(owned_head, struct z_erofs_pcluster, next); cur = pcl->obj.index; - end = cur + BIT(pcl->clusterbits); + end = cur + pcl->pclusterpages; /* close the main owned chain at first */ owned_head = cmpxchg(&pcl->next, Z_EROFS_PCLUSTER_TAIL, diff --git a/fs/erofs/zdata.h b/fs/erofs/zdata.h index b503b353d4ab..942ee69dff6a 100644 --- a/fs/erofs/zdata.h +++ b/fs/erofs/zdata.h @@ -10,6 +10,7 @@ #include "internal.h" #include "zpvec.h" +#define Z_EROFS_PCLUSTER_MAX_PAGES (Z_EROFS_PCLUSTER_MAX_SIZE / PAGE_SIZE) #define Z_EROFS_NR_INLINE_PAGEVECS 3 /* @@ -59,16 +60,17 @@ struct z_erofs_pcluster { /* A: point to next chained pcluster or TAILs */ z_erofs_next_pcluster_t next; - /* A: compressed pages (including multi-usage pages) */ - struct page *compressed_pages[Z_EROFS_CLUSTER_MAX_PAGES]; - /* A: lower limit of decompressed length and if full length or not */ unsigned int length; + /* I: physical cluster size in pages */ + unsigned short pclusterpages; + /* I: compression algorithm format */ unsigned char algorithmformat; - /* I: bit shift of physical cluster size */ - unsigned char clusterbits; + + /* A: compressed pages (can be cached or inplaced pages) */ + struct page *compressed_pages[]; }; #define z_erofs_primarycollection(pcluster) (&(pcluster)->primary_collection) @@ -82,8 +84,6 @@ struct z_erofs_pcluster { #define Z_EROFS_PCLUSTER_NIL (NULL) -#define Z_EROFS_WORKGROUP_SIZE sizeof(struct z_erofs_pcluster) - struct z_erofs_decompressqueue { struct super_block *sb; atomic_t pending_bios; diff --git a/fs/erofs/zmap.c b/fs/erofs/zmap.c index 14d2de35110c..efaf32596b97 100644 --- a/fs/erofs/zmap.c +++ b/fs/erofs/zmap.c @@ -11,17 +11,16 @@ int z_erofs_fill_inode(struct inode *inode) { struct erofs_inode *const vi = EROFS_I(inode); + struct erofs_sb_info *sbi = EROFS_SB(inode->i_sb); - if (vi->datalayout == EROFS_INODE_FLAT_COMPRESSION_LEGACY) { + if (!erofs_sb_has_big_pcluster(sbi) && + vi->datalayout == EROFS_INODE_FLAT_COMPRESSION_LEGACY) { vi->z_advise = 0; vi->z_algorithmtype[0] = 0; vi->z_algorithmtype[1] = 0; vi->z_logical_clusterbits = LOG_BLOCK_SIZE; - vi->z_physical_clusterbits[0] = vi->z_logical_clusterbits; - vi->z_physical_clusterbits[1] = vi->z_logical_clusterbits; set_bit(EROFS_I_Z_INITED_BIT, &vi->flags); } - inode->i_mapping->a_ops = &z_erofs_aops; return 0; } @@ -52,7 +51,8 @@ static int z_erofs_fill_inode_lazy(struct inode *inode) if (test_bit(EROFS_I_Z_INITED_BIT, &vi->flags)) goto out_unlock; - DBG_BUGON(vi->datalayout == EROFS_INODE_FLAT_COMPRESSION_LEGACY); + DBG_BUGON(!erofs_sb_has_big_pcluster(EROFS_SB(sb)) && + vi->datalayout == EROFS_INODE_FLAT_COMPRESSION_LEGACY); pos = ALIGN(iloc(EROFS_SB(sb), vi->nid) + vi->inode_isize + vi->xattr_isize, 8); @@ -77,18 +77,22 @@ static int z_erofs_fill_inode_lazy(struct inode *inode) } vi->z_logical_clusterbits = LOG_BLOCK_SIZE + (h->h_clusterbits & 7); - vi->z_physical_clusterbits[0] = vi->z_logical_clusterbits + - ((h->h_clusterbits >> 3) & 3); - - if (vi->z_physical_clusterbits[0] != LOG_BLOCK_SIZE) { - erofs_err(sb, "unsupported physical clusterbits %u for nid %llu, please upgrade kernel", - vi->z_physical_clusterbits[0], vi->nid); - err = -EOPNOTSUPP; + if (!erofs_sb_has_big_pcluster(EROFS_SB(sb)) && + vi->z_advise & (Z_EROFS_ADVISE_BIG_PCLUSTER_1 | + Z_EROFS_ADVISE_BIG_PCLUSTER_2)) { + erofs_err(sb, "per-inode big pcluster without sb feature for nid %llu", + vi->nid); + err = -EFSCORRUPTED; + goto unmap_done; + } + if (vi->datalayout == EROFS_INODE_FLAT_COMPRESSION && + !(vi->z_advise & Z_EROFS_ADVISE_BIG_PCLUSTER_1) ^ + !(vi->z_advise & Z_EROFS_ADVISE_BIG_PCLUSTER_2)) { + erofs_err(sb, "big pcluster head1/2 of compact indexes should be consistent for nid %llu", + vi->nid); + err = -EFSCORRUPTED; goto unmap_done; } - - vi->z_physical_clusterbits[1] = vi->z_logical_clusterbits + - ((h->h_clusterbits >> 5) & 7); /* paired with smp_mb() at the beginning of the function */ smp_mb(); set_bit(EROFS_I_Z_INITED_BIT, &vi->flags); @@ -111,7 +115,7 @@ struct z_erofs_maprecorder { u8 type; u16 clusterofs; u16 delta[2]; - erofs_blk_t pblk; + erofs_blk_t pblk, compressedlcs; }; static int z_erofs_reload_indexes(struct z_erofs_maprecorder *m, @@ -174,6 +178,15 @@ static int legacy_load_cluster_from_disk(struct z_erofs_maprecorder *m, case Z_EROFS_VLE_CLUSTER_TYPE_NONHEAD: m->clusterofs = 1 << vi->z_logical_clusterbits; m->delta[0] = le16_to_cpu(di->di_u.delta[0]); + if (m->delta[0] & Z_EROFS_VLE_DI_D0_CBLKCNT) { + if (!(vi->z_advise & Z_EROFS_ADVISE_BIG_PCLUSTER_1)) { + DBG_BUGON(1); + return -EFSCORRUPTED; + } + m->compressedlcs = m->delta[0] & + ~Z_EROFS_VLE_DI_D0_CBLKCNT; + m->delta[0] = 1; + } m->delta[1] = le16_to_cpu(di->di_u.delta[1]); break; case Z_EROFS_VLE_CLUSTER_TYPE_PLAIN: @@ -210,6 +223,7 @@ static int unpack_compacted_index(struct z_erofs_maprecorder *m, unsigned int vcnt, base, lo, encodebits, nblk; int i; u8 *in, type; + bool big_pcluster; if (1 << amortizedshift == 4) vcnt = 2; @@ -218,6 +232,7 @@ static int unpack_compacted_index(struct z_erofs_maprecorder *m, else return -EOPNOTSUPP; + big_pcluster = vi->z_advise & Z_EROFS_ADVISE_BIG_PCLUSTER_1; encodebits = ((vcnt << amortizedshift) - sizeof(__le32)) * 8 / vcnt; base = round_down(eofs, vcnt << amortizedshift); in = m->kaddr + base; @@ -229,7 +244,15 @@ static int unpack_compacted_index(struct z_erofs_maprecorder *m, m->type = type; if (type == Z_EROFS_VLE_CLUSTER_TYPE_NONHEAD) { m->clusterofs = 1 << lclusterbits; - if (i + 1 != vcnt) { + if (lo & Z_EROFS_VLE_DI_D0_CBLKCNT) { + if (!big_pcluster) { + DBG_BUGON(1); + return -EFSCORRUPTED; + } + m->compressedlcs = lo & ~Z_EROFS_VLE_DI_D0_CBLKCNT; + m->delta[0] = 1; + return 0; + } else if (i + 1 != (int)vcnt) { m->delta[0] = lo; return 0; } @@ -242,22 +265,48 @@ static int unpack_compacted_index(struct z_erofs_maprecorder *m, in, encodebits * (i - 1), &type); if (type != Z_EROFS_VLE_CLUSTER_TYPE_NONHEAD) lo = 0; + else if (lo & Z_EROFS_VLE_DI_D0_CBLKCNT) + lo = 1; m->delta[0] = lo + 1; return 0; } m->clusterofs = lo; m->delta[0] = 0; /* figout out blkaddr (pblk) for HEAD lclusters */ - nblk = 1; - while (i > 0) { - --i; - lo = decode_compactedbits(lclusterbits, lomask, - in, encodebits * i, &type); - if (type == Z_EROFS_VLE_CLUSTER_TYPE_NONHEAD) - i -= lo; + if (!big_pcluster) { + nblk = 1; + while (i > 0) { + --i; + lo = decode_compactedbits(lclusterbits, lomask, + in, encodebits * i, &type); + if (type == Z_EROFS_VLE_CLUSTER_TYPE_NONHEAD) + i -= lo; - if (i >= 0) + if (i >= 0) + ++nblk; + } + } else { + nblk = 0; + while (i > 0) { + --i; + lo = decode_compactedbits(lclusterbits, lomask, + in, encodebits * i, &type); + if (type == Z_EROFS_VLE_CLUSTER_TYPE_NONHEAD) { + if (lo & Z_EROFS_VLE_DI_D0_CBLKCNT) { + --i; + nblk += lo & ~Z_EROFS_VLE_DI_D0_CBLKCNT; + continue; + } + /* bigpcluster shouldn't have plain d0 == 1 */ + if (lo <= 1) { + DBG_BUGON(1); + return -EFSCORRUPTED; + } + i -= lo - 2; + continue; + } ++nblk; + } } in += (vcnt << amortizedshift) - sizeof(__le32); m->pblk = le32_to_cpu(*(__le32 *)in) + nblk; @@ -381,6 +430,75 @@ static int z_erofs_extent_lookback(struct z_erofs_maprecorder *m, return 0; } +static int z_erofs_get_extent_compressedlen(struct z_erofs_maprecorder *m, + unsigned int initial_lcn) +{ + struct erofs_inode *const vi = EROFS_I(m->inode); + struct erofs_map_blocks *const map = m->map; + const unsigned int lclusterbits = vi->z_logical_clusterbits; + unsigned long lcn; + int err; + + DBG_BUGON(m->type != Z_EROFS_VLE_CLUSTER_TYPE_PLAIN && + m->type != Z_EROFS_VLE_CLUSTER_TYPE_HEAD); + if (!(map->m_flags & EROFS_MAP_ZIPPED) || + !(vi->z_advise & Z_EROFS_ADVISE_BIG_PCLUSTER_1)) { + map->m_plen = 1 << lclusterbits; + return 0; + } + + lcn = m->lcn + 1; + if (m->compressedlcs) + goto out; + + err = z_erofs_load_cluster_from_disk(m, lcn); + if (err) + return err; + + /* + * If the 1st NONHEAD lcluster has already been handled initially w/o + * valid compressedlcs, which means at least it mustn't be CBLKCNT, or + * an internal implemenatation error is detected. + * + * The following code can also handle it properly anyway, but let's + * BUG_ON in the debugging mode only for developers to notice that. + */ + DBG_BUGON(lcn == initial_lcn && + m->type == Z_EROFS_VLE_CLUSTER_TYPE_NONHEAD); + + switch (m->type) { + case Z_EROFS_VLE_CLUSTER_TYPE_PLAIN: + case Z_EROFS_VLE_CLUSTER_TYPE_HEAD: + /* + * if the 1st NONHEAD lcluster is actually PLAIN or HEAD type + * rather than CBLKCNT, it's a 1 lcluster-sized pcluster. + */ + m->compressedlcs = 1; + break; + case Z_EROFS_VLE_CLUSTER_TYPE_NONHEAD: + if (m->delta[0] != 1) + goto err_bonus_cblkcnt; + if (m->compressedlcs) + break; + fallthrough; + default: + erofs_err(m->inode->i_sb, + "cannot found CBLKCNT @ lcn %lu of nid %llu", + lcn, vi->nid); + DBG_BUGON(1); + return -EFSCORRUPTED; + } +out: + map->m_plen = m->compressedlcs << lclusterbits; + return 0; +err_bonus_cblkcnt: + erofs_err(m->inode->i_sb, + "bogus CBLKCNT @ lcn %lu of nid %llu", + lcn, vi->nid); + DBG_BUGON(1); + return -EFSCORRUPTED; +} + int z_erofs_map_blocks_iter(struct inode *inode, struct erofs_map_blocks *map, int flags) @@ -392,6 +510,7 @@ int z_erofs_map_blocks_iter(struct inode *inode, }; int err = 0; unsigned int lclusterbits, endoff; + unsigned long initial_lcn; unsigned long long ofs, end; trace_z_erofs_map_blocks_iter_enter(inode, map, flags); @@ -410,10 +529,10 @@ int z_erofs_map_blocks_iter(struct inode *inode, lclusterbits = vi->z_logical_clusterbits; ofs = map->m_la; - m.lcn = ofs >> lclusterbits; + initial_lcn = ofs >> lclusterbits; endoff = ofs & ((1 << lclusterbits) - 1); - err = z_erofs_load_cluster_from_disk(&m, m.lcn); + err = z_erofs_load_cluster_from_disk(&m, initial_lcn); if (err) goto unmap_out; @@ -443,7 +562,7 @@ int z_erofs_map_blocks_iter(struct inode *inode, m.delta[0] = 1; fallthrough; case Z_EROFS_VLE_CLUSTER_TYPE_NONHEAD: - /* get the correspoinding first chunk */ + /* get the corresponding first chunk */ err = z_erofs_extent_lookback(&m, m.delta[0]); if (err) goto unmap_out; @@ -457,10 +576,12 @@ int z_erofs_map_blocks_iter(struct inode *inode, } map->m_llen = end - map->m_la; - map->m_plen = 1 << lclusterbits; map->m_pa = blknr_to_addr(m.pblk); map->m_flags |= EROFS_MAP_MAPPED; + err = z_erofs_get_extent_compressedlen(&m, initial_lcn); + if (err) + goto out; unmap_out: if (m.kaddr) kunmap_atomic(m.kaddr); diff --git a/fs/f2fs/inode.c b/fs/f2fs/inode.c index 9141147b5bb0..1213f15ffd68 100644 --- a/fs/f2fs/inode.c +++ b/fs/f2fs/inode.c @@ -527,7 +527,7 @@ make_now: inode->i_op = &f2fs_dir_inode_operations; inode->i_fop = &f2fs_dir_operations; inode->i_mapping->a_ops = &f2fs_dblock_aops; - inode_nohighmem(inode); + mapping_set_gfp_mask(inode->i_mapping, GFP_NOFS); } else if (S_ISLNK(inode->i_mode)) { if (file_is_encrypt(inode)) inode->i_op = &f2fs_encrypted_symlink_inode_operations; diff --git a/fs/f2fs/namei.c b/fs/f2fs/namei.c index 9306fdc728b9..8e7aa2b2973e 100644 --- a/fs/f2fs/namei.c +++ b/fs/f2fs/namei.c @@ -747,7 +747,7 @@ static int f2fs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode) inode->i_op = &f2fs_dir_inode_operations; inode->i_fop = &f2fs_dir_operations; inode->i_mapping->a_ops = &f2fs_dblock_aops; - inode_nohighmem(inode); + mapping_set_gfp_mask(inode->i_mapping, GFP_NOFS); set_inode_flag(inode, FI_INC_LINK); f2fs_lock_op(sbi); diff --git a/fs/fuse/dir.c b/fs/fuse/dir.c index 98496f5a78fc..b5439324685b 100644 --- a/fs/fuse/dir.c +++ b/fs/fuse/dir.c @@ -405,7 +405,7 @@ static void fuse_dentry_canonical_path(const struct path *path, char *path_name; int err; - path_name = (char *)__get_free_page(GFP_KERNEL); + path_name = (char *)get_zeroed_page(GFP_KERNEL); if (!path_name) goto default_path; diff --git a/fs/fuse/passthrough.c b/fs/fuse/passthrough.c index 52068065fddc..83125de0bfdc 100644 --- a/fs/fuse/passthrough.c +++ b/fs/fuse/passthrough.c @@ -14,11 +14,34 @@ struct fuse_aio_req { struct kiocb *iocb_fuse; }; +static void fuse_file_accessed(struct file *dst_file, struct file *src_file) +{ + struct inode *dst_inode; + struct inode *src_inode; + + if (dst_file->f_flags & O_NOATIME) + return; + + dst_inode = file_inode(dst_file); + src_inode = file_inode(src_file); + + if ((!timespec64_equal(&dst_inode->i_mtime, &src_inode->i_mtime) || + !timespec64_equal(&dst_inode->i_ctime, &src_inode->i_ctime))) { + dst_inode->i_mtime = src_inode->i_mtime; + dst_inode->i_ctime = src_inode->i_ctime; + } + + touch_atime(&dst_file->f_path); +} + static void fuse_copyattr(struct file *dst_file, struct file *src_file) { struct inode *dst = file_inode(dst_file); struct inode *src = file_inode(src_file); + dst->i_atime = src->i_atime; + dst->i_mtime = src->i_mtime; + dst->i_ctime = src->i_ctime; i_size_write(dst, i_size_read(src)); } @@ -84,6 +107,8 @@ ssize_t fuse_passthrough_read_iter(struct kiocb *iocb_fuse, out: revert_creds(old_cred); + fuse_file_accessed(fuse_filp, passthrough_filp); + return ret; } @@ -103,6 +128,8 @@ ssize_t fuse_passthrough_write_iter(struct kiocb *iocb_fuse, inode_lock(fuse_inode); + fuse_copyattr(fuse_filp, passthrough_filp); + old_cred = override_creds(ff->passthrough.cred); if (is_sync_kiocb(iocb_fuse)) { file_start_write(passthrough_filp); @@ -143,9 +170,7 @@ ssize_t fuse_passthrough_mmap(struct file *file, struct vm_area_struct *vma) int ret; const struct cred *old_cred; struct fuse_file *ff = file->private_data; - struct inode *fuse_inode = file_inode(file); struct file *passthrough_filp = ff->passthrough.filp; - struct inode *passthrough_inode = file_inode(passthrough_filp); if (!passthrough_filp->f_op->mmap) return -ENODEV; @@ -164,17 +189,7 @@ ssize_t fuse_passthrough_mmap(struct file *file, struct vm_area_struct *vma) else fput(file); - if (file->f_flags & O_NOATIME) - return ret; - - if ((!timespec64_equal(&fuse_inode->i_mtime, - &passthrough_inode->i_mtime) || - !timespec64_equal(&fuse_inode->i_ctime, - &passthrough_inode->i_ctime))) { - fuse_inode->i_mtime = passthrough_inode->i_mtime; - fuse_inode->i_ctime = passthrough_inode->i_ctime; - } - touch_atime(&file->f_path); + fuse_file_accessed(file, passthrough_filp); return ret; } diff --git a/include/linux/buffer_head.h b/include/linux/buffer_head.h index e7e99da31349..b04d34bab124 100644 --- a/include/linux/buffer_head.h +++ b/include/linux/buffer_head.h @@ -194,7 +194,7 @@ void __breadahead_gfp(struct block_device *, sector_t block, unsigned int size, struct buffer_head *__bread_gfp(struct block_device *, sector_t block, unsigned size, gfp_t gfp); void invalidate_bh_lrus(void); -void invalidate_bh_lrus_cpu(int cpu); +void invalidate_bh_lrus_cpu(void); bool has_bh_in_lru(int cpu, void *dummy); struct buffer_head *alloc_buffer_head(gfp_t gfp_flags); void free_buffer_head(struct buffer_head * bh); @@ -408,7 +408,7 @@ static inline int inode_has_buffers(struct inode *inode) { return 0; } static inline void invalidate_inode_buffers(struct inode *inode) {} static inline int remove_inode_buffers(struct inode *inode) { return 1; } static inline int sync_mapping_buffers(struct address_space *mapping) { return 0; } -static inline void invalidate_bh_lrus_cpu(int cpu) {} +static inline void invalidate_bh_lrus_cpu(void) {} static inline bool has_bh_in_lru(int cpu, void *dummy) { return 0; } #define buffer_heads_over_limit 0 diff --git a/include/linux/dma-buf.h b/include/linux/dma-buf.h index 63ffe57a61d5..a9ad8cfdd8fd 100644 --- a/include/linux/dma-buf.h +++ b/include/linux/dma-buf.h @@ -623,6 +623,7 @@ int dma_buf_mmap(struct dma_buf *, struct vm_area_struct *, unsigned long); void *dma_buf_vmap(struct dma_buf *); void dma_buf_vunmap(struct dma_buf *, void *vaddr); +long dma_buf_set_name(struct dma_buf *dmabuf, const char *name); int dma_buf_get_flags(struct dma_buf *dmabuf, unsigned long *flags); int dma_buf_get_uuid(struct dma_buf *dmabuf, uuid_t *uuid); diff --git a/include/linux/kasan-tags.h b/include/linux/kasan-tags.h new file mode 100644 index 000000000000..4f85f562512c --- /dev/null +++ b/include/linux/kasan-tags.h @@ -0,0 +1,15 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef _LINUX_KASAN_TAGS_H +#define _LINUX_KASAN_TAGS_H + +#define KASAN_TAG_KERNEL 0xFF /* native kernel pointers tag */ +#define KASAN_TAG_INVALID 0xFE /* inaccessible memory tag */ +#define KASAN_TAG_MAX 0xFD /* maximum value for random tags */ + +#ifdef CONFIG_KASAN_HW_TAGS +#define KASAN_TAG_MIN 0xF0 /* minimum value for random tags */ +#else +#define KASAN_TAG_MIN 0x00 /* minimum value for random tags */ +#endif + +#endif /* LINUX_KASAN_TAGS_H */ diff --git a/include/linux/kasan.h b/include/linux/kasan.h index a1c7ce5f3e4f..b59675cc19b7 100644 --- a/include/linux/kasan.h +++ b/include/linux/kasan.h @@ -89,7 +89,7 @@ static __always_inline bool kasan_enabled(void) return static_branch_likely(&kasan_flag_enabled); } -static inline bool kasan_has_integrated_init(void) +static inline bool kasan_hw_tags_enabled(void) { return kasan_enabled(); } @@ -104,7 +104,7 @@ static inline bool kasan_enabled(void) return IS_ENABLED(CONFIG_KASAN); } -static inline bool kasan_has_integrated_init(void) +static inline bool kasan_hw_tags_enabled(void) { return false; } @@ -125,6 +125,11 @@ static __always_inline void kasan_free_pages(struct page *page, #endif /* CONFIG_KASAN_HW_TAGS */ +static inline bool kasan_has_integrated_init(void) +{ + return kasan_hw_tags_enabled(); +} + #ifdef CONFIG_KASAN struct kasan_cache { diff --git a/include/linux/tracepoint.h b/include/linux/tracepoint.h index e4c5df71f0e7..c51a00210f88 100644 --- a/include/linux/tracepoint.h +++ b/include/linux/tracepoint.h @@ -245,7 +245,7 @@ static inline struct tracepoint *tracepoint_ptr_deref(tracepoint_ptr_t *p) extern int __traceiter_##name(data_proto); \ DECLARE_STATIC_CALL(tp_func_##name, __traceiter_##name); \ extern struct tracepoint __tracepoint_##name; \ - static inline void trace_##name(proto) \ + static inline void __nocfi trace_##name(proto) \ { \ if (static_key_false(&__tracepoint_##name.key)) \ __DO_TRACE(name, \ @@ -310,7 +310,7 @@ static inline struct tracepoint *tracepoint_ptr_deref(tracepoint_ptr_t *p) .unregfunc = _unreg, \ .funcs = NULL }; \ __TRACEPOINT_ENTRY(_name); \ - int __traceiter_##_name(void *__data, proto) \ + int __nocfi __traceiter_##_name(void *__data, proto) \ { \ struct tracepoint_func *it_func_ptr; \ void *it_func; \ diff --git a/include/sound/soc.h b/include/sound/soc.h index 63338f68de48..330c82c58afe 100644 --- a/include/sound/soc.h +++ b/include/sound/soc.h @@ -1105,6 +1105,12 @@ struct snd_soc_card { ANDROID_KABI_RESERVE(3); ANDROID_KABI_RESERVE(4); }; + +struct snd_soc_card_ext { + struct snd_soc_card card; + unsigned int component_chaining:1; +}; + #define for_each_card_prelinks(card, i, link) \ for ((i) = 0; \ ((i) < (card)->num_links) && ((link) = &(card)->dai_link[i]); \ diff --git a/include/trace/hooks/ufshcd.h b/include/trace/hooks/ufshcd.h index ec8845a55076..744a1db41631 100644 --- a/include/trace/hooks/ufshcd.h +++ b/include/trace/hooks/ufshcd.h @@ -19,6 +19,10 @@ DECLARE_HOOK(android_vh_ufs_fill_prdt, unsigned int segments, int *err), TP_ARGS(hba, lrbp, segments, err)); +DECLARE_RESTRICTED_HOOK(android_rvh_ufs_complete_init, + TP_PROTO(struct ufs_hba *hba), + TP_ARGS(hba), 1); + DECLARE_RESTRICTED_HOOK(android_rvh_ufs_reprogram_all_keys, TP_PROTO(struct ufs_hba *hba, int *err), TP_ARGS(hba, err), 1); diff --git a/include/uapi/linux/android/binder.h b/include/uapi/linux/android/binder.h index 74dcd8e92e50..2d3f015e2ae3 100644 --- a/include/uapi/linux/android/binder.h +++ b/include/uapi/linux/android/binder.h @@ -273,7 +273,14 @@ struct binder_freeze_info { struct binder_frozen_status_info { __u32 pid; + + /* process received sync transactions since last frozen + * bit 0: received sync transaction after being frozen + * bit 1: new pending sync transaction during freezing + */ __u32 sync_recv; + + /* process received async transactions since last frozen */ __u32 async_recv; }; diff --git a/kernel/scs.c b/kernel/scs.c index e2a71fc82fa0..579841be8864 100644 --- a/kernel/scs.c +++ b/kernel/scs.c @@ -78,6 +78,7 @@ void scs_free(void *s) if (this_cpu_cmpxchg(scs_cache[i], 0, s) == NULL) return; + kasan_unpoison_vmalloc(s, SCS_SIZE); vfree_atomic(s); } diff --git a/mm/filemap.c b/mm/filemap.c index d60dd67000fb..632734e9f8f1 100644 --- a/mm/filemap.c +++ b/mm/filemap.c @@ -2996,6 +2996,8 @@ vm_fault_t filemap_map_pages(struct vm_fault *vmf, addr = vma->vm_start + ((start_pgoff - vma->vm_pgoff) << PAGE_SHIFT); if (!pte_map_lock_addr(vmf, addr)) { + unlock_page(head); + put_page(head); ret = VM_FAULT_RETRY; goto out; } diff --git a/mm/kasan/hw_tags.c b/mm/kasan/hw_tags.c index ed5e5b833d61..d91e98c48dc7 100644 --- a/mm/kasan/hw_tags.c +++ b/mm/kasan/hw_tags.c @@ -142,8 +142,6 @@ void kasan_init_hw_tags_cpu(void) if (kasan_arg == KASAN_ARG_OFF) return; - hw_init_tags(KASAN_TAG_MAX); - /* * Enable async mode only when explicitly requested through * the command line. diff --git a/mm/kasan/kasan.h b/mm/kasan/kasan.h index ed9c45a63f9a..ac88595d6211 100644 --- a/mm/kasan/kasan.h +++ b/mm/kasan/kasan.h @@ -3,6 +3,7 @@ #define __MM_KASAN_KASAN_H #include +#include #include #include @@ -51,16 +52,6 @@ extern bool kasan_flag_async __ro_after_init; #define KASAN_MEMORY_PER_SHADOW_PAGE (KASAN_GRANULE_SIZE << PAGE_SHIFT) -#define KASAN_TAG_KERNEL 0xFF /* native kernel pointers tag */ -#define KASAN_TAG_INVALID 0xFE /* inaccessible memory tag */ -#define KASAN_TAG_MAX 0xFD /* maximum value for random tags */ - -#ifdef CONFIG_KASAN_HW_TAGS -#define KASAN_TAG_MIN 0xF0 /* mimimum value for random tags */ -#else -#define KASAN_TAG_MIN 0x00 /* mimimum value for random tags */ -#endif - #ifdef CONFIG_KASAN_GENERIC #define KASAN_FREE_PAGE 0xFF /* page was freed */ #define KASAN_PAGE_REDZONE 0xFE /* redzone for kmalloc_large allocations */ @@ -299,9 +290,6 @@ static inline const void *arch_kasan_set_tag(const void *addr, u8 tag) #ifndef arch_enable_tagging_async #define arch_enable_tagging_async() #endif -#ifndef arch_init_tags -#define arch_init_tags(max_tag) -#endif #ifndef arch_set_tagging_report_once #define arch_set_tagging_report_once(state) #endif @@ -320,7 +308,6 @@ static inline const void *arch_kasan_set_tag(const void *addr, u8 tag) #define hw_enable_tagging_sync() arch_enable_tagging_sync() #define hw_enable_tagging_async() arch_enable_tagging_async() -#define hw_init_tags(max_tag) arch_init_tags(max_tag) #define hw_set_tagging_report_once(state) arch_set_tagging_report_once(state) #define hw_force_async_tag_fault() arch_force_async_tag_fault() #define hw_get_random_tag() arch_get_random_tag() diff --git a/mm/page_pinner.c b/mm/page_pinner.c index 3f5c48af3135..f4a141aafac6 100644 --- a/mm/page_pinner.c +++ b/mm/page_pinner.c @@ -59,7 +59,7 @@ static bool page_pinner_enabled; DEFINE_STATIC_KEY_FALSE(page_pinner_inited); DEFINE_STATIC_KEY_TRUE(failure_tracking); -EXPORT_SYMBOL_GPL(failure_tracking); +EXPORT_SYMBOL(failure_tracking); static depot_stack_handle_t failure_handle; @@ -350,7 +350,7 @@ void __page_pinner_migration_failed(struct page *page) acf_pinner.pinner[idx] = record; spin_unlock_irqrestore(&acf_pinner.lock, flags); } -EXPORT_SYMBOL_GPL(__page_pinner_migration_failed); +EXPORT_SYMBOL(__page_pinner_migration_failed); void __page_pinner_mark_migration_failed_pages(struct list_head *page_list) { diff --git a/mm/slab_common.c b/mm/slab_common.c index 582a2bbd482d..6a04bfa91df5 100644 --- a/mm/slab_common.c +++ b/mm/slab_common.c @@ -313,6 +313,16 @@ kmem_cache_create_usercopy(const char *name, get_online_cpus(); get_online_mems(); +#ifdef CONFIG_SLUB_DEBUG + /* + * If no slub_debug was enabled globally, the static key is not yet + * enabled by setup_slub_debug(). Enable it if the cache is being + * created with any of the debugging flags passed explicitly. + */ + if (flags & SLAB_DEBUG_FLAGS) + static_branch_enable(&slub_debug_enabled); +#endif + mutex_lock(&slab_mutex); err = kmem_cache_sanity_check(name, size); diff --git a/mm/swap.c b/mm/swap.c index 8d5c61de5a6e..abf445bd7721 100644 --- a/mm/swap.c +++ b/mm/swap.c @@ -691,7 +691,6 @@ void lru_add_drain_cpu(int cpu) pagevec_lru_move_fn(pvec, lru_lazyfree_movetail_fn, NULL); activate_page_drain(cpu); - invalidate_bh_lrus_cpu(cpu); } /** @@ -797,6 +796,20 @@ void lru_add_drain(void) local_unlock(&lru_pvecs.lock); } +/* + * It's called from per-cpu workqueue context in SMP case so + * lru_add_drain_cpu and invalidate_bh_lrus_cpu should run on + * the same cpu. It shouldn't be a problem in !SMP case since + * the core is only one and the locks will disable preemption. + */ +static void lru_add_and_bh_lrus_drain(void) +{ + local_lock(&lru_pvecs.lock); + lru_add_drain_cpu(smp_processor_id()); + local_unlock(&lru_pvecs.lock); + invalidate_bh_lrus_cpu(); +} + void lru_add_drain_cpu_zone(struct zone *zone) { local_lock(&lru_pvecs.lock); @@ -811,7 +824,7 @@ static DEFINE_PER_CPU(struct work_struct, lru_add_drain_work); static void lru_add_drain_per_cpu(struct work_struct *dummy) { - lru_add_drain(); + lru_add_and_bh_lrus_drain(); } /* @@ -969,7 +982,7 @@ void lru_cache_disable(void) */ __lru_add_drain_all(true); #else - lru_add_drain(); + lru_add_and_bh_lrus_drain(); #endif atomic_inc(&lru_disable_count); } diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c index 678547b939e5..59113d831c39 100644 --- a/sound/soc/soc-core.c +++ b/sound/soc/soc-core.c @@ -2175,9 +2175,17 @@ EXPORT_SYMBOL_GPL(snd_soc_add_dai_controls); */ int snd_soc_register_card(struct snd_soc_card *card) { + struct snd_soc_card_ext *card_ext; + if (!card->name || !card->dev) return -EINVAL; + card_ext = devm_kzalloc(card->dev, + sizeof(struct snd_soc_card_ext), GFP_KERNEL); + + memcpy(&card_ext->card, card, sizeof(struct snd_soc_card)); + card = &card_ext->card; + dev_set_drvdata(card->dev, card); INIT_LIST_HEAD(&card->widgets); diff --git a/sound/soc/soc-pcm.c b/sound/soc/soc-pcm.c index 69c78fd59e41..406273166d19 100644 --- a/sound/soc/soc-pcm.c +++ b/sound/soc/soc-pcm.c @@ -1274,6 +1274,7 @@ int dpcm_path_get(struct snd_soc_pcm_runtime *fe, int stream, struct snd_soc_dapm_widget_list **list) { struct snd_soc_dai *cpu_dai = asoc_rtd_to_cpu(fe, 0); + struct snd_soc_card_ext *card_ext; int paths; if (fe->num_cpus > 1) { @@ -1282,9 +1283,12 @@ int dpcm_path_get(struct snd_soc_pcm_runtime *fe, return -EINVAL; } + card_ext = container_of(fe->card, struct snd_soc_card_ext, card); + /* get number of valid DAI paths and their widgets */ paths = snd_soc_dapm_dai_get_connected_widgets(cpu_dai, stream, list, - dpcm_end_walk_at_be); + card_ext->component_chaining ? + NULL : dpcm_end_walk_at_be); dev_dbg(fe->dev, "ASoC: found %d audio %s paths\n", paths, stream ? "capture" : "playback");