diag: Change to GFP_KERNEL in diagfwd_buffers_init()

In diagfwd_buffers_init() change the memory allocation to
from GFP_ATOMIC to GFP_KERNEL.
This patch also replaces spinlock with mutex to enable device
to go into sleep mode.

Change-Id: I8ea299a4287401a0a01ff7bbdd86c37ccd138480
Signed-off-by: Sreelakshmi Gownipalli <sgownipa@codeaurora.org>
This commit is contained in:
Sreelakshmi Gownipalli 2016-11-29 16:01:13 -08:00 committed by Manoj Prabhu B
parent a80e267a8c
commit 85ddeea84a
3 changed files with 19 additions and 25 deletions

View file

@ -437,9 +437,9 @@ int diagfwd_peripheral_init(void)
fwd_info->inited = 1; fwd_info->inited = 1;
fwd_info->read_bytes = 0; fwd_info->read_bytes = 0;
fwd_info->write_bytes = 0; fwd_info->write_bytes = 0;
spin_lock_init(&fwd_info->buf_lock); mutex_init(&fwd_info->buf_mutex);
spin_lock_init(&fwd_info->write_buf_lock);
mutex_init(&fwd_info->data_mutex); mutex_init(&fwd_info->data_mutex);
spin_lock_init(&fwd_info->write_buf_lock);
} }
} }
@ -453,8 +453,8 @@ int diagfwd_peripheral_init(void)
fwd_info->ch_open = 0; fwd_info->ch_open = 0;
fwd_info->read_bytes = 0; fwd_info->read_bytes = 0;
fwd_info->write_bytes = 0; fwd_info->write_bytes = 0;
spin_lock_init(&fwd_info->buf_lock);
spin_lock_init(&fwd_info->write_buf_lock); spin_lock_init(&fwd_info->write_buf_lock);
mutex_init(&fwd_info->buf_mutex);
mutex_init(&fwd_info->data_mutex); mutex_init(&fwd_info->data_mutex);
/* /*
* This state shouldn't be set for Control channels * This state shouldn't be set for Control channels
@ -1072,7 +1072,6 @@ static void diagfwd_queue_read(struct diagfwd_info *fwd_info)
void diagfwd_buffers_init(struct diagfwd_info *fwd_info) void diagfwd_buffers_init(struct diagfwd_info *fwd_info)
{ {
unsigned long flags;
if (!fwd_info) if (!fwd_info)
return; return;
@ -1083,10 +1082,10 @@ void diagfwd_buffers_init(struct diagfwd_info *fwd_info)
return; return;
} }
spin_lock_irqsave(&fwd_info->buf_lock, flags); mutex_lock(&fwd_info->buf_mutex);
if (!fwd_info->buf_1) { if (!fwd_info->buf_1) {
fwd_info->buf_1 = kzalloc(sizeof(struct diagfwd_buf_t), fwd_info->buf_1 = kzalloc(sizeof(struct diagfwd_buf_t),
GFP_ATOMIC); GFP_KERNEL);
if (!fwd_info->buf_1) if (!fwd_info->buf_1)
goto err; goto err;
kmemleak_not_leak(fwd_info->buf_1); kmemleak_not_leak(fwd_info->buf_1);
@ -1094,7 +1093,7 @@ void diagfwd_buffers_init(struct diagfwd_info *fwd_info)
if (!fwd_info->buf_1->data) { if (!fwd_info->buf_1->data) {
fwd_info->buf_1->data = kzalloc(PERIPHERAL_BUF_SZ + fwd_info->buf_1->data = kzalloc(PERIPHERAL_BUF_SZ +
APF_DIAG_PADDING, APF_DIAG_PADDING,
GFP_ATOMIC); GFP_KERNEL);
if (!fwd_info->buf_1->data) if (!fwd_info->buf_1->data)
goto err; goto err;
fwd_info->buf_1->len = PERIPHERAL_BUF_SZ; fwd_info->buf_1->len = PERIPHERAL_BUF_SZ;
@ -1106,7 +1105,7 @@ void diagfwd_buffers_init(struct diagfwd_info *fwd_info)
if (fwd_info->type == TYPE_DATA) { if (fwd_info->type == TYPE_DATA) {
if (!fwd_info->buf_2) { if (!fwd_info->buf_2) {
fwd_info->buf_2 = kzalloc(sizeof(struct diagfwd_buf_t), fwd_info->buf_2 = kzalloc(sizeof(struct diagfwd_buf_t),
GFP_ATOMIC); GFP_KERNEL);
if (!fwd_info->buf_2) if (!fwd_info->buf_2)
goto err; goto err;
kmemleak_not_leak(fwd_info->buf_2); kmemleak_not_leak(fwd_info->buf_2);
@ -1115,7 +1114,7 @@ void diagfwd_buffers_init(struct diagfwd_info *fwd_info)
if (!fwd_info->buf_2->data) { if (!fwd_info->buf_2->data) {
fwd_info->buf_2->data = kzalloc(PERIPHERAL_BUF_SZ + fwd_info->buf_2->data = kzalloc(PERIPHERAL_BUF_SZ +
APF_DIAG_PADDING, APF_DIAG_PADDING,
GFP_ATOMIC); GFP_KERNEL);
if (!fwd_info->buf_2->data) if (!fwd_info->buf_2->data)
goto err; goto err;
fwd_info->buf_2->len = PERIPHERAL_BUF_SZ; fwd_info->buf_2->len = PERIPHERAL_BUF_SZ;
@ -1131,7 +1130,7 @@ void diagfwd_buffers_init(struct diagfwd_info *fwd_info)
fwd_info->buf_1->data_raw = fwd_info->buf_1->data_raw =
kzalloc(PERIPHERAL_BUF_SZ + kzalloc(PERIPHERAL_BUF_SZ +
APF_DIAG_PADDING, APF_DIAG_PADDING,
GFP_ATOMIC); GFP_KERNEL);
if (!fwd_info->buf_1->data_raw) if (!fwd_info->buf_1->data_raw)
goto err; goto err;
fwd_info->buf_1->len_raw = PERIPHERAL_BUF_SZ; fwd_info->buf_1->len_raw = PERIPHERAL_BUF_SZ;
@ -1141,7 +1140,7 @@ void diagfwd_buffers_init(struct diagfwd_info *fwd_info)
fwd_info->buf_2->data_raw = fwd_info->buf_2->data_raw =
kzalloc(PERIPHERAL_BUF_SZ + kzalloc(PERIPHERAL_BUF_SZ +
APF_DIAG_PADDING, APF_DIAG_PADDING,
GFP_ATOMIC); GFP_KERNEL);
if (!fwd_info->buf_2->data_raw) if (!fwd_info->buf_2->data_raw)
goto err; goto err;
fwd_info->buf_2->len_raw = PERIPHERAL_BUF_SZ; fwd_info->buf_2->len_raw = PERIPHERAL_BUF_SZ;
@ -1155,7 +1154,7 @@ void diagfwd_buffers_init(struct diagfwd_info *fwd_info)
if (!fwd_info->buf_1->data_raw) { if (!fwd_info->buf_1->data_raw) {
fwd_info->buf_1->data_raw = kzalloc(PERIPHERAL_BUF_SZ + fwd_info->buf_1->data_raw = kzalloc(PERIPHERAL_BUF_SZ +
APF_DIAG_PADDING, APF_DIAG_PADDING,
GFP_ATOMIC); GFP_KERNEL);
if (!fwd_info->buf_1->data_raw) if (!fwd_info->buf_1->data_raw)
goto err; goto err;
fwd_info->buf_1->len_raw = PERIPHERAL_BUF_SZ; fwd_info->buf_1->len_raw = PERIPHERAL_BUF_SZ;
@ -1163,11 +1162,11 @@ void diagfwd_buffers_init(struct diagfwd_info *fwd_info)
} }
} }
spin_unlock_irqrestore(&fwd_info->buf_lock, flags); mutex_unlock(&fwd_info->buf_mutex);
return; return;
err: err:
spin_unlock_irqrestore(&fwd_info->buf_lock, flags); mutex_unlock(&fwd_info->buf_mutex);
diagfwd_buffers_exit(fwd_info); diagfwd_buffers_exit(fwd_info);
return; return;
@ -1175,12 +1174,11 @@ err:
static void diagfwd_buffers_exit(struct diagfwd_info *fwd_info) static void diagfwd_buffers_exit(struct diagfwd_info *fwd_info)
{ {
unsigned long flags;
if (!fwd_info) if (!fwd_info)
return; return;
spin_lock_irqsave(&fwd_info->buf_lock, flags); mutex_lock(&fwd_info->buf_mutex);
if (fwd_info->buf_1) { if (fwd_info->buf_1) {
kfree(fwd_info->buf_1->data); kfree(fwd_info->buf_1->data);
fwd_info->buf_1->data = NULL; fwd_info->buf_1->data = NULL;
@ -1197,7 +1195,7 @@ static void diagfwd_buffers_exit(struct diagfwd_info *fwd_info)
kfree(fwd_info->buf_2); kfree(fwd_info->buf_2);
fwd_info->buf_2 = NULL; fwd_info->buf_2 = NULL;
} }
spin_unlock_irqrestore(&fwd_info->buf_lock, flags); mutex_unlock(&fwd_info->buf_mutex);
} }
void diagfwd_write_buffers_init(struct diagfwd_info *fwd_info) void diagfwd_write_buffers_init(struct diagfwd_info *fwd_info)

View file

@ -70,8 +70,8 @@ struct diagfwd_info {
atomic_t opened; atomic_t opened;
unsigned long read_bytes; unsigned long read_bytes;
unsigned long write_bytes; unsigned long write_bytes;
spinlock_t buf_lock;
spinlock_t write_buf_lock; spinlock_t write_buf_lock;
struct mutex buf_mutex;
struct mutex data_mutex; struct mutex data_mutex;
void *ctxt; void *ctxt;
struct diagfwd_buf_t *buf_1; struct diagfwd_buf_t *buf_1;

View file

@ -261,13 +261,6 @@ static void socket_data_ready(struct sock *sk_ptr)
spin_unlock_irqrestore(&info->lock, flags); spin_unlock_irqrestore(&info->lock, flags);
diag_ws_on_notify(); diag_ws_on_notify();
/*
* Initialize read buffers for the servers. The servers must read data
* first to get the address of its clients.
*/
if (!atomic_read(&info->opened) && info->port_type == PORT_TYPE_SERVER)
diagfwd_buffers_init(info->fwd_ctxt);
queue_work(info->wq, &(info->read_work)); queue_work(info->wq, &(info->read_work));
wake_up_interruptible(&info->read_wait_q); wake_up_interruptible(&info->read_wait_q);
return; return;
@ -656,6 +649,9 @@ static void socket_read_work_fn(struct work_struct *work)
if (!info) if (!info)
return; return;
if (!atomic_read(&info->opened) && info->port_type == PORT_TYPE_SERVER)
diagfwd_buffers_init(info->fwd_ctxt);
diagfwd_channel_read(info->fwd_ctxt); diagfwd_channel_read(info->fwd_ctxt);
} }