Commit 6dca544e authored by Stefan Wahren's avatar Stefan Wahren Committed by Greg Kroah-Hartman

staging: vchiq_core: Remove stackhog in process_free_queue

This removes the stackhog in process_free_queue by allocating the
necessary memory within the recycle thread main function instead
of the stack.
Signed-off-by: default avatarStefan Wahren <stefan.wahren@i2se.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 8113b89f
...@@ -620,10 +620,9 @@ reserve_space(VCHIQ_STATE_T *state, size_t space, int is_blocking) ...@@ -620,10 +620,9 @@ reserve_space(VCHIQ_STATE_T *state, size_t space, int is_blocking)
/* Called by the recycle thread. */ /* Called by the recycle thread. */
static void static void
process_free_queue(VCHIQ_STATE_T *state) process_free_queue(VCHIQ_STATE_T *state, BITSET_T *service_found, size_t length)
{ {
VCHIQ_SHARED_STATE_T *local = state->local; VCHIQ_SHARED_STATE_T *local = state->local;
BITSET_T service_found[BITSET_SIZE(VCHIQ_MAX_SERVICES)];
int slot_queue_available; int slot_queue_available;
/* Find slots which have been freed by the other side, and return them /* Find slots which have been freed by the other side, and return them
...@@ -656,7 +655,7 @@ process_free_queue(VCHIQ_STATE_T *state) ...@@ -656,7 +655,7 @@ process_free_queue(VCHIQ_STATE_T *state)
/* Initialise the bitmask for services which have used this /* Initialise the bitmask for services which have used this
** slot */ ** slot */
BITSET_ZERO(service_found); memset(service_found, 0, length);
pos = 0; pos = 0;
...@@ -2183,11 +2182,20 @@ recycle_func(void *v) ...@@ -2183,11 +2182,20 @@ recycle_func(void *v)
{ {
VCHIQ_STATE_T *state = (VCHIQ_STATE_T *) v; VCHIQ_STATE_T *state = (VCHIQ_STATE_T *) v;
VCHIQ_SHARED_STATE_T *local = state->local; VCHIQ_SHARED_STATE_T *local = state->local;
BITSET_T *found;
size_t length;
length = sizeof(*found) * BITSET_SIZE(VCHIQ_MAX_SERVICES);
found = kmalloc_array(BITSET_SIZE(VCHIQ_MAX_SERVICES), sizeof(*found),
GFP_KERNEL);
if (!found)
return -ENOMEM;
while (1) { while (1) {
remote_event_wait(state, &local->recycle); remote_event_wait(state, &local->recycle);
process_free_queue(state); process_free_queue(state, found, length);
} }
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment