The kobject Infrastructure

Patrick Mochel <mochel@osdl.org>

Updated: 3 June 2003


Copyright (c)  2003 Patrick Mochel
Copyright (c)  2003 Open Source Development Labs


0. Introduction

The kobject infrastructure performs basic object management that larger
data structures and subsystems can leverage, rather than reimplement
similar functionality. This functionality primarily concerns:

- Object reference counting.
- Maintaining lists (sets) of objects.
- Object set locking.
- Userspace representation. 

The infrastructure consists of a number of object types to support
this functionality. Their programming interfaces are described below
in detail, and briefly here:

- kobjects	a simple object.
- kset		a set of objects of a certain type.
- ktype		a set of helpers for objects of a common type. 
- subsystem	a controlling object for a number of ksets.


The kobject infrastructure maintains a close relationship with the
sysfs filesystem. Each kobject that is registered with the kobject
core receives a directory in sysfs. Attributes about the kobject can
then be exported. Please see Documentation/filesystems/sysfs.txt for
more information. 

The kobject infrastructure provides a flexible programming interface,
and allows kobjects and ksets to be used without being registered
(i.e. with no sysfs representation). This is also described later. 


1. kobjects

1.1 Description


struct kobject is a simple data type that provides a foundation for
more complex object types. It provides a set of basic fields that
almost all complex data types share. kobjects are intended to be
embedded in larger data structures and replace fields they duplicate. 

1.2 Defintion

struct kobject {
	char			name[KOBJ_NAME_LEN];
	atomic_t		refcount;
	struct list_head	entry;
	struct kobject		* parent;
	struct kset		* kset;
	struct kobj_type	* ktype;
	struct dentry		* dentry;
};

void kobject_init(struct kobject *);
int kobject_add(struct kobject *);
int kobject_register(struct kobject *);

void kobject_del(struct kobject *);
void kobject_unregister(struct kobject *);

struct kobject * kobject_get(struct kobject *);
void kobject_put(struct kobject *);


1.3 kobject Programming Interface

kobjects may be dynamically added and removed from the kobject core
using kobject_register() and kobject_unregister(). Registration
includes inserting the kobject in the list of its dominant kset and
creating a directory for it in sysfs.

Alternatively, one may use a kobject without adding it to its kset's list
or exporting it via sysfs, by simply calling kobject_init(). An
initialized kobject may later be added to the object hierarchy by
calling kobject_add(). An initialized kobject may be used for
reference counting.

Note: calling kobject_init() then kobject_add() is functionally
equivalent to calling kobject_register().

When a kobject is unregistered, it is removed from its kset's list,
removed from the sysfs filesystem, and its reference count is decremented.
List and sysfs removal happen in kobject_del(), and may be called
manually. kobject_put() decrements the reference count, and may also
be called manually. 

A kobject's reference count may be incremented with kobject_get(),
which returns a valid reference to a kobject; and decremented with 
kobject_put(). An object's reference count may only be incremented if
it is already positive. 

When a kobject's reference count reaches 0, the method struct
kobj_type::release() (which the kobject's kset points to) is called.
This allows any memory allocated for the object to be freed.


NOTE!!! 

It is _imperative_ that you supply a destructor for dynamically
allocated kobjects to free them if you are using kobject reference
counts. The reference count controls the lifetime of the object.
If it goes to 0, then it is assumed that the object will
be freed and cannot be used. 

More importantly, you must free the object there, and not immediately
after an unregister call. If someone else is referencing the object
(e.g. through a sysfs file), they will obtain a reference to the
object, assume it's valid and operate on it. If the object is
unregistered and freed in the meantime, the operation will then
reference freed memory and go boom. 

This can be prevented, in the simplest case, by defining a release
method and freeing the object from there only. Note that this will not
secure reference count/object management models that use a dual
reference count or do other wacky things with the reference count
(like the networking layer). 


1.4 sysfs

Each kobject receives a directory in sysfs. This directory is created
under the kobject's parent directory. 

If a kobject does not have a parent when it is registered, its parent
becomes its dominant kset. 

If a kobject does not have a parent nor a dominant kset, its directory
is created at the top-level of the sysfs partition. This should only
happen for kobjects that are embedded in a struct subsystem. 



2. ksets

2.1 Description

A kset is a set of kobjects that are embedded in the same type. 


struct kset {
	struct subsystem	* subsys;
	struct kobj_type	* ktype;
	struct list_head	list;
	struct kobject		kobj;
};


void kset_init(struct kset * k);
int kset_add(struct kset * k);
int kset_register(struct kset * k);
void kset_unregister(struct kset * k);

struct kset * kset_get(struct kset * k);
void kset_put(struct kset * k);

struct kobject * kset_find_obj(struct kset *, char *);


The type that the kobjects are embedded in is described by the ktype
pointer. The subsystem that the kobject belongs to is pointed to by the
subsys pointer. 

A kset contains a kobject itself, meaning that it may be registered in
the kobject hierarchy and exported via sysfs. More importantly, the
kset may be embedded in a larger data type, and may be part of another
kset (of that object type). 

For example, a block device is an object (struct gendisk) that is
contained in a set of block devices. It may also contain a set of
partitions (struct hd_struct) that have been found on the device. The
following code snippet illustrates how to express this properly.

	 struct gendisk * disk;
	 ...
	 disk->kset.kobj.kset = &block_kset;
	 disk->kset.ktype = &partition_ktype;
	 kset_register(&disk->kset);

- The kset that the disk's embedded object belongs to is the
  block_kset, and is pointed to by disk->kset.kobj.kset. 

- The type of objects on the disk's _subordinate_ list are partitions, 
  and is set in disk->kset.ktype. 

- The kset is then registered, which handles initializing and adding
  the embedded kobject to the hierarchy. 


2.2 kset Programming Interface 

All kset functions, except kset_find_obj(), eventually forward the
calls to their embedded kobjects after performing kset-specific
operations. ksets offer a similar programming model to kobjects: they
may be used after they are initialized, without registering them in
the hierarchy. 

kset_find_obj() may be used to locate a kobject with a particular
name. The kobject, if found, is returned. 


2.3 sysfs

ksets are represented in sysfs when their embedded kobjects are
registered. They follow the same rules of parenting, with one
exception. If a kset does not have a parent, nor is its embedded
kobject part of another kset, the kset's parent becomes its dominant
subsystem. 

If the kset does not have a parent, its directory is created at the
sysfs root. This should only happen when the kset registered is
embedded in a subsystem itself. 


3. struct ktype

3.1. Description

struct kobj_type {
	void (*release)(struct kobject *);
	struct sysfs_ops	* sysfs_ops;
	struct attribute	** default_attrs;
};


Object types require specific functions for converting between the
generic object and the more complex type. struct kobj_type provides
the object-specific fields, which include:

- release: Called when the kobject's reference count reaches 0. This
  should convert the object to the more complex type and free it. 

- sysfs_ops: Provides conversion functions for sysfs access. Please
  see the sysfs documentation for more information. 

- default_attrs: Default attributes to be exported via sysfs when the
  object is registered.Note that the last attribute has to be
  initialized to NULL ! You can find a complete implementation
  in block/genhd.c


Instances of struct kobj_type are not registered; only referenced by
the kset. A kobj_type may be referenced by an arbitrary number of
ksets, as there may be disparate sets of identical objects. 



4. subsystems

4.1 Description

A subsystem represents a significant entity of code that maintains an
arbitrary number of sets of objects of various types. Since the number
of ksets and the type of objects they contain are variable, a
generic representation of a subsystem is minimal. 


struct subsystem {
	struct kset		kset;
	struct rw_semaphore	rwsem;
};

int subsystem_register(struct subsystem *);
void subsystem_unregister(struct subsystem *);

struct subsystem * subsys_get(struct subsystem * s);
void subsys_put(struct subsystem * s);


A subsystem contains an embedded kset so:

- It can be represented in the object hierarchy via the kset's
  embedded kobject. 

- It can maintain a default list of objects of one type. 

Additional ksets may attach to the subsystem simply by referencing the
subsystem before they are registered. (This one-way reference means
that there is no way to determine the ksets that are attached to the
subsystem.) 

All ksets that are attached to a subsystem share the subsystem's R/W
semaphore. 


4.2 subsystem Programming Interface.

The subsystem programming interface is simple and does not offer the
flexibility that the kset and kobject programming interfaces do. They
may be registered and unregistered, as well as reference counted. Each
call forwards the calls to their embedded ksets (which forward the
calls to their embedded kobjects).


4.3 Helpers

A number of macros are available to make dealing with subsystems and
their embedded objects easier. 


decl_subsys(name,type)

Declares a subsystem named '<name>_subsys', with an embedded kset of
type <type>. For example, 

decl_subsys(devices,&ktype_devices);

is equivalent to doing:

struct subsystem device_subsys = {
       .kset = {
	     .kobj = {
		   .name = "devices",
	     },
	     .ktype = &ktype_devices,
	}
}; 


The objects that are registered with a subsystem that use the
subsystem's default list must have their kset ptr set properly. These
objects may have embedded kobjects, ksets, or other subsystems. The
following helpers make setting the kset easier: 


kobj_set_kset_s(obj,subsys)

- Assumes that obj->kobj exists, and is a struct kobject. 
- Sets the kset of that kobject to the subsystem's embedded kset.


kset_set_kset_s(obj,subsys)

- Assumes that obj->kset exists, and is a struct kset.
- Sets the kset of the embedded kobject to the subsystem's 
  embedded kset. 

subsys_set_kset(obj,subsys)

- Assumes obj->subsys exists, and is a struct subsystem.
- Sets obj->subsys.kset.kobj.kset to the subsystem's embedded kset.


4.4 sysfs

subsystems are represented in sysfs via their embedded kobjects. They
follow the same rules as previously mentioned with no exceptions. They
typically receive a top-level directory in sysfs, except when their
embedded kobject is part of another kset, or the parent of the
embedded kobject is explicitly set. 

Note that the subsystem's embedded kset must be 'attached' to the
subsystem itself in order to use its rwsem. This is done after
kset_add() has been called. (Not before, because kset_add() uses its
subsystem for a default parent if it doesn't already have one).

