aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Sperl <kernel@martin.sperl.org>2015-06-22 09:02:04 -0400
committerMark Brown <broonie@kernel.org>2015-09-19 14:12:56 -0400
commit6b7bc0618ff1a333d2265131b124e966335d5dee (patch)
treedcbbfd8154c62a3bb02c23d071f57cba08294371
parent6ff33f3902c3b1c5d0db6b1e2c70b6d76fba357f (diff)
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: Martin Sperl <kernel@martin.sperl.org> Signed-off-by: Mark Brown <broonie@kernel.org>
-rw-r--r--drivers/spi/spi.c61
-rw-r--r--include/linux/spi/spi.h4
2 files changed, 65 insertions, 0 deletions
diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c
index 3abb3903f2ad..73face0f6b9c 100644
--- a/drivers/spi/spi.c
+++ b/drivers/spi/spi.c
@@ -123,6 +123,28 @@ SPI_STATISTICS_SHOW(bytes, "%llu");
123SPI_STATISTICS_SHOW(bytes_rx, "%llu"); 123SPI_STATISTICS_SHOW(bytes_rx, "%llu");
124SPI_STATISTICS_SHOW(bytes_tx, "%llu"); 124SPI_STATISTICS_SHOW(bytes_tx, "%llu");
125 125
126#define SPI_STATISTICS_TRANSFER_BYTES_HISTO(index, number) \
127 SPI_STATISTICS_SHOW_NAME(transfer_bytes_histo##index, \
128 "transfer_bytes_histo_" number, \
129 transfer_bytes_histo[index], "%lu")
130SPI_STATISTICS_TRANSFER_BYTES_HISTO(0, "0-1");
131SPI_STATISTICS_TRANSFER_BYTES_HISTO(1, "2-3");
132SPI_STATISTICS_TRANSFER_BYTES_HISTO(2, "4-7");
133SPI_STATISTICS_TRANSFER_BYTES_HISTO(3, "8-15");
134SPI_STATISTICS_TRANSFER_BYTES_HISTO(4, "16-31");
135SPI_STATISTICS_TRANSFER_BYTES_HISTO(5, "32-63");
136SPI_STATISTICS_TRANSFER_BYTES_HISTO(6, "64-127");
137SPI_STATISTICS_TRANSFER_BYTES_HISTO(7, "128-255");
138SPI_STATISTICS_TRANSFER_BYTES_HISTO(8, "256-511");
139SPI_STATISTICS_TRANSFER_BYTES_HISTO(9, "512-1023");
140SPI_STATISTICS_TRANSFER_BYTES_HISTO(10, "1024-2047");
141SPI_STATISTICS_TRANSFER_BYTES_HISTO(11, "2048-4095");
142SPI_STATISTICS_TRANSFER_BYTES_HISTO(12, "4096-8191");
143SPI_STATISTICS_TRANSFER_BYTES_HISTO(13, "8192-16383");
144SPI_STATISTICS_TRANSFER_BYTES_HISTO(14, "16384-32767");
145SPI_STATISTICS_TRANSFER_BYTES_HISTO(15, "32768-65535");
146SPI_STATISTICS_TRANSFER_BYTES_HISTO(16, "65536+");
147
126static struct attribute *spi_dev_attrs[] = { 148static struct attribute *spi_dev_attrs[] = {
127 &dev_attr_modalias.attr, 149 &dev_attr_modalias.attr,
128 NULL, 150 NULL,
@@ -143,6 +165,23 @@ static struct attribute *spi_device_statistics_attrs[] = {
143 &dev_attr_spi_device_bytes.attr, 165 &dev_attr_spi_device_bytes.attr,
144 &dev_attr_spi_device_bytes_rx.attr, 166 &dev_attr_spi_device_bytes_rx.attr,
145 &dev_attr_spi_device_bytes_tx.attr, 167 &dev_attr_spi_device_bytes_tx.attr,
168 &dev_attr_spi_device_transfer_bytes_histo0.attr,
169 &dev_attr_spi_device_transfer_bytes_histo1.attr,
170 &dev_attr_spi_device_transfer_bytes_histo2.attr,
171 &dev_attr_spi_device_transfer_bytes_histo3.attr,
172 &dev_attr_spi_device_transfer_bytes_histo4.attr,
173 &dev_attr_spi_device_transfer_bytes_histo5.attr,
174 &dev_attr_spi_device_transfer_bytes_histo6.attr,
175 &dev_attr_spi_device_transfer_bytes_histo7.attr,
176 &dev_attr_spi_device_transfer_bytes_histo8.attr,
177 &dev_attr_spi_device_transfer_bytes_histo9.attr,
178 &dev_attr_spi_device_transfer_bytes_histo10.attr,
179 &dev_attr_spi_device_transfer_bytes_histo11.attr,
180 &dev_attr_spi_device_transfer_bytes_histo12.attr,
181 &dev_attr_spi_device_transfer_bytes_histo13.attr,
182 &dev_attr_spi_device_transfer_bytes_histo14.attr,
183 &dev_attr_spi_device_transfer_bytes_histo15.attr,
184 &dev_attr_spi_device_transfer_bytes_histo16.attr,
146 NULL, 185 NULL,
147}; 186};
148 187
@@ -168,6 +207,23 @@ static struct attribute *spi_master_statistics_attrs[] = {
168 &dev_attr_spi_master_bytes.attr, 207 &dev_attr_spi_master_bytes.attr,
169 &dev_attr_spi_master_bytes_rx.attr, 208 &dev_attr_spi_master_bytes_rx.attr,
170 &dev_attr_spi_master_bytes_tx.attr, 209 &dev_attr_spi_master_bytes_tx.attr,
210 &dev_attr_spi_master_transfer_bytes_histo0.attr,
211 &dev_attr_spi_master_transfer_bytes_histo1.attr,
212 &dev_attr_spi_master_transfer_bytes_histo2.attr,
213 &dev_attr_spi_master_transfer_bytes_histo3.attr,
214 &dev_attr_spi_master_transfer_bytes_histo4.attr,
215 &dev_attr_spi_master_transfer_bytes_histo5.attr,
216 &dev_attr_spi_master_transfer_bytes_histo6.attr,
217 &dev_attr_spi_master_transfer_bytes_histo7.attr,
218 &dev_attr_spi_master_transfer_bytes_histo8.attr,
219 &dev_attr_spi_master_transfer_bytes_histo9.attr,
220 &dev_attr_spi_master_transfer_bytes_histo10.attr,
221 &dev_attr_spi_master_transfer_bytes_histo11.attr,
222 &dev_attr_spi_master_transfer_bytes_histo12.attr,
223 &dev_attr_spi_master_transfer_bytes_histo13.attr,
224 &dev_attr_spi_master_transfer_bytes_histo14.attr,
225 &dev_attr_spi_master_transfer_bytes_histo15.attr,
226 &dev_attr_spi_master_transfer_bytes_histo16.attr,
171 NULL, 227 NULL,
172}; 228};
173 229
@@ -186,10 +242,15 @@ void spi_statistics_add_transfer_stats(struct spi_statistics *stats,
186 struct spi_master *master) 242 struct spi_master *master)
187{ 243{
188 unsigned long flags; 244 unsigned long flags;
245 int l2len = min(fls(xfer->len), SPI_STATISTICS_HISTO_SIZE) - 1;
246
247 if (l2len < 0)
248 l2len = 0;
189 249
190 spin_lock_irqsave(&stats->lock, flags); 250 spin_lock_irqsave(&stats->lock, flags);
191 251
192 stats->transfers++; 252 stats->transfers++;
253 stats->transfer_bytes_histo[l2len]++;
193 254
194 stats->bytes += xfer->len; 255 stats->bytes += xfer->len;
195 if ((xfer->tx_buf) && 256 if ((xfer->tx_buf) &&
diff --git a/include/linux/spi/spi.h b/include/linux/spi/spi.h
index 269e8afd3e2a..5b6fdc48eba7 100644
--- a/include/linux/spi/spi.h
+++ b/include/linux/spi/spi.h
@@ -51,6 +51,8 @@ extern struct bus_type spi_bus_type;
51 * @bytes_tx: number of bytes sent to device 51 * @bytes_tx: number of bytes sent to device
52 * @bytes_rx: number of bytes received from device 52 * @bytes_rx: number of bytes received from device
53 * 53 *
54 * @transfer_bytes_histo:
55 * transfer bytes histogramm
54 */ 56 */
55struct spi_statistics { 57struct spi_statistics {
56 spinlock_t lock; /* lock for the whole structure */ 58 spinlock_t lock; /* lock for the whole structure */
@@ -68,6 +70,8 @@ struct spi_statistics {
68 unsigned long long bytes_rx; 70 unsigned long long bytes_rx;
69 unsigned long long bytes_tx; 71 unsigned long long bytes_tx;
70 72
73#define SPI_STATISTICS_HISTO_SIZE 17
74 unsigned long transfer_bytes_histo[SPI_STATISTICS_HISTO_SIZE];
71}; 75};
72 76
73void spi_statistics_add_transfer_stats(struct spi_statistics *stats, 77void spi_statistics_add_transfer_stats(struct spi_statistics *stats,