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

Commit 48823cc0 authored by Dave Stevenson's avatar Dave Stevenson Committed by Greg Kroah-Hartman
Browse files

staging: mmal-vchiq: Allocate and free components as required



[ Upstream commit 8c589e1794a31e9a381916b0280260ab601e4d6e ]

The existing code assumed that there would only ever be 4 components,
and never freed the entries once used.
Allow arbitrary creation and destruction of components.

Signed-off-by: default avatarDave Stevenson <dave.stevenson@raspberrypi.org>
Signed-off-by: default avatarJacopo Mondi <jacopo@jmondi.org>
Signed-off-by: default avatarNicolas Saenz Julienne <nsaenzjulienne@suse.de>
Link: https://lore.kernel.org/r/20200623164235.29566-3-nsaenzjulienne@suse.de


Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Stable-dep-of: f37e76abd614 ("staging: vc04_services: fix information leak in create_component()")
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
parent 11895fd0
Loading
Loading
Loading
Loading
+19 −10
Original line number Diff line number Diff line
@@ -31,8 +31,11 @@
#define USE_VCHIQ_ARM
#include "interface/vchi/vchi.h"

/* maximum number of components supported */
#define VCHIQ_MMAL_MAX_COMPONENTS 4
/*
 * maximum number of components supported.
 * This matches the maximum permitted by default on the VPU
 */
#define VCHIQ_MMAL_MAX_COMPONENTS 64

/*#define FULL_MSG_DUMP 1*/

@@ -165,8 +168,6 @@ struct vchiq_mmal_instance {
	/* protect accesses to context_map */
	struct mutex context_map_lock;

	/* component to use next */
	int component_idx;
	struct vchiq_mmal_component component[VCHIQ_MMAL_MAX_COMPONENTS];
};

@@ -1607,18 +1608,24 @@ int vchiq_mmal_component_init(struct vchiq_mmal_instance *instance,
{
	int ret;
	int idx;		/* port index */
	struct vchiq_mmal_component *component;
	struct vchiq_mmal_component *component = NULL;

	if (mutex_lock_interruptible(&instance->vchiq_mutex))
		return -EINTR;

	if (instance->component_idx == VCHIQ_MMAL_MAX_COMPONENTS) {
	for (idx = 0; idx < VCHIQ_MMAL_MAX_COMPONENTS; idx++) {
		if (!instance->component[idx].in_use) {
			component = &instance->component[idx];
			component->in_use = 1;
			break;
		}
	}

	if (!component) {
		ret = -EINVAL;	/* todo is this correct error? */
		goto unlock;
	}

	component = &instance->component[instance->component_idx];

	ret = create_component(instance, component, name);
	if (ret < 0)
		goto unlock;
@@ -1666,8 +1673,6 @@ int vchiq_mmal_component_init(struct vchiq_mmal_instance *instance,
			goto release_component;
	}

	instance->component_idx++;

	*component_out = component;

	mutex_unlock(&instance->vchiq_mutex);
@@ -1677,6 +1682,8 @@ int vchiq_mmal_component_init(struct vchiq_mmal_instance *instance,
release_component:
	destroy_component(instance, component);
unlock:
	if (component)
		component->in_use = 0;
	mutex_unlock(&instance->vchiq_mutex);

	return ret;
@@ -1698,6 +1705,8 @@ int vchiq_mmal_component_finalise(struct vchiq_mmal_instance *instance,

	ret = destroy_component(instance, component);

	component->in_use = 0;

	mutex_unlock(&instance->vchiq_mutex);

	return ret;
+1 −0
Original line number Diff line number Diff line
@@ -81,6 +81,7 @@ struct vchiq_mmal_port {
};

struct vchiq_mmal_component {
	u32 in_use:1;
	u32 enabled:1;
	u32 handle;  /* VideoCore handle for component */
	u32 inputs;  /* Number of input ports */