📄 dpm-core-2.6.16.patch
字号:
+static ssize_t policy_state ## index ## _store(struct kobject * kobj, \+ const char * buf, \+ size_t n) \+{ \+ struct dpm_policy *policy = to_policy(kobj); \+ struct dpm_classopt old_classopt; \+ int ret; \+ \+ dpm_lock(); \+ old_classopt = policy->classopt[index]; \+ if ((ret = dpm_map_policy_state(policy,index,(char *)buf))) \+ policy->classopt[index] = old_classopt; \+ dpm_unlock(); \+ return ret ? -EINVAL : n; \+} \+static struct dpm_policy_attribute policy_state ## index ## _attr = { \+ .attr = { \+ .mode = 0644, \+ }, \+ .show = policy_state ## index ## _show, \+ .store = policy_state ## index ## _store, \+}; \++#define MAX_POLICY_STATES 20+POLICY_STATE_ATTR(0);+POLICY_STATE_ATTR(1);+POLICY_STATE_ATTR(2);+POLICY_STATE_ATTR(3);+POLICY_STATE_ATTR(4);+POLICY_STATE_ATTR(5);+POLICY_STATE_ATTR(6);+POLICY_STATE_ATTR(7);+POLICY_STATE_ATTR(8);+POLICY_STATE_ATTR(9);+POLICY_STATE_ATTR(10);+POLICY_STATE_ATTR(11);+POLICY_STATE_ATTR(12);+POLICY_STATE_ATTR(13);+POLICY_STATE_ATTR(14);+POLICY_STATE_ATTR(15);+POLICY_STATE_ATTR(16);+POLICY_STATE_ATTR(17);+POLICY_STATE_ATTR(18);+POLICY_STATE_ATTR(19);++static struct dpm_policy_attribute *policy_state_attr[MAX_POLICY_STATES] = {+ &policy_state0_attr,+ &policy_state1_attr,+ &policy_state2_attr,+ &policy_state3_attr,+ &policy_state4_attr,+ &policy_state5_attr,+ &policy_state6_attr,+ &policy_state7_attr,+ &policy_state8_attr,+ &policy_state9_attr,+ &policy_state10_attr,+ &policy_state11_attr,+ &policy_state12_attr,+ &policy_state13_attr,+ &policy_state14_attr,+ &policy_state15_attr,+ &policy_state16_attr,+ &policy_state17_attr,+ &policy_state18_attr,+ &policy_state19_attr,+};++static ssize_t+policy_attr_show(struct kobject * kobj, struct attribute * attr, char * buf)+{+ struct dpm_policy_attribute * policy_attr = to_policy_attr(attr);+ ssize_t ret = 0;++ if (policy_attr->show)+ ret = policy_attr->show(kobj,buf);+ return ret;+}++static ssize_t+policy_attr_store(struct kobject * kobj, struct attribute * attr,+ const char * buf, size_t count)+{+ struct dpm_policy_attribute * policy_attr = to_policy_attr(attr);+ ssize_t ret = 0;++ if (policy_attr->store)+ ret = policy_attr->store(kobj,buf,count);+ return ret;+}++static struct dpm_policy_attribute a_policy_control_attr = {+ .attr = {+ .name = "control",+ .mode = 0644,+ },+ .show = a_policy_control_show,+ .store = a_policy_control_store,+};++static struct sysfs_ops policy_sysfs_ops = {+ .show = policy_attr_show,+ .store = policy_attr_store,+};++static struct attribute * policy_default_attrs[] = {+ &a_policy_control_attr.attr,+ NULL,+};++static struct kobj_type ktype_policy = {+ .release = dpm_kobj_release,+ .sysfs_ops = &policy_sysfs_ops,+ .default_attrs = policy_default_attrs,+};++void dpm_sysfs_new_policy(struct dpm_policy *policy)+{+ int i;++ memset(&policy->kobj, 0, sizeof(struct kobject));+ policy->kobj.kset = &dpm_subsys.kset,+ kobject_set_name(&policy->kobj,policy->name);+ policy->kobj.parent = &dpm_policy_kobj;+ policy->kobj.ktype = &ktype_policy;+ kobject_register(&policy->kobj);++ for (i = 0; (i < DPM_STATES) && (i < MAX_POLICY_STATES); i++) {+ policy_state_attr[i]->attr.name = dpm_state_names[i];+ sysfs_create_file(&policy->kobj, &policy_state_attr[i]->attr);+ }++ return;+}++void dpm_sysfs_destroy_policy(struct dpm_policy *policy)+{+ kobject_unregister(&policy->kobj);+ return;+}++/*+ * class+ */++struct dpm_class_attribute {+ struct attribute attr;+ ssize_t (*show)(struct kobject * kobj, char * buf);+ ssize_t (*store)(struct kobject * kobj, const char * buf, size_t count);+};++#define to_class(obj) container_of(obj,struct dpm_class,kobj)+#define to_class_attr(_attr) container_of(_attr,struct dpm_class_attribute,attr)++static ssize_t class_control_show(struct subsystem * subsys, char * buf)+{+ ssize_t len = 0;+ struct list_head * p;++ len += sprintf(buf + len, "classes: ");++ list_for_each(p, &dpm_classes) {+ len += sprintf(buf + len, "%s ",+ ((struct dpm_class *)+ list_entry(p, struct dpm_class, list))->name);+ }++ len += sprintf(buf + len, "\nactive: %s\n",+ (dpm_enabled && dpm_active_class) ?+ dpm_active_class->name : "[none]");+ return len;+}++static ssize_t class_control_store(struct subsystem * subsys, const char * buf,+ size_t n)+{+ int error = 0;+ char *tbuf = NULL;+ char *token[MAXTOKENS];+ int ntoks = tokenizer(&tbuf, buf, n, (char **) &token, MAXTOKENS);++ if (ntoks <= 0) {+ error = ntoks;+ goto out;+ }++ if (strcmp(token[0],"create") == 0) {+ if (ntoks < 3)+ printk("dpm: class create requires 1 name and at least one operating point argument\n");+ else+ error = dpm_create_class(token[1], &token[2], ntoks-2);+ } else+ error = -EINVAL;++ out:+ if (tbuf)+ kfree(tbuf);+ return error ? error : n;+}++static struct kobject dpm_class_kobj = {+ .kset = &dpm_subsys.kset,+};++dpm_attr(control,class_control);++static ssize_t a_class_control_show(struct kobject * kobj, char * buf)+{+ ssize_t len = 0;+ struct dpm_class *class = to_class(kobj);+ int i;++ len += sprintf(buf + len, "ops: ");++ for (i = 0; i < class->nops; i++)+ len += sprintf(buf + len, "%s ", class->ops[i]->name);+++ len += sprintf(buf + len, "\n");+ return len;+}++static ssize_t a_class_control_store(struct kobject * kobj, const char * buf,+ size_t n)+{+ return n;+}++static ssize_t+class_attr_show(struct kobject * kobj, struct attribute * attr, char * buf)+{+ struct dpm_class_attribute * class_attr = to_class_attr(attr);+ ssize_t ret = 0;++ if (class_attr->show)+ ret = class_attr->show(kobj,buf);+ return ret;+}++static ssize_t+class_attr_store(struct kobject * kobj, struct attribute * attr,+ const char * buf, size_t count)+{+ struct dpm_class_attribute * class_attr = to_class_attr(attr);+ ssize_t ret = 0;++ if (class_attr->store)+ ret = class_attr->store(kobj,buf,count);+ return ret;+}++static struct dpm_class_attribute a_class_control_attr = {+ .attr = {+ .name = "control",+ .mode = 0644,+ },+ .show = a_class_control_show,+ .store = a_class_control_store,+};++static struct sysfs_ops class_sysfs_ops = {+ .show = class_attr_show,+ .store = class_attr_store,+};++static struct attribute * class_default_attrs[] = {+ &a_class_control_attr.attr,+ NULL,+};++static struct kobj_type ktype_class = {+ .release = dpm_kobj_release,+ .sysfs_ops = &class_sysfs_ops,+ .default_attrs = class_default_attrs,+};++void dpm_sysfs_new_class(struct dpm_class *class)+{+ memset(&class->kobj, 0, sizeof(struct kobject));+ class->kobj.kset = &dpm_subsys.kset,+ kobject_set_name(&class->kobj,class->name);+ class->kobj.parent = &dpm_class_kobj;+ class->kobj.ktype = &ktype_class;+ kobject_register(&class->kobj);+ return;+}++void dpm_sysfs_destroy_class(struct dpm_class *class)+{+ kobject_unregister(&class->kobj);+ return;+}+++/*+ * op+ */++struct dpm_op_attribute {+ struct attribute attr;+ ssize_t (*show)(struct kobject * kobj, char * buf);+ ssize_t (*store)(struct kobject * kobj, const char * buf, size_t count);+};++#define to_op(obj) container_of(obj,struct dpm_opt,kobj)+#define to_op_attr(_attr) container_of(_attr,struct dpm_op_attribute,attr)++static ssize_t op_control_show(struct subsystem * subsys, char * buf)+{+ unsigned long flags;+ ssize_t len = 0;++ if (dpm_lock_interruptible())+ return -ERESTARTSYS;++ len += sprintf(buf + len, "active: ");++ if (!dpm_enabled) {+ len += sprintf(buf + len, "[none]\n");+ } else {+ spin_lock_irqsave(&dpm_policy_lock, flags);+ len += sprintf(buf + len,"%s\n",+ dpm_active_opt ? dpm_active_opt->name : "[none]");+ spin_unlock_irqrestore(&dpm_policy_lock, flags);+ }++ dpm_unlock();++ len += sprintf(buf + len, "params: %d\n", DPM_PP_NBR);+ return len;+}++static ssize_t op_control_store(struct subsystem * subsys, const char * buf,+ size_t n)+{+ int error = 0;+ char *tbuf = NULL;+ char *token[MAXTOKENS];+ int ntoks = tokenizer(&tbuf, buf, n, (char **) &token, MAXTOKENS);++ if (ntoks <= 0) {+ error = ntoks;+ goto out;+ }++ if ((strcmp(token[0],"create") == 0) && (ntoks >= 2)) {+ dpm_md_pp_t pp[DPM_PP_NBR];+ int i;++ for (i = 0; i < DPM_PP_NBR; i++) {+ if (i >= ntoks - 2)+ pp[i] = -1;+ else+ pp[i] = simple_strtol(token[i + 2],+ NULL, 0);+ }++ error = dpm_create_opt(token[1], pp, DPM_PP_NBR);+ } else+ error = -EINVAL;++ out:+ if (tbuf)+ kfree(tbuf);+ return error ? error : n;++}++dpm_attr(control,op_control);++#ifdef CONFIG_DPM_STATS+static ssize_t op_stats_show(struct subsystem * subsys, char * buf)+{+ int len = 0;+ struct dpm_opt *opt;+ struct list_head *p;+ unsigned long long total_time;++ if (dpm_lock_interruptible())+ return -ERESTARTSYS;++ if (!dpm_enabled) {+ dpm_unlock();+ len += sprintf(buf + len, "DPM IS DISABLED\n");+ return len;+ }++ for (p = dpm_opts.next; p != &dpm_opts; p = p->next) {+ opt = list_entry(p, struct dpm_opt, list);+ len += sprintf(buf + len, "op: %s", opt->name);+ total_time = opt->stats.total_time;+ if (opt == dpm_active_opt)+ total_time += (unsigned long long) dpm_time() -+ opt->stats.start_time;+ len += sprintf(buf + len, " ticks: %Lu times: %lu\n",+ (unsigned long long) dpm_time_to_usec(total_time),+ opt->stats.count);+ }++ dpm_unlock();+ return len;+}++static ssize_t op_stats_store(struct subsystem * subsys, const char * buf,+ size_t n)+{+ return n;+}++dpm_attr(stats, op_stats);+#endif /* CONFIG_DPM_STATS */+++static struct kobject dpm_op_kobj = {+ .kset = &dpm_subsys.kset,+};++static ssize_t an_op_control_show(struct kobject * kobj, char * buf)+{+ ssize_t len = 0;+ // struct dpm_opt *opt = to_op(kobj);++ len += sprintf(buf + len, "\n");+ return len;+}++static ssize_t an_op_control_store(struct kobject * kobj, const char * buf,+ size_t n)+{+ return n;+}++static struct dpm_op_attribute an_op_control_attr = {+ .attr = {+ .name = "control",+ .mode = 0644,+ },+ .show = an_op_control_show,+ .store = an_op_control_store,+};++static ssize_t op_force_show(struct kobject * kobj, char * buf)+{+ ssize_t len = 0;+ struct dpm_opt *opt = to_op(kobj);++ len += sprintf(buf + len, "%d\n", opt->flags & DPM_OP_FORCE ? 1 : 0);+ return len;+}++static ssize_t op_force_store(struct kobject * kobj, const char * buf,+ size_t n)+{+ struct dpm_opt *opt = to_op(kobj);++ opt->flags = (opt->flags & ~DPM_OP_FORCE) |+ (simple_strtol(buf, NULL, 0) ? DPM_OP_FORCE : 0);+ return n;+}++static struct dpm_op_attribute op_force_attr = {+ .attr = {+ .name = "force",+ .mode = 0644,+ },+ .show = op_force_show,+ .store = op_force_store,+};++#define OP_PARAM_ATTR(index) \+static ssize_t op_param ## index ## _show(struct kobject * kobj, char * buf) \+{ \+ ssize_t len = 0; \+ struct dpm_opt *opt = to_op(kobj); \+ len += sprintf(buf + len, "%d\n", opt->pp[index]); \+ return len; \+} \+static ssize_t op_param ## index ## _store(struct kobject * kobj, const char * buf, \+ size_t n) \+{ \+ struct dpm_opt *opt = to_op(kobj); \+ int ret, oldval; \+ \+ oldval = opt->pp[index]; \+ opt->pp[index] = simple_strtol(buf, NULL, 0); \+ ret = dpm_md_init_opt(opt); \+ if (ret) \+ opt->pp[index] = oldval; \+ return ret ? ret : n; \+} \+static struct dpm_op_attribute op_param ## index ## _attr = { \+ .attr = { \+ .mode = 0644, \+ }, \+ .show = op_param ## index ## _show, \+ .store = op_param ## index ## _store, \+}; \++#define MAX_OP_PARAMS 20+OP_PARAM_ATTR(0);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -