cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

devres.c (31694B)


      1// SPDX-License-Identifier: GPL-2.0
      2/*
      3 * drivers/base/devres.c - device resource management
      4 *
      5 * Copyright (c) 2006  SUSE Linux Products GmbH
      6 * Copyright (c) 2006  Tejun Heo <teheo@suse.de>
      7 */
      8
      9#include <linux/device.h>
     10#include <linux/module.h>
     11#include <linux/slab.h>
     12#include <linux/percpu.h>
     13
     14#include <asm/sections.h>
     15
     16#include "base.h"
     17#include "trace.h"
     18
     19struct devres_node {
     20	struct list_head		entry;
     21	dr_release_t			release;
     22	const char			*name;
     23	size_t				size;
     24};
     25
     26struct devres {
     27	struct devres_node		node;
     28	/*
     29	 * Some archs want to perform DMA into kmalloc caches
     30	 * and need a guaranteed alignment larger than
     31	 * the alignment of a 64-bit integer.
     32	 * Thus we use ARCH_KMALLOC_MINALIGN here and get exactly the same
     33	 * buffer alignment as if it was allocated by plain kmalloc().
     34	 */
     35	u8 __aligned(ARCH_KMALLOC_MINALIGN) data[];
     36};
     37
     38struct devres_group {
     39	struct devres_node		node[2];
     40	void				*id;
     41	int				color;
     42	/* -- 8 pointers */
     43};
     44
     45static void set_node_dbginfo(struct devres_node *node, const char *name,
     46			     size_t size)
     47{
     48	node->name = name;
     49	node->size = size;
     50}
     51
     52#ifdef CONFIG_DEBUG_DEVRES
     53static int log_devres = 0;
     54module_param_named(log, log_devres, int, S_IRUGO | S_IWUSR);
     55
     56static void devres_dbg(struct device *dev, struct devres_node *node,
     57		       const char *op)
     58{
     59	if (unlikely(log_devres))
     60		dev_err(dev, "DEVRES %3s %p %s (%zu bytes)\n",
     61			op, node, node->name, node->size);
     62}
     63#else /* CONFIG_DEBUG_DEVRES */
     64#define devres_dbg(dev, node, op)	do {} while (0)
     65#endif /* CONFIG_DEBUG_DEVRES */
     66
     67static void devres_log(struct device *dev, struct devres_node *node,
     68		       const char *op)
     69{
     70	trace_devres_log(dev, op, node, node->name, node->size);
     71	devres_dbg(dev, node, op);
     72}
     73
     74/*
     75 * Release functions for devres group.  These callbacks are used only
     76 * for identification.
     77 */
     78static void group_open_release(struct device *dev, void *res)
     79{
     80	/* noop */
     81}
     82
     83static void group_close_release(struct device *dev, void *res)
     84{
     85	/* noop */
     86}
     87
     88static struct devres_group * node_to_group(struct devres_node *node)
     89{
     90	if (node->release == &group_open_release)
     91		return container_of(node, struct devres_group, node[0]);
     92	if (node->release == &group_close_release)
     93		return container_of(node, struct devres_group, node[1]);
     94	return NULL;
     95}
     96
     97static bool check_dr_size(size_t size, size_t *tot_size)
     98{
     99	/* We must catch any near-SIZE_MAX cases that could overflow. */
    100	if (unlikely(check_add_overflow(sizeof(struct devres),
    101					size, tot_size)))
    102		return false;
    103
    104	return true;
    105}
    106
    107static __always_inline struct devres * alloc_dr(dr_release_t release,
    108						size_t size, gfp_t gfp, int nid)
    109{
    110	size_t tot_size;
    111	struct devres *dr;
    112
    113	if (!check_dr_size(size, &tot_size))
    114		return NULL;
    115
    116	dr = kmalloc_node_track_caller(tot_size, gfp, nid);
    117	if (unlikely(!dr))
    118		return NULL;
    119
    120	memset(dr, 0, offsetof(struct devres, data));
    121
    122	INIT_LIST_HEAD(&dr->node.entry);
    123	dr->node.release = release;
    124	return dr;
    125}
    126
    127static void add_dr(struct device *dev, struct devres_node *node)
    128{
    129	devres_log(dev, node, "ADD");
    130	BUG_ON(!list_empty(&node->entry));
    131	list_add_tail(&node->entry, &dev->devres_head);
    132}
    133
    134static void replace_dr(struct device *dev,
    135		       struct devres_node *old, struct devres_node *new)
    136{
    137	devres_log(dev, old, "REPLACE");
    138	BUG_ON(!list_empty(&new->entry));
    139	list_replace(&old->entry, &new->entry);
    140}
    141
    142/**
    143 * __devres_alloc_node - Allocate device resource data
    144 * @release: Release function devres will be associated with
    145 * @size: Allocation size
    146 * @gfp: Allocation flags
    147 * @nid: NUMA node
    148 * @name: Name of the resource
    149 *
    150 * Allocate devres of @size bytes.  The allocated area is zeroed, then
    151 * associated with @release.  The returned pointer can be passed to
    152 * other devres_*() functions.
    153 *
    154 * RETURNS:
    155 * Pointer to allocated devres on success, NULL on failure.
    156 */
    157void *__devres_alloc_node(dr_release_t release, size_t size, gfp_t gfp, int nid,
    158			  const char *name)
    159{
    160	struct devres *dr;
    161
    162	dr = alloc_dr(release, size, gfp | __GFP_ZERO, nid);
    163	if (unlikely(!dr))
    164		return NULL;
    165	set_node_dbginfo(&dr->node, name, size);
    166	return dr->data;
    167}
    168EXPORT_SYMBOL_GPL(__devres_alloc_node);
    169
    170/**
    171 * devres_for_each_res - Resource iterator
    172 * @dev: Device to iterate resource from
    173 * @release: Look for resources associated with this release function
    174 * @match: Match function (optional)
    175 * @match_data: Data for the match function
    176 * @fn: Function to be called for each matched resource.
    177 * @data: Data for @fn, the 3rd parameter of @fn
    178 *
    179 * Call @fn for each devres of @dev which is associated with @release
    180 * and for which @match returns 1.
    181 *
    182 * RETURNS:
    183 * 	void
    184 */
    185void devres_for_each_res(struct device *dev, dr_release_t release,
    186			dr_match_t match, void *match_data,
    187			void (*fn)(struct device *, void *, void *),
    188			void *data)
    189{
    190	struct devres_node *node;
    191	struct devres_node *tmp;
    192	unsigned long flags;
    193
    194	if (!fn)
    195		return;
    196
    197	spin_lock_irqsave(&dev->devres_lock, flags);
    198	list_for_each_entry_safe_reverse(node, tmp,
    199			&dev->devres_head, entry) {
    200		struct devres *dr = container_of(node, struct devres, node);
    201
    202		if (node->release != release)
    203			continue;
    204		if (match && !match(dev, dr->data, match_data))
    205			continue;
    206		fn(dev, dr->data, data);
    207	}
    208	spin_unlock_irqrestore(&dev->devres_lock, flags);
    209}
    210EXPORT_SYMBOL_GPL(devres_for_each_res);
    211
    212/**
    213 * devres_free - Free device resource data
    214 * @res: Pointer to devres data to free
    215 *
    216 * Free devres created with devres_alloc().
    217 */
    218void devres_free(void *res)
    219{
    220	if (res) {
    221		struct devres *dr = container_of(res, struct devres, data);
    222
    223		BUG_ON(!list_empty(&dr->node.entry));
    224		kfree(dr);
    225	}
    226}
    227EXPORT_SYMBOL_GPL(devres_free);
    228
    229/**
    230 * devres_add - Register device resource
    231 * @dev: Device to add resource to
    232 * @res: Resource to register
    233 *
    234 * Register devres @res to @dev.  @res should have been allocated
    235 * using devres_alloc().  On driver detach, the associated release
    236 * function will be invoked and devres will be freed automatically.
    237 */
    238void devres_add(struct device *dev, void *res)
    239{
    240	struct devres *dr = container_of(res, struct devres, data);
    241	unsigned long flags;
    242
    243	spin_lock_irqsave(&dev->devres_lock, flags);
    244	add_dr(dev, &dr->node);
    245	spin_unlock_irqrestore(&dev->devres_lock, flags);
    246}
    247EXPORT_SYMBOL_GPL(devres_add);
    248
    249static struct devres *find_dr(struct device *dev, dr_release_t release,
    250			      dr_match_t match, void *match_data)
    251{
    252	struct devres_node *node;
    253
    254	list_for_each_entry_reverse(node, &dev->devres_head, entry) {
    255		struct devres *dr = container_of(node, struct devres, node);
    256
    257		if (node->release != release)
    258			continue;
    259		if (match && !match(dev, dr->data, match_data))
    260			continue;
    261		return dr;
    262	}
    263
    264	return NULL;
    265}
    266
    267/**
    268 * devres_find - Find device resource
    269 * @dev: Device to lookup resource from
    270 * @release: Look for resources associated with this release function
    271 * @match: Match function (optional)
    272 * @match_data: Data for the match function
    273 *
    274 * Find the latest devres of @dev which is associated with @release
    275 * and for which @match returns 1.  If @match is NULL, it's considered
    276 * to match all.
    277 *
    278 * RETURNS:
    279 * Pointer to found devres, NULL if not found.
    280 */
    281void * devres_find(struct device *dev, dr_release_t release,
    282		   dr_match_t match, void *match_data)
    283{
    284	struct devres *dr;
    285	unsigned long flags;
    286
    287	spin_lock_irqsave(&dev->devres_lock, flags);
    288	dr = find_dr(dev, release, match, match_data);
    289	spin_unlock_irqrestore(&dev->devres_lock, flags);
    290
    291	if (dr)
    292		return dr->data;
    293	return NULL;
    294}
    295EXPORT_SYMBOL_GPL(devres_find);
    296
    297/**
    298 * devres_get - Find devres, if non-existent, add one atomically
    299 * @dev: Device to lookup or add devres for
    300 * @new_res: Pointer to new initialized devres to add if not found
    301 * @match: Match function (optional)
    302 * @match_data: Data for the match function
    303 *
    304 * Find the latest devres of @dev which has the same release function
    305 * as @new_res and for which @match return 1.  If found, @new_res is
    306 * freed; otherwise, @new_res is added atomically.
    307 *
    308 * RETURNS:
    309 * Pointer to found or added devres.
    310 */
    311void * devres_get(struct device *dev, void *new_res,
    312		  dr_match_t match, void *match_data)
    313{
    314	struct devres *new_dr = container_of(new_res, struct devres, data);
    315	struct devres *dr;
    316	unsigned long flags;
    317
    318	spin_lock_irqsave(&dev->devres_lock, flags);
    319	dr = find_dr(dev, new_dr->node.release, match, match_data);
    320	if (!dr) {
    321		add_dr(dev, &new_dr->node);
    322		dr = new_dr;
    323		new_res = NULL;
    324	}
    325	spin_unlock_irqrestore(&dev->devres_lock, flags);
    326	devres_free(new_res);
    327
    328	return dr->data;
    329}
    330EXPORT_SYMBOL_GPL(devres_get);
    331
    332/**
    333 * devres_remove - Find a device resource and remove it
    334 * @dev: Device to find resource from
    335 * @release: Look for resources associated with this release function
    336 * @match: Match function (optional)
    337 * @match_data: Data for the match function
    338 *
    339 * Find the latest devres of @dev associated with @release and for
    340 * which @match returns 1.  If @match is NULL, it's considered to
    341 * match all.  If found, the resource is removed atomically and
    342 * returned.
    343 *
    344 * RETURNS:
    345 * Pointer to removed devres on success, NULL if not found.
    346 */
    347void * devres_remove(struct device *dev, dr_release_t release,
    348		     dr_match_t match, void *match_data)
    349{
    350	struct devres *dr;
    351	unsigned long flags;
    352
    353	spin_lock_irqsave(&dev->devres_lock, flags);
    354	dr = find_dr(dev, release, match, match_data);
    355	if (dr) {
    356		list_del_init(&dr->node.entry);
    357		devres_log(dev, &dr->node, "REM");
    358	}
    359	spin_unlock_irqrestore(&dev->devres_lock, flags);
    360
    361	if (dr)
    362		return dr->data;
    363	return NULL;
    364}
    365EXPORT_SYMBOL_GPL(devres_remove);
    366
    367/**
    368 * devres_destroy - Find a device resource and destroy it
    369 * @dev: Device to find resource from
    370 * @release: Look for resources associated with this release function
    371 * @match: Match function (optional)
    372 * @match_data: Data for the match function
    373 *
    374 * Find the latest devres of @dev associated with @release and for
    375 * which @match returns 1.  If @match is NULL, it's considered to
    376 * match all.  If found, the resource is removed atomically and freed.
    377 *
    378 * Note that the release function for the resource will not be called,
    379 * only the devres-allocated data will be freed.  The caller becomes
    380 * responsible for freeing any other data.
    381 *
    382 * RETURNS:
    383 * 0 if devres is found and freed, -ENOENT if not found.
    384 */
    385int devres_destroy(struct device *dev, dr_release_t release,
    386		   dr_match_t match, void *match_data)
    387{
    388	void *res;
    389
    390	res = devres_remove(dev, release, match, match_data);
    391	if (unlikely(!res))
    392		return -ENOENT;
    393
    394	devres_free(res);
    395	return 0;
    396}
    397EXPORT_SYMBOL_GPL(devres_destroy);
    398
    399
    400/**
    401 * devres_release - Find a device resource and destroy it, calling release
    402 * @dev: Device to find resource from
    403 * @release: Look for resources associated with this release function
    404 * @match: Match function (optional)
    405 * @match_data: Data for the match function
    406 *
    407 * Find the latest devres of @dev associated with @release and for
    408 * which @match returns 1.  If @match is NULL, it's considered to
    409 * match all.  If found, the resource is removed atomically, the
    410 * release function called and the resource freed.
    411 *
    412 * RETURNS:
    413 * 0 if devres is found and freed, -ENOENT if not found.
    414 */
    415int devres_release(struct device *dev, dr_release_t release,
    416		   dr_match_t match, void *match_data)
    417{
    418	void *res;
    419
    420	res = devres_remove(dev, release, match, match_data);
    421	if (unlikely(!res))
    422		return -ENOENT;
    423
    424	(*release)(dev, res);
    425	devres_free(res);
    426	return 0;
    427}
    428EXPORT_SYMBOL_GPL(devres_release);
    429
    430static int remove_nodes(struct device *dev,
    431			struct list_head *first, struct list_head *end,
    432			struct list_head *todo)
    433{
    434	struct devres_node *node, *n;
    435	int cnt = 0, nr_groups = 0;
    436
    437	/* First pass - move normal devres entries to @todo and clear
    438	 * devres_group colors.
    439	 */
    440	node = list_entry(first, struct devres_node, entry);
    441	list_for_each_entry_safe_from(node, n, end, entry) {
    442		struct devres_group *grp;
    443
    444		grp = node_to_group(node);
    445		if (grp) {
    446			/* clear color of group markers in the first pass */
    447			grp->color = 0;
    448			nr_groups++;
    449		} else {
    450			/* regular devres entry */
    451			if (&node->entry == first)
    452				first = first->next;
    453			list_move_tail(&node->entry, todo);
    454			cnt++;
    455		}
    456	}
    457
    458	if (!nr_groups)
    459		return cnt;
    460
    461	/* Second pass - Scan groups and color them.  A group gets
    462	 * color value of two iff the group is wholly contained in
    463	 * [current node, end). That is, for a closed group, both opening
    464	 * and closing markers should be in the range, while just the
    465	 * opening marker is enough for an open group.
    466	 */
    467	node = list_entry(first, struct devres_node, entry);
    468	list_for_each_entry_safe_from(node, n, end, entry) {
    469		struct devres_group *grp;
    470
    471		grp = node_to_group(node);
    472		BUG_ON(!grp || list_empty(&grp->node[0].entry));
    473
    474		grp->color++;
    475		if (list_empty(&grp->node[1].entry))
    476			grp->color++;
    477
    478		BUG_ON(grp->color <= 0 || grp->color > 2);
    479		if (grp->color == 2) {
    480			/* No need to update current node or end. The removed
    481			 * nodes are always before both.
    482			 */
    483			list_move_tail(&grp->node[0].entry, todo);
    484			list_del_init(&grp->node[1].entry);
    485		}
    486	}
    487
    488	return cnt;
    489}
    490
    491static void release_nodes(struct device *dev, struct list_head *todo)
    492{
    493	struct devres *dr, *tmp;
    494
    495	/* Release.  Note that both devres and devres_group are
    496	 * handled as devres in the following loop.  This is safe.
    497	 */
    498	list_for_each_entry_safe_reverse(dr, tmp, todo, node.entry) {
    499		devres_log(dev, &dr->node, "REL");
    500		dr->node.release(dev, dr->data);
    501		kfree(dr);
    502	}
    503}
    504
    505/**
    506 * devres_release_all - Release all managed resources
    507 * @dev: Device to release resources for
    508 *
    509 * Release all resources associated with @dev.  This function is
    510 * called on driver detach.
    511 */
    512int devres_release_all(struct device *dev)
    513{
    514	unsigned long flags;
    515	LIST_HEAD(todo);
    516	int cnt;
    517
    518	/* Looks like an uninitialized device structure */
    519	if (WARN_ON(dev->devres_head.next == NULL))
    520		return -ENODEV;
    521
    522	/* Nothing to release if list is empty */
    523	if (list_empty(&dev->devres_head))
    524		return 0;
    525
    526	spin_lock_irqsave(&dev->devres_lock, flags);
    527	cnt = remove_nodes(dev, dev->devres_head.next, &dev->devres_head, &todo);
    528	spin_unlock_irqrestore(&dev->devres_lock, flags);
    529
    530	release_nodes(dev, &todo);
    531	return cnt;
    532}
    533
    534/**
    535 * devres_open_group - Open a new devres group
    536 * @dev: Device to open devres group for
    537 * @id: Separator ID
    538 * @gfp: Allocation flags
    539 *
    540 * Open a new devres group for @dev with @id.  For @id, using a
    541 * pointer to an object which won't be used for another group is
    542 * recommended.  If @id is NULL, address-wise unique ID is created.
    543 *
    544 * RETURNS:
    545 * ID of the new group, NULL on failure.
    546 */
    547void * devres_open_group(struct device *dev, void *id, gfp_t gfp)
    548{
    549	struct devres_group *grp;
    550	unsigned long flags;
    551
    552	grp = kmalloc(sizeof(*grp), gfp);
    553	if (unlikely(!grp))
    554		return NULL;
    555
    556	grp->node[0].release = &group_open_release;
    557	grp->node[1].release = &group_close_release;
    558	INIT_LIST_HEAD(&grp->node[0].entry);
    559	INIT_LIST_HEAD(&grp->node[1].entry);
    560	set_node_dbginfo(&grp->node[0], "grp<", 0);
    561	set_node_dbginfo(&grp->node[1], "grp>", 0);
    562	grp->id = grp;
    563	if (id)
    564		grp->id = id;
    565
    566	spin_lock_irqsave(&dev->devres_lock, flags);
    567	add_dr(dev, &grp->node[0]);
    568	spin_unlock_irqrestore(&dev->devres_lock, flags);
    569	return grp->id;
    570}
    571EXPORT_SYMBOL_GPL(devres_open_group);
    572
    573/* Find devres group with ID @id.  If @id is NULL, look for the latest. */
    574static struct devres_group * find_group(struct device *dev, void *id)
    575{
    576	struct devres_node *node;
    577
    578	list_for_each_entry_reverse(node, &dev->devres_head, entry) {
    579		struct devres_group *grp;
    580
    581		if (node->release != &group_open_release)
    582			continue;
    583
    584		grp = container_of(node, struct devres_group, node[0]);
    585
    586		if (id) {
    587			if (grp->id == id)
    588				return grp;
    589		} else if (list_empty(&grp->node[1].entry))
    590			return grp;
    591	}
    592
    593	return NULL;
    594}
    595
    596/**
    597 * devres_close_group - Close a devres group
    598 * @dev: Device to close devres group for
    599 * @id: ID of target group, can be NULL
    600 *
    601 * Close the group identified by @id.  If @id is NULL, the latest open
    602 * group is selected.
    603 */
    604void devres_close_group(struct device *dev, void *id)
    605{
    606	struct devres_group *grp;
    607	unsigned long flags;
    608
    609	spin_lock_irqsave(&dev->devres_lock, flags);
    610
    611	grp = find_group(dev, id);
    612	if (grp)
    613		add_dr(dev, &grp->node[1]);
    614	else
    615		WARN_ON(1);
    616
    617	spin_unlock_irqrestore(&dev->devres_lock, flags);
    618}
    619EXPORT_SYMBOL_GPL(devres_close_group);
    620
    621/**
    622 * devres_remove_group - Remove a devres group
    623 * @dev: Device to remove group for
    624 * @id: ID of target group, can be NULL
    625 *
    626 * Remove the group identified by @id.  If @id is NULL, the latest
    627 * open group is selected.  Note that removing a group doesn't affect
    628 * any other resources.
    629 */
    630void devres_remove_group(struct device *dev, void *id)
    631{
    632	struct devres_group *grp;
    633	unsigned long flags;
    634
    635	spin_lock_irqsave(&dev->devres_lock, flags);
    636
    637	grp = find_group(dev, id);
    638	if (grp) {
    639		list_del_init(&grp->node[0].entry);
    640		list_del_init(&grp->node[1].entry);
    641		devres_log(dev, &grp->node[0], "REM");
    642	} else
    643		WARN_ON(1);
    644
    645	spin_unlock_irqrestore(&dev->devres_lock, flags);
    646
    647	kfree(grp);
    648}
    649EXPORT_SYMBOL_GPL(devres_remove_group);
    650
    651/**
    652 * devres_release_group - Release resources in a devres group
    653 * @dev: Device to release group for
    654 * @id: ID of target group, can be NULL
    655 *
    656 * Release all resources in the group identified by @id.  If @id is
    657 * NULL, the latest open group is selected.  The selected group and
    658 * groups properly nested inside the selected group are removed.
    659 *
    660 * RETURNS:
    661 * The number of released non-group resources.
    662 */
    663int devres_release_group(struct device *dev, void *id)
    664{
    665	struct devres_group *grp;
    666	unsigned long flags;
    667	LIST_HEAD(todo);
    668	int cnt = 0;
    669
    670	spin_lock_irqsave(&dev->devres_lock, flags);
    671
    672	grp = find_group(dev, id);
    673	if (grp) {
    674		struct list_head *first = &grp->node[0].entry;
    675		struct list_head *end = &dev->devres_head;
    676
    677		if (!list_empty(&grp->node[1].entry))
    678			end = grp->node[1].entry.next;
    679
    680		cnt = remove_nodes(dev, first, end, &todo);
    681		spin_unlock_irqrestore(&dev->devres_lock, flags);
    682
    683		release_nodes(dev, &todo);
    684	} else {
    685		WARN_ON(1);
    686		spin_unlock_irqrestore(&dev->devres_lock, flags);
    687	}
    688
    689	return cnt;
    690}
    691EXPORT_SYMBOL_GPL(devres_release_group);
    692
    693/*
    694 * Custom devres actions allow inserting a simple function call
    695 * into the teardown sequence.
    696 */
    697
    698struct action_devres {
    699	void *data;
    700	void (*action)(void *);
    701};
    702
    703static int devm_action_match(struct device *dev, void *res, void *p)
    704{
    705	struct action_devres *devres = res;
    706	struct action_devres *target = p;
    707
    708	return devres->action == target->action &&
    709	       devres->data == target->data;
    710}
    711
    712static void devm_action_release(struct device *dev, void *res)
    713{
    714	struct action_devres *devres = res;
    715
    716	devres->action(devres->data);
    717}
    718
    719/**
    720 * devm_add_action() - add a custom action to list of managed resources
    721 * @dev: Device that owns the action
    722 * @action: Function that should be called
    723 * @data: Pointer to data passed to @action implementation
    724 *
    725 * This adds a custom action to the list of managed resources so that
    726 * it gets executed as part of standard resource unwinding.
    727 */
    728int devm_add_action(struct device *dev, void (*action)(void *), void *data)
    729{
    730	struct action_devres *devres;
    731
    732	devres = devres_alloc(devm_action_release,
    733			      sizeof(struct action_devres), GFP_KERNEL);
    734	if (!devres)
    735		return -ENOMEM;
    736
    737	devres->data = data;
    738	devres->action = action;
    739
    740	devres_add(dev, devres);
    741	return 0;
    742}
    743EXPORT_SYMBOL_GPL(devm_add_action);
    744
    745/**
    746 * devm_remove_action() - removes previously added custom action
    747 * @dev: Device that owns the action
    748 * @action: Function implementing the action
    749 * @data: Pointer to data passed to @action implementation
    750 *
    751 * Removes instance of @action previously added by devm_add_action().
    752 * Both action and data should match one of the existing entries.
    753 */
    754void devm_remove_action(struct device *dev, void (*action)(void *), void *data)
    755{
    756	struct action_devres devres = {
    757		.data = data,
    758		.action = action,
    759	};
    760
    761	WARN_ON(devres_destroy(dev, devm_action_release, devm_action_match,
    762			       &devres));
    763}
    764EXPORT_SYMBOL_GPL(devm_remove_action);
    765
    766/**
    767 * devm_release_action() - release previously added custom action
    768 * @dev: Device that owns the action
    769 * @action: Function implementing the action
    770 * @data: Pointer to data passed to @action implementation
    771 *
    772 * Releases and removes instance of @action previously added by
    773 * devm_add_action().  Both action and data should match one of the
    774 * existing entries.
    775 */
    776void devm_release_action(struct device *dev, void (*action)(void *), void *data)
    777{
    778	struct action_devres devres = {
    779		.data = data,
    780		.action = action,
    781	};
    782
    783	WARN_ON(devres_release(dev, devm_action_release, devm_action_match,
    784			       &devres));
    785
    786}
    787EXPORT_SYMBOL_GPL(devm_release_action);
    788
    789/*
    790 * Managed kmalloc/kfree
    791 */
    792static void devm_kmalloc_release(struct device *dev, void *res)
    793{
    794	/* noop */
    795}
    796
    797static int devm_kmalloc_match(struct device *dev, void *res, void *data)
    798{
    799	return res == data;
    800}
    801
    802/**
    803 * devm_kmalloc - Resource-managed kmalloc
    804 * @dev: Device to allocate memory for
    805 * @size: Allocation size
    806 * @gfp: Allocation gfp flags
    807 *
    808 * Managed kmalloc.  Memory allocated with this function is
    809 * automatically freed on driver detach.  Like all other devres
    810 * resources, guaranteed alignment is unsigned long long.
    811 *
    812 * RETURNS:
    813 * Pointer to allocated memory on success, NULL on failure.
    814 */
    815void *devm_kmalloc(struct device *dev, size_t size, gfp_t gfp)
    816{
    817	struct devres *dr;
    818
    819	if (unlikely(!size))
    820		return ZERO_SIZE_PTR;
    821
    822	/* use raw alloc_dr for kmalloc caller tracing */
    823	dr = alloc_dr(devm_kmalloc_release, size, gfp, dev_to_node(dev));
    824	if (unlikely(!dr))
    825		return NULL;
    826
    827	/*
    828	 * This is named devm_kzalloc_release for historical reasons
    829	 * The initial implementation did not support kmalloc, only kzalloc
    830	 */
    831	set_node_dbginfo(&dr->node, "devm_kzalloc_release", size);
    832	devres_add(dev, dr->data);
    833	return dr->data;
    834}
    835EXPORT_SYMBOL_GPL(devm_kmalloc);
    836
    837/**
    838 * devm_krealloc - Resource-managed krealloc()
    839 * @dev: Device to re-allocate memory for
    840 * @ptr: Pointer to the memory chunk to re-allocate
    841 * @new_size: New allocation size
    842 * @gfp: Allocation gfp flags
    843 *
    844 * Managed krealloc(). Resizes the memory chunk allocated with devm_kmalloc().
    845 * Behaves similarly to regular krealloc(): if @ptr is NULL or ZERO_SIZE_PTR,
    846 * it's the equivalent of devm_kmalloc(). If new_size is zero, it frees the
    847 * previously allocated memory and returns ZERO_SIZE_PTR. This function doesn't
    848 * change the order in which the release callback for the re-alloc'ed devres
    849 * will be called (except when falling back to devm_kmalloc() or when freeing
    850 * resources when new_size is zero). The contents of the memory are preserved
    851 * up to the lesser of new and old sizes.
    852 */
    853void *devm_krealloc(struct device *dev, void *ptr, size_t new_size, gfp_t gfp)
    854{
    855	size_t total_new_size, total_old_size;
    856	struct devres *old_dr, *new_dr;
    857	unsigned long flags;
    858
    859	if (unlikely(!new_size)) {
    860		devm_kfree(dev, ptr);
    861		return ZERO_SIZE_PTR;
    862	}
    863
    864	if (unlikely(ZERO_OR_NULL_PTR(ptr)))
    865		return devm_kmalloc(dev, new_size, gfp);
    866
    867	if (WARN_ON(is_kernel_rodata((unsigned long)ptr)))
    868		/*
    869		 * We cannot reliably realloc a const string returned by
    870		 * devm_kstrdup_const().
    871		 */
    872		return NULL;
    873
    874	if (!check_dr_size(new_size, &total_new_size))
    875		return NULL;
    876
    877	total_old_size = ksize(container_of(ptr, struct devres, data));
    878	if (total_old_size == 0) {
    879		WARN(1, "Pointer doesn't point to dynamically allocated memory.");
    880		return NULL;
    881	}
    882
    883	/*
    884	 * If new size is smaller or equal to the actual number of bytes
    885	 * allocated previously - just return the same pointer.
    886	 */
    887	if (total_new_size <= total_old_size)
    888		return ptr;
    889
    890	/*
    891	 * Otherwise: allocate new, larger chunk. We need to allocate before
    892	 * taking the lock as most probably the caller uses GFP_KERNEL.
    893	 */
    894	new_dr = alloc_dr(devm_kmalloc_release,
    895			  total_new_size, gfp, dev_to_node(dev));
    896	if (!new_dr)
    897		return NULL;
    898
    899	/*
    900	 * The spinlock protects the linked list against concurrent
    901	 * modifications but not the resource itself.
    902	 */
    903	spin_lock_irqsave(&dev->devres_lock, flags);
    904
    905	old_dr = find_dr(dev, devm_kmalloc_release, devm_kmalloc_match, ptr);
    906	if (!old_dr) {
    907		spin_unlock_irqrestore(&dev->devres_lock, flags);
    908		kfree(new_dr);
    909		WARN(1, "Memory chunk not managed or managed by a different device.");
    910		return NULL;
    911	}
    912
    913	replace_dr(dev, &old_dr->node, &new_dr->node);
    914
    915	spin_unlock_irqrestore(&dev->devres_lock, flags);
    916
    917	/*
    918	 * We can copy the memory contents after releasing the lock as we're
    919	 * no longer modifying the list links.
    920	 */
    921	memcpy(new_dr->data, old_dr->data,
    922	       total_old_size - offsetof(struct devres, data));
    923	/*
    924	 * Same for releasing the old devres - it's now been removed from the
    925	 * list. This is also the reason why we must not use devm_kfree() - the
    926	 * links are no longer valid.
    927	 */
    928	kfree(old_dr);
    929
    930	return new_dr->data;
    931}
    932EXPORT_SYMBOL_GPL(devm_krealloc);
    933
    934/**
    935 * devm_kstrdup - Allocate resource managed space and
    936 *                copy an existing string into that.
    937 * @dev: Device to allocate memory for
    938 * @s: the string to duplicate
    939 * @gfp: the GFP mask used in the devm_kmalloc() call when
    940 *       allocating memory
    941 * RETURNS:
    942 * Pointer to allocated string on success, NULL on failure.
    943 */
    944char *devm_kstrdup(struct device *dev, const char *s, gfp_t gfp)
    945{
    946	size_t size;
    947	char *buf;
    948
    949	if (!s)
    950		return NULL;
    951
    952	size = strlen(s) + 1;
    953	buf = devm_kmalloc(dev, size, gfp);
    954	if (buf)
    955		memcpy(buf, s, size);
    956	return buf;
    957}
    958EXPORT_SYMBOL_GPL(devm_kstrdup);
    959
    960/**
    961 * devm_kstrdup_const - resource managed conditional string duplication
    962 * @dev: device for which to duplicate the string
    963 * @s: the string to duplicate
    964 * @gfp: the GFP mask used in the kmalloc() call when allocating memory
    965 *
    966 * Strings allocated by devm_kstrdup_const will be automatically freed when
    967 * the associated device is detached.
    968 *
    969 * RETURNS:
    970 * Source string if it is in .rodata section otherwise it falls back to
    971 * devm_kstrdup.
    972 */
    973const char *devm_kstrdup_const(struct device *dev, const char *s, gfp_t gfp)
    974{
    975	if (is_kernel_rodata((unsigned long)s))
    976		return s;
    977
    978	return devm_kstrdup(dev, s, gfp);
    979}
    980EXPORT_SYMBOL_GPL(devm_kstrdup_const);
    981
    982/**
    983 * devm_kvasprintf - Allocate resource managed space and format a string
    984 *		     into that.
    985 * @dev: Device to allocate memory for
    986 * @gfp: the GFP mask used in the devm_kmalloc() call when
    987 *       allocating memory
    988 * @fmt: The printf()-style format string
    989 * @ap: Arguments for the format string
    990 * RETURNS:
    991 * Pointer to allocated string on success, NULL on failure.
    992 */
    993char *devm_kvasprintf(struct device *dev, gfp_t gfp, const char *fmt,
    994		      va_list ap)
    995{
    996	unsigned int len;
    997	char *p;
    998	va_list aq;
    999
   1000	va_copy(aq, ap);
   1001	len = vsnprintf(NULL, 0, fmt, aq);
   1002	va_end(aq);
   1003
   1004	p = devm_kmalloc(dev, len+1, gfp);
   1005	if (!p)
   1006		return NULL;
   1007
   1008	vsnprintf(p, len+1, fmt, ap);
   1009
   1010	return p;
   1011}
   1012EXPORT_SYMBOL(devm_kvasprintf);
   1013
   1014/**
   1015 * devm_kasprintf - Allocate resource managed space and format a string
   1016 *		    into that.
   1017 * @dev: Device to allocate memory for
   1018 * @gfp: the GFP mask used in the devm_kmalloc() call when
   1019 *       allocating memory
   1020 * @fmt: The printf()-style format string
   1021 * @...: Arguments for the format string
   1022 * RETURNS:
   1023 * Pointer to allocated string on success, NULL on failure.
   1024 */
   1025char *devm_kasprintf(struct device *dev, gfp_t gfp, const char *fmt, ...)
   1026{
   1027	va_list ap;
   1028	char *p;
   1029
   1030	va_start(ap, fmt);
   1031	p = devm_kvasprintf(dev, gfp, fmt, ap);
   1032	va_end(ap);
   1033
   1034	return p;
   1035}
   1036EXPORT_SYMBOL_GPL(devm_kasprintf);
   1037
   1038/**
   1039 * devm_kfree - Resource-managed kfree
   1040 * @dev: Device this memory belongs to
   1041 * @p: Memory to free
   1042 *
   1043 * Free memory allocated with devm_kmalloc().
   1044 */
   1045void devm_kfree(struct device *dev, const void *p)
   1046{
   1047	int rc;
   1048
   1049	/*
   1050	 * Special cases: pointer to a string in .rodata returned by
   1051	 * devm_kstrdup_const() or NULL/ZERO ptr.
   1052	 */
   1053	if (unlikely(is_kernel_rodata((unsigned long)p) || ZERO_OR_NULL_PTR(p)))
   1054		return;
   1055
   1056	rc = devres_destroy(dev, devm_kmalloc_release,
   1057			    devm_kmalloc_match, (void *)p);
   1058	WARN_ON(rc);
   1059}
   1060EXPORT_SYMBOL_GPL(devm_kfree);
   1061
   1062/**
   1063 * devm_kmemdup - Resource-managed kmemdup
   1064 * @dev: Device this memory belongs to
   1065 * @src: Memory region to duplicate
   1066 * @len: Memory region length
   1067 * @gfp: GFP mask to use
   1068 *
   1069 * Duplicate region of a memory using resource managed kmalloc
   1070 */
   1071void *devm_kmemdup(struct device *dev, const void *src, size_t len, gfp_t gfp)
   1072{
   1073	void *p;
   1074
   1075	p = devm_kmalloc(dev, len, gfp);
   1076	if (p)
   1077		memcpy(p, src, len);
   1078
   1079	return p;
   1080}
   1081EXPORT_SYMBOL_GPL(devm_kmemdup);
   1082
   1083struct pages_devres {
   1084	unsigned long addr;
   1085	unsigned int order;
   1086};
   1087
   1088static int devm_pages_match(struct device *dev, void *res, void *p)
   1089{
   1090	struct pages_devres *devres = res;
   1091	struct pages_devres *target = p;
   1092
   1093	return devres->addr == target->addr;
   1094}
   1095
   1096static void devm_pages_release(struct device *dev, void *res)
   1097{
   1098	struct pages_devres *devres = res;
   1099
   1100	free_pages(devres->addr, devres->order);
   1101}
   1102
   1103/**
   1104 * devm_get_free_pages - Resource-managed __get_free_pages
   1105 * @dev: Device to allocate memory for
   1106 * @gfp_mask: Allocation gfp flags
   1107 * @order: Allocation size is (1 << order) pages
   1108 *
   1109 * Managed get_free_pages.  Memory allocated with this function is
   1110 * automatically freed on driver detach.
   1111 *
   1112 * RETURNS:
   1113 * Address of allocated memory on success, 0 on failure.
   1114 */
   1115
   1116unsigned long devm_get_free_pages(struct device *dev,
   1117				  gfp_t gfp_mask, unsigned int order)
   1118{
   1119	struct pages_devres *devres;
   1120	unsigned long addr;
   1121
   1122	addr = __get_free_pages(gfp_mask, order);
   1123
   1124	if (unlikely(!addr))
   1125		return 0;
   1126
   1127	devres = devres_alloc(devm_pages_release,
   1128			      sizeof(struct pages_devres), GFP_KERNEL);
   1129	if (unlikely(!devres)) {
   1130		free_pages(addr, order);
   1131		return 0;
   1132	}
   1133
   1134	devres->addr = addr;
   1135	devres->order = order;
   1136
   1137	devres_add(dev, devres);
   1138	return addr;
   1139}
   1140EXPORT_SYMBOL_GPL(devm_get_free_pages);
   1141
   1142/**
   1143 * devm_free_pages - Resource-managed free_pages
   1144 * @dev: Device this memory belongs to
   1145 * @addr: Memory to free
   1146 *
   1147 * Free memory allocated with devm_get_free_pages(). Unlike free_pages,
   1148 * there is no need to supply the @order.
   1149 */
   1150void devm_free_pages(struct device *dev, unsigned long addr)
   1151{
   1152	struct pages_devres devres = { .addr = addr };
   1153
   1154	WARN_ON(devres_release(dev, devm_pages_release, devm_pages_match,
   1155			       &devres));
   1156}
   1157EXPORT_SYMBOL_GPL(devm_free_pages);
   1158
   1159static void devm_percpu_release(struct device *dev, void *pdata)
   1160{
   1161	void __percpu *p;
   1162
   1163	p = *(void __percpu **)pdata;
   1164	free_percpu(p);
   1165}
   1166
   1167static int devm_percpu_match(struct device *dev, void *data, void *p)
   1168{
   1169	struct devres *devr = container_of(data, struct devres, data);
   1170
   1171	return *(void **)devr->data == p;
   1172}
   1173
   1174/**
   1175 * __devm_alloc_percpu - Resource-managed alloc_percpu
   1176 * @dev: Device to allocate per-cpu memory for
   1177 * @size: Size of per-cpu memory to allocate
   1178 * @align: Alignment of per-cpu memory to allocate
   1179 *
   1180 * Managed alloc_percpu. Per-cpu memory allocated with this function is
   1181 * automatically freed on driver detach.
   1182 *
   1183 * RETURNS:
   1184 * Pointer to allocated memory on success, NULL on failure.
   1185 */
   1186void __percpu *__devm_alloc_percpu(struct device *dev, size_t size,
   1187		size_t align)
   1188{
   1189	void *p;
   1190	void __percpu *pcpu;
   1191
   1192	pcpu = __alloc_percpu(size, align);
   1193	if (!pcpu)
   1194		return NULL;
   1195
   1196	p = devres_alloc(devm_percpu_release, sizeof(void *), GFP_KERNEL);
   1197	if (!p) {
   1198		free_percpu(pcpu);
   1199		return NULL;
   1200	}
   1201
   1202	*(void __percpu **)p = pcpu;
   1203
   1204	devres_add(dev, p);
   1205
   1206	return pcpu;
   1207}
   1208EXPORT_SYMBOL_GPL(__devm_alloc_percpu);
   1209
   1210/**
   1211 * devm_free_percpu - Resource-managed free_percpu
   1212 * @dev: Device this memory belongs to
   1213 * @pdata: Per-cpu memory to free
   1214 *
   1215 * Free memory allocated with devm_alloc_percpu().
   1216 */
   1217void devm_free_percpu(struct device *dev, void __percpu *pdata)
   1218{
   1219	WARN_ON(devres_destroy(dev, devm_percpu_release, devm_percpu_match,
   1220			       (__force void *)pdata));
   1221}
   1222EXPORT_SYMBOL_GPL(devm_free_percpu);