Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge tag 'sched_urgent_for_v6.5_rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

Pull scheduler fixes from Borislav Petkov:

- Remove a cgroup from under a polling process properly

- Fix the idle sibling selection

* tag 'sched_urgent_for_v6.5_rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
sched/psi: use kernfs polling functions for PSI trigger polling
sched/fair: Use recent_used_cpu to test p->cpus_ptr

+29 -12
+3 -2
include/linux/psi.h
··· 23 23 void psi_memstall_leave(unsigned long *flags); 24 24 25 25 int psi_show(struct seq_file *s, struct psi_group *group, enum psi_res res); 26 - struct psi_trigger *psi_trigger_create(struct psi_group *group, 27 - char *buf, enum psi_res res, struct file *file); 26 + struct psi_trigger *psi_trigger_create(struct psi_group *group, char *buf, 27 + enum psi_res res, struct file *file, 28 + struct kernfs_open_file *of); 28 29 void psi_trigger_destroy(struct psi_trigger *t); 29 30 30 31 __poll_t psi_trigger_poll(void **trigger_ptr, struct file *file,
+3
include/linux/psi_types.h
··· 137 137 /* Wait queue for polling */ 138 138 wait_queue_head_t event_wait; 139 139 140 + /* Kernfs file for cgroup triggers */ 141 + struct kernfs_open_file *of; 142 + 140 143 /* Pending event flag */ 141 144 int event; 142 145
+1 -1
kernel/cgroup/cgroup.c
··· 3730 3730 } 3731 3731 3732 3732 psi = cgroup_psi(cgrp); 3733 - new = psi_trigger_create(psi, buf, res, of->file); 3733 + new = psi_trigger_create(psi, buf, res, of->file, of); 3734 3734 if (IS_ERR(new)) { 3735 3735 cgroup_put(cgrp); 3736 3736 return PTR_ERR(new);
+1 -1
kernel/sched/fair.c
··· 7174 7174 recent_used_cpu != target && 7175 7175 cpus_share_cache(recent_used_cpu, target) && 7176 7176 (available_idle_cpu(recent_used_cpu) || sched_idle_cpu(recent_used_cpu)) && 7177 - cpumask_test_cpu(p->recent_used_cpu, p->cpus_ptr) && 7177 + cpumask_test_cpu(recent_used_cpu, p->cpus_ptr) && 7178 7178 asym_fits_cpu(task_util, util_min, util_max, recent_used_cpu)) { 7179 7179 return recent_used_cpu; 7180 7180 }
+21 -8
kernel/sched/psi.c
··· 493 493 continue; 494 494 495 495 /* Generate an event */ 496 - if (cmpxchg(&t->event, 0, 1) == 0) 497 - wake_up_interruptible(&t->event_wait); 496 + if (cmpxchg(&t->event, 0, 1) == 0) { 497 + if (t->of) 498 + kernfs_notify(t->of->kn); 499 + else 500 + wake_up_interruptible(&t->event_wait); 501 + } 498 502 t->last_event_time = now; 499 503 /* Reset threshold breach flag once event got generated */ 500 504 t->pending_event = false; ··· 1275 1271 return 0; 1276 1272 } 1277 1273 1278 - struct psi_trigger *psi_trigger_create(struct psi_group *group, 1279 - char *buf, enum psi_res res, struct file *file) 1274 + struct psi_trigger *psi_trigger_create(struct psi_group *group, char *buf, 1275 + enum psi_res res, struct file *file, 1276 + struct kernfs_open_file *of) 1280 1277 { 1281 1278 struct psi_trigger *t; 1282 1279 enum psi_states state; ··· 1336 1331 1337 1332 t->event = 0; 1338 1333 t->last_event_time = 0; 1339 - init_waitqueue_head(&t->event_wait); 1334 + t->of = of; 1335 + if (!of) 1336 + init_waitqueue_head(&t->event_wait); 1340 1337 t->pending_event = false; 1341 1338 t->aggregator = privileged ? PSI_POLL : PSI_AVGS; 1342 1339 ··· 1395 1388 * being accessed later. Can happen if cgroup is deleted from under a 1396 1389 * polling process. 1397 1390 */ 1398 - wake_up_pollfree(&t->event_wait); 1391 + if (t->of) 1392 + kernfs_notify(t->of->kn); 1393 + else 1394 + wake_up_interruptible(&t->event_wait); 1399 1395 1400 1396 if (t->aggregator == PSI_AVGS) { 1401 1397 mutex_lock(&group->avgs_lock); ··· 1475 1465 if (!t) 1476 1466 return DEFAULT_POLLMASK | EPOLLERR | EPOLLPRI; 1477 1467 1478 - poll_wait(file, &t->event_wait, wait); 1468 + if (t->of) 1469 + kernfs_generic_poll(t->of, wait); 1470 + else 1471 + poll_wait(file, &t->event_wait, wait); 1479 1472 1480 1473 if (cmpxchg(&t->event, 1, 0) == 1) 1481 1474 ret |= EPOLLPRI; ··· 1548 1535 return -EBUSY; 1549 1536 } 1550 1537 1551 - new = psi_trigger_create(&psi_system, buf, res, file); 1538 + new = psi_trigger_create(&psi_system, buf, res, file, NULL); 1552 1539 if (IS_ERR(new)) { 1553 1540 mutex_unlock(&seq->lock); 1554 1541 return PTR_ERR(new);