Merge branch 'android15-6.6' into android15-6.6-lts

Sync up with the android15-6.6 branch to fix the TH build due to recent
required ABI symbol additions there.  Included in here are the following
commits:

* ee2542f0e5 ANDROID: ABI: Update pixel symbol list
* 9a46e8ecf7 ANDROID: mm: add vh for kcompactd_cpu_online()
* dd7de90d0e ANDROID: sched: Add android_vh_set_task_comm
* e0b348c4b8 Revert "UPSTREAM: Revert "f2fs: use flush command instead of FUA for zoned device""
* d5c1618b74 UPSTREAM: usb: gadget: uvc: queue pump work in uvcg_video_enable()
* 466f71925c UPSTREAM: usb: xhci: Check for xhci->interrupters being allocated in xhci_mem_clearup()
* 90248f12cc UPSTREAM: cachestat: do not flush stats in recency check
* 3e6bc54909 UPSTREAM: mm: shmem: fix getting incorrect lruvec when replacing a shmem folio
* 00079e2bce UPSTREAM: wifi: cfg80211: validate HE operation element parsing
* af3fbe448f UPSTREAM: riscv: cpufeature: Fix extension subset checking
* 412ee5bcbf UPSTREAM: memcg: fix data-race KCSAN bug in rstats
* 6134f98d1e UPSTREAM: PM: EM: fix wrong utilization estimation in em_cpu_energy()
* 600d8fb230 UPSTREAM: exfat: fix timing of synchronizing bitmap and inode
* 11a6be14ae UPSTREAM: firmware: arm_ffa: Fix the partition ID check in ffa_notification_info_get()
* 05181e576f UPSTREAM: mm/damon/core: check apply interval in damon_do_apply_schemes()
* 49bb2617e1 UPSTREAM: firmware: arm_ffa: Check xa_load() return value
* 1c8bc63929 UPSTREAM: firmware: arm_ffa: Add missing rwlock_init() for the driver partition
* 18bbf1be19 UPSTREAM: firmware: arm_ffa: Add missing rwlock_init() in ffa_setup_partitions()
* 7f8ed76fc2 UPSTREAM: mm/damon/sysfs-schemes: add timeout for update_schemes_tried_regions
* ba95736c5b BACKPORT: mm/damon/core: copy nr_accesses when splitting region
* a44df1cfbb UPSTREAM: firmware: arm_ffa: Fix ffa_notification_info_get() IDs handling
* 7c593903ee UPSTREAM: exfat: fix ctime is not updated
* 178f47033b UPSTREAM: exfat: fix setting uninitialized time to ctime/atime
* bb51ec9159 ANDROID: GKI: add symbols to symbol list
* cc5fad9390 ANDROID: vendor_hooks: add hook in alloc_workqueue()
* 2fd50de384 ANDROID: Update the ABI symbol list and stg

Change-Id: Idfeb4d556fcda753c38b23c04361132d03f62c1b
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
Greg Kroah-Hartman 2024-09-30 17:42:12 +00:00
commit eb7cf642ed
28 changed files with 231 additions and 40 deletions

View File

