On 09/05/14 10:50, Johannes Berg wrote: > From: Johannes Berg<johannes.berg at intel.com> > > Many devices run firmware and/or complex hardware, and most of that > can have bugs. When it misbehaves, however, it is often much harder > to debug than software running on the host. > > Introduce a "device coredump" mechanism to allow dumping internal > device/firmware state through a generalized mechanism. As devices > are different and information needed can vary accordingly, this > doesn't prescribe a file format - it just provides mechanism to > get data to be able to capture it in a generalized way (e.g. in > distributions.)
Although it can be found in the patch it would not hurt to point out where the coredump can be found in sysfs in this patch description. [...] > +static struct class devcd_class = { > + .name = "devcoredump", > + .owner = THIS_MODULE, > + .dev_release = devcd_dev_release, > + .dev_groups = devcd_dev_groups, > +}; [...] > +/** > + * dev_coredumpm - create firmware coredump with read/free methods > + * @dev: the struct device for the crashed device > + * @data: data cookie for the @read/@free functions > + * @datalen: length of the data > + * @gfp: allocation flags > + * @read: function to read from the given buffer > + * @free: function to free the given buffer > + */ > +void dev_coredumpm(struct device *dev, struct module *owner, > + const void *data, size_t datalen, gfp_t gfp, > + ssize_t (*read)(char *buffer, loff_t offset, size_t count, > + const void *data, size_t datalen), > + void (*free)(const void *data)) > +{ > + static atomic_t devcd_count = ATOMIC_INIT(0); > + struct devcd_entry *devcd; > + struct device *existing; > + > + existing = class_find_device(&devcd_class, NULL, dev, > + devcd_match_failing); > + if (existing) { > + put_device(existing); > + return; > + } > + > + if (!try_module_get(owner)) > + return; > + > + devcd = kzalloc(sizeof(*devcd), gfp); > + if (!devcd) > + goto put_module; > + > + devcd->owner = owner; > + devcd->data = data; > + devcd->datalen = datalen; > + devcd->read = read; > + devcd->free = free; > + devcd->failing_dev = get_device(dev); > + > + device_initialize(&devcd->devcd_dev); > + > + dev_set_name(&devcd->devcd_dev, "devcd%d", > + atomic_inc_return(&devcd_count)); > + devcd->devcd_dev.class =&devcd_class; > + > + if (device_add(&devcd->devcd_dev)) > + goto put_device; > + > + if (sysfs_create_link(&devcd->devcd_dev.kobj,&dev->kobj, > + "failing_device")) > + /* nothing - symlink will be missing */; > + > + if (sysfs_create_link(&dev->kobj,&devcd->devcd_dev.kobj, > + "dev_coredump")) > + /* nothing - symlink will be missing */; The class is called "devcoredump" so you may want to be consistent here and get rid of the underscore. Regards, Arend