Commit 6b7bc061 authored by Martin Sperl's avatar Martin Sperl Committed by Mark Brown

spi: add transfer histogram statistics via sysfs

report transfer sizes as a histogram via the following files:
  /sys/class/spi_master/spi*/statistics/transfer_bytes_histo_*
  /sys/class/spi_master/spi*/spi*.*/statistics/transfer_bytes_histo_*
Signed-off-by: default avatarMartin Sperl <kernel@martin.sperl.org>
Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent 6ff33f39
...@@ -123,6 +123,28 @@ SPI_STATISTICS_SHOW(bytes, "%llu"); ...@@ -123,6 +123,28 @@ SPI_STATISTICS_SHOW(bytes, "%llu");
SPI_STATISTICS_SHOW(bytes_rx, "%llu"); SPI_STATISTICS_SHOW(bytes_rx, "%llu");
SPI_STATISTICS_SHOW(bytes_tx, "%llu"); SPI_STATISTICS_SHOW(bytes_tx, "%llu");
#define SPI_STATISTICS_TRANSFER_BYTES_HISTO(index, number) \
SPI_STATISTICS_SHOW_NAME(transfer_bytes_histo##index, \
"transfer_bytes_histo_" number, \
transfer_bytes_histo[index], "%lu")
SPI_STATISTICS_TRANSFER_BYTES_HISTO(0, "0-1");
SPI_STATISTICS_TRANSFER_BYTES_HISTO(1, "2-3");
SPI_STATISTICS_TRANSFER_BYTES_HISTO(2, "4-7");
SPI_STATISTICS_TRANSFER_BYTES_HISTO(3, "8-15");
SPI_STATISTICS_TRANSFER_BYTES_HISTO(4, "16-31");
SPI_STATISTICS_TRANSFER_BYTES_HISTO(5, "32-63");
SPI_STATISTICS_TRANSFER_BYTES_HISTO(6, "64-127");
SPI_STATISTICS_TRANSFER_BYTES_HISTO(7, "128-255");
SPI_STATISTICS_TRANSFER_BYTES_HISTO(8, "256-511");
SPI_STATISTICS_TRANSFER_BYTES_HISTO(9, "512-1023");
SPI_STATISTICS_TRANSFER_BYTES_HISTO(10, "1024-2047");
SPI_STATISTICS_TRANSFER_BYTES_HISTO(11, "2048-4095");
SPI_STATISTICS_TRANSFER_BYTES_HISTO(12, "4096-8191");
SPI_STATISTICS_TRANSFER_BYTES_HISTO(13, "8192-16383");
SPI_STATISTICS_TRANSFER_BYTES_HISTO(14, "16384-32767");
SPI_STATISTICS_TRANSFER_BYTES_HISTO(15, "32768-65535");
SPI_STATISTICS_TRANSFER_BYTES_HISTO(16, "65536+");
static struct attribute *spi_dev_attrs[] = { static struct attribute *spi_dev_attrs[] = {
&dev_attr_modalias.attr, &dev_attr_modalias.attr,
NULL, NULL,
...@@ -143,6 +165,23 @@ static struct attribute *spi_device_statistics_attrs[] = { ...@@ -143,6 +165,23 @@ static struct attribute *spi_device_statistics_attrs[] = {
&dev_attr_spi_device_bytes.attr, &dev_attr_spi_device_bytes.attr,
&dev_attr_spi_device_bytes_rx.attr, &dev_attr_spi_device_bytes_rx.attr,
&dev_attr_spi_device_bytes_tx.attr, &dev_attr_spi_device_bytes_tx.attr,
&dev_attr_spi_device_transfer_bytes_histo0.attr,
&dev_attr_spi_device_transfer_bytes_histo1.attr,
&dev_attr_spi_device_transfer_bytes_histo2.attr,
&dev_attr_spi_device_transfer_bytes_histo3.attr,
&dev_attr_spi_device_transfer_bytes_histo4.attr,
&dev_attr_spi_device_transfer_bytes_histo5.attr,
&dev_attr_spi_device_transfer_bytes_histo6.attr,
&dev_attr_spi_device_transfer_bytes_histo7.attr,
&dev_attr_spi_device_transfer_bytes_histo8.attr,
&dev_attr_spi_device_transfer_bytes_histo9.attr,
&dev_attr_spi_device_transfer_bytes_histo10.attr,
&dev_attr_spi_device_transfer_bytes_histo11.attr,
&dev_attr_spi_device_transfer_bytes_histo12.attr,
&dev_attr_spi_device_transfer_bytes_histo13.attr,
&dev_attr_spi_device_transfer_bytes_histo14.attr,
&dev_attr_spi_device_transfer_bytes_histo15.attr,
&dev_attr_spi_device_transfer_bytes_histo16.attr,
NULL, NULL,
}; };
...@@ -168,6 +207,23 @@ static struct attribute *spi_master_statistics_attrs[] = { ...@@ -168,6 +207,23 @@ static struct attribute *spi_master_statistics_attrs[] = {
&dev_attr_spi_master_bytes.attr, &dev_attr_spi_master_bytes.attr,
&dev_attr_spi_master_bytes_rx.attr, &dev_attr_spi_master_bytes_rx.attr,
&dev_attr_spi_master_bytes_tx.attr, &dev_attr_spi_master_bytes_tx.attr,
&dev_attr_spi_master_transfer_bytes_histo0.attr,
&dev_attr_spi_master_transfer_bytes_histo1.attr,
&dev_attr_spi_master_transfer_bytes_histo2.attr,
&dev_attr_spi_master_transfer_bytes_histo3.attr,
&dev_attr_spi_master_transfer_bytes_histo4.attr,
&dev_attr_spi_master_transfer_bytes_histo5.attr,
&dev_attr_spi_master_transfer_bytes_histo6.attr,
&dev_attr_spi_master_transfer_bytes_histo7.attr,
&dev_attr_spi_master_transfer_bytes_histo8.attr,
&dev_attr_spi_master_transfer_bytes_histo9.attr,
&dev_attr_spi_master_transfer_bytes_histo10.attr,
&dev_attr_spi_master_transfer_bytes_histo11.attr,
&dev_attr_spi_master_transfer_bytes_histo12.attr,
&dev_attr_spi_master_transfer_bytes_histo13.attr,
&dev_attr_spi_master_transfer_bytes_histo14.attr,
&dev_attr_spi_master_transfer_bytes_histo15.attr,
&dev_attr_spi_master_transfer_bytes_histo16.attr,
NULL, NULL,
}; };
...@@ -186,10 +242,15 @@ void spi_statistics_add_transfer_stats(struct spi_statistics *stats, ...@@ -186,10 +242,15 @@ void spi_statistics_add_transfer_stats(struct spi_statistics *stats,
struct spi_master *master) struct spi_master *master)
{ {
unsigned long flags; unsigned long flags;
int l2len = min(fls(xfer->len), SPI_STATISTICS_HISTO_SIZE) - 1;
if (l2len < 0)
l2len = 0;
spin_lock_irqsave(&stats->lock, flags); spin_lock_irqsave(&stats->lock, flags);
stats->transfers++; stats->transfers++;
stats->transfer_bytes_histo[l2len]++;
stats->bytes += xfer->len; stats->bytes += xfer->len;
if ((xfer->tx_buf) && if ((xfer->tx_buf) &&
......
...@@ -51,6 +51,8 @@ extern struct bus_type spi_bus_type; ...@@ -51,6 +51,8 @@ extern struct bus_type spi_bus_type;
* @bytes_tx: number of bytes sent to device * @bytes_tx: number of bytes sent to device
* @bytes_rx: number of bytes received from device * @bytes_rx: number of bytes received from device
* *
* @transfer_bytes_histo:
* transfer bytes histogramm
*/ */
struct spi_statistics { struct spi_statistics {
spinlock_t lock; /* lock for the whole structure */ spinlock_t lock; /* lock for the whole structure */
...@@ -68,6 +70,8 @@ struct spi_statistics { ...@@ -68,6 +70,8 @@ struct spi_statistics {
unsigned long long bytes_rx; unsigned long long bytes_rx;
unsigned long long bytes_tx; unsigned long long bytes_tx;
#define SPI_STATISTICS_HISTO_SIZE 17
unsigned long transfer_bytes_histo[SPI_STATISTICS_HISTO_SIZE];
}; };
void spi_statistics_add_transfer_stats(struct spi_statistics *stats, void spi_statistics_add_transfer_stats(struct spi_statistics *stats,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment