static int init_rq_attribs(void) { int i; int err = 0; const int attr_count = 5; struct attribute **attribs = kzalloc(sizeof(struct attribute *) * attr_count, GFP_KERNEL); if (!attribs) goto rel; rq_info.rq_avg = 0; rq_info.rq_poll_ms = 0; rq_info.rq_debug = 0; attribs[0] = MSM_SLEEP_RW_ATTRIB(def_timer_ms); attribs[1] = MSM_SLEEP_RO_ATTRIB(run_queue_avg); attribs[2] = MSM_SLEEP_RW_ATTRIB(run_queue_poll_ms); attribs[3] = MSM_SLEEP_RW_ATTRIB(run_queue_debug); attribs[4] = NULL; for (i = 0; i < attr_count - 1 ; i++) { if (!attribs[i]) goto rel; } rq_info.attr_group = kzalloc(sizeof(struct attribute_group), GFP_KERNEL); if (!rq_info.attr_group) goto rel; rq_info.attr_group->attrs = attribs; /* Create /sys/devices/system/cpu/cpu0/rq-stats/... */ rq_info.kobj = kobject_create_and_add("rq-stats", &get_cpu_sysdev(0)->kobj); if (!rq_info.kobj) goto rel; err = sysfs_create_group(rq_info.kobj, rq_info.attr_group); if (err) kobject_put(rq_info.kobj); else kobject_uevent(rq_info.kobj, KOBJ_ADD); if (!err) return err; rel: for (i = 0; i < attr_count - 1 ; i++) kfree(attribs[i]); kfree(attribs); kfree(rq_info.attr_group); kfree(rq_info.kobj); return -ENOMEM; }
static int add_sysfs_objects(struct sleep_data *sleep_info) { int err = 0; int i = 0; const int attr_count = 6; struct attribute **attribs = kzalloc(sizeof(struct attribute *) * attr_count, GFP_KERNEL); if (!attribs) goto rel; atomic_set(&sleep_info->idle_microsec, 0); atomic_set(&sleep_info->busy_microsec, 0); atomic_set(&sleep_info->timer_expired, 0); atomic_set(&sleep_info->policy_changed, 0); atomic_set(&sleep_info->timer_val_ms, INT_MAX); attribs[0] = MSM_SLEEP_RO_ATTRIB(idle_ms); attribs[1] = MSM_SLEEP_RO_ATTRIB(busy_ms); attribs[2] = MSM_SLEEP_RW_ATTRIB(timer_val_ms); attribs[3] = MSM_SLEEP_RO_ATTRIB(timer_expired); attribs[4] = MSM_SLEEP_RO_ATTRIB(policy_changed); attribs[5] = NULL; for (i = 0; i < attr_count - 1 ; i++) { if (!attribs[i]) goto rel; } sleep_info->attr_group = kzalloc(sizeof(struct attribute_group), GFP_KERNEL); if (!sleep_info->attr_group) goto rel; sleep_info->attr_group->attrs = attribs; /* Create /sys/devices/system/cpu/cpuX/sleep-stats/... */ sleep_info->kobj = kobject_create_and_add("sleep-stats", &get_cpu_sysdev(sleep_info->cpu)->kobj); if (!sleep_info->kobj) goto rel; err = sysfs_create_group(sleep_info->kobj, sleep_info->attr_group); if (err) kobject_put(sleep_info->kobj); else kobject_uevent(sleep_info->kobj, KOBJ_ADD); if (!err) return err; rel: for (i = 0; i < attr_count - 1 ; i++) kfree(attribs[i]); kfree(attribs); kfree(sleep_info->attr_group); kfree(sleep_info->kobj); return -ENOMEM; }
static int add_sysfs_objects(struct sleep_data *sleep_info) { int err = 0; int i = 0; const int attr_count = 3; struct attribute **attribs = kzalloc(sizeof(struct attribute *) * attr_count, GFP_KERNEL); if (!attribs) return -ENOMEM; atomic_set(&sleep_info->timer_expired, 0); atomic_set(&sleep_info->timer_val_ms, INT_MAX); attribs[0] = MSM_SLEEP_RW_ATTRIB(timer_val_ms); attribs[1] = MSM_SLEEP_RO_ATTRIB(timer_expired); attribs[2] = NULL; for (i = 0; i < attr_count - 1 ; i++) { if (!attribs[i]) goto release_attribs; } sleep_info->attr_group = kzalloc(sizeof(struct attribute_group), GFP_KERNEL); if (!sleep_info->attr_group) goto release_attribs; sleep_info->attr_group->attrs = attribs; sleep_info->kobj = kobject_create_and_add("sleep-stats", &get_cpu_device(0)->kobj); if (!sleep_info->kobj) goto release_attr_group; err = sysfs_create_group(sleep_info->kobj, sleep_info->attr_group); if (err) kobject_put(sleep_info->kobj); else kobject_uevent(sleep_info->kobj, KOBJ_ADD); if (!err) return err; release_attr_group: kfree(sleep_info->attr_group); release_attribs: for (i = 0; i < attr_count - 1 ; i++) if (attribs[i]) kfree(attribs[i]); kfree(attribs); return -ENOMEM; }