@ -315500,6 +315500,11 @@ function {
parameter_id: 0x3fa672fd
parameter_id: 0x0490bb4a
}
function {
id: 0x36c501fb
return_type_id: 0x33756485
parameter_id: 0x1da732a0
}
function {
id: 0x36cad8bb
return_type_id: 0x23f09c34
@ -337538,6 +337543,14 @@ function {
parameter_id: 0x7be80061
parameter_id: 0x4585663f
}
function {
id: 0x9bca672a
return_type_id: 0x6720d32f
parameter_id: 0x18bd6530
parameter_id: 0x18db1c77
parameter_id: 0x1bf16028
parameter_id: 0x13580d6c
}
function {
id: 0x9bca793f
return_type_id: 0x6720d32f
@ -354017,6 +354030,15 @@ elf_symbol {
type_id: 0x9bc8472e
full_name: "__traceiter_android_rvh_alloc_and_link_pwqs"
}
elf_symbol {
id: 0xef79dd4d
name: "__traceiter_android_rvh_alloc_workqueue"
is_defined: true
symbol_type: FUNCTION
crc: 0xc0d90a3b
type_id: 0x9bca672a
full_name: "__traceiter_android_rvh_alloc_workqueue"
}
elf_symbol {
id: 0x0b48afa1
name: "__traceiter_android_rvh_arm64_serror_panic"
@ -357293,6 +357315,15 @@ elf_symbol {
type_id: 0x9b7ba7c5
full_name: "__traceiter_android_vh_mm_direct_reclaim_exit"
}
elf_symbol {
id: 0x6f5c8275
name: "__traceiter_android_vh_mm_kcompactd_cpu_online"
is_defined: true
symbol_type: FUNCTION
crc: 0x0e957ed4
type_id: 0x9a33392f
full_name: "__traceiter_android_vh_mm_kcompactd_cpu_online"
}
elf_symbol {
id: 0xf182fb15
name: "__traceiter_android_vh_mm_may_oom_exit"
@ -358256,6 +358287,15 @@ elf_symbol {
type_id: 0x9b50c8eb
full_name: "__traceiter_android_vh_sd_setup_unmap_multi_segment"
}
elf_symbol {
id: 0x0b48ad7a
name: "__traceiter_android_vh_set_task_comm"
is_defined: true
symbol_type: FUNCTION
crc: 0x01b7877e
type_id: 0x9bdbdcc4
full_name: "__traceiter_android_vh_set_task_comm"
}
elf_symbol {
id: 0x874fcdb2
name: "__traceiter_android_vh_set_tsk_need_resched_lazy"
@ -359903,6 +359943,15 @@ elf_symbol {
type_id: 0x18ccbd2c
full_name: "__tracepoint_android_rvh_alloc_and_link_pwqs"
}
elf_symbol {
id: 0x0b219d2b
name: "__tracepoint_android_rvh_alloc_workqueue"
is_defined: true
symbol_type: OBJECT
crc: 0xbae7d4d4
type_id: 0x18ccbd2c
full_name: "__tracepoint_android_rvh_alloc_workqueue"
}
elf_symbol {
id: 0x748c1fd7
name: "__tracepoint_android_rvh_arm64_serror_panic"
@ -363179,6 +363228,15 @@ elf_symbol {
type_id: 0x18ccbd2c
full_name: "__tracepoint_android_vh_mm_direct_reclaim_exit"
}
elf_symbol {
id: 0x0f593caf
name: "__tracepoint_android_vh_mm_kcompactd_cpu_online"
is_defined: true
symbol_type: OBJECT
crc: 0x7258a4a5
type_id: 0x18ccbd2c
full_name: "__tracepoint_android_vh_mm_kcompactd_cpu_online"
}
elf_symbol {
id: 0x47bcd15f
name: "__tracepoint_android_vh_mm_may_oom_exit"
@ -364142,6 +364200,15 @@ elf_symbol {
type_id: 0x18ccbd2c
full_name: "__tracepoint_android_vh_sd_setup_unmap_multi_segment"
}
elf_symbol {
id: 0x1f07c260
name: "__tracepoint_android_vh_set_task_comm"
is_defined: true
symbol_type: OBJECT
crc: 0xc50d6787
type_id: 0x18ccbd2c
full_name: "__tracepoint_android_vh_set_task_comm"
}
elf_symbol {
id: 0xb6de2d88
name: "__tracepoint_android_vh_set_tsk_need_resched_lazy"
@ -423781,6 +423848,15 @@ elf_symbol {
type_id: 0x1fc98171
full_name: "vm_unmap_ram"
}
elf_symbol {
id: 0xbbf42090
name: "vm_unmapped_area"
is_defined: true
symbol_type: FUNCTION
crc: 0x064b9739
type_id: 0x36c501fb
full_name: "vm_unmapped_area"
}
elf_symbol {
id: 0xca7f93d5
name: "vm_zone_stat"
@ -425802,6 +425878,7 @@ interface {
symbol_id: 0xb42422d5
symbol_id: 0xb3d70eab
symbol_id: 0x9ca1a40f
symbol_id: 0xef79dd4d
symbol_id: 0x0b48afa1
symbol_id: 0xa927338c
symbol_id: 0x6d4cc1a2
@ -426166,6 +426243,7 @@ interface {
symbol_id: 0x83742db6
symbol_id: 0x9f58159a
symbol_id: 0x29c67d40
symbol_id: 0x6f5c8275
symbol_id: 0xf182fb15
symbol_id: 0xe44dacb1
symbol_id: 0xab76d6cc
@ -426273,6 +426351,7 @@ interface {
symbol_id: 0xb841c45e
symbol_id: 0xe3b923c8
symbol_id: 0x8a2c7656
symbol_id: 0x0b48ad7a
symbol_id: 0x874fcdb2
symbol_id: 0xaa3f6a65
symbol_id: 0xa2fe718f
@ -426456,6 +426535,7 @@ interface {
symbol_id: 0x4b7a8fd7
symbol_id: 0xcd36f539
symbol_id: 0x33f0c37d
symbol_id: 0x0b219d2b
symbol_id: 0x748c1fd7
symbol_id: 0xcb42202e
symbol_id: 0xc9400cec
@ -426820,6 +426900,7 @@ interface {
symbol_id: 0x420ef2d0
symbol_id: 0xd333a65c
symbol_id: 0xddcff44a
symbol_id: 0x0f593caf
symbol_id: 0x47bcd15f
symbol_id: 0xb6da564f
symbol_id: 0x0403b7c6
@ -426927,6 +427008,7 @@ interface {
symbol_id: 0xff2bccb8
symbol_id: 0x5d163d02
symbol_id: 0x5294a07c
symbol_id: 0x1f07c260
symbol_id: 0xb6de2d88
symbol_id: 0xd7ceb15f
symbol_id: 0x923147c1
@ -433543,6 +433625,7 @@ interface {
symbol_id: 0x2570ceae
symbol_id: 0xacc76406
symbol_id: 0xef2c49d1
symbol_id: 0xbbf42090
symbol_id: 0xca7f93d5
symbol_id: 0x3c915fdb
symbol_id: 0x8ffd0533

View File

@ -199,6 +199,7 @@
__traceiter_android_vh_alloc_oem_binder_struct
__traceiter_android_vh_alloc_pages_failure_bypass
__traceiter_android_vh_alloc_pages_reclaim_bypass
__traceiter_android_rvh_alloc_workqueue
__traceiter_android_vh_alter_mutex_list_add
__traceiter_android_vh_binder_alloc_new_buf_locked
__traceiter_android_vh_binder_buffer_release
@ -345,6 +346,7 @@
__tracepoint_android_vh_alloc_oem_binder_struct
__tracepoint_android_vh_alloc_pages_failure_bypass
__tracepoint_android_vh_alloc_pages_reclaim_bypass
__tracepoint_android_rvh_alloc_workqueue
__tracepoint_android_vh_alter_mutex_list_add
__tracepoint_android_vh_binder_alloc_new_buf_locked
__tracepoint_android_vh_binder_buffer_release

View File

@ -124,6 +124,7 @@
class_unregister
cleancache_register_ops
clear_page
__ClearPageMovable
clk_disable
clk_enable
clk_get
@ -559,6 +560,7 @@
down_read_trylock
down_trylock
down_write
d_path
dput
drain_workqueue
driver_for_each_device
@ -826,11 +828,13 @@
find_pid_ns
find_task_by_vpid
find_vma_intersection
find_vpid
finish_wait
firmware_request_nowarn
flush_delayed_work
flush_work
__flush_workqueue
__folio_lock
__folio_put
fortify_panic
fput
@ -899,6 +903,7 @@
get_sg_io_hdr
__get_task_comm
get_task_cred
get_task_mm
get_thermal_instance
get_unused_fd_flags
get_user_pages
@ -1276,6 +1281,7 @@
loops_per_jiffy
mac_pton
mas_empty_area_rev
mas_find
max_load_balance_interval
mbox_chan_received_data
mbox_controller_register
@ -1329,6 +1335,7 @@
__mmap_lock_do_trace_released
__mmap_lock_do_trace_start_locking
__mmdrop
mmput
mod_delayed_work_on
mod_timer
__module_get
@ -1493,6 +1500,7 @@
param_array_ops
param_get_int
param_get_string
param_get_uint
param_ops_bool
param_ops_byte
param_ops_charp
@ -1503,6 +1511,7 @@
param_ops_ulong
param_set_copystring
param_set_int
param_set_uint_minmax
pci_alloc_irq_vectors
pci_alloc_irq_vectors_affinity
pci_assign_resource
@ -1802,6 +1811,7 @@
regulator_set_mode
regulator_set_voltage
regulator_set_voltage_sel_regmap
regulator_sync_voltage
regulator_unregister
release_firmware
__release_region
@ -1903,6 +1913,7 @@
set_normalized_timespec64
set_page_dirty
set_page_dirty_lock
__SetPageMovable
set_task_cpu
set_user_nice
sg_alloc_table
@ -2243,6 +2254,7 @@
__traceiter_android_rvh_set_task_cpu
__traceiter_android_rvh_set_user_nice_locked
__traceiter_android_rvh_tick_entry
__traceiter_android_rvh_try_to_wake_up_success
__traceiter_android_rvh_uclamp_eff_get
__traceiter_android_rvh_ufs_complete_init
__traceiter_android_rvh_ufs_reprogram_all_keys
@ -2262,11 +2274,13 @@
__traceiter_android_vh_early_resume_begin
__traceiter_android_vh_enable_thermal_genl_check
__traceiter_android_vh_ipi_stop
__traceiter_android_vh_mm_kcompactd_cpu_online
__traceiter_android_vh_prio_inheritance
__traceiter_android_vh_prio_restore
__traceiter_android_vh_resume_end
__traceiter_android_vh_scheduler_tick
__traceiter_android_vh_setscheduler_uclamp
__traceiter_android_vh_set_task_comm
__traceiter_android_vh_si_meminfo_adjust
__traceiter_android_vh_sysrq_crash
__traceiter_android_vh_uclamp_validate
@ -2340,6 +2354,7 @@
__tracepoint_android_rvh_set_task_cpu
__tracepoint_android_rvh_set_user_nice_locked
__tracepoint_android_rvh_tick_entry
__tracepoint_android_rvh_try_to_wake_up_success
__tracepoint_android_rvh_uclamp_eff_get
__tracepoint_android_rvh_ufs_complete_init
__tracepoint_android_rvh_ufs_reprogram_all_keys
@ -2359,11 +2374,13 @@
__tracepoint_android_vh_early_resume_begin
__tracepoint_android_vh_enable_thermal_genl_check
__tracepoint_android_vh_ipi_stop
__tracepoint_android_vh_mm_kcompactd_cpu_online
__tracepoint_android_vh_prio_inheritance
__tracepoint_android_vh_prio_restore
__tracepoint_android_vh_resume_end
__tracepoint_android_vh_scheduler_tick
__tracepoint_android_vh_setscheduler_uclamp
__tracepoint_android_vh_set_task_comm
__tracepoint_android_vh_si_meminfo_adjust
__tracepoint_android_vh_sysrq_crash
__tracepoint_android_vh_uclamp_validate
@ -2454,6 +2471,7 @@
ufshcd_remove
ufshcd_system_resume
ufshcd_system_suspend
unlock_page
unmap_mapping_range
unpin_user_page
__unregister_chrdev
@ -2599,6 +2617,7 @@
vmalloc_user
vmap
vmf_insert_pfn_prot
vm_unmapped_area
vprintk
vprintk_emit
vring_del_virtqueue

View File

@ -591,7 +591,7 @@ static int __init riscv_fill_hwcap_from_ext_list(unsigned long *isa2hwcap)
if (ext->subset_ext_size) {
for (int j = 0; j < ext->subset_ext_size; j++) {
if (riscv_isa_extension_check(ext->subset_ext_ids[i]))
if (riscv_isa_extension_check(ext->subset_ext_ids[j]))
set_bit(ext->subset_ext_ids[j], isainfo->isa);
}
}

View File

@ -319,6 +319,7 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_exit_check);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_freeze_whether_wake);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_percpu_rwsem_wq_add);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_alloc_oem_binder_struct);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_alloc_workqueue);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_binder_transaction_received);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_free_oem_binder_struct);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_binder_special_task);
@ -381,6 +382,7 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_compaction_exit);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_compaction_try_to_compact_exit);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_mm_direct_reclaim_enter);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_mm_direct_reclaim_exit);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_mm_kcompactd_cpu_online);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_mm_may_oom_exit);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_vmscan_kswapd_done);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_shrink_folio_list);

