mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-12 13:55:32 +00:00
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: 950fd867c6
("staging: bcm2835-camera: Replace open-coded idr with a struct idr.")
Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.org>
Signed-off-by: Stefan Wahren <wahrenst@gmx.net>
Acked-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Acked-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
557897fea0
commit
8dedab2903
1 changed files with 7 additions and 6 deletions
|
@ -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)
|
||||||
* 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)
|
||||||
{
|
{
|
||||||
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)
|
||||||
|
|
||||||
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;
|
||||||
|
|
Loading…
Reference in a new issue