mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-21 14:11:20 +00:00
Driver core patches for 5.1-rc1
Here is the big driver core patchset for 5.1-rc1 More patches than "normal" here this merge window, due to some work in the driver core by Alexander Duyck to rework the async probe functionality to work better for a number of devices, and independant work from Rafael for the device link functionality to make it work "correctly". Also in here is: - lots of BUS_ATTR() removals, the macro is about to go away - firmware test fixups - ihex fixups and simplification - component additions (also includes i915 patches) - lots of minor coding style fixups and cleanups. All of these have been in linux-next for a while with no reported issues. Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> -----BEGIN PGP SIGNATURE----- iG0EABECAC0WIQT0tgzFv3jCIUoxPcsxR9QN2y37KQUCXH+euQ8cZ3JlZ0Brcm9h aC5jb20ACgkQMUfUDdst+ynyTgCfbV8CLums843sBnT8NnWrTMTdTCcAn1K4re0m ep8g+6oRLxJy414hogxQ =bLs2 -----END PGP SIGNATURE----- Merge tag 'driver-core-5.1-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core Pull driver core updates from Greg KH: "Here is the big driver core patchset for 5.1-rc1 More patches than "normal" here this merge window, due to some work in the driver core by Alexander Duyck to rework the async probe functionality to work better for a number of devices, and independant work from Rafael for the device link functionality to make it work "correctly". Also in here is: - lots of BUS_ATTR() removals, the macro is about to go away - firmware test fixups - ihex fixups and simplification - component additions (also includes i915 patches) - lots of minor coding style fixups and cleanups. All of these have been in linux-next for a while with no reported issues" * tag 'driver-core-5.1-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core: (65 commits) driver core: platform: remove misleading err_alloc label platform: set of_node in platform_device_register_full() firmware: hardcode the debug message for -ENOENT driver core: Add missing description of new struct device_link field driver core: Fix PM-runtime for links added during consumer probe drivers/component: kerneldoc polish async: Add cmdline option to specify drivers to be async probed driver core: Fix possible supplier PM-usage counter imbalance PM-runtime: Fix __pm_runtime_set_status() race with runtime resume driver: platform: Support parsing GpioInt 0 in platform_get_irq() selftests: firmware: fix verify_reqs() return value Revert "selftests: firmware: remove use of non-standard diff -Z option" Revert "selftests: firmware: add CONFIG_FW_LOADER_USER_HELPER_FALLBACK to config" device: Fix comment for driver_data in struct device kernfs: Allocating memory for kernfs_iattrs with kmem_cache. sysfs: remove unused include of kernfs-internal.h driver core: Postpone DMA tear-down until after devres release driver core: Document limitation related to DL_FLAG_RPM_ACTIVE PM-runtime: Take suppliers into account in __pm_runtime_set_status() device.h: Add __cold to dev_<level> logging functions ...
This commit is contained in:
commit
e431f2d74e
52 changed files with 1096 additions and 413 deletions
|
@ -1514,6 +1514,90 @@ bool queue_work_on(int cpu, struct workqueue_struct *wq,
|
|||
}
|
||||
EXPORT_SYMBOL(queue_work_on);
|
||||
|
||||
/**
|
||||
* workqueue_select_cpu_near - Select a CPU based on NUMA node
|
||||
* @node: NUMA node ID that we want to select a CPU from
|
||||
*
|
||||
* This function will attempt to find a "random" cpu available on a given
|
||||
* node. If there are no CPUs available on the given node it will return
|
||||
* WORK_CPU_UNBOUND indicating that we should just schedule to any
|
||||
* available CPU if we need to schedule this work.
|
||||
*/
|
||||
static int workqueue_select_cpu_near(int node)
|
||||
{
|
||||
int cpu;
|
||||
|
||||
/* No point in doing this if NUMA isn't enabled for workqueues */
|
||||
if (!wq_numa_enabled)
|
||||
return WORK_CPU_UNBOUND;
|
||||
|
||||
/* Delay binding to CPU if node is not valid or online */
|
||||
if (node < 0 || node >= MAX_NUMNODES || !node_online(node))
|
||||
return WORK_CPU_UNBOUND;
|
||||
|
||||
/* Use local node/cpu if we are already there */
|
||||
cpu = raw_smp_processor_id();
|
||||
if (node == cpu_to_node(cpu))
|
||||
return cpu;
|
||||
|
||||
/* Use "random" otherwise know as "first" online CPU of node */
|
||||
cpu = cpumask_any_and(cpumask_of_node(node), cpu_online_mask);
|
||||
|
||||
/* If CPU is valid return that, otherwise just defer */
|
||||
return cpu < nr_cpu_ids ? cpu : WORK_CPU_UNBOUND;
|
||||
}
|
||||
|
||||
/**
|
||||
* queue_work_node - queue work on a "random" cpu for a given NUMA node
|
||||
* @node: NUMA node that we are targeting the work for
|
||||
* @wq: workqueue to use
|
||||
* @work: work to queue
|
||||
*
|
||||
* We queue the work to a "random" CPU within a given NUMA node. The basic
|
||||
* idea here is to provide a way to somehow associate work with a given
|
||||
* NUMA node.
|
||||
*
|
||||
* This function will only make a best effort attempt at getting this onto
|
||||
* the right NUMA node. If no node is requested or the requested node is
|
||||
* offline then we just fall back to standard queue_work behavior.
|
||||
*
|
||||
* Currently the "random" CPU ends up being the first available CPU in the
|
||||
* intersection of cpu_online_mask and the cpumask of the node, unless we
|
||||
* are running on the node. In that case we just use the current CPU.
|
||||
*
|
||||
* Return: %false if @work was already on a queue, %true otherwise.
|
||||
*/
|
||||
bool queue_work_node(int node, struct workqueue_struct *wq,
|
||||
struct work_struct *work)
|
||||
{
|
||||
unsigned long flags;
|
||||
bool ret = false;
|
||||
|
||||
/*
|
||||
* This current implementation is specific to unbound workqueues.
|
||||
* Specifically we only return the first available CPU for a given
|
||||
* node instead of cycling through individual CPUs within the node.
|
||||
*
|
||||
* If this is used with a per-cpu workqueue then the logic in
|
||||
* workqueue_select_cpu_near would need to be updated to allow for
|
||||
* some round robin type logic.
|
||||
*/
|
||||
WARN_ON_ONCE(!(wq->flags & WQ_UNBOUND));
|
||||
|
||||
local_irq_save(flags);
|
||||
|
||||
if (!test_and_set_bit(WORK_STRUCT_PENDING_BIT, work_data_bits(work))) {
|
||||
int cpu = workqueue_select_cpu_near(node);
|
||||
|
||||
__queue_work(cpu, wq, work);
|
||||
ret = true;
|
||||
}
|
||||
|
||||
local_irq_restore(flags);
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(queue_work_node);
|
||||
|
||||
void delayed_work_timer_fn(struct timer_list *t)
|
||||
{
|
||||
struct delayed_work *dwork = from_timer(dwork, t, timer);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue