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

Commit 4502c43d authored by Dave Stevenson's avatar Dave Stevenson Committed by Greg Kroah-Hartman
Browse files

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



commit 8dedab2903f152aa3cee9ae3d57c828dea0d356e upstream.

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 22a20b9f
Loading
Loading
Loading
Loading
+7 −6
Original line number Diff line number Diff line
@@ -162,7 +162,8 @@ struct vchiq_mmal_instance {
	void *bulk_scratch;

	struct idr context_map;
	spinlock_t context_map_lock;
	/* protect accesses to context_map */
	struct mutex context_map_lock;

	/* component to use next */
	int component_idx;
@@ -185,10 +186,10 @@ get_msg_context(struct vchiq_mmal_instance *instance)
	 * that when we service the VCHI reply, we can look up what
	 * 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,
			   0, 0, GFP_KERNEL);
	spin_unlock(&instance->context_map_lock);
	mutex_unlock(&instance->context_map_lock);

	if (handle < 0) {
		kfree(msg_context);
@@ -212,9 +213,9 @@ release_msg_context(struct mmal_msg_context *msg_context)
{
	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);
	spin_unlock(&instance->context_map_lock);
	mutex_unlock(&instance->context_map_lock);
	kfree(msg_context);
}

@@ -1854,7 +1855,7 @@ int vchiq_mmal_init(struct vchiq_mmal_instance **out_instance)

	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);

	params.callback_param = instance;