Commit 8dedab29 authored by Dave Stevenson's avatar Dave Stevenson Committed by Greg Kroah-Hartman

staging: bcm2835-camera: Replace spinlock protecting context_map with mutex

The commit "staging: bcm2835-camera: Replace open-coded idr with a struct idr."
replaced an internal implementation of an idr with the standard functions
and a spinlock. idr_alloc(GFP_KERNEL) can sleep whilst calling kmem_cache_alloc
to allocate the new node, but this is not valid whilst in an atomic context
due to the spinlock.

There is no need for this to be a spinlock as a standard mutex is
sufficient.

Fixes: 950fd867 ("staging: bcm2835-camera: Replace open-coded idr with a struct idr.")
Signed-off-by: default avatarDave Stevenson <dave.stevenson@raspberrypi.org>
Signed-off-by: default avatarStefan Wahren <wahrenst@gmx.net>
Acked-by: default avatarHans Verkuil <hverkuil-cisco@xs4all.nl>
Acked-by: default avatarMauro Carvalho Chehab <mchehab+samsung@kernel.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 557897fe
...@@ -161,7 +161,8 @@ struct vchiq_mmal_instance { ...@@ -161,7 +161,8 @@ struct vchiq_mmal_instance {
void *bulk_scratch; void *bulk_scratch;
struct idr context_map; struct idr context_map;
spinlock_t context_map_lock; /* protect accesses to context_map */
struct mutex context_map_lock;
/* component to use next */ /* component to use next */
int component_idx; int component_idx;
...@@ -184,10 +185,10 @@ get_msg_context(struct vchiq_mmal_instance *instance) ...@@ -184,10 +185,10 @@ get_msg_context(struct vchiq_mmal_instance *instance)
* that when we service the VCHI reply, we can look up what * that when we service the VCHI reply, we can look up what
* message is being replied to. * message is being replied to.
*/ */
spin_lock(&instance->context_map_lock); mutex_lock(&instance->context_map_lock);
handle = idr_alloc(&instance->context_map, msg_context, handle = idr_alloc(&instance->context_map, msg_context,
0, 0, GFP_KERNEL); 0, 0, GFP_KERNEL);
spin_unlock(&instance->context_map_lock); mutex_unlock(&instance->context_map_lock);
if (handle < 0) { if (handle < 0) {
kfree(msg_context); kfree(msg_context);
...@@ -211,9 +212,9 @@ release_msg_context(struct mmal_msg_context *msg_context) ...@@ -211,9 +212,9 @@ release_msg_context(struct mmal_msg_context *msg_context)
{ {
struct vchiq_mmal_instance *instance = msg_context->instance; struct vchiq_mmal_instance *instance = msg_context->instance;
spin_lock(&instance->context_map_lock); mutex_lock(&instance->context_map_lock);
idr_remove(&instance->context_map, msg_context->handle); idr_remove(&instance->context_map, msg_context->handle);
spin_unlock(&instance->context_map_lock); mutex_unlock(&instance->context_map_lock);
kfree(msg_context); kfree(msg_context);
} }
...@@ -1849,7 +1850,7 @@ int vchiq_mmal_init(struct vchiq_mmal_instance **out_instance) ...@@ -1849,7 +1850,7 @@ int vchiq_mmal_init(struct vchiq_mmal_instance **out_instance)
instance->bulk_scratch = vmalloc(PAGE_SIZE); instance->bulk_scratch = vmalloc(PAGE_SIZE);
spin_lock_init(&instance->context_map_lock); mutex_init(&instance->context_map_lock);
idr_init_base(&instance->context_map, 1); idr_init_base(&instance->context_map, 1);
params.callback_param = instance; params.callback_param = instance;
......
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