diff --git a/android/abi_gki_aarch64.xml b/android/abi_gki_aarch64.xml index 878779269b2b..af1caade63e1 100644 --- a/android/abi_gki_aarch64.xml +++ b/android/abi_gki_aarch64.xml @@ -471,6 +471,7 @@ + @@ -509,6 +510,7 @@ + @@ -547,11 +549,13 @@ + + @@ -587,6 +591,7 @@ + @@ -602,6 +607,7 @@ + @@ -648,6 +654,7 @@ + @@ -674,6 +681,7 @@ + @@ -691,6 +699,7 @@ + @@ -1182,6 +1191,7 @@ + @@ -1300,6 +1310,7 @@ + @@ -2789,6 +2800,7 @@ + @@ -3291,6 +3303,7 @@ + @@ -5581,7 +5594,9 @@ + + @@ -5600,6 +5615,7 @@ + @@ -6527,6 +6543,7 @@ + @@ -6565,6 +6582,7 @@ + @@ -6603,11 +6621,13 @@ + + @@ -6643,6 +6663,7 @@ + @@ -6658,6 +6679,7 @@ + @@ -6704,6 +6726,7 @@ + @@ -6730,6 +6753,7 @@ + @@ -6747,6 +6771,7 @@ + @@ -7283,6 +7308,14 @@ + + + + + + + + @@ -8725,14 +8758,6 @@ - - - - - - - - @@ -9480,9 +9505,9 @@ - - - + + + @@ -12155,6 +12180,7 @@ + @@ -24520,6 +24546,9 @@ + + + @@ -33936,6 +33965,7 @@ + @@ -40005,8 +40035,8 @@ - - + + @@ -44626,7 +44656,23 @@ - + + + + + + + + + + + + + + + + + @@ -48966,6 +49012,7 @@ + @@ -53923,6 +53970,13 @@ + + + + + + + @@ -58978,6 +59032,11 @@ + + + + + @@ -65067,26 +65126,7 @@ - - - - - - - - - - - - - - - - - - - - + @@ -66583,6 +66623,13 @@ + + + + + + + @@ -71582,7 +71629,17 @@ - + + + + + + + + + + + @@ -91374,6 +91431,7 @@ + @@ -103141,6 +103199,12 @@ + + + + + + @@ -106547,29 +106611,7 @@ - - - - - - - - - - - - - - - - - - - - - - - + @@ -109495,13 +109537,6 @@ - - - - - - - @@ -111387,6 +111422,7 @@ + @@ -116460,20 +116496,20 @@ - + - + - - + + - - - + + + @@ -116491,11 +116527,11 @@ - - - - - + + + + + @@ -117131,9 +117167,9 @@ - - - + + + @@ -117176,9 +117212,9 @@ - - - + + + @@ -117186,9 +117222,9 @@ - - - + + + @@ -117229,16 +117265,16 @@ - - - - + + + + - - - - + + + + @@ -117704,13 +117740,13 @@ - - - + + + - - + + @@ -118219,17 +118255,17 @@ - - - - + + + + - - - - - + + + + + @@ -118410,12 +118446,12 @@ - - - - - - + + + + + + @@ -118496,19 +118532,19 @@ - - - - - + + + + + - - - - - - + + + + + + @@ -118520,10 +118556,10 @@ - - - - + + + + @@ -118936,10 +118972,10 @@ - - - - + + + + @@ -118980,22 +119016,22 @@ - - - - - - - + + + + + + + - - - - - - - + + + + + + + @@ -119012,17 +119048,17 @@ - - - - + + + + - - - - - + + + + + @@ -119322,27 +119358,32 @@ - - - + + + - - - + + + - - - - - + + + - - - - + + + + + + + + + + + @@ -119464,12 +119505,12 @@ - - - - - - + + + + + + @@ -119550,17 +119591,17 @@ - - - - + + + + - - - - - + + + + + @@ -119568,6 +119609,14 @@ + + + + + + + + @@ -119668,12 +119717,12 @@ - - - - - - + + + + + + @@ -119692,10 +119741,10 @@ - - - - + + + + @@ -119720,10 +119769,10 @@ - - - - + + + + @@ -119810,6 +119859,13 @@ + + + + + + + @@ -119822,24 +119878,30 @@ - - - - - - + + + + + + - - - - + + + + - - - - + + + + + + + + + + @@ -119896,10 +119958,10 @@ - - - - + + + + @@ -120006,10 +120068,10 @@ - - - - + + + + @@ -120020,11 +120082,11 @@ - - - - - + + + + + @@ -120058,10 +120120,16 @@ - - - - + + + + + + + + + + @@ -120097,10 +120165,10 @@ - - - - + + + + @@ -120127,9 +120195,9 @@ - - - + + + @@ -120148,6 +120216,14 @@ + + + + + + + + @@ -120377,9 +120453,9 @@ - - - + + + @@ -120408,6 +120484,17 @@ + + + + + + + + + + + @@ -120457,10 +120544,10 @@ - - - - + + + + @@ -120486,22 +120573,22 @@ - - - - - + + + + + - - - + + + - - - - + + + + @@ -120516,9 +120603,9 @@ - - - + + + @@ -120565,6 +120652,15 @@ + + + + + + + + + @@ -120678,10 +120774,17 @@ - - - - + + + + + + + + + + + @@ -120741,9 +120844,9 @@ - - - + + + @@ -121183,8 +121286,8 @@ - - + + @@ -121211,7 +121314,7 @@ - + @@ -121224,10 +121327,10 @@ - - + + - + @@ -121293,18 +121396,18 @@ - + - - + + - - + + @@ -121349,10 +121452,11 @@ - - - - + + + + + @@ -121371,7 +121475,7 @@ - + @@ -121384,9 +121488,10 @@ - - + + + @@ -121403,15 +121508,15 @@ - + - + - + @@ -121425,11 +121530,13 @@ + - - - + + + + @@ -121439,7 +121546,7 @@ - + @@ -121457,29 +121564,31 @@ - + - + - + + - + - + + @@ -121521,11 +121630,12 @@ - + + @@ -121534,17 +121644,17 @@ - + - - - + + + - + @@ -121552,6 +121662,7 @@ + @@ -121569,7 +121680,8 @@ - + + @@ -121578,7 +121690,7 @@ - + @@ -122097,12 +122209,12 @@ - - - - - - + + + + + + @@ -122191,9 +122303,9 @@ - - - + + + @@ -122317,9 +122429,9 @@ - - - + + + @@ -122401,7 +122513,7 @@ - + @@ -123714,41 +123826,41 @@ - - - - - + + + + + - - - + + + - - - - + + + + - - - + + + - - - + + + - - + + - - - + + + @@ -123894,9 +124006,14 @@ - - - + + + + + + + + @@ -124529,6 +124646,11 @@ + + + + + @@ -125334,14 +125456,14 @@ - - - + + + - - - + + + @@ -128091,16 +128213,16 @@ - - + + - - + + - - + + @@ -128112,16 +128234,16 @@ - - + + - - + + - - + + @@ -130870,10 +130992,10 @@ - - - - + + + + @@ -131313,15 +131435,15 @@ - + - - + + @@ -131338,10 +131460,10 @@ - - - - + + + + @@ -131506,10 +131628,10 @@ - - - - + + + + @@ -131566,14 +131688,14 @@ - - - + + + - - - + + + @@ -132146,9 +132268,9 @@ - - - + + + @@ -132165,9 +132287,9 @@ - - - + + + @@ -132209,10 +132331,10 @@ - - - - + + + + @@ -132364,6 +132486,10 @@ + + + + @@ -132521,8 +132647,8 @@ - - + + @@ -132802,10 +132928,10 @@ - - - - + + + + @@ -133012,71 +133138,71 @@ - - + + - + - - - + + + - - + + - - + + - - - + + + - - + + - - - - - - + + + + + + - - + + - - - - + + + + - - - - - - + + + + + + - - + + - - - - - - + + + + + + @@ -134905,9 +135031,9 @@ - - - + + + @@ -134929,6 +135055,12 @@ + + + + + + @@ -135143,8 +135275,8 @@ - - + + @@ -135243,16 +135375,16 @@ - - - - + + + + - - - - + + + + @@ -135378,14 +135510,14 @@ - - - + + + - - - + + + @@ -135393,10 +135525,10 @@ - - - - + + + + @@ -135680,8 +135812,8 @@ - - + + @@ -135689,10 +135821,10 @@ - - - - + + + + @@ -136194,14 +136326,14 @@ - - - + + + - - - + + + @@ -138393,14 +138525,14 @@ - - - - + + + + - - + + @@ -138409,12 +138541,12 @@ - - + + - - + + @@ -138479,24 +138611,24 @@ - - - - - - - - + + + + + + + + - - - - - - - - + + + + + + + + @@ -141036,17 +141168,17 @@ - - - - - + + + + + - - - - + + + + @@ -141682,12 +141814,12 @@ - - - - - - + + + + + + @@ -143565,11 +143697,11 @@ - + - - + + @@ -145361,9 +145493,9 @@ - - - + + + @@ -145646,9 +145778,9 @@ - - - + + + @@ -146536,9 +146668,9 @@ - - - + + + @@ -146687,12 +146819,22 @@ + + + + + + + + + + @@ -146791,6 +146933,11 @@ + + + + + @@ -147456,11 +147603,11 @@ - - - - - + + + + + @@ -147615,12 +147762,12 @@ - - + + - - + + @@ -147642,13 +147789,13 @@ - - + + - - - + + + @@ -147817,8 +147964,8 @@ - - + + @@ -147981,8 +148128,8 @@ - - + + @@ -147994,9 +148141,9 @@ - - - + + + @@ -148011,8 +148158,8 @@ - - + + @@ -148052,7 +148199,7 @@ - + @@ -148172,10 +148319,10 @@ - - - - + + + + @@ -148386,9 +148533,9 @@ - - - + + + @@ -149842,22 +149989,22 @@ - - - - + + + + - - - - + + + + - - - - + + + + @@ -149866,16 +150013,16 @@ - + - - - - - - - + + + + + + + @@ -149923,28 +150070,28 @@ - - - + + + - - - - + + + + - - - - + + + + - - - - - + + + + + @@ -150572,19 +150719,19 @@ - - - - - - + + + + + + - - - - - + + + + + diff --git a/android/abi_gki_aarch64_exynos b/android/abi_gki_aarch64_exynos index 5f0526297f1c..ef69e40b6754 100644 --- a/android/abi_gki_aarch64_exynos +++ b/android/abi_gki_aarch64_exynos @@ -172,6 +172,7 @@ __const_udelay consume_skb contig_page_data + copy_highpage __cpu_active_mask cpu_all_bits cpu_bit_bitmap @@ -2114,7 +2115,9 @@ ttm_bo_move_ttm ttm_bo_put ttm_bo_unlock_delayed_workqueue + ttm_bo_unmap_virtual ttm_bo_validate + ttm_bo_wait ttm_dma_page_alloc_debugfs ttm_dma_populate ttm_dma_tt_fini @@ -2133,6 +2136,7 @@ ttm_tt_destroy_common ttm_tt_populate ttm_tt_set_placement_caching + ttm_tt_unpopulate ttm_unmap_and_unpopulate_pages tty_flip_buffer_push tty_insert_flip_string_fixed_flag diff --git a/android/abi_gki_aarch64_nothing b/android/abi_gki_aarch64_nothing new file mode 100644 index 000000000000..5960f2b3c287 --- /dev/null +++ b/android/abi_gki_aarch64_nothing @@ -0,0 +1,4 @@ +[abi_symbol_list] +# required by mount_state.ko + iterate_supers_type + get_fs_type \ No newline at end of file diff --git a/android/abi_gki_aarch64_oplus b/android/abi_gki_aarch64_oplus index bd21cf7d3005..51738dc7cd4d 100644 --- a/android/abi_gki_aarch64_oplus +++ b/android/abi_gki_aarch64_oplus @@ -143,6 +143,7 @@ cdev_device_del cdev_init __cfi_slowpath + cgroup_add_dfl_cftypes cgroup_add_legacy_cftypes cgroup_path_ns cgroup_taskset_first @@ -2793,6 +2794,16 @@ __traceiter_android_vh_clear_mask_adjust __traceiter_android_vh_clear_reserved_fmt_fields __traceiter_android_vh_cma_drain_all_pages_bypass + __traceiter_android_vh_compact_finished + __traceiter_android_vh_alloc_pages_reclaim_bypass + __traceiter_android_vh_free_unref_page_bypass + __traceiter_android_vh_kvmalloc_node_use_vmalloc + __traceiter_android_vh_should_alloc_pages_retry + __traceiter_android_vh_unreserve_highatomic_bypass + __traceiter_android_vh_pageset_update + __traceiter_android_vh_rmqueue_bulk_bypass + __traceiter_android_vh_tune_mmap_readaround + __traceiter_android_vh_ra_tuning_max_page __traceiter_android_vh_cleanup_old_buffers_bypass __traceiter_android_vh_commit_creds __traceiter_android_vh_cpufreq_acct_update_power @@ -2841,6 +2852,7 @@ __traceiter_android_vh_logbuf __traceiter_android_vh_look_around __traceiter_android_vh_look_around_migrate_page + __traceiter_android_vh_madvise_cold_or_pageout_abort __traceiter_android_vh_mark_page_accessed __traceiter_android_vh_mem_cgroup_alloc __traceiter_android_vh_mem_cgroup_css_offline @@ -3049,6 +3061,16 @@ __tracepoint_android_vh_clear_mask_adjust __tracepoint_android_vh_clear_reserved_fmt_fields __tracepoint_android_vh_cma_drain_all_pages_bypass + __tracepoint_android_vh_compact_finished + __tracepoint_android_vh_alloc_pages_reclaim_bypass + __tracepoint_android_vh_free_unref_page_bypass + __tracepoint_android_vh_kvmalloc_node_use_vmalloc + __tracepoint_android_vh_should_alloc_pages_retry + __tracepoint_android_vh_unreserve_highatomic_bypass + __tracepoint_android_vh_pageset_update + __tracepoint_android_vh_rmqueue_bulk_bypass + __tracepoint_android_vh_tune_mmap_readaround + __tracepoint_android_vh_ra_tuning_max_page __tracepoint_android_vh_cleanup_old_buffers_bypass __tracepoint_android_vh_commit_creds __tracepoint_android_vh_cpufreq_acct_update_power @@ -3097,6 +3119,7 @@ __tracepoint_android_vh_logbuf __tracepoint_android_vh_look_around __tracepoint_android_vh_look_around_migrate_page + __tracepoint_android_vh_madvise_cold_or_pageout_abort __tracepoint_android_vh_mark_page_accessed __tracepoint_android_vh_mem_cgroup_alloc __tracepoint_android_vh_mem_cgroup_css_offline diff --git a/build.config.gki.aarch64 b/build.config.gki.aarch64 index 738ddee4af33..b0971e2a0c4f 100644 --- a/build.config.gki.aarch64 +++ b/build.config.gki.aarch64 @@ -23,6 +23,7 @@ android/abi_gki_aarch64_honor android/abi_gki_aarch64_imx android/abi_gki_aarch64_lenovo android/abi_gki_aarch64_mtk +android/abi_gki_aarch64_nothing android/abi_gki_aarch64_oplus android/abi_gki_aarch64_qcom android/abi_gki_aarch64_rockchip diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index 2ce349294f3d..815c5efb5c22 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -76,6 +76,7 @@ #include #include #include +#include /* * Export tracepoints that act as a bare tracehook (ie: have no trace event @@ -332,6 +333,12 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_do_page_trylock); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_page_referenced_check_bypass); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_drain_all_pages_bypass); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_cma_drain_all_pages_bypass); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_free_unref_page_bypass); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_kvmalloc_node_use_vmalloc); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_should_alloc_pages_retry); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_unreserve_highatomic_bypass); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_pageset_update); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_rmqueue_bulk_bypass); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_pcplist_add_cma_pages_bypass); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_psi_event); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_psi_group); @@ -441,6 +448,7 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_binder_read_done); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_handle_tlb_conf); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_shrink_node_memcgs); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_ra_tuning_max_page); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_tune_mmap_readaround); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_handle_pte_fault_end); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_handle_pte_fault_end); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_cow_user_page); @@ -481,6 +489,9 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_look_around); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_look_around_migrate_page); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_test_clear_look_around_ref); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_dma_buf_stats_teardown); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_madvise_cold_or_pageout_abort); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_compact_finished); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_wakeup_bypass); /* * For type visibility */ diff --git a/drivers/gpu/drm/ttm/ttm_tt.c b/drivers/gpu/drm/ttm/ttm_tt.c index f43fa69a1e65..3f1a029248ce 100644 --- a/drivers/gpu/drm/ttm/ttm_tt.c +++ b/drivers/gpu/drm/ttm/ttm_tt.c @@ -466,3 +466,4 @@ void ttm_tt_unpopulate(struct ttm_bo_device *bdev, else ttm_pool_unpopulate(ttm); } +EXPORT_SYMBOL(ttm_tt_unpopulate); diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c index 5f9ec1d1464a..b007074a30ec 100644 --- a/drivers/hid/hid-core.c +++ b/drivers/hid/hid-core.c @@ -32,6 +32,7 @@ #include #include #include +#include #include "hid-ids.h" @@ -258,6 +259,7 @@ static int hid_add_field(struct hid_parser *parser, unsigned report_type, unsign { struct hid_report *report; struct hid_field *field; + unsigned int max_buffer_size = HID_MAX_BUFFER_SIZE; unsigned int usages; unsigned int offset; unsigned int i; @@ -288,8 +290,11 @@ static int hid_add_field(struct hid_parser *parser, unsigned report_type, unsign offset = report->size; report->size += parser->global.report_size * parser->global.report_count; + if (IS_ENABLED(CONFIG_UHID) && parser->device->ll_driver == &uhid_hid_driver) + max_buffer_size = UHID_DATA_MAX; + /* Total size check: Allow for possible report index byte */ - if (report->size > (HID_MAX_BUFFER_SIZE - 1) << 3) { + if (report->size > (max_buffer_size - 1) << 3) { hid_err(parser->device, "report is too long\n"); return -1; } @@ -1752,6 +1757,7 @@ int hid_report_raw_event(struct hid_device *hid, int type, u8 *data, u32 size, struct hid_report_enum *report_enum = hid->report_enum + type; struct hid_report *report; struct hid_driver *hdrv; + int max_buffer_size = HID_MAX_BUFFER_SIZE; unsigned int a; u32 rsize, csize = size; u8 *cdata = data; @@ -1768,10 +1774,13 @@ int hid_report_raw_event(struct hid_device *hid, int type, u8 *data, u32 size, rsize = hid_compute_report_size(report); - if (report_enum->numbered && rsize >= HID_MAX_BUFFER_SIZE) - rsize = HID_MAX_BUFFER_SIZE - 1; - else if (rsize > HID_MAX_BUFFER_SIZE) - rsize = HID_MAX_BUFFER_SIZE; + if (IS_ENABLED(CONFIG_UHID) && hid->ll_driver == &uhid_hid_driver) + max_buffer_size = UHID_DATA_MAX; + + if (report_enum->numbered && rsize >= max_buffer_size) + rsize = max_buffer_size - 1; + else if (rsize > max_buffer_size) + rsize = max_buffer_size; if (csize < rsize) { dbg_hid("report %d is too short, (%d < %d)\n", report->id, diff --git a/drivers/input/keyboard/gpio_keys.c b/drivers/input/keyboard/gpio_keys.c index f2d4e4daa818..725a196662af 100644 --- a/drivers/input/keyboard/gpio_keys.c +++ b/drivers/input/keyboard/gpio_keys.c @@ -28,6 +28,7 @@ #include #include #include +#include struct gpio_button_data { const struct gpio_keys_button *button; @@ -958,11 +959,16 @@ static int __maybe_unused gpio_keys_suspend(struct device *dev) struct gpio_keys_drvdata *ddata = dev_get_drvdata(dev); struct input_dev *input = ddata->input; int error; + int wakeup_bypass_enabled = 0; + + trace_android_vh_wakeup_bypass(&wakeup_bypass_enabled); if (device_may_wakeup(dev)) { - error = gpio_keys_enable_wakeup(ddata); - if (error) - return error; + if (!wakeup_bypass_enabled) { + error = gpio_keys_enable_wakeup(ddata); + if (error) + return error; + } } else { mutex_lock(&input->mutex); if (input->users) @@ -978,9 +984,13 @@ static int __maybe_unused gpio_keys_resume(struct device *dev) struct gpio_keys_drvdata *ddata = dev_get_drvdata(dev); struct input_dev *input = ddata->input; int error = 0; + int wakeup_bypass_enabled = 0; + + trace_android_vh_wakeup_bypass(&wakeup_bypass_enabled); if (device_may_wakeup(dev)) { - gpio_keys_disable_wakeup(ddata); + if (!wakeup_bypass_enabled) + gpio_keys_disable_wakeup(ddata); } else { mutex_lock(&input->mutex); if (input->users) diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c index 93c07514fdad..3ec65523bdc5 100644 --- a/drivers/usb/dwc3/gadget.c +++ b/drivers/usb/dwc3/gadget.c @@ -2586,7 +2586,9 @@ static int dwc3_gadget_pullup(struct usb_gadget *g, int is_on) ret = pm_runtime_get_sync(dwc->dev); if (!ret || ret < 0) { pm_runtime_put(dwc->dev); - return 0; + if (ret < 0) + pm_runtime_set_suspended(dwc->dev); + return ret; } if (dwc->pullups_connected == is_on) { @@ -2605,13 +2607,16 @@ static int dwc3_gadget_pullup(struct usb_gadget *g, int is_on) * device-initiated disconnect requires a core soft reset * (DCTL.CSftRst) before enabling the run/stop bit. */ - dwc3_core_soft_reset(dwc); + ret = dwc3_core_soft_reset(dwc); + if (ret) + goto done; dwc3_event_buffers_setup(dwc); __dwc3_gadget_start(dwc); ret = dwc3_gadget_run_stop(dwc, true, false); } +done: pm_runtime_put(dwc->dev); return ret; diff --git a/drivers/usb/gadget/udc/core.c b/drivers/usb/gadget/udc/core.c index 7a00af1f9624..237f9cc8bfba 100644 --- a/drivers/usb/gadget/udc/core.c +++ b/drivers/usb/gadget/udc/core.c @@ -1047,12 +1047,16 @@ EXPORT_SYMBOL_GPL(usb_gadget_set_state); /* ------------------------------------------------------------------------- */ -static void usb_udc_connect_control(struct usb_udc *udc) +static int usb_udc_connect_control(struct usb_udc *udc) { + int ret; + if (udc->vbus) - usb_gadget_connect(udc->gadget); + ret = usb_gadget_connect(udc->gadget); else - usb_gadget_disconnect(udc->gadget); + ret = usb_gadget_disconnect(udc->gadget); + + return ret; } /** @@ -1507,15 +1511,26 @@ static int udc_bind_to_driver(struct usb_udc *udc, struct usb_gadget_driver *dri if (ret) goto err1; ret = usb_gadget_udc_start(udc); - if (ret) { - driver->unbind(udc->gadget); - goto err1; - } + if (ret) + goto err_start; + usb_gadget_enable_async_callbacks(udc); - usb_udc_connect_control(udc); + ret = usb_udc_connect_control(udc); + if (ret) + goto err_connect_control; kobject_uevent(&udc->dev.kobj, KOBJ_CHANGE); return 0; + +err_connect_control: + usb_gadget_disable_async_callbacks(udc); + if (udc->gadget->irq) + synchronize_irq(udc->gadget->irq); + usb_gadget_udc_stop(udc); + +err_start: + driver->unbind(udc->gadget); + err1: if (ret != -EISNAM) dev_err(&udc->dev, "failed to start %s: %d\n", diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c index dc730847fe68..f4c582f396f2 100644 --- a/fs/f2fs/super.c +++ b/fs/f2fs/super.c @@ -1994,6 +1994,11 @@ static int f2fs_disable_checkpoint(struct f2fs_sb_info *sbi) } sbi->sb->s_flags |= SB_ACTIVE; + /* check if we need more GC first */ + unusable = f2fs_get_unusable_blocks(sbi); + if (!f2fs_disable_cp_again(sbi, unusable)) + goto skip_gc; + f2fs_update_time(sbi, DISABLE_TIME); while (!f2fs_time_over(sbi, DISABLE_TIME)) { @@ -2019,6 +2024,7 @@ static int f2fs_disable_checkpoint(struct f2fs_sb_info *sbi) goto restore_flag; } +skip_gc: f2fs_down_write(&sbi->gc_lock); cpc.reason = CP_PAUSE; set_sbi_flag(sbi, SBI_CP_DISABLED); diff --git a/fs/incfs/pseudo_files.c b/fs/incfs/pseudo_files.c index 1b9bf000f598..d43ccb2ce3b0 100644 --- a/fs/incfs/pseudo_files.c +++ b/fs/incfs/pseudo_files.c @@ -916,10 +916,10 @@ static long ioctl_get_read_timeouts(struct mount_info *mi, void __user *arg) if (copy_from_user(&args, args_usr_ptr, sizeof(args))) return -EINVAL; - if (args.timeouts_array_size_out > INCFS_DATA_FILE_BLOCK_SIZE) + if (args.timeouts_array_size > INCFS_DATA_FILE_BLOCK_SIZE) return -EINVAL; - buffer = kzalloc(args.timeouts_array_size_out, GFP_NOFS); + buffer = kzalloc(args.timeouts_array_size, GFP_NOFS); if (!buffer) return -ENOMEM; diff --git a/include/linux/percpu-rwsem.h b/include/linux/percpu-rwsem.h index 92d172cfce06..55e80d18628d 100644 --- a/include/linux/percpu-rwsem.h +++ b/include/linux/percpu-rwsem.h @@ -107,7 +107,6 @@ static inline bool percpu_down_read_trylock(struct percpu_rw_semaphore *sem) static inline void percpu_up_read(struct percpu_rw_semaphore *sem) { - _trace_android_vh_record_pcpu_rwsem_starttime(current, 0); rwsem_release(&sem->dep_map, _RET_IP_); preempt_disable(); @@ -130,6 +129,7 @@ static inline void percpu_up_read(struct percpu_rw_semaphore *sem) this_cpu_dec(*sem->read_count); rcuwait_wake_up(&sem->writer); } + _trace_android_vh_record_pcpu_rwsem_starttime(current, 0); preempt_enable(); } diff --git a/include/trace/hooks/mm.h b/include/trace/hooks/mm.h index 8fecbc8b3d5b..480880a49d32 100644 --- a/include/trace/hooks/mm.h +++ b/include/trace/hooks/mm.h @@ -192,6 +192,27 @@ DECLARE_HOOK(android_vh_mark_page_accessed, DECLARE_HOOK(android_vh_cma_drain_all_pages_bypass, TP_PROTO(unsigned int migratetype, bool *bypass), TP_ARGS(migratetype, bypass)); +DECLARE_HOOK(android_vh_free_unref_page_bypass, + TP_PROTO(struct page *page, int order, int migratetype, bool *bypass), + TP_ARGS(page, order, migratetype, bypass)); +DECLARE_HOOK(android_vh_kvmalloc_node_use_vmalloc, + TP_PROTO(size_t size, gfp_t *kmalloc_flags, bool *use_vmalloc), + TP_ARGS(size, kmalloc_flags, use_vmalloc)); +DECLARE_HOOK(android_vh_should_alloc_pages_retry, + TP_PROTO(gfp_t gfp_mask, int order, int *alloc_flags, + int migratetype, struct zone *preferred_zone, struct page **page, bool *should_alloc_retry), + TP_ARGS(gfp_mask, order, alloc_flags, + migratetype, preferred_zone, page, should_alloc_retry)); +DECLARE_HOOK(android_vh_unreserve_highatomic_bypass, + TP_PROTO(bool force, struct zone *zone, bool *skip_unreserve_highatomic), + TP_ARGS(force, zone, skip_unreserve_highatomic)); +DECLARE_HOOK(android_vh_pageset_update, + TP_PROTO(unsigned long *high, unsigned long *batch), + TP_ARGS(high, batch)); +DECLARE_HOOK(android_vh_rmqueue_bulk_bypass, + TP_PROTO(unsigned int order, struct per_cpu_pages *pcp, int migratetype, + struct list_head *list), + TP_ARGS(order, pcp, migratetype, list)); DECLARE_HOOK(android_vh_pcplist_add_cma_pages_bypass, TP_PROTO(int migratetype, bool *bypass), TP_ARGS(migratetype, bypass)); @@ -201,6 +222,10 @@ DECLARE_HOOK(android_vh_subpage_dma_contig_alloc, DECLARE_HOOK(android_vh_ra_tuning_max_page, TP_PROTO(struct readahead_control *ractl, unsigned long *max_page), TP_ARGS(ractl, max_page)); +DECLARE_HOOK(android_vh_tune_mmap_readaround, + TP_PROTO(unsigned int ra_pages, pgoff_t pgoff, + pgoff_t *start, unsigned int *size, unsigned int *async_size), + TP_ARGS(ra_pages, pgoff, start, size, async_size)); DECLARE_RESTRICTED_HOOK(android_rvh_handle_pte_fault_end, TP_PROTO(struct vm_fault *vmf, unsigned long highest_memmap_pfn), TP_ARGS(vmf, highest_memmap_pfn), 1); @@ -313,6 +338,12 @@ DECLARE_HOOK(android_vh_look_around, TP_PROTO(struct page_vma_mapped_walk *pvmw, struct page *page, struct vm_area_struct *vma, int *referenced), TP_ARGS(pvmw, page, vma, referenced)); +DECLARE_HOOK(android_vh_compact_finished, + TP_PROTO(bool *abort_compact), + TP_ARGS(abort_compact)); +DECLARE_HOOK(android_vh_madvise_cold_or_pageout_abort, + TP_PROTO(struct vm_area_struct *vma, bool *abort_madvise), + TP_ARGS(vma, abort_madvise)); /* macro versions of hooks are no longer required */ #endif /* _TRACE_HOOK_MM_H */ diff --git a/include/trace/hooks/wakeupbypass.h b/include/trace/hooks/wakeupbypass.h new file mode 100644 index 000000000000..a96c8874481e --- /dev/null +++ b/include/trace/hooks/wakeupbypass.h @@ -0,0 +1,17 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#undef TRACE_SYSTEM +#define TRACE_SYSTEM wakeupbypass + +#define TRACE_INCLUDE_PATH trace/hooks + +#if !defined(_TRACE_HOOK_WAKEUPBYPASS_H) || defined(TRACE_HEADER_MULTI_READ) +#define _TRACE_HOOK_WAKEUPBYPASS_H +#include + +DECLARE_HOOK(android_vh_wakeup_bypass, + TP_PROTO(int *is_wakeup_bypassed), + TP_ARGS(is_wakeup_bypassed)); + +#endif /* _TRACE_HOOK_WAKEUPBYPASS_H */ +/* This part must be outside protection */ +#include diff --git a/kernel/cgroup/cgroup.c b/kernel/cgroup/cgroup.c index 8d6dec75d9bf..20a3448cb8f2 100644 --- a/kernel/cgroup/cgroup.c +++ b/kernel/cgroup/cgroup.c @@ -4233,6 +4233,7 @@ int cgroup_add_dfl_cftypes(struct cgroup_subsys *ss, struct cftype *cfts) cft->flags |= __CFTYPE_ONLY_ON_DFL; return cgroup_add_cftypes(ss, cfts); } +EXPORT_SYMBOL_GPL(cgroup_add_dfl_cftypes); /** * cgroup_add_legacy_cftypes - add an array of cftypes for legacy hierarchies diff --git a/kernel/locking/mutex.c b/kernel/locking/mutex.c index b9a10aacb139..be121ed70d7c 100644 --- a/kernel/locking/mutex.c +++ b/kernel/locking/mutex.c @@ -760,12 +760,12 @@ static noinline void __sched __mutex_unlock_slowpath(struct mutex *lock, unsigne */ void __sched mutex_unlock(struct mutex *lock) { - trace_android_vh_record_mutex_lock_starttime(current, 0); #ifndef CONFIG_DEBUG_LOCK_ALLOC if (__mutex_unlock_fast(lock)) return; #endif __mutex_unlock_slowpath(lock, _RET_IP_); + trace_android_vh_record_mutex_lock_starttime(current, 0); } EXPORT_SYMBOL(mutex_unlock); diff --git a/kernel/locking/percpu-rwsem.c b/kernel/locking/percpu-rwsem.c index c8a474aa1b3b..915c045a15f3 100644 --- a/kernel/locking/percpu-rwsem.c +++ b/kernel/locking/percpu-rwsem.c @@ -258,7 +258,6 @@ EXPORT_SYMBOL_GPL(percpu_down_write); void percpu_up_write(struct percpu_rw_semaphore *sem) { - trace_android_vh_record_pcpu_rwsem_starttime(current, 0); rwsem_release(&sem->dep_map, _RET_IP_); /* @@ -284,6 +283,7 @@ void percpu_up_write(struct percpu_rw_semaphore *sem) * exclusive write lock because its counting. */ rcu_sync_exit(&sem->rss); + trace_android_vh_record_pcpu_rwsem_starttime(current, 0); } EXPORT_SYMBOL_GPL(percpu_up_write); diff --git a/kernel/locking/rwsem.c b/kernel/locking/rwsem.c index 057c9e99251a..acd1fc78d059 100644 --- a/kernel/locking/rwsem.c +++ b/kernel/locking/rwsem.c @@ -1066,6 +1066,8 @@ rwsem_down_read_slowpath(struct rw_semaphore *sem, int state) raw_spin_unlock_irq(&sem->wait_lock); rwsem_set_reader_owned(sem); lockevent_inc(rwsem_rlock_fast); + trace_android_vh_record_rwsem_lock_starttime( + current, jiffies); return sem; } adjustment += RWSEM_FLAG_WAITERS; diff --git a/kernel/time/alarmtimer.c b/kernel/time/alarmtimer.c index 1de426d3f694..3a20a9f9f7b5 100644 --- a/kernel/time/alarmtimer.c +++ b/kernel/time/alarmtimer.c @@ -33,6 +33,8 @@ #define CREATE_TRACE_POINTS #include +#undef CREATE_TRACE_POINTS +#include /** * struct alarm_base - Alarm timer bases * @lock: Lock for syncrhonized access to the base @@ -246,6 +248,7 @@ static int alarmtimer_suspend(struct device *dev) struct rtc_device *rtc; unsigned long flags; struct rtc_time tm; + int wakeup_bypass_enabled = 0; spin_lock_irqsave(&freezer_delta_lock, flags); min = freezer_delta; @@ -254,6 +257,10 @@ static int alarmtimer_suspend(struct device *dev) freezer_delta = 0; spin_unlock_irqrestore(&freezer_delta_lock, flags); + trace_android_vh_wakeup_bypass(&wakeup_bypass_enabled); + if (wakeup_bypass_enabled) + return 0; + rtc = alarmtimer_get_rtcdev(); /* If we have no rtcdev, just return */ if (!rtc) diff --git a/mm/compaction.c b/mm/compaction.c index eca4d0ea74c1..dc96fadb04da 100644 --- a/mm/compaction.c +++ b/mm/compaction.c @@ -45,6 +45,11 @@ static inline void count_compact_events(enum vm_event_item item, long delta) #define CREATE_TRACE_POINTS #include +#undef CREATE_TRACE_POINTS +#ifndef __GENKSYMS__ +#include +#endif + #define block_start_pfn(pfn, order) round_down(pfn, 1UL << (order)) #define block_end_pfn(pfn, order) ALIGN((pfn) + 1, 1UL << (order)) #define pageblock_start_pfn(pfn) block_start_pfn(pfn, pageblock_order) @@ -1984,6 +1989,7 @@ static enum compact_result __compact_finished(struct compact_control *cc) unsigned int order; const int migratetype = cc->migratetype; int ret; + bool abort_compact = false; /* Compaction run completes if the migrate and free scanner meet */ if (compact_scanners_met(cc)) { @@ -2083,7 +2089,8 @@ static enum compact_result __compact_finished(struct compact_control *cc) } out: - if (cc->contended || fatal_signal_pending(current)) + trace_android_vh_compact_finished(&abort_compact); + if (cc->contended || fatal_signal_pending(current) || abort_compact) ret = COMPACT_CONTENDED; return ret; diff --git a/mm/filemap.c b/mm/filemap.c index dd1db5745741..0450b4ef4b1a 100644 --- a/mm/filemap.c +++ b/mm/filemap.c @@ -2661,6 +2661,8 @@ static struct file *do_sync_mmap_readahead(struct vm_fault *vmf) ra->start = max_t(long, 0, vmf->pgoff - ra->ra_pages / 2); ra->size = ra->ra_pages; ra->async_size = ra->ra_pages / 4; + trace_android_vh_tune_mmap_readaround(ra->ra_pages, vmf->pgoff, + &ra->start, &ra->size, &ra->async_size); ractl._index = ra->start; do_page_cache_ra(&ractl, ra->size, ra->async_size); return fpin; diff --git a/mm/madvise.c b/mm/madvise.c index b3761ca637bb..d16fa1d8f60f 100644 --- a/mm/madvise.c +++ b/mm/madvise.c @@ -322,8 +322,10 @@ static int madvise_cold_or_pageout_pte_range(pmd_t *pmd, struct page *page = NULL; LIST_HEAD(page_list); bool allow_shared = false; + bool abort_madvise = false; - if (fatal_signal_pending(current)) + trace_android_vh_madvise_cold_or_pageout_abort(vma, &abort_madvise); + if (fatal_signal_pending(current) || abort_madvise) return -EINTR; trace_android_vh_madvise_cold_or_pageout(vma, &allow_shared); diff --git a/mm/memory.c b/mm/memory.c index 834078ab6e1c..df62ea2ef8f2 100644 --- a/mm/memory.c +++ b/mm/memory.c @@ -246,6 +246,16 @@ static void free_pte_range(struct mmu_gather *tlb, pmd_t *pmd, unsigned long addr) { pgtable_t token = pmd_pgtable(*pmd); +#ifdef CONFIG_SPECULATIVE_PAGE_FAULT + /* + * Ensure page table destruction is blocked if __pte_map_lock managed + * to take this lock. Without this barrier tlb_remove_table_rcu can + * destroy ptl after __pte_map_lock locked it and during unlock would + * cause a use-after-free. + */ + spinlock_t *ptl = pmd_lock(tlb->mm, pmd); + spin_unlock(ptl); +#endif pmd_clear(pmd); pte_free_tlb(tlb, token, addr); mm_dec_nr_ptes(tlb->mm); @@ -2627,9 +2637,7 @@ EXPORT_SYMBOL_GPL(apply_to_page_range); static bool pte_spinlock(struct vm_fault *vmf) { bool ret = false; -#ifdef CONFIG_TRANSPARENT_HUGEPAGE pmd_t pmdval; -#endif /* Check if vma is still valid */ if (!(vmf->flags & FAULT_FLAG_SPECULATIVE)) { @@ -2644,24 +2652,28 @@ static bool pte_spinlock(struct vm_fault *vmf) goto out; } -#ifdef CONFIG_TRANSPARENT_HUGEPAGE /* * We check if the pmd value is still the same to ensure that there * is not a huge collapse operation in progress in our back. + * It also ensures that pmd was not cleared by pmd_clear in + * free_pte_range and ptl is still valid. */ pmdval = READ_ONCE(*vmf->pmd); if (!pmd_same(pmdval, vmf->orig_pmd)) { trace_spf_pmd_changed(_RET_IP_, vmf->vma, vmf->address); goto out; } -#endif - vmf->ptl = pte_lockptr(vmf->vma->vm_mm, vmf->pmd); + vmf->ptl = pte_lockptr(vmf->vma->vm_mm, &pmdval); if (unlikely(!spin_trylock(vmf->ptl))) { trace_spf_pte_lock(_RET_IP_, vmf->vma, vmf->address); goto out; } + /* + * The check below will fail if pte_spinlock passed its ptl barrier + * before we took the ptl lock. + */ if (vma_has_changed(vmf)) { spin_unlock(vmf->ptl); trace_spf_vma_changed(_RET_IP_, vmf->vma, vmf->address); @@ -2679,9 +2691,7 @@ static bool __pte_map_lock_speculative(struct vm_fault *vmf, unsigned long addr) bool ret = false; pte_t *pte; spinlock_t *ptl; -#ifdef CONFIG_TRANSPARENT_HUGEPAGE pmd_t pmdval; -#endif /* * The first vma_has_changed() guarantees the page-tables are still @@ -2696,7 +2706,6 @@ static bool __pte_map_lock_speculative(struct vm_fault *vmf, unsigned long addr) goto out; } -#ifdef CONFIG_TRANSPARENT_HUGEPAGE /* * We check if the pmd value is still the same to ensure that there * is not a huge collapse operation in progress in our back. @@ -2706,7 +2715,6 @@ static bool __pte_map_lock_speculative(struct vm_fault *vmf, unsigned long addr) trace_spf_pmd_changed(_RET_IP_, vmf->vma, addr); goto out; } -#endif /* * Same as pte_offset_map_lock() except that we call @@ -2715,14 +2723,18 @@ static bool __pte_map_lock_speculative(struct vm_fault *vmf, unsigned long addr) * to invalidate TLB but this CPU has irq disabled. * Since we are in a speculative patch, accept it could fail */ - ptl = pte_lockptr(vmf->vma->vm_mm, vmf->pmd); - pte = pte_offset_map(vmf->pmd, addr); + ptl = pte_lockptr(vmf->vma->vm_mm, &pmdval); + pte = pte_offset_map(&pmdval, addr); if (unlikely(!spin_trylock(ptl))) { pte_unmap(pte); trace_spf_pte_lock(_RET_IP_, vmf->vma, addr); goto out; } + /* + * The check below will fail if __pte_map_lock_speculative passed its ptl + * barrier before we took the ptl lock. + */ if (vma_has_changed(vmf)) { pte_unmap_unlock(pte, ptl); trace_spf_vma_changed(_RET_IP_, vmf->vma, addr); diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 25789b01dc0d..fa1f971c8a43 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -1608,11 +1608,16 @@ static void __free_pages_ok(struct page *page, unsigned int order, unsigned long flags; int migratetype; unsigned long pfn = page_to_pfn(page); + bool skip_free_unref_page = false; if (!free_pages_prepare(page, order, true, fpi_flags)) return; migratetype = get_pfnblock_migratetype(page, pfn); + trace_android_vh_free_unref_page_bypass(page, order, migratetype, &skip_free_unref_page); + if (skip_free_unref_page) + return; + local_irq_save(flags); __count_vm_events(PGFREE, 1 << order); free_one_page(page_zone(page), page, pfn, order, migratetype, @@ -2791,6 +2796,7 @@ static bool unreserve_highatomic_pageblock(const struct alloc_context *ac, struct page *page; int order; bool ret; + bool skip_unreserve_highatomic = false; for_each_zone_zonelist_nodemask(zone, z, zonelist, ac->highest_zoneidx, ac->nodemask) { @@ -2802,6 +2808,11 @@ static bool unreserve_highatomic_pageblock(const struct alloc_context *ac, pageblock_nr_pages) continue; + trace_android_vh_unreserve_highatomic_bypass(force, zone, + &skip_unreserve_highatomic); + if (skip_unreserve_highatomic) + continue; + spin_lock_irqsave(&zone->lock, flags); for (order = 0; order < MAX_ORDER; order++) { struct free_area *area = &(zone->free_area[order]); @@ -3047,6 +3058,10 @@ static struct list_head *get_populated_pcp_list(struct zone *zone, struct list_head *list = &pcp->lists[migratetype]; if (list_empty(list)) { + trace_android_vh_rmqueue_bulk_bypass(order, pcp, migratetype, list); + if (!list_empty(list)) + return list; + pcp->count += rmqueue_bulk(zone, order, pcp->batch, list, migratetype, alloc_flags); @@ -3343,10 +3358,17 @@ void free_unref_page(struct page *page) { unsigned long flags; unsigned long pfn = page_to_pfn(page); + int migratetype; + bool skip_free_unref_page = false; if (!free_unref_page_prepare(page, pfn)) return; + migratetype = get_pfnblock_migratetype(page, pfn); + trace_android_vh_free_unref_page_bypass(page, 0, migratetype, &skip_free_unref_page); + if (skip_free_unref_page) + return; + local_irq_save(flags); free_unref_page_commit(page, pfn); local_irq_restore(flags); @@ -4822,6 +4844,7 @@ __alloc_pages_slowpath(gfp_t gfp_mask, unsigned int order, unsigned int zonelist_iter_cookie; int reserve_flags; unsigned long vh_record; + bool should_alloc_retry = false; trace_android_vh_alloc_pages_slowpath_begin(gfp_mask, order, &vh_record); /* @@ -4962,6 +4985,12 @@ __alloc_pages_slowpath(gfp_t gfp_mask, unsigned int order, if (page) goto got_pg; + trace_android_vh_should_alloc_pages_retry(gfp_mask, order, + &alloc_flags, ac->migratetype, ac->preferred_zoneref->zone, + &page, &should_alloc_retry); + if (should_alloc_retry) + goto retry; + /* Try direct reclaim and then allocating */ page = __alloc_pages_direct_reclaim(gfp_mask, order, alloc_flags, ac, &did_some_progress); @@ -6620,6 +6649,7 @@ static int zone_batchsize(struct zone *zone) static void pageset_update(struct per_cpu_pages *pcp, unsigned long high, unsigned long batch) { + trace_android_vh_pageset_update(&high, &batch); /* start with a fail safe value for batch */ pcp->batch = 1; smp_wmb(); diff --git a/mm/util.c b/mm/util.c index 9e2b223ebde3..6ed9861cb98c 100644 --- a/mm/util.c +++ b/mm/util.c @@ -29,6 +29,7 @@ #include "internal.h" #ifndef __GENKSYMS__ #include +#include #endif /** @@ -587,6 +588,7 @@ void *kvmalloc_node(size_t size, gfp_t flags, int node) { gfp_t kmalloc_flags = flags; void *ret; + bool use_vmalloc = false; /* * vmalloc uses GFP_KERNEL for some internal allocations (e.g page tables) @@ -595,6 +597,10 @@ void *kvmalloc_node(size_t size, gfp_t flags, int node) if ((flags & GFP_KERNEL) != GFP_KERNEL) return kmalloc_node(size, flags, node); + trace_android_vh_kvmalloc_node_use_vmalloc(size, &kmalloc_flags, &use_vmalloc); + if (use_vmalloc) + goto use_vmalloc_node; + /* * We want to attempt a large physically contiguous block first because * it is less likely to fragment multiple larger blocks and therefore @@ -624,6 +630,7 @@ void *kvmalloc_node(size_t size, gfp_t flags, int node) return NULL; } +use_vmalloc_node: return __vmalloc_node(size, 1, flags, node, __builtin_return_address(0)); }