Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5bc094e1 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "msm: msm_bus: Manage reallocating device allocated memory"

parents 6adc40df 35d9c6ba
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -26,7 +26,7 @@ struct link_node {
	int next;
	struct device *next_dev;
	struct list_head link;
	uint32_t free;
	uint32_t in_use;
};

/* New types introduced for adhoc topology */
@@ -99,6 +99,8 @@ int msm_bus_update_clks(struct msm_bus_node_device_type *nodedev,
int msm_bus_commit_data(int *dirty_nodes, int ctx, int num_dirty);
int msm_bus_update_bw(struct msm_bus_node_device_type *nodedev, int ctx,
	int64_t add_bw, int **dirty_nodes, int *num_dirty);
void *msm_bus_realloc_devmem(struct device *dev, void *p, size_t old_size,
					size_t new_size, gfp_t flags);

extern struct msm_bus_device_node_registration
	*msm_bus_of_to_pdata(struct platform_device *pdev);
+21 −9
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@
#include "msm_bus_adhoc.h"

#define NUM_CL_HANDLES	50
#define NUM_LNODES	3

struct bus_search_type {
	struct list_head link;
@@ -91,14 +92,15 @@ static int gen_lnode(struct device *dev,

	if (!cur_dev->num_lnodes) {
		cur_dev->lnode_list = devm_kzalloc(dev,
				sizeof(struct link_node), GFP_KERNEL);
				sizeof(struct link_node) * NUM_LNODES,
								GFP_KERNEL);
		lnode = cur_dev->lnode_list;
		cur_dev->num_lnodes++;
		cur_dev->num_lnodes = NUM_LNODES;
		lnode_idx = 0;
	} else {
		int i;
		for (i = 0; i < cur_dev->num_lnodes; i++) {
			if (cur_dev->lnode_list[i].free)
			if (!cur_dev->lnode_list[i].in_use)
				break;
		}

@@ -107,17 +109,27 @@ static int gen_lnode(struct device *dev,
			lnode_idx = i;
		} else {
			struct link_node *realloc_list;
			cur_dev->num_lnodes++;
			realloc_list = krealloc(cur_dev->lnode_list,
			size_t cur_size = sizeof(struct link_node) *
					cur_dev->num_lnodes;

			cur_dev->num_lnodes += NUM_LNODES;
			realloc_list = msm_bus_realloc_devmem(
					dev,
					cur_dev->lnode_list,
					cur_size,
					sizeof(struct link_node) *
					cur_dev->num_lnodes, GFP_KERNEL);

			if (!realloc_list)
				goto exit_gen_lnode;

			cur_dev->lnode_list = realloc_list;
			lnode = &cur_dev->lnode_list[(cur_dev->num_lnodes - 1)];
			lnode_idx = (cur_dev->num_lnodes - 1);
			lnode = &cur_dev->lnode_list[i];
			lnode_idx = i;
		}
	}

	lnode->free = 0;
	lnode->in_use = 1;
	if (next_hop == cur_dev->node_info->id) {
		lnode->next = -1;
		lnode->next_dev = NULL;
@@ -157,7 +169,7 @@ static int remove_lnode(struct msm_bus_node_device_type *cur_dev,

		cur_dev->lnode_list[lnode_idx].next = -1;
		cur_dev->lnode_list[lnode_idx].next_dev = NULL;
		cur_dev->lnode_list[lnode_idx].free = 1;
		cur_dev->lnode_list[lnode_idx].in_use = 0;
	}

exit_remove_lnode:
+27 −0
Original line number Diff line number Diff line
@@ -281,6 +281,33 @@ int msm_bus_commit_data(int *dirty_nodes, int ctx, int num_dirty)
	return ret;
}

void *msm_bus_realloc_devmem(struct device *dev, void *p, size_t old_size,
					size_t new_size, gfp_t flags)
{
	void *ret;
	size_t copy_size = old_size;

	if (!new_size) {
		devm_kfree(dev, p);
		return ZERO_SIZE_PTR;
	}

	if (new_size < old_size)
		copy_size = new_size;

	ret = devm_kzalloc(dev, new_size, flags);
	if (!ret) {
		MSM_BUS_ERR("%s: Error Reallocating memory", __func__);
		goto exit_realloc_devmem;
	}

	memcpy(ret, p, copy_size);
	devm_kfree(dev, p);
exit_realloc_devmem:
	return ret;
}


static int add_dirty_node(int **dirty_nodes, int id, int *num_dirty)
{
	int i;