Commit 1af115d6 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'driver-core-4.3-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core

Pull driver core updates from Greg KH:
 "Here is the new patches for the driver core / sysfs for 4.3-rc1.

  Very small number of changes here, all the details are in the
  shortlog, nothing major happening at all this kernel release, which is
  nice to see"

* tag 'driver-core-4.3-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core:
  bus: subsys: update return type of ->remove_dev() to void
  driver core: correct device's shutdown order
  driver core: fix docbook for device_private.device
  selftests: firmware: skip timeout checks for kernels without user mode helper
  kernel, cpu: Remove bogus __ref annotations
  cpu: Remove bogus __ref annotation of cpu_subsys_online()
  firmware: fix wrong memory deallocation in fw_add_devm_name()
  sysfs.txt: update show method notes about sprintf/snprintf/scnprintf usage
  devres: fix devres_get()
parents 1c00038c 71db87ba
...@@ -212,7 +212,10 @@ Other notes: ...@@ -212,7 +212,10 @@ Other notes:
- show() methods should return the number of bytes printed into the - show() methods should return the number of bytes printed into the
buffer. This is the return value of scnprintf(). buffer. This is the return value of scnprintf().
- show() should always use scnprintf(). - show() must not use snprintf() when formatting the value to be
returned to user space. If you can guarantee that an overflow
will never happen you can use sprintf() otherwise you must use
scnprintf().
- store() should return the number of bytes used from the buffer. If the - store() should return the number of bytes used from the buffer. If the
entire buffer has been used, just return the count argument. entire buffer has been used, just return the count argument.
......
...@@ -355,13 +355,12 @@ static int sq_dev_add(struct device *dev, struct subsys_interface *sif) ...@@ -355,13 +355,12 @@ static int sq_dev_add(struct device *dev, struct subsys_interface *sif)
return error; return error;
} }
static int sq_dev_remove(struct device *dev, struct subsys_interface *sif) static void sq_dev_remove(struct device *dev, struct subsys_interface *sif)
{ {
unsigned int cpu = dev->id; unsigned int cpu = dev->id;
struct kobject *kobj = sq_kobject[cpu]; struct kobject *kobj = sq_kobject[cpu];
kobject_put(kobj); kobject_put(kobj);
return 0;
} }
static struct subsys_interface sq_interface = { static struct subsys_interface sq_interface = {
......
...@@ -198,16 +198,13 @@ static int hv_stats_device_add(struct device *dev, struct subsys_interface *sif) ...@@ -198,16 +198,13 @@ static int hv_stats_device_add(struct device *dev, struct subsys_interface *sif)
return err; return err;
} }
static int hv_stats_device_remove(struct device *dev, static void hv_stats_device_remove(struct device *dev,
struct subsys_interface *sif) struct subsys_interface *sif)
{ {
int cpu = dev->id; int cpu = dev->id;
if (!cpu_online(cpu)) if (cpu_online(cpu))
return 0; sysfs_remove_file(&dev->kobj, &dev_attr_hv_stats.attr);
sysfs_remove_file(&dev->kobj, &dev_attr_hv_stats.attr);
return 0;
} }
......
...@@ -377,17 +377,16 @@ static int mc_device_add(struct device *dev, struct subsys_interface *sif) ...@@ -377,17 +377,16 @@ static int mc_device_add(struct device *dev, struct subsys_interface *sif)
return err; return err;
} }
static int mc_device_remove(struct device *dev, struct subsys_interface *sif) static void mc_device_remove(struct device *dev, struct subsys_interface *sif)
{ {
int cpu = dev->id; int cpu = dev->id;
if (!cpu_online(cpu)) if (!cpu_online(cpu))
return 0; return;
pr_debug("CPU%d removed\n", cpu); pr_debug("CPU%d removed\n", cpu);
microcode_fini_cpu(cpu); microcode_fini_cpu(cpu);
sysfs_remove_group(&dev->kobj, &mc_attr_group); sysfs_remove_group(&dev->kobj, &mc_attr_group);
return 0;
} }
static struct subsys_interface mc_cpu_interface = { static struct subsys_interface mc_cpu_interface = {
......
...@@ -63,7 +63,7 @@ struct driver_private { ...@@ -63,7 +63,7 @@ struct driver_private {
* binding of drivers which were unable to get all the resources needed by * binding of drivers which were unable to get all the resources needed by
* the device; typically because it depends on another driver getting * the device; typically because it depends on another driver getting
* probed first. * probed first.
* @device - pointer back to the struct class that this structure is * @device - pointer back to the struct device that this structure is
* associated with. * associated with.
* *
* Nothing outside of the driver core should ever touch these fields. * Nothing outside of the driver core should ever touch these fields.
...@@ -134,6 +134,7 @@ extern int devres_release_all(struct device *dev); ...@@ -134,6 +134,7 @@ extern int devres_release_all(struct device *dev);
/* /sys/devices directory */ /* /sys/devices directory */
extern struct kset *devices_kset; extern struct kset *devices_kset;
extern void devices_kset_move_last(struct device *dev);
#if defined(CONFIG_MODULES) && defined(CONFIG_SYSFS) #if defined(CONFIG_MODULES) && defined(CONFIG_SYSFS)
extern void module_add_driver(struct module *mod, struct device_driver *drv); extern void module_add_driver(struct module *mod, struct device_driver *drv);
......
...@@ -533,6 +533,52 @@ static DEVICE_ATTR_RO(dev); ...@@ -533,6 +533,52 @@ static DEVICE_ATTR_RO(dev);
/* /sys/devices/ */ /* /sys/devices/ */
struct kset *devices_kset; struct kset *devices_kset;
/**
* devices_kset_move_before - Move device in the devices_kset's list.
* @deva: Device to move.
* @devb: Device @deva should come before.
*/
static void devices_kset_move_before(struct device *deva, struct device *devb)
{
if (!devices_kset)
return;
pr_debug("devices_kset: Moving %s before %s\n",
dev_name(deva), dev_name(devb));
spin_lock(&devices_kset->list_lock);
list_move_tail(&deva->kobj.entry, &devb->kobj.entry);
spin_unlock(&devices_kset->list_lock);
}
/**
* devices_kset_move_after - Move device in the devices_kset's list.
* @deva: Device to move
* @devb: Device @deva should come after.
*/
static void devices_kset_move_after(struct device *deva, struct device *devb)
{
if (!devices_kset)
return;
pr_debug("devices_kset: Moving %s after %s\n",
dev_name(deva), dev_name(devb));
spin_lock(&devices_kset->list_lock);
list_move(&deva->kobj.entry, &devb->kobj.entry);
spin_unlock(&devices_kset->list_lock);
}
/**
* devices_kset_move_last - move the device to the end of devices_kset's list.
* @dev: device to move
*/
void devices_kset_move_last(struct device *dev)
{
if (!devices_kset)
return;
pr_debug("devices_kset: Moving %s to end of list\n", dev_name(dev));
spin_lock(&devices_kset->list_lock);
list_move_tail(&dev->kobj.entry, &devices_kset->list);
spin_unlock(&devices_kset->list_lock);
}
/** /**
* device_create_file - create sysfs attribute file for device. * device_create_file - create sysfs attribute file for device.
* @dev: device. * @dev: device.
...@@ -1923,12 +1969,15 @@ int device_move(struct device *dev, struct device *new_parent, ...@@ -1923,12 +1969,15 @@ int device_move(struct device *dev, struct device *new_parent,
break; break;
case DPM_ORDER_DEV_AFTER_PARENT: case DPM_ORDER_DEV_AFTER_PARENT:
device_pm_move_after(dev, new_parent); device_pm_move_after(dev, new_parent);
devices_kset_move_after(dev, new_parent);
break; break;
case DPM_ORDER_PARENT_BEFORE_DEV: case DPM_ORDER_PARENT_BEFORE_DEV:
device_pm_move_before(new_parent, dev); device_pm_move_before(new_parent, dev);
devices_kset_move_before(new_parent, dev);
break; break;
case DPM_ORDER_DEV_LAST: case DPM_ORDER_DEV_LAST:
device_pm_move_last(dev); device_pm_move_last(dev);
devices_kset_move_last(dev);
break; break;
} }
......
...@@ -41,7 +41,7 @@ static void change_cpu_under_node(struct cpu *cpu, ...@@ -41,7 +41,7 @@ static void change_cpu_under_node(struct cpu *cpu,
cpu->node_id = to_nid; cpu->node_id = to_nid;
} }
static int __ref cpu_subsys_online(struct device *dev) static int cpu_subsys_online(struct device *dev)
{ {
struct cpu *cpu = container_of(dev, struct cpu, dev); struct cpu *cpu = container_of(dev, struct cpu, dev);
int cpuid = dev->id; int cpuid = dev->id;
......
...@@ -304,6 +304,14 @@ static int really_probe(struct device *dev, struct device_driver *drv) ...@@ -304,6 +304,14 @@ static int really_probe(struct device *dev, struct device_driver *drv)
goto probe_failed; goto probe_failed;
} }
/*
* Ensure devices are listed in devices_kset in correct order
* It's important to move Dev to the end of devices_kset before
* calling .probe, because it could be recursive and parent Dev
* should always go first
*/
devices_kset_move_last(dev);
if (dev->bus->probe) { if (dev->bus->probe) {
ret = dev->bus->probe(dev); ret = dev->bus->probe(dev);
if (ret) if (ret)
......
...@@ -297,10 +297,10 @@ void * devres_get(struct device *dev, void *new_res, ...@@ -297,10 +297,10 @@ void * devres_get(struct device *dev, void *new_res,
if (!dr) { if (!dr) {
add_dr(dev, &new_dr->node); add_dr(dev, &new_dr->node);
dr = new_dr; dr = new_dr;
new_dr = NULL; new_res = NULL;
} }
spin_unlock_irqrestore(&dev->devres_lock, flags); spin_unlock_irqrestore(&dev->devres_lock, flags);
devres_free(new_dr); devres_free(new_res);
return dr->data; return dr->data;
} }
......
...@@ -443,7 +443,7 @@ static int fw_add_devm_name(struct device *dev, const char *name) ...@@ -443,7 +443,7 @@ static int fw_add_devm_name(struct device *dev, const char *name)
return -ENOMEM; return -ENOMEM;
fwn->name = kstrdup_const(name, GFP_KERNEL); fwn->name = kstrdup_const(name, GFP_KERNEL);
if (!fwn->name) { if (!fwn->name) {
kfree(fwn); devres_free(fwn);
return -ENOMEM; return -ENOMEM;
} }
......
...@@ -1521,13 +1521,13 @@ static int __cpufreq_remove_dev_finish(struct device *dev) ...@@ -1521,13 +1521,13 @@ static int __cpufreq_remove_dev_finish(struct device *dev)
* *
* Removes the cpufreq interface for a CPU device. * Removes the cpufreq interface for a CPU device.
*/ */
static int cpufreq_remove_dev(struct device *dev, struct subsys_interface *sif) static void cpufreq_remove_dev(struct device *dev, struct subsys_interface *sif)
{ {
unsigned int cpu = dev->id; unsigned int cpu = dev->id;
struct cpufreq_policy *policy = per_cpu(cpufreq_cpu_data, cpu); struct cpufreq_policy *policy = per_cpu(cpufreq_cpu_data, cpu);
if (!policy) if (!policy)
return 0; return;
if (cpu_online(cpu)) { if (cpu_online(cpu)) {
__cpufreq_remove_dev_prepare(dev); __cpufreq_remove_dev_prepare(dev);
...@@ -1538,7 +1538,7 @@ static int cpufreq_remove_dev(struct device *dev, struct subsys_interface *sif) ...@@ -1538,7 +1538,7 @@ static int cpufreq_remove_dev(struct device *dev, struct subsys_interface *sif)
if (cpumask_empty(policy->real_cpus)) { if (cpumask_empty(policy->real_cpus)) {
cpufreq_policy_free(policy, true); cpufreq_policy_free(policy, true);
return 0; return;
} }
if (cpu != policy->kobj_cpu) { if (cpu != policy->kobj_cpu) {
...@@ -1557,8 +1557,6 @@ static int cpufreq_remove_dev(struct device *dev, struct subsys_interface *sif) ...@@ -1557,8 +1557,6 @@ static int cpufreq_remove_dev(struct device *dev, struct subsys_interface *sif)
policy->kobj_cpu = new_cpu; policy->kobj_cpu = new_cpu;
WARN_ON(kobject_move(&policy->kobj, &new_dev->kobj)); WARN_ON(kobject_move(&policy->kobj, &new_dev->kobj));
} }
return 0;
} }
static void handle_update(struct work_struct *work) static void handle_update(struct work_struct *work)
......
...@@ -396,7 +396,7 @@ static int rionet_close(struct net_device *ndev) ...@@ -396,7 +396,7 @@ static int rionet_close(struct net_device *ndev)
return 0; return 0;
} }
static int rionet_remove_dev(struct device *dev, struct subsys_interface *sif) static void rionet_remove_dev(struct device *dev, struct subsys_interface *sif)
{ {
struct rio_dev *rdev = to_rio_dev(dev); struct rio_dev *rdev = to_rio_dev(dev);
unsigned char netid = rdev->net->hport->id; unsigned char netid = rdev->net->hport->id;
...@@ -416,8 +416,6 @@ static int rionet_remove_dev(struct device *dev, struct subsys_interface *sif) ...@@ -416,8 +416,6 @@ static int rionet_remove_dev(struct device *dev, struct subsys_interface *sif)
} }
} }
} }
return 0;
} }
static void rionet_get_drvinfo(struct net_device *ndev, static void rionet_get_drvinfo(struct net_device *ndev,
......
...@@ -341,7 +341,7 @@ struct subsys_interface { ...@@ -341,7 +341,7 @@ struct subsys_interface {
struct bus_type *subsys; struct bus_type *subsys;
struct list_head node; struct list_head node;
int (*add_dev)(struct device *dev, struct subsys_interface *sif); int (*add_dev)(struct device *dev, struct subsys_interface *sif);
int (*remove_dev)(struct device *dev, struct subsys_interface *sif); void (*remove_dev)(struct device *dev, struct subsys_interface *sif);
}; };
int subsys_interface_register(struct subsys_interface *sif); int subsys_interface_register(struct subsys_interface *sif);
......
...@@ -206,7 +206,7 @@ EXPORT_SYMBOL_GPL(cpu_hotplug_enable); ...@@ -206,7 +206,7 @@ EXPORT_SYMBOL_GPL(cpu_hotplug_enable);
#endif /* CONFIG_HOTPLUG_CPU */ #endif /* CONFIG_HOTPLUG_CPU */
/* Need to know about CPUs going up/down? */ /* Need to know about CPUs going up/down? */
int __ref register_cpu_notifier(struct notifier_block *nb) int register_cpu_notifier(struct notifier_block *nb)
{ {
int ret; int ret;
cpu_maps_update_begin(); cpu_maps_update_begin();
...@@ -215,7 +215,7 @@ int __ref register_cpu_notifier(struct notifier_block *nb) ...@@ -215,7 +215,7 @@ int __ref register_cpu_notifier(struct notifier_block *nb)
return ret; return ret;
} }
int __ref __register_cpu_notifier(struct notifier_block *nb) int __register_cpu_notifier(struct notifier_block *nb)
{ {
return raw_notifier_chain_register(&cpu_chain, nb); return raw_notifier_chain_register(&cpu_chain, nb);
} }
...@@ -245,7 +245,7 @@ static void cpu_notify_nofail(unsigned long val, void *v) ...@@ -245,7 +245,7 @@ static void cpu_notify_nofail(unsigned long val, void *v)
EXPORT_SYMBOL(register_cpu_notifier); EXPORT_SYMBOL(register_cpu_notifier);
EXPORT_SYMBOL(__register_cpu_notifier); EXPORT_SYMBOL(__register_cpu_notifier);
void __ref unregister_cpu_notifier(struct notifier_block *nb) void unregister_cpu_notifier(struct notifier_block *nb)
{ {
cpu_maps_update_begin(); cpu_maps_update_begin();
raw_notifier_chain_unregister(&cpu_chain, nb); raw_notifier_chain_unregister(&cpu_chain, nb);
...@@ -253,7 +253,7 @@ void __ref unregister_cpu_notifier(struct notifier_block *nb) ...@@ -253,7 +253,7 @@ void __ref unregister_cpu_notifier(struct notifier_block *nb)
} }
EXPORT_SYMBOL(unregister_cpu_notifier); EXPORT_SYMBOL(unregister_cpu_notifier);
void __ref __unregister_cpu_notifier(struct notifier_block *nb) void __unregister_cpu_notifier(struct notifier_block *nb)
{ {
raw_notifier_chain_unregister(&cpu_chain, nb); raw_notifier_chain_unregister(&cpu_chain, nb);
} }
...@@ -330,7 +330,7 @@ struct take_cpu_down_param { ...@@ -330,7 +330,7 @@ struct take_cpu_down_param {
}; };
/* Take this CPU down. */ /* Take this CPU down. */
static int __ref take_cpu_down(void *_param) static int take_cpu_down(void *_param)
{ {
struct take_cpu_down_param *param = _param; struct take_cpu_down_param *param = _param;
int err; int err;
...@@ -349,7 +349,7 @@ static int __ref take_cpu_down(void *_param) ...@@ -349,7 +349,7 @@ static int __ref take_cpu_down(void *_param)
} }
/* Requires cpu_add_remove_lock to be held */ /* Requires cpu_add_remove_lock to be held */
static int __ref _cpu_down(unsigned int cpu, int tasks_frozen) static int _cpu_down(unsigned int cpu, int tasks_frozen)
{ {
int err, nr_calls = 0; int err, nr_calls = 0;
void *hcpu = (void *)(long)cpu; void *hcpu = (void *)(long)cpu;
...@@ -443,7 +443,7 @@ static int __ref _cpu_down(unsigned int cpu, int tasks_frozen) ...@@ -443,7 +443,7 @@ static int __ref _cpu_down(unsigned int cpu, int tasks_frozen)
return err; return err;
} }
int __ref cpu_down(unsigned int cpu) int cpu_down(unsigned int cpu)
{ {
int err; int err;
...@@ -633,7 +633,7 @@ void __weak arch_enable_nonboot_cpus_end(void) ...@@ -633,7 +633,7 @@ void __weak arch_enable_nonboot_cpus_end(void)
{ {
} }
void __ref enable_nonboot_cpus(void) void enable_nonboot_cpus(void)
{ {
int cpu, error; int cpu, error;
......
...@@ -9,7 +9,15 @@ modprobe test_firmware ...@@ -9,7 +9,15 @@ modprobe test_firmware
DIR=/sys/devices/virtual/misc/test_firmware DIR=/sys/devices/virtual/misc/test_firmware
OLD_TIMEOUT=$(cat /sys/class/firmware/timeout) # CONFIG_FW_LOADER_USER_HELPER has a sysfs class under /sys/class/firmware/
# These days no one enables CONFIG_FW_LOADER_USER_HELPER so check for that
# as an indicator for CONFIG_FW_LOADER_USER_HELPER.
HAS_FW_LOADER_USER_HELPER=$(if [ -d /sys/class/firmware/ ]; then echo yes; else echo no; fi)
if [ "$HAS_FW_LOADER_USER_HELPER" = "yes" ]; then
OLD_TIMEOUT=$(cat /sys/class/firmware/timeout)
fi
OLD_FWPATH=$(cat /sys/module/firmware_class/parameters/path) OLD_FWPATH=$(cat /sys/module/firmware_class/parameters/path)
FWPATH=$(mktemp -d) FWPATH=$(mktemp -d)
...@@ -17,7 +25,9 @@ FW="$FWPATH/test-firmware.bin" ...@@ -17,7 +25,9 @@ FW="$FWPATH/test-firmware.bin"
test_finish() test_finish()
{ {
echo "$OLD_TIMEOUT" >/sys/class/firmware/timeout if [ "$HAS_FW_LOADER_USER_HELPER" = "yes" ]; then
echo "$OLD_TIMEOUT" >/sys/class/firmware/timeout
fi
echo -n "$OLD_PATH" >/sys/module/firmware_class/parameters/path echo -n "$OLD_PATH" >/sys/module/firmware_class/parameters/path
rm -f "$FW" rm -f "$FW"
rmdir "$FWPATH" rmdir "$FWPATH"
...@@ -25,8 +35,11 @@ test_finish() ...@@ -25,8 +35,11 @@ test_finish()
trap "test_finish" EXIT trap "test_finish" EXIT
# Turn down the timeout so failures don't take so long. if [ "$HAS_FW_LOADER_USER_HELPER" = "yes" ]; then
echo 1 >/sys/class/firmware/timeout # Turn down the timeout so failures don't take so long.
echo 1 >/sys/class/firmware/timeout
fi
# Set the kernel search path. # Set the kernel search path.
echo -n "$FWPATH" >/sys/module/firmware_class/parameters/path echo -n "$FWPATH" >/sys/module/firmware_class/parameters/path
...@@ -41,7 +54,9 @@ if diff -q "$FW" /dev/test_firmware >/dev/null ; then ...@@ -41,7 +54,9 @@ if diff -q "$FW" /dev/test_firmware >/dev/null ; then
echo "$0: firmware was not expected to match" >&2 echo "$0: firmware was not expected to match" >&2
exit 1 exit 1
else else
echo "$0: timeout works" if [ "$HAS_FW_LOADER_USER_HELPER" = "yes" ]; then
echo "$0: timeout works"
fi
fi fi
# This should succeed via kernel load or will fail after 1 second after # This should succeed via kernel load or will fail after 1 second after
......
...@@ -9,7 +9,17 @@ modprobe test_firmware ...@@ -9,7 +9,17 @@ modprobe test_firmware
DIR=/sys/devices/virtual/misc/test_firmware DIR=/sys/devices/virtual/misc/test_firmware
OLD_TIMEOUT=$(cat /sys/class/firmware/timeout) # CONFIG_FW_LOADER_USER_HELPER has a sysfs class under /sys/class/firmware/
# These days no one enables CONFIG_FW_LOADER_USER_HELPER so check for that
# as an indicator for CONFIG_FW_LOADER_USER_HELPER.
HAS_FW_LOADER_USER_HELPER=$(if [ -d /sys/class/firmware/ ]; then echo yes; else echo no; fi)
if [ "$HAS_FW_LOADER_USER_HELPER" = "yes" ]; then
OLD_TIMEOUT=$(cat /sys/class/firmware/timeout)
else
echo "usermode helper disabled so ignoring test"
exit 0
fi
FWPATH=$(mktemp -d) FWPATH=$(mktemp -d)
FW="$FWPATH/test-firmware.bin" FW="$FWPATH/test-firmware.bin"
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment