Commit d5f6ac9e authored by Dave Stevenson's avatar Dave Stevenson Committed by popcornmix
Browse files

staging: mmal-vchiq: Replace spinlock protecting context_map with mutex



950fd867 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.

Signed-off-by: default avatarDave Stevenson <dave.stevenson@raspberrypi.org>
parent 06e48eb9
Loading
Loading
Loading
Loading
+7 −6
Original line number Diff line number Diff line
@@ -185,7 +185,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;

	struct vchiq_mmal_component component[VCHIQ_MMAL_MAX_COMPONENTS];

@@ -209,10 +210,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);
@@ -236,9 +237,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);
}

@@ -2143,7 +2144,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;