View File

@ -732,6 +732,11 @@ static void __do_sched_recv_cb(u16 part_id, u16 vcpu, bool is_per_vcpu)
void *cb_data;
partition = xa_load(&drv_info->partition_info, part_id);
if (!partition) {
pr_err("%s: Invalid partition ID 0x%x\n", __func__, part_id);
return;
}
read_lock(&partition->rw_lock);
callback = partition->callback;
cb_data = partition->cb_data;
@ -782,9 +787,9 @@ static void ffa_notification_info_get(void)
if (ids_processed >= max_ids - 1)
break;
part_id = packed_id_list[++ids_processed];
part_id = packed_id_list[ids_processed++];
if (!ids_count[list]) { /* Global Notification */
if (ids_count[list] == 1) { /* Global Notification */
__do_sched_recv_cb(part_id, 0, false);
continue;
}
@ -794,7 +799,7 @@ static void ffa_notification_info_get(void)
if (ids_processed >= max_ids - 1)
break;
vcpu_id = packed_id_list[++ids_processed];
vcpu_id = packed_id_list[ids_processed++];
__do_sched_recv_cb(part_id, vcpu_id, true);
}
@ -909,6 +914,11 @@ static int ffa_sched_recv_cb_update(u16 part_id, ffa_sched_recv_cb callback,
bool cb_valid;
partition = xa_load(&drv_info->partition_info, part_id);
if (!partition) {
pr_err("%s: Invalid partition ID 0x%x\n", __func__, part_id);
return -EINVAL;
}
write_lock(&partition->rw_lock);
cb_valid = !!partition->callback;
@ -1211,6 +1221,7 @@ static void ffa_setup_partitions(void)
ffa_device_unregister(ffa_dev);
continue;
}
rwlock_init(&info->rw_lock);
xa_store(&drv_info->partition_info, tpbuf->id, info, GFP_KERNEL);
}
drv_info->partition_count = count;
@ -1221,6 +1232,7 @@ static void ffa_setup_partitions(void)
info = kzalloc(sizeof(*info), GFP_KERNEL);
if (!info)
return;
rwlock_init(&info->rw_lock);
xa_store(&drv_info->partition_info, drv_info->vm_id, info, GFP_KERNEL);
drv_info->partition_count++;
}

