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

PM / Runtime: Remove device fields related to suspend time, v2

After the previous changes in default_stop_ok() and
default_power_down_ok() for PM domains, there are two fields in
struct dev_pm_info that aren't necessary any more, suspend_time
and max_time_suspended_ns.

Remove those fields along with all of the code that accesses them,
which simplifies the runtime PM framework quite a bit.

Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>

+2 -119
-13
drivers/base/power/domain.c
··· 445 445 446 446 genpd->status = GPD_STATE_POWER_OFF; 447 447 448 - /* Update PM QoS information for devices in the domain. */ 449 - list_for_each_entry_reverse(pdd, &genpd->dev_list, list_node) { 450 - struct gpd_timing_data *td = &to_gpd_data(pdd)->td; 451 - 452 - pm_runtime_update_max_time_suspended(pdd->dev, 453 - td->start_latency_ns + 454 - td->restore_state_latency_ns + 455 - genpd->power_on_latency_ns); 456 - } 457 - 458 448 list_for_each_entry(link, &genpd->slave_links, slave_node) { 459 449 genpd_sd_counter_dec(link->master); 460 450 genpd_queue_power_off_work(link->master); ··· 504 514 ret = genpd_stop_dev(genpd, dev); 505 515 if (ret) 506 516 return ret; 507 - 508 - pm_runtime_update_max_time_suspended(dev, 509 - dev_gpd_data(dev)->td.start_latency_ns); 510 517 511 518 /* 512 519 * If power.irq_safe is set, this routine will be run with interrupts
+2 -101
drivers/base/power/runtime.c
··· 282 282 return retval != -EACCES ? retval : -EIO; 283 283 } 284 284 285 - struct rpm_qos_data { 286 - ktime_t time_now; 287 - s64 constraint_ns; 288 - }; 289 - 290 - /** 291 - * rpm_update_qos_constraint - Update a given PM QoS constraint data. 292 - * @dev: Device whose timing data to use. 293 - * @data: PM QoS constraint data to update. 294 - * 295 - * Use the suspend timing data of @dev to update PM QoS constraint data pointed 296 - * to by @data. 297 - */ 298 - static int rpm_update_qos_constraint(struct device *dev, void *data) 299 - { 300 - struct rpm_qos_data *qos = data; 301 - unsigned long flags; 302 - s64 delta_ns; 303 - int ret = 0; 304 - 305 - spin_lock_irqsave(&dev->power.lock, flags); 306 - 307 - if (dev->power.max_time_suspended_ns < 0) 308 - goto out; 309 - 310 - delta_ns = dev->power.max_time_suspended_ns - 311 - ktime_to_ns(ktime_sub(qos->time_now, dev->power.suspend_time)); 312 - if (delta_ns <= 0) { 313 - ret = -EBUSY; 314 - goto out; 315 - } 316 - 317 - if (qos->constraint_ns > delta_ns || qos->constraint_ns == 0) 318 - qos->constraint_ns = delta_ns; 319 - 320 - out: 321 - spin_unlock_irqrestore(&dev->power.lock, flags); 322 - 323 - return ret; 324 - } 325 - 326 285 /** 327 286 * rpm_suspend - Carry out runtime suspend of given device. 328 287 * @dev: Device to suspend. ··· 308 349 { 309 350 int (*callback)(struct device *); 310 351 struct device *parent = NULL; 311 - struct rpm_qos_data qos; 312 352 int retval; 313 353 314 354 trace_rpm_suspend(dev, rpmflags); ··· 403 445 goto out; 404 446 } 405 447 406 - qos.constraint_ns = __dev_pm_qos_read_value(dev); 407 - if (qos.constraint_ns < 0) { 408 - /* Negative constraint means "never suspend". */ 448 + if (__dev_pm_qos_read_value(dev) < 0) { 449 + /* Negative PM QoS constraint means "never suspend". */ 409 450 retval = -EPERM; 410 451 goto out; 411 452 } 412 - qos.constraint_ns *= NSEC_PER_USEC; 413 - qos.time_now = ktime_get(); 414 453 415 454 __update_runtime_status(dev, RPM_SUSPENDING); 416 - 417 - if (!dev->power.ignore_children) { 418 - if (dev->power.irq_safe) 419 - spin_unlock(&dev->power.lock); 420 - else 421 - spin_unlock_irq(&dev->power.lock); 422 - 423 - retval = device_for_each_child(dev, &qos, 424 - rpm_update_qos_constraint); 425 - 426 - if (dev->power.irq_safe) 427 - spin_lock(&dev->power.lock); 428 - else 429 - spin_lock_irq(&dev->power.lock); 430 - 431 - if (retval) 432 - goto fail; 433 - } 434 - 435 - dev->power.suspend_time = qos.time_now; 436 - dev->power.max_time_suspended_ns = qos.constraint_ns ? : -1; 437 455 438 456 if (dev->pm_domain) 439 457 callback = dev->pm_domain->ops.runtime_suspend; ··· 463 529 464 530 fail: 465 531 __update_runtime_status(dev, RPM_ACTIVE); 466 - dev->power.suspend_time = ktime_set(0, 0); 467 - dev->power.max_time_suspended_ns = -1; 468 532 dev->power.deferred_resume = false; 469 533 wake_up_all(&dev->power.wait_queue); 470 534 ··· 635 703 636 704 if (dev->power.no_callbacks) 637 705 goto no_callback; /* Assume success. */ 638 - 639 - dev->power.suspend_time = ktime_set(0, 0); 640 - dev->power.max_time_suspended_ns = -1; 641 706 642 707 __update_runtime_status(dev, RPM_RESUMING); 643 708 ··· 1298 1369 setup_timer(&dev->power.suspend_timer, pm_suspend_timer_fn, 1299 1370 (unsigned long)dev); 1300 1371 1301 - dev->power.suspend_time = ktime_set(0, 0); 1302 - dev->power.max_time_suspended_ns = -1; 1303 - 1304 1372 init_waitqueue_head(&dev->power.wait_queue); 1305 1373 } 1306 1374 ··· 1314 1388 pm_runtime_set_suspended(dev); 1315 1389 if (dev->power.irq_safe && dev->parent) 1316 1390 pm_runtime_put_sync(dev->parent); 1317 - } 1318 - 1319 - /** 1320 - * pm_runtime_update_max_time_suspended - Update device's suspend time data. 1321 - * @dev: Device to handle. 1322 - * @delta_ns: Value to subtract from the device's max_time_suspended_ns field. 1323 - * 1324 - * Update the device's power.max_time_suspended_ns field by subtracting 1325 - * @delta_ns from it. The resulting value of power.max_time_suspended_ns is 1326 - * never negative. 1327 - */ 1328 - void pm_runtime_update_max_time_suspended(struct device *dev, s64 delta_ns) 1329 - { 1330 - unsigned long flags; 1331 - 1332 - spin_lock_irqsave(&dev->power.lock, flags); 1333 - 1334 - if (delta_ns > 0 && dev->power.max_time_suspended_ns > 0) { 1335 - if (dev->power.max_time_suspended_ns > delta_ns) 1336 - dev->power.max_time_suspended_ns -= delta_ns; 1337 - else 1338 - dev->power.max_time_suspended_ns = 0; 1339 - } 1340 - 1341 - spin_unlock_irqrestore(&dev->power.lock, flags); 1342 1391 }
-2
include/linux/pm.h
··· 544 544 unsigned long active_jiffies; 545 545 unsigned long suspended_jiffies; 546 546 unsigned long accounting_timestamp; 547 - ktime_t suspend_time; 548 - s64 max_time_suspended_ns; 549 547 struct dev_pm_qos_request *pq_req; 550 548 #endif 551 549 struct pm_subsys_data *subsys_data; /* Owned by the subsystem. */
-3
include/linux/pm_runtime.h
··· 150 150 static inline unsigned long pm_runtime_autosuspend_expiration( 151 151 struct device *dev) { return 0; } 152 152 153 - static inline void pm_runtime_update_max_time_suspended(struct device *dev, 154 - s64 delta_ns) {} 155 - 156 153 #endif /* !CONFIG_PM_RUNTIME */ 157 154 158 155 static inline int pm_runtime_idle(struct device *dev)