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

PM QoS: Make pm_qos settings readable

I have a machine where entering deep C-states broke.
pm_qos was a hot candidate, but I couldn't find any way to double
check without the need of recompiling.

While in this case it was a driver bug (ath9k):
https://bugzilla.kernel.org/show_bug.cgi?id=27532

powertop or others may want to read out cpu_dma_latency
restrictions which could be the cause of preventing a machine
entering deeper C-states.

Output with this patch:

# default value of 2000 * USEC_PER_SEC (0x77359400)
cat /dev/network_latency |hexdump
0000000 9400 7735
0000004

# value of 55 us which is the reason for not entering C2
cat /dev/cpu_dma_latency |hexdump
0000000 0037 0000
0000004

There is no reason to hide this info -> make pm_qos files readable.

Signed-off-by: Thomas Renninger <trenn@suse.de>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>

authored by

Thomas Renninger and committed by
Rafael J. Wysocki
f9b9e806 7ae49618

+24
+24
kernel/pm_qos_params.c
··· 103 103 104 104 static ssize_t pm_qos_power_write(struct file *filp, const char __user *buf, 105 105 size_t count, loff_t *f_pos); 106 + static ssize_t pm_qos_power_read(struct file *filp, char __user *buf, 107 + size_t count, loff_t *f_pos); 106 108 static int pm_qos_power_open(struct inode *inode, struct file *filp); 107 109 static int pm_qos_power_release(struct inode *inode, struct file *filp); 108 110 109 111 static const struct file_operations pm_qos_power_fops = { 110 112 .write = pm_qos_power_write, 113 + .read = pm_qos_power_read, 111 114 .open = pm_qos_power_open, 112 115 .release = pm_qos_power_release, 113 116 .llseek = noop_llseek, ··· 378 375 return 0; 379 376 } 380 377 378 + 379 + static ssize_t pm_qos_power_read(struct file *filp, char __user *buf, 380 + size_t count, loff_t *f_pos) 381 + { 382 + s32 value; 383 + unsigned long flags; 384 + struct pm_qos_object *o; 385 + struct pm_qos_request_list *pm_qos_req = filp->private_data;; 386 + 387 + if (!pm_qos_req) 388 + return -EINVAL; 389 + if (!pm_qos_request_active(pm_qos_req)) 390 + return -EINVAL; 391 + 392 + o = pm_qos_array[pm_qos_req->pm_qos_class]; 393 + spin_lock_irqsave(&pm_qos_lock, flags); 394 + value = pm_qos_get_value(o); 395 + spin_unlock_irqrestore(&pm_qos_lock, flags); 396 + 397 + return simple_read_from_buffer(buf, count, f_pos, &value, sizeof(s32)); 398 + } 381 399 382 400 static ssize_t pm_qos_power_write(struct file *filp, const char __user *buf, 383 401 size_t count, loff_t *f_pos)