View File

@ -759,6 +759,7 @@ int uvcg_video_enable(struct uvc_video *video)
video->req_int_count = 0;
uvc_video_ep_queue_initial_requests(video);
queue_work(video->async_wq, &video->pump);
return ret;
}

View File

@ -1893,7 +1893,7 @@ void xhci_mem_cleanup(struct xhci_hcd *xhci)
cancel_delayed_work_sync(&xhci->cmd_timer);
for (i = 0; i < xhci->max_interrupters; i++) {
for (i = 0; xhci->interrupters && i < xhci->max_interrupters; i++) {
if (xhci->interrupters[i]) {
xhci_remove_interrupter(xhci, xhci->interrupters[i]);
xhci_free_interrupter(xhci, xhci->interrupters[i]);

View File

@ -1236,6 +1236,7 @@ void __set_task_comm(struct task_struct *tsk, const char *buf, bool exec)
task_lock(tsk);
trace_task_rename(tsk, buf);
strscpy_pad(tsk->comm, buf, sizeof(tsk->comm));
trace_android_vh_set_task_comm(tsk);
task_unlock(tsk);
perf_event_comm(tsk, exec);
trace_android_rvh_set_task_comm(tsk, exec);

View File

@ -51,7 +51,7 @@ static int exfat_cont_expand(struct inode *inode, loff_t size)
clu.flags = ei->flags;
ret = exfat_alloc_cluster(inode, new_num_clusters - num_clusters,
&clu, IS_DIRSYNC(inode));
&clu, inode_needs_sync(inode));
if (ret)
return ret;
@ -77,12 +77,11 @@ out:
ei->i_size_aligned = round_up(size, sb->s_blocksize);
ei->i_size_ondisk = ei->i_size_aligned;
inode->i_blocks = round_up(size, sbi->cluster_size) >> 9;
if (IS_DIRSYNC(inode))
return write_inode_now(inode, 1);
mark_inode_dirty(inode);
if (IS_SYNC(inode))
return write_inode_now(inode, 1);
return 0;
free_clu:
@ -344,6 +343,7 @@ int exfat_setattr(struct mnt_idmap *idmap, struct dentry *dentry,
if (attr->ia_valid & ATTR_SIZE)
inode_set_mtime_to_ts(inode, inode_set_ctime_current(inode));
setattr_copy(&nop_mnt_idmap, inode, attr);
exfat_truncate_inode_atime(inode);
if (attr->ia_valid & ATTR_SIZE) {

View File

@ -56,18 +56,18 @@ int __exfat_write_inode(struct inode *inode, int sync)
&ep->dentry.file.create_time,
&ep->dentry.file.create_date,
&ep->dentry.file.create_time_cs);
ts = inode_get_mtime(inode);
exfat_set_entry_time(sbi, &ts,
&ep->dentry.file.modify_tz,
&ep->dentry.file.modify_time,
&ep->dentry.file.modify_date,
&ep->dentry.file.modify_time_cs);
inode_set_mtime_to_ts(inode, ts);
ts = inode_get_atime(inode);
exfat_set_entry_time(sbi, &ts,
&ep->dentry.file.access_tz,
&ep->dentry.file.access_time,
&ep->dentry.file.access_date,
NULL);
inode_set_atime_to_ts(inode, ts);
/* File size should be zero if there is no cluster allocated */
on_disk_size = i_size_read(inode);

View File

@ -378,7 +378,8 @@ sync_nodes:
f2fs_remove_ino_entry(sbi, ino, APPEND_INO);
clear_inode_flag(inode, FI_APPEND_WRITE);
flush_out:
if (!atomic && F2FS_OPTION(sbi).fsync_mode != FSYNC_MODE_NOBARRIER)
if ((!atomic && F2FS_OPTION(sbi).fsync_mode != FSYNC_MODE_NOBARRIER) ||
(atomic && !test_opt(sbi, NOBARRIER) && f2fs_sb_has_blkzoned(sbi)))
ret = f2fs_issue_flush(sbi, inode->i_ino);
if (!ret) {
f2fs_remove_ino_entry(sbi, ino, UPDATE_INO);

View File

@ -1676,7 +1676,7 @@ static int __write_node_page(struct page *page, bool atomic, bool *submitted,
goto redirty_out;
}
if (atomic && !test_opt(sbi, NOBARRIER))
if (atomic && !test_opt(sbi, NOBARRIER) && !f2fs_sb_has_blkzoned(sbi))
fio.op_flags |= REQ_PREFLUSH | REQ_FUA;
/* should add to global list before clearing PAGECACHE status */

View File

@ -253,7 +253,6 @@ static inline unsigned long em_cpu_energy(struct em_perf_domain *pd,
* max utilization to the allowed CPU capacity before calculating
* effective performance.
*/
max_util = map_util_perf(max_util);
max_util = min(max_util, allowed_cpu_cap);
/*

View File

@ -368,7 +368,8 @@ static inline swp_entry_t page_swap_entry(struct page *page)
}
/* linux/mm/workingset.c */
bool workingset_test_recent(void *shadow, bool file, bool *workingset);
bool workingset_test_recent(void *shadow, bool file, bool *workingset,
bool flush);
void workingset_age_nonresident(struct lruvec *lruvec, unsigned long nr_pages);
void *workingset_eviction(struct folio *folio, struct mem_cgroup *target_memcg);
void workingset_refault(struct folio *folio, void *shadow);

View File

@ -76,6 +76,9 @@ DECLARE_HOOK(android_vh_look_around,
TP_PROTO(struct page_vma_mapped_walk *pvmw, struct folio *folio,
struct vm_area_struct *vma, int *referenced),
TP_ARGS(pvmw, folio, vma, referenced));
DECLARE_HOOK(android_vh_mm_kcompactd_cpu_online,
TP_PROTO(int cpu),
TP_ARGS(cpu));
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));

View File

@ -476,7 +476,9 @@ DECLARE_HOOK(android_vh_prio_restore,
TP_PROTO(int saved_prio),
TP_ARGS(saved_prio));
/* macro versions of hooks are no longer required */
DECLARE_HOOK(android_vh_set_task_comm,
TP_PROTO(struct task_struct *p),
TP_ARGS(p));
#endif /* _TRACE_HOOK_SCHED_H */
/* This part must be outside protection */

View File

@ -10,6 +10,10 @@
* Following tracepoints are not exported in tracefs and provide a
* mechanism for vendor modules to hook and extend functionality
*/
DECLARE_RESTRICTED_HOOK(android_rvh_alloc_workqueue,
TP_PROTO(struct workqueue_struct *wq, unsigned int *flags, int *max_active),
TP_ARGS(wq, flags, max_active), 1);
DECLARE_RESTRICTED_HOOK(android_rvh_create_worker,
TP_PROTO(struct task_struct *p, struct workqueue_attrs *attrs),
TP_ARGS(p, attrs), 1);

View File

@ -121,3 +121,4 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_set_sugov_sched_attr);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_set_iowait);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_prio_inheritance);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_prio_restore);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_set_task_comm);

