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

Commit b58675be authored by Hardik Arya's avatar Hardik Arya Committed by Gerrit - the friendly Code Review server
Browse files

diag: Allocate DCI memory using vzalloc instead of kzalloc



Currently there is a possibility of kmalloc failing
when system is running low on memory condition.
The patch changes the dci memory allocation from
kzalloc to vzalloc.

CRs-Fixed: 2195818
Change-Id: I92b20d8e77ce5b2a96212f9d0757fbbff2703891
Signed-off-by: default avatarHardik Arya <harya@codeaurora.org>
parent c40e1092
Loading
Loading
Loading
Loading
+21 −20
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@
#include <linux/reboot.h>
#include <asm/current.h>
#include <soc/qcom/restart.h>
#include <linux/vmalloc.h>
#ifdef CONFIG_DIAG_OVER_USB
#include <linux/usb/usbdiag.h>
#endif
@@ -229,7 +230,7 @@ static int diag_dci_init_buffer(struct diag_dci_buffer_t *buffer, int type)
	switch (type) {
	case DCI_BUF_PRIMARY:
		buffer->capacity = IN_BUF_SIZE;
		buffer->data = kzalloc(buffer->capacity, GFP_KERNEL);
		buffer->data = vzalloc(buffer->capacity);
		if (!buffer->data)
			return -ENOMEM;
		break;
@@ -239,7 +240,7 @@ static int diag_dci_init_buffer(struct diag_dci_buffer_t *buffer, int type)
		break;
	case DCI_BUF_CMD:
		buffer->capacity = DIAG_MAX_REQ_SIZE + DCI_BUF_SIZE;
		buffer->data = kzalloc(buffer->capacity, GFP_KERNEL);
		buffer->data = vzalloc(buffer->capacity);
		if (!buffer->data)
			return -ENOMEM;
		break;
@@ -2615,7 +2616,7 @@ static int diag_dci_init_remote(void)
		create_dci_event_mask_tbl(temp->event_mask_composite);
	}

	partial_pkt.data = kzalloc(MAX_DCI_PACKET_SZ, GFP_KERNEL);
	partial_pkt.data = vzalloc(MAX_DCI_PACKET_SZ);
	if (!partial_pkt.data) {
		pr_err("diag: Unable to create partial pkt data\n");
		return -ENOMEM;
@@ -2671,7 +2672,7 @@ int diag_dci_init(void)
		goto err;

	if (driver->apps_dci_buf == NULL) {
		driver->apps_dci_buf = kzalloc(DCI_BUF_SIZE, GFP_KERNEL);
		driver->apps_dci_buf = vzalloc(DCI_BUF_SIZE);
		if (driver->apps_dci_buf == NULL)
			goto err;
	}
@@ -2688,12 +2689,12 @@ int diag_dci_init(void)
	return DIAG_DCI_NO_ERROR;
err:
	pr_err("diag: Could not initialize diag DCI buffers");
	kfree(driver->apps_dci_buf);
	vfree(driver->apps_dci_buf);
	driver->apps_dci_buf = NULL;

	if (driver->diag_dci_wq)
		destroy_workqueue(driver->diag_dci_wq);
	kfree(partial_pkt.data);
	vfree(partial_pkt.data);
	partial_pkt.data = NULL;
	mutex_destroy(&driver->dci_mutex);
	mutex_destroy(&dci_log_mask_mutex);
@@ -2713,9 +2714,9 @@ void diag_dci_channel_init(void)

void diag_dci_exit(void)
{
	kfree(partial_pkt.data);
	vfree(partial_pkt.data);
	partial_pkt.data = NULL;
	kfree(driver->apps_dci_buf);
	vfree(driver->apps_dci_buf);
	driver->apps_dci_buf = NULL;
	mutex_destroy(&driver->dci_mutex);
	mutex_destroy(&dci_log_mask_mutex);
@@ -2855,7 +2856,7 @@ int diag_dci_register_client(struct diag_dci_reg_tbl_t *reg_entry)
	new_entry->in_service = 0;
	INIT_LIST_HEAD(&new_entry->list_write_buf);
	mutex_init(&new_entry->write_buf_mutex);
	new_entry->dci_log_mask =  kzalloc(DCI_LOG_MASK_SIZE, GFP_KERNEL);
	new_entry->dci_log_mask =  vzalloc(DCI_LOG_MASK_SIZE);
	if (!new_entry->dci_log_mask) {
		pr_err("diag: Unable to create log mask for client, %d",
							driver->dci_client_id);
@@ -2863,7 +2864,7 @@ int diag_dci_register_client(struct diag_dci_reg_tbl_t *reg_entry)
	}
	create_dci_log_mask_tbl(new_entry->dci_log_mask, DCI_LOG_MASK_CLEAN);

	new_entry->dci_event_mask =  kzalloc(DCI_EVENT_MASK_SIZE, GFP_KERNEL);
	new_entry->dci_event_mask =  vzalloc(DCI_EVENT_MASK_SIZE);
	if (!new_entry->dci_event_mask) {
		pr_err("diag: Unable to create event mask for client, %d",
							driver->dci_client_id);
@@ -2930,7 +2931,7 @@ fail_alloc:
			if (proc_buf) {
				mutex_destroy(&proc_buf->health_mutex);
				if (proc_buf->buf_primary) {
					kfree(proc_buf->buf_primary->data);
					vfree(proc_buf->buf_primary->data);
					proc_buf->buf_primary->data = NULL;
					mutex_destroy(
					   &proc_buf->buf_primary->data_mutex);
@@ -2938,7 +2939,7 @@ fail_alloc:
				kfree(proc_buf->buf_primary);
				proc_buf->buf_primary = NULL;
				if (proc_buf->buf_cmd) {
					kfree(proc_buf->buf_cmd->data);
					vfree(proc_buf->buf_cmd->data);
					proc_buf->buf_cmd->data = NULL;
					mutex_destroy(
					   &proc_buf->buf_cmd->data_mutex);
@@ -2947,9 +2948,9 @@ fail_alloc:
				proc_buf->buf_cmd = NULL;
			}
		}
		kfree(new_entry->dci_event_mask);
		vfree(new_entry->dci_event_mask);
		new_entry->dci_event_mask = NULL;
		kfree(new_entry->dci_log_mask);
		vfree(new_entry->dci_log_mask);
		new_entry->dci_log_mask = NULL;
		kfree(new_entry->buffers);
		new_entry->buffers = NULL;
@@ -2984,7 +2985,7 @@ int diag_dci_deinit_client(struct diag_dci_client_tbl *entry)
	 * Clear the client's log and event masks, update the cumulative
	 * masks and send the masks to peripherals
	 */
	kfree(entry->dci_log_mask);
	vfree(entry->dci_log_mask);
	entry->dci_log_mask = NULL;
	diag_dci_invalidate_cumulative_log_mask(token);
	if (token == DCI_LOCAL_PROC)
@@ -2993,7 +2994,7 @@ int diag_dci_deinit_client(struct diag_dci_client_tbl *entry)
	if (ret != DIAG_DCI_NO_ERROR) {
		return ret;
	}
	kfree(entry->dci_event_mask);
	vfree(entry->dci_event_mask);
	entry->dci_event_mask = NULL;
	diag_dci_invalidate_cumulative_event_mask(token);
	if (token == DCI_LOCAL_PROC)
@@ -3057,12 +3058,12 @@ int diag_dci_deinit_client(struct diag_dci_client_tbl *entry)
		}

		mutex_lock(&proc_buf->buf_primary->data_mutex);
		kfree(proc_buf->buf_primary->data);
		vfree(proc_buf->buf_primary->data);
		proc_buf->buf_primary->data = NULL;
		mutex_unlock(&proc_buf->buf_primary->data_mutex);

		mutex_lock(&proc_buf->buf_cmd->data_mutex);
		kfree(proc_buf->buf_cmd->data);
		vfree(proc_buf->buf_cmd->data);
		proc_buf->buf_cmd->data = NULL;
		mutex_unlock(&proc_buf->buf_cmd->data_mutex);