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

Commit b53e0c9e authored by Johan Hovold's avatar Johan Hovold Committed by Greg Kroah-Hartman
Browse files

greybus: connection: make cport lookup thread-safe



Use the gb_connection_mutex when making sure a remote CPort is
available.

This is needed when moving to driver-managed connections that can be
created and destroyed at any time.

Also check for duplicate bundle-less connections.

Reviewed-by: default avatarViresh Kumar <viresh.kumar@linaro.org>
Signed-off-by: default avatarJohan Hovold <johan@hovoldconsulting.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@google.com>
parent 210b508e
Loading
Loading
Loading
Loading
+6 −12
Original line number Diff line number Diff line
@@ -19,7 +19,7 @@ static DEFINE_SPINLOCK(gb_connections_lock);
static DEFINE_MUTEX(gb_connection_mutex);


/* This is only used at initialization time; no locking is required. */
/* Caller holds gb_connection_mutex. */
static struct gb_connection *
gb_connection_intf_find(struct gb_interface *intf, u16 cport_id)
{
@@ -142,17 +142,6 @@ gb_connection_create(struct gb_host_device *hd, int hd_cport_id,
	struct ida *id_map = &hd->cport_id_map;
	int ida_start, ida_end;

	/*
	 * If a manifest tries to reuse a cport, reject it.  We
	 * initialize connections serially so we don't need to worry
	 * about holding the connection lock.
	 */
	if (bundle && gb_connection_intf_find(bundle->intf, cport_id)) {
		dev_err(&bundle->dev, "cport %u already connected\n",
				cport_id);
		return NULL;
	}

	if (hd_cport_id < 0) {
		ida_start = 0;
		ida_end = hd->num_cports;
@@ -166,6 +155,11 @@ gb_connection_create(struct gb_host_device *hd, int hd_cport_id,

	mutex_lock(&gb_connection_mutex);

	if (intf && gb_connection_intf_find(intf, cport_id)) {
		dev_err(&intf->dev, "cport %u already in use\n", cport_id);
		goto err_unlock;
	}

	hd_cport_id = ida_simple_get(id_map, ida_start, ida_end, GFP_KERNEL);
	if (hd_cport_id < 0)
		goto err_unlock;