View File

@ -4732,6 +4732,7 @@ struct workqueue_struct *alloc_workqueue(const char *fmt,
vsnprintf(wq->name, sizeof(wq->name), fmt, args);
va_end(args);
trace_android_rvh_alloc_workqueue(wq, &flags, &max_active);
max_active = max_active ?: WQ_DFL_ACTIVE;
max_active = wq_clamp_max_active(max_active, flags, wq->name);

View File

@ -3247,6 +3247,7 @@ static int kcompactd_cpu_online(unsigned int cpu)
if (pgdat->kcompactd)
set_cpus_allowed_ptr(pgdat->kcompactd, mask);
}
trace_android_vh_mm_kcompactd_cpu_online(cpu);
return 0;
}

View File

@ -989,6 +989,9 @@ static void damon_do_apply_schemes(struct damon_ctx *c,
damon_for_each_scheme(s, c) {
struct damos_quota *quota = &s->quota;
if (c->passed_sample_intervals != s->next_apply_sis)
continue;
if (!s->wmarks.activated)
continue;
@ -1089,10 +1092,6 @@ static void kdamond_apply_schemes(struct damon_ctx *c)
if (c->passed_sample_intervals != s->next_apply_sis)
continue;
s->next_apply_sis +=
(s->apply_interval_us ? s->apply_interval_us :
c->attrs.aggr_interval) / sample_interval;
if (!s->wmarks.activated)
continue;
@ -1108,6 +1107,14 @@ static void kdamond_apply_schemes(struct damon_ctx *c)
damon_for_each_region_safe(r, next_r, t)
damon_do_apply_schemes(c, t, r);
}
damon_for_each_scheme(s, c) {
if (c->passed_sample_intervals != s->next_apply_sis)
continue;
s->next_apply_sis +=
(s->apply_interval_us ? s->apply_interval_us :
c->attrs.aggr_interval) / sample_interval;
}
}
/*
@ -1208,6 +1215,7 @@ static void damon_split_region_at(struct damon_target *t,
new->age = r->age;
new->last_nr_accesses = r->last_nr_accesses;
new->nr_accesses = r->nr_accesses;
damon_insert_region(new, r, damon_next_region(r), t);
}

View File

@ -139,6 +139,13 @@ static const struct kobj_type damon_sysfs_scheme_region_ktype = {
* 'finished'. Then, damon_sysfs_before_damos_apply() understands the
* situation by showing the 'finished' status and do nothing.
*
* If DAMOS is not applied to any region due to any reasons including the
* access pattern, the watermarks, the quotas, and the filters,
* ->before_damos_apply() will not be called back. Until the situation is
* changed, the update will not be finished. To avoid this,
* damon_sysfs_after_sampling() set the status as 'finished' if more than two
* apply intervals of the scheme is passed while the state is 'idle'.
*
* Finally, the tried regions request handling finisher function
* (damon_sysfs_schemes_update_regions_stop()) unregisters the callbacks.
*/
@ -154,6 +161,7 @@ struct damon_sysfs_scheme_regions {
int nr_regions;
unsigned long total_bytes;
enum damos_sysfs_regions_upd_status upd_status;
unsigned long upd_timeout_jiffies;
};
static struct damon_sysfs_scheme_regions *
@ -1854,7 +1862,9 @@ void damos_sysfs_mark_finished_regions_updates(struct damon_ctx *ctx)
for (i = 0; i < sysfs_schemes->nr; i++) {
sysfs_regions = sysfs_schemes->schemes_arr[i]->tried_regions;
if (sysfs_regions->upd_status ==
DAMOS_TRIED_REGIONS_UPD_STARTED)
DAMOS_TRIED_REGIONS_UPD_STARTED ||
time_after(jiffies,
sysfs_regions->upd_timeout_jiffies))
sysfs_regions->upd_status =
DAMOS_TRIED_REGIONS_UPD_FINISHED;
}
@ -1883,14 +1893,41 @@ int damon_sysfs_schemes_clear_regions(
return 0;
}
static struct damos *damos_sysfs_nth_scheme(int n, struct damon_ctx *ctx)
{
struct damos *scheme;
int i = 0;
damon_for_each_scheme(scheme, ctx) {
if (i == n)
return scheme;
i++;
}
return NULL;
}
static void damos_tried_regions_init_upd_status(
struct damon_sysfs_schemes *sysfs_schemes)
struct damon_sysfs_schemes *sysfs_schemes,
struct damon_ctx *ctx)
{
int i;
struct damos *scheme;
struct damon_sysfs_scheme_regions *sysfs_regions;
for (i = 0; i < sysfs_schemes->nr; i++)
sysfs_schemes->schemes_arr[i]->tried_regions->upd_status =
DAMOS_TRIED_REGIONS_UPD_IDLE;
for (i = 0; i < sysfs_schemes->nr; i++) {
sysfs_regions = sysfs_schemes->schemes_arr[i]->tried_regions;
scheme = damos_sysfs_nth_scheme(i, ctx);
if (!scheme) {
sysfs_regions->upd_status =
DAMOS_TRIED_REGIONS_UPD_FINISHED;
continue;
}
sysfs_regions->upd_status = DAMOS_TRIED_REGIONS_UPD_IDLE;
sysfs_regions->upd_timeout_jiffies = jiffies +
2 * usecs_to_jiffies(scheme->apply_interval_us ?
scheme->apply_interval_us :
ctx->attrs.sample_interval);
}
}
/* Called from damon_sysfs_cmd_request_callback under damon_sysfs_lock */
@ -1900,7 +1937,7 @@ int damon_sysfs_schemes_update_regions_start(
{
damon_sysfs_schemes_clear_regions(sysfs_schemes, ctx);
damon_sysfs_schemes_for_damos_callback = sysfs_schemes;
damos_tried_regions_init_upd_status(sysfs_schemes);
damos_tried_regions_init_upd_status(sysfs_schemes, ctx);
damos_regions_upd_total_bytes_only = total_bytes_only;
ctx->callback.before_damos_apply = damon_sysfs_before_damos_apply;
return 0;

View File

@ -4200,6 +4200,9 @@ static void filemap_cachestat(struct address_space *mapping,
XA_STATE(xas, &mapping->i_pages, first_index);
struct folio *folio;
/* Flush stats (and potentially sleep) outside the RCU read section. */
mem_cgroup_flush_stats_ratelimited(NULL);
rcu_read_lock();
xas_for_each(&xas, folio, last_index) {
int order;
@ -4263,7 +4266,7 @@ static void filemap_cachestat(struct address_space *mapping,
goto resched;
}
#endif
if (workingset_test_recent(shadow, true, &workingset))
if (workingset_test_recent(shadow, true, &workingset, false))
cs->nr_recently_evicted += nr_pages;
goto resched;

View File

@ -720,6 +720,7 @@ static inline void memcg_rstat_updated(struct mem_cgroup *memcg, int val)
{
struct memcg_vmstats_percpu *statc;
int cpu = smp_processor_id();
unsigned int stats_updates;
if (!val)
return;
@ -727,8 +728,9 @@ static inline void memcg_rstat_updated(struct mem_cgroup *memcg, int val)
cgroup_rstat_updated(memcg->css.cgroup, cpu);
statc = this_cpu_ptr(memcg->vmstats_percpu);
for (; statc; statc = statc->parent) {
statc->stats_updates += abs(val);
if (statc->stats_updates < MEMCG_CHARGE_BATCH)
stats_updates = READ_ONCE(statc->stats_updates) + abs(val);
WRITE_ONCE(statc->stats_updates, stats_updates);
if (stats_updates < MEMCG_CHARGE_BATCH)
continue;
/*
@ -736,9 +738,9 @@ static inline void memcg_rstat_updated(struct mem_cgroup *memcg, int val)
* redundant. Avoid the overhead of the atomic update.
*/
if (!memcg_vmstats_needs_flush(statc->vmstats))
atomic64_add(statc->stats_updates,
atomic64_add(stats_updates,
&statc->vmstats->stats_updates);
statc->stats_updates = 0;
WRITE_ONCE(statc->stats_updates, 0);
}
}
@ -5771,7 +5773,7 @@ static void mem_cgroup_css_rstat_flush(struct cgroup_subsys_state *css, int cpu)
}
}
}
statc->stats_updates = 0;
WRITE_ONCE(statc->stats_updates, 0);
/* We are in a per-cpu loop here, only do the atomic write once */
if (atomic64_read(&memcg->vmstats->stats_updates))
atomic64_set(&memcg->vmstats->stats_updates, 0);
@ -7372,8 +7374,7 @@ void __mem_cgroup_uncharge_list(struct list_head *page_list)
* @new: Replacement folio.
*
* Charge @new as a replacement folio for @old. @old will
* be uncharged upon free. This is only used by the page cache
* (in replace_page_cache_folio()).
* be uncharged upon free.
*
* Both folios must be locked, @new->mapping must be set up.
*/

View File

@ -1782,7 +1782,7 @@ static int shmem_replace_folio(struct folio **foliop, gfp_t gfp,
xa_lock_irq(&swap_mapping->i_pages);
error = shmem_replace_entry(swap_mapping, swap_index, old, new);
if (!error) {
mem_cgroup_migrate(old, new);
mem_cgroup_replace_folio(old, new);
__lruvec_stat_mod_folio(new, NR_FILE_PAGES, 1);
__lruvec_stat_mod_folio(new, NR_SHMEM, 1);
__lruvec_stat_mod_folio(old, NR_FILE_PAGES, -1);

View File

@ -412,10 +412,12 @@ void *workingset_eviction(struct folio *folio, struct mem_cgroup *target_memcg)
* @file: whether the corresponding folio is from the file lru.
* @workingset: where the workingset value unpacked from shadow should
* be stored.
* @flush: whether to flush cgroup rstat.
*
* Return: true if the shadow is for a recently evicted folio; false otherwise.
*/
bool workingset_test_recent(void *shadow, bool file, bool *workingset)
bool workingset_test_recent(void *shadow, bool file, bool *workingset,
bool flush)
{
struct mem_cgroup *eviction_memcg;
struct lruvec *eviction_lruvec;
@ -467,9 +469,15 @@ bool workingset_test_recent(void *shadow, bool file, bool *workingset)
/*
* Flush stats (and potentially sleep) outside the RCU read section.
*
* Note that workingset_test_recent() itself might be called in RCU read
* section (for e.g, in cachestat) - these callers need to skip flushing
* stats (via the flush argument).
*
* XXX: With per-memcg flushing and thresholding, is ratelimiting
* still needed here?
*/
if (flush)
mem_cgroup_flush_stats_ratelimited(eviction_memcg);
eviction_lruvec = mem_cgroup_lruvec(eviction_memcg, pgdat);
@ -560,7 +568,7 @@ void workingset_refault(struct folio *folio, void *shadow)
mod_lruvec_state(lruvec, WORKINGSET_REFAULT_BASE + file, nr);
if (!workingset_test_recent(shadow, file, &workingset))
if (!workingset_test_recent(shadow, file, &workingset, true))
return;
folio_set_active(folio);

View File

@ -2148,7 +2148,8 @@ static bool cfg80211_6ghz_power_type_valid(const u8 *ie, size_t ielen,
struct ieee80211_he_operation *he_oper;
tmp = cfg80211_find_ext_elem(WLAN_EID_EXT_HE_OPERATION, ie, ielen);
if (tmp && tmp->datalen >= sizeof(*he_oper) + 1) {
if (tmp && tmp->datalen >= sizeof(*he_oper) + 1 &&
tmp->datalen >= ieee80211_he_oper_size(tmp->data + 1)) {
const struct ieee80211_he_6ghz_oper *he_6ghz_oper;
he_oper = (void *)&tmp->data[1];