Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at b75cdf388ecdcd5ab5e66178f19c39a4c94dea26 367 lines 12 kB view raw
1The kobject Infrastructure 2 3Patrick Mochel <mochel@osdl.org> 4 5Updated: 3 June 2003 6 7 8Copyright (c) 2003 Patrick Mochel 9Copyright (c) 2003 Open Source Development Labs 10 11 120. Introduction 13 14The kobject infrastructure performs basic object management that larger 15data structures and subsystems can leverage, rather than reimplement 16similar functionality. This functionality primarily concerns: 17 18- Object reference counting. 19- Maintaining lists (sets) of objects. 20- Object set locking. 21- Userspace representation. 22 23The infrastructure consists of a number of object types to support 24this functionality. Their programming interfaces are described below 25in detail, and briefly here: 26 27- kobjects a simple object. 28- kset a set of objects of a certain type. 29- ktype a set of helpers for objects of a common type. 30- subsystem a controlling object for a number of ksets. 31 32 33The kobject infrastructure maintains a close relationship with the 34sysfs filesystem. Each kobject that is registered with the kobject 35core receives a directory in sysfs. Attributes about the kobject can 36then be exported. Please see Documentation/filesystems/sysfs.txt for 37more information. 38 39The kobject infrastructure provides a flexible programming interface, 40and allows kobjects and ksets to be used without being registered 41(i.e. with no sysfs representation). This is also described later. 42 43 441. kobjects 45 461.1 Description 47 48 49struct kobject is a simple data type that provides a foundation for 50more complex object types. It provides a set of basic fields that 51almost all complex data types share. kobjects are intended to be 52embedded in larger data structures and replace fields they duplicate. 53 541.2 Defintion 55 56struct kobject { 57 char name[KOBJ_NAME_LEN]; 58 atomic_t refcount; 59 struct list_head entry; 60 struct kobject * parent; 61 struct kset * kset; 62 struct kobj_type * ktype; 63 struct dentry * dentry; 64}; 65 66void kobject_init(struct kobject *); 67int kobject_add(struct kobject *); 68int kobject_register(struct kobject *); 69 70void kobject_del(struct kobject *); 71void kobject_unregister(struct kobject *); 72 73struct kobject * kobject_get(struct kobject *); 74void kobject_put(struct kobject *); 75 76 771.3 kobject Programming Interface 78 79kobjects may be dynamically added and removed from the kobject core 80using kobject_register() and kobject_unregister(). Registration 81includes inserting the kobject in the list of its dominant kset and 82creating a directory for it in sysfs. 83 84Alternatively, one may use a kobject without adding it to its kset's list 85or exporting it via sysfs, by simply calling kobject_init(). An 86initialized kobject may later be added to the object hierarchy by 87calling kobject_add(). An initialized kobject may be used for 88reference counting. 89 90Note: calling kobject_init() then kobject_add() is functionally 91equivalent to calling kobject_register(). 92 93When a kobject is unregistered, it is removed from its kset's list, 94removed from the sysfs filesystem, and its reference count is decremented. 95List and sysfs removal happen in kobject_del(), and may be called 96manually. kobject_put() decrements the reference count, and may also 97be called manually. 98 99A kobject's reference count may be incremented with kobject_get(), 100which returns a valid reference to a kobject; and decremented with 101kobject_put(). An object's reference count may only be incremented if 102it is already positive. 103 104When a kobject's reference count reaches 0, the method struct 105kobj_type::release() (which the kobject's kset points to) is called. 106This allows any memory allocated for the object to be freed. 107 108 109NOTE!!! 110 111It is _imperative_ that you supply a destructor for dynamically 112allocated kobjects to free them if you are using kobject reference 113counts. The reference count controls the lifetime of the object. 114If it goes to 0, then it is assumed that the object will 115be freed and cannot be used. 116 117More importantly, you must free the object there, and not immediately 118after an unregister call. If someone else is referencing the object 119(e.g. through a sysfs file), they will obtain a reference to the 120object, assume it's valid and operate on it. If the object is 121unregistered and freed in the meantime, the operation will then 122reference freed memory and go boom. 123 124This can be prevented, in the simplest case, by defining a release 125method and freeing the object from there only. Note that this will not 126secure reference count/object management models that use a dual 127reference count or do other wacky things with the reference count 128(like the networking layer). 129 130 1311.4 sysfs 132 133Each kobject receives a directory in sysfs. This directory is created 134under the kobject's parent directory. 135 136If a kobject does not have a parent when it is registered, its parent 137becomes its dominant kset. 138 139If a kobject does not have a parent nor a dominant kset, its directory 140is created at the top-level of the sysfs partition. This should only 141happen for kobjects that are embedded in a struct subsystem. 142 143 144 1452. ksets 146 1472.1 Description 148 149A kset is a set of kobjects that are embedded in the same type. 150 151 152struct kset { 153 struct subsystem * subsys; 154 struct kobj_type * ktype; 155 struct list_head list; 156 struct kobject kobj; 157}; 158 159 160void kset_init(struct kset * k); 161int kset_add(struct kset * k); 162int kset_register(struct kset * k); 163void kset_unregister(struct kset * k); 164 165struct kset * kset_get(struct kset * k); 166void kset_put(struct kset * k); 167 168struct kobject * kset_find_obj(struct kset *, char *); 169 170 171The type that the kobjects are embedded in is described by the ktype 172pointer. The subsystem that the kobject belongs to is pointed to by the 173subsys pointer. 174 175A kset contains a kobject itself, meaning that it may be registered in 176the kobject hierarchy and exported via sysfs. More importantly, the 177kset may be embedded in a larger data type, and may be part of another 178kset (of that object type). 179 180For example, a block device is an object (struct gendisk) that is 181contained in a set of block devices. It may also contain a set of 182partitions (struct hd_struct) that have been found on the device. The 183following code snippet illustrates how to express this properly. 184 185 struct gendisk * disk; 186 ... 187 disk->kset.kobj.kset = &block_kset; 188 disk->kset.ktype = &partition_ktype; 189 kset_register(&disk->kset); 190 191- The kset that the disk's embedded object belongs to is the 192 block_kset, and is pointed to by disk->kset.kobj.kset. 193 194- The type of objects on the disk's _subordinate_ list are partitions, 195 and is set in disk->kset.ktype. 196 197- The kset is then registered, which handles initializing and adding 198 the embedded kobject to the hierarchy. 199 200 2012.2 kset Programming Interface 202 203All kset functions, except kset_find_obj(), eventually forward the 204calls to their embedded kobjects after performing kset-specific 205operations. ksets offer a similar programming model to kobjects: they 206may be used after they are initialized, without registering them in 207the hierarchy. 208 209kset_find_obj() may be used to locate a kobject with a particular 210name. The kobject, if found, is returned. 211 212 2132.3 sysfs 214 215ksets are represented in sysfs when their embedded kobjects are 216registered. They follow the same rules of parenting, with one 217exception. If a kset does not have a parent, nor is its embedded 218kobject part of another kset, the kset's parent becomes its dominant 219subsystem. 220 221If the kset does not have a parent, its directory is created at the 222sysfs root. This should only happen when the kset registered is 223embedded in a subsystem itself. 224 225 2263. struct ktype 227 2283.1. Description 229 230struct kobj_type { 231 void (*release)(struct kobject *); 232 struct sysfs_ops * sysfs_ops; 233 struct attribute ** default_attrs; 234}; 235 236 237Object types require specific functions for converting between the 238generic object and the more complex type. struct kobj_type provides 239the object-specific fields, which include: 240 241- release: Called when the kobject's reference count reaches 0. This 242 should convert the object to the more complex type and free it. 243 244- sysfs_ops: Provides conversion functions for sysfs access. Please 245 see the sysfs documentation for more information. 246 247- default_attrs: Default attributes to be exported via sysfs when the 248 object is registered.Note that the last attribute has to be 249 initialized to NULL ! You can find a complete implementation 250 in drivers/block/genhd.c 251 252 253Instances of struct kobj_type are not registered; only referenced by 254the kset. A kobj_type may be referenced by an arbitrary number of 255ksets, as there may be disparate sets of identical objects. 256 257 258 2594. subsystems 260 2614.1 Description 262 263A subsystem represents a significant entity of code that maintains an 264arbitrary number of sets of objects of various types. Since the number 265of ksets and the type of objects they contain are variable, a 266generic representation of a subsystem is minimal. 267 268 269struct subsystem { 270 struct kset kset; 271 struct rw_semaphore rwsem; 272}; 273 274int subsystem_register(struct subsystem *); 275void subsystem_unregister(struct subsystem *); 276 277struct subsystem * subsys_get(struct subsystem * s); 278void subsys_put(struct subsystem * s); 279 280 281A subsystem contains an embedded kset so: 282 283- It can be represented in the object hierarchy via the kset's 284 embedded kobject. 285 286- It can maintain a default list of objects of one type. 287 288Additional ksets may attach to the subsystem simply by referencing the 289subsystem before they are registered. (This one-way reference means 290that there is no way to determine the ksets that are attached to the 291subsystem.) 292 293All ksets that are attached to a subsystem share the subsystem's R/W 294semaphore. 295 296 2974.2 subsystem Programming Interface. 298 299The subsystem programming interface is simple and does not offer the 300flexibility that the kset and kobject programming interfaces do. They 301may be registered and unregistered, as well as reference counted. Each 302call forwards the calls to their embedded ksets (which forward the 303calls to their embedded kobjects). 304 305 3064.3 Helpers 307 308A number of macros are available to make dealing with subsystems and 309their embedded objects easier. 310 311 312decl_subsys(name,type) 313 314Declares a subsystem named '<name>_subsys', with an embedded kset of 315type <type>. For example, 316 317decl_subsys(devices,&ktype_devices); 318 319is equivalent to doing: 320 321struct subsystem device_subsys = { 322 .kset = { 323 .kobj = { 324 .name = "devices", 325 }, 326 .ktype = &ktype_devices, 327 } 328}; 329 330 331The objects that are registered with a subsystem that use the 332subsystem's default list must have their kset ptr set properly. These 333objects may have embedded kobjects, ksets, or other subsystems. The 334following helpers make setting the kset easier: 335 336 337kobj_set_kset_s(obj,subsys) 338 339- Assumes that obj->kobj exists, and is a struct kobject. 340- Sets the kset of that kobject to the subsystem's embedded kset. 341 342 343kset_set_kset_s(obj,subsys) 344 345- Assumes that obj->kset exists, and is a struct kset. 346- Sets the kset of the embedded kobject to the subsystem's 347 embedded kset. 348 349subsys_set_kset(obj,subsys) 350 351- Assumes obj->subsys exists, and is a struct subsystem. 352- Sets obj->subsys.kset.kobj.kset to the subsystem's embedded kset. 353 354 3554.4 sysfs 356 357subsystems are represented in sysfs via their embedded kobjects. They 358follow the same rules as previously mentioned with no exceptions. They 359typically receive a top-level directory in sysfs, except when their 360embedded kobject is part of another kset, or the parent of the 361embedded kobject is explicitly set. 362 363Note that the subsystem's embedded kset must be 'attached' to the 364subsystem itself in order to use its rwsem. This is done after 365kset_add() has been called. (Not before, because kset_add() uses its 366subsystem for a default parent if it doesn't already have one). 367