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 <[email protected]>
CC: [email protected]
CC: [email protected]

---
 kernel/pm_qos_params.c |   24 ++++++++++++++++++++++++
 1 file changed, 24 insertions(+)

Index: linux-2.6.37-master_build/kernel/pm_qos_params.c
===================================================================
--- linux-2.6.37-master_build.orig/kernel/pm_qos_params.c
+++ linux-2.6.37-master_build/kernel/pm_qos_params.c
@@ -103,11 +103,14 @@ static struct pm_qos_object *pm_qos_arra
 
 static ssize_t pm_qos_power_write(struct file *filp, const char __user *buf,
                size_t count, loff_t *f_pos);
+static ssize_t pm_qos_power_read(struct file *filp, char __user *buf,
+               size_t count, loff_t *f_pos);
 static int pm_qos_power_open(struct inode *inode, struct file *filp);
 static int pm_qos_power_release(struct inode *inode, struct file *filp);
 
 static const struct file_operations pm_qos_power_fops = {
        .write = pm_qos_power_write,
+       .read = pm_qos_power_read,
        .open = pm_qos_power_open,
        .release = pm_qos_power_release,
        .llseek = noop_llseek,
@@ -376,6 +379,27 @@ static int pm_qos_power_release(struct i
 }
 
 
+static ssize_t pm_qos_power_read(struct file *filp, char __user *buf,
+               size_t count, loff_t *f_pos)
+{
+       s32 value;
+       unsigned long flags;
+       struct pm_qos_object *o;
+       struct pm_qos_request_list *pm_qos_req = filp->private_data;;
+
+       if (!pm_qos_req)
+               return -EINVAL;
+       if (!pm_qos_request_active(pm_qos_req))
+               return -EINVAL;
+
+       o = pm_qos_array[pm_qos_req->pm_qos_class];
+       spin_lock_irqsave(&pm_qos_lock, flags);
+       value = pm_qos_get_value(o);
+       spin_unlock_irqrestore(&pm_qos_lock, flags);
+
+       return simple_read_from_buffer(buf, count, f_pos, &value, sizeof(s32));
+}
+
 static ssize_t pm_qos_power_write(struct file *filp, const char __user *buf,
                size_t count, loff_t *f_pos)
 {

_______________________________________________
Power mailing list
[email protected]
http://www.bughost.org/mailman/listinfo/power

Reply via email to