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;
}
예제 #3
0
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;
}