diff options
author | Martin Sperl <kernel@martin.sperl.org> | 2015-06-22 09:02:04 -0400 |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2015-09-19 14:12:56 -0400 |
commit | 6b7bc0618ff1a333d2265131b124e966335d5dee (patch) | |
tree | dcbbfd8154c62a3bb02c23d071f57cba08294371 | |
parent | 6ff33f3902c3b1c5d0db6b1e2c70b6d76fba357f (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.c | 61 | ||||
-rw-r--r-- | include/linux/spi/spi.h | 4 |
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"); | |||
123 | SPI_STATISTICS_SHOW(bytes_rx, "%llu"); | 123 | SPI_STATISTICS_SHOW(bytes_rx, "%llu"); |
124 | SPI_STATISTICS_SHOW(bytes_tx, "%llu"); | 124 | SPI_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") | ||
130 | SPI_STATISTICS_TRANSFER_BYTES_HISTO(0, "0-1"); | ||
131 | SPI_STATISTICS_TRANSFER_BYTES_HISTO(1, "2-3"); | ||
132 | SPI_STATISTICS_TRANSFER_BYTES_HISTO(2, "4-7"); | ||
133 | SPI_STATISTICS_TRANSFER_BYTES_HISTO(3, "8-15"); | ||
134 | SPI_STATISTICS_TRANSFER_BYTES_HISTO(4, "16-31"); | ||
135 | SPI_STATISTICS_TRANSFER_BYTES_HISTO(5, "32-63"); | ||
136 | SPI_STATISTICS_TRANSFER_BYTES_HISTO(6, "64-127"); | ||
137 | SPI_STATISTICS_TRANSFER_BYTES_HISTO(7, "128-255"); | ||
138 | SPI_STATISTICS_TRANSFER_BYTES_HISTO(8, "256-511"); | ||
139 | SPI_STATISTICS_TRANSFER_BYTES_HISTO(9, "512-1023"); | ||
140 | SPI_STATISTICS_TRANSFER_BYTES_HISTO(10, "1024-2047"); | ||
141 | SPI_STATISTICS_TRANSFER_BYTES_HISTO(11, "2048-4095"); | ||
142 | SPI_STATISTICS_TRANSFER_BYTES_HISTO(12, "4096-8191"); | ||
143 | SPI_STATISTICS_TRANSFER_BYTES_HISTO(13, "8192-16383"); | ||
144 | SPI_STATISTICS_TRANSFER_BYTES_HISTO(14, "16384-32767"); | ||
145 | SPI_STATISTICS_TRANSFER_BYTES_HISTO(15, "32768-65535"); | ||
146 | SPI_STATISTICS_TRANSFER_BYTES_HISTO(16, "65536+"); | ||
147 | |||
126 | static struct attribute *spi_dev_attrs[] = { | 148 | static 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 | */ |
55 | struct spi_statistics { | 57 | struct 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 | ||
73 | void spi_statistics_add_transfer_stats(struct spi_statistics *stats, | 77 | void spi_statistics_add_transfer_stats(struct spi_statistics *stats, |