Commit 1f79046b authored by Alex Elder's avatar Alex Elder Committed by Greg Kroah-Hartman
Browse files

greybus: tracing: fix hd traces



Currently there are two trace points defined for the Greybus host
device structure.  One records information when a message gets sent,
and another when it gets received.  Neither of these is really a
host device event.

We have trace points defined for messages that dump information
about all sent and received messages.  As a result, the information
about sending messages over a host is redundant, and can go away.
(Note that the message traces may need a little refinement so they
produce all desired information.)

Instead of these trace points, define some that are directly
related to the host device abstraction: when one is created,
added, deleted, or released (destroyed).  These do not require
a CPort ID or payload size, so eliminate those two parameters
from the host device trace point prototype.  Change the trace
information recorded for a host device to be just a subset of
interesting fields in a host device.

Signed-off-by: default avatarAlex Elder <elder@linaro.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@google.com>
parent df732546
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -14,8 +14,10 @@
#include "greybus.h"
#include "greybus_trace.h"

EXPORT_TRACEPOINT_SYMBOL_GPL(gb_host_device_send);
EXPORT_TRACEPOINT_SYMBOL_GPL(gb_host_device_recv);
EXPORT_TRACEPOINT_SYMBOL_GPL(gb_hd_create);
EXPORT_TRACEPOINT_SYMBOL_GPL(gb_hd_release);
EXPORT_TRACEPOINT_SYMBOL_GPL(gb_hd_add);
EXPORT_TRACEPOINT_SYMBOL_GPL(gb_hd_del);

/* Allow greybus to be disabled at boot if needed */
static bool nogreybus;
+0 −4
Original line number Diff line number Diff line
@@ -16,8 +16,6 @@
#include "greybus.h"
#include "kernel_ver.h"
#include "connection.h"
#include "greybus_trace.h"


/* Fixed CPort numbers */
#define ES2_CPORT_CDSI0		16
@@ -469,7 +467,6 @@ static int message_send(struct gb_host_device *hd, u16 cport_id,
			  message->buffer, buffer_size,
			  cport_out_callback, message);
	urb->transfer_flags |= URB_ZERO_PACKET;
	trace_gb_host_device_send(hd, cport_id, buffer_size);
	retval = usb_submit_urb(urb, gfp_mask);
	if (retval) {
		dev_err(&udev->dev, "failed to submit out-urb: %d\n", retval);
@@ -909,7 +906,6 @@ static void cport_in_callback(struct urb *urb)
	cport_id = gb_message_cport_unpack(header);

	if (cport_id_valid(hd, cport_id)) {
		trace_gb_host_device_recv(hd, cport_id, urb->actual_length);
		greybus_data_rcvd(hd, cport_id, urb->transfer_buffer,
							urb->actual_length);
	} else {
+31 −21
Original line number Diff line number Diff line
@@ -158,45 +158,55 @@ DEFINE_OPERATION_EVENT(gb_operation_put_active);

DECLARE_EVENT_CLASS(gb_host_device,

	TP_PROTO(struct gb_host_device *hd, u16 intf_cport_id,
		 size_t payload_size),
	TP_PROTO(struct gb_host_device *hd),

	TP_ARGS(hd, intf_cport_id, payload_size),
	TP_ARGS(hd),

	TP_STRUCT__entry(
		__string(name, dev_name(&hd->dev))
		__field(u16, intf_cport_id)
		__field(size_t, payload_size)
		__field(int, bus_id)
		__field(u8, num_cports)
		__field(size_t, buffer_size_max)
	),

	TP_fast_assign(
		__assign_str(name, dev_name(&hd->dev))
		__entry->intf_cport_id = intf_cport_id;
		__entry->payload_size = payload_size;
		__entry->bus_id = hd->bus_id;
		__entry->num_cports = hd->num_cports;
		__entry->buffer_size_max = hd->buffer_size_max;
	),

	TP_printk("greybus:%s if_id=%u l=%zu", __get_str(name),
		  __entry->intf_cport_id, __entry->payload_size)
	TP_printk("greybus: bus_id=%d num_cports=%hu mtu=%zu",
		__entry->bus_id, __entry->num_cports,
		__entry->buffer_size_max)
);

#define DEFINE_HD_EVENT(name)						\
		DEFINE_EVENT(gb_host_device, name,			\
				TP_PROTO(struct gb_host_device *hd,	\
					u16 intf_cport_id,		\
					size_t payload_size),		\
				TP_ARGS(hd, intf_cport_id, payload_size))
				TP_PROTO(struct gb_host_device *hd),	\
				TP_ARGS(hd))

/*
 * Occurs after a new host device is successfully created, before
 * its SVC has been set up.
 */
DEFINE_HD_EVENT(gb_hd_create);

/*
 * Occurs after the last reference to a host device has been
 * dropped.
 */
DEFINE_HD_EVENT(gb_hd_release);

/*
 * Occurs immediately before calling usb_submit_urb() to send a
 * message to the UniPro bridge.
 * Occurs after a new host device has been added, after the
 * connection to its SVC has * been enabled.
 */
DEFINE_HD_EVENT(gb_host_device_send);
DEFINE_HD_EVENT(gb_hd_add);

/*
 * Occurs after receiving a UniPro message via the USB subsystem,
 * just prior to handing it to the Greybus core for handling.
 * Occurs when a host device is being disconnected from the AP USB
 * host controller.
 */
DEFINE_HD_EVENT(gb_host_device_recv);
DEFINE_HD_EVENT(gb_hd_del);

#undef DEFINE_HD_EVENT

+9 −1
Original line number Diff line number Diff line
@@ -11,7 +11,7 @@
#include <linux/slab.h>

#include "greybus.h"

#include "greybus_trace.h"

static struct ida gb_hd_bus_id_map;

@@ -87,6 +87,8 @@ void gb_hd_cport_release(struct gb_host_device *hd, u16 cport_id)
	}

	ida_simple_remove(&hd->cport_id_map, cport_id);

	trace_gb_hd_release(hd);
}

static void gb_hd_release(struct device *dev)
@@ -168,6 +170,8 @@ struct gb_host_device *gb_hd_create(struct gb_hd_driver *driver,
	device_initialize(&hd->dev);
	dev_set_name(&hd->dev, "greybus%d", hd->bus_id);

	trace_gb_hd_create(hd);

	hd->svc = gb_svc_create(hd);
	if (!hd->svc) {
		dev_err(&hd->dev, "failed to create svc\n");
@@ -193,12 +197,16 @@ int gb_hd_add(struct gb_host_device *hd)
		return ret;
	}

	trace_gb_hd_add(hd);

	return 0;
}
EXPORT_SYMBOL_GPL(gb_hd_add);

void gb_hd_del(struct gb_host_device *hd)
{
	trace_gb_hd_del(hd);

	/*
	 * Tear down the svc and flush any on-going hotplug processing before
	 * removing the remaining interfaces.