uint64_t values[], unsigned int n)
{
const struct rte_ioat_rawdev *ioat = dev->dev_private;
+ const uint64_t *stats = (const void *)&ioat->xstats;
unsigned int i;
for (i = 0; i < n; i++) {
- switch (ids[i]) {
- case 0: values[i] = ioat->enqueue_failed; break;
- case 1: values[i] = ioat->enqueued; break;
- case 2: values[i] = ioat->started; break;
- case 3: values[i] = ioat->completed; break;
- default: values[i] = 0; break;
- }
+ if (ids[i] < sizeof(ioat->xstats)/sizeof(*stats))
+ values[i] = stats[ids[i]];
+ else
+ values[i] = 0;
}
return n;
}
ioat_xstats_reset(struct rte_rawdev *dev, const uint32_t *ids, uint32_t nb_ids)
{
struct rte_ioat_rawdev *ioat = dev->dev_private;
+ uint64_t *stats = (void *)&ioat->xstats;
unsigned int i;
if (!ids) {
- ioat->enqueue_failed = 0;
- ioat->enqueued = 0;
- ioat->started = 0;
- ioat->completed = 0;
+ memset(&ioat->xstats, 0, sizeof(ioat->xstats));
return 0;
}
- for (i = 0; i < nb_ids; i++) {
- switch (ids[i]) {
- case 0:
- ioat->enqueue_failed = 0;
- break;
- case 1:
- ioat->enqueued = 0;
- break;
- case 2:
- ioat->started = 0;
- break;
- case 3:
- ioat->completed = 0;
- break;
- default:
- IOAT_PMD_WARN("Invalid xstat id - cannot reset value");
- break;
- }
- }
+ for (i = 0; i < nb_ids; i++)
+ if (ids[i] < sizeof(ioat->xstats)/sizeof(*stats))
+ stats[ids[i]] = 0;
return 0;
}
RTE_IDXD_DEV,
};
+/**
+ * @internal
+ * some statistics for tracking, if added/changed update xstats fns
+ */
+struct rte_ioat_xstats {
+ uint64_t enqueue_failed;
+ uint64_t enqueued;
+ uint64_t started;
+ uint64_t completed;
+};
+
/**
* @internal
* Structure representing an IOAT device instance
*/
struct rte_ioat_rawdev {
+ /* common fields at the top - match those in rte_idxd_rawdev */
enum rte_ioat_dev_type type;
+ struct rte_ioat_xstats xstats;
+
struct rte_rawdev *rawdev;
const struct rte_memzone *mz;
const struct rte_memzone *desc_mz;
- volatile uint16_t *doorbell;
+ volatile uint16_t *doorbell __rte_cache_aligned;
phys_addr_t status_addr;
phys_addr_t ring_addr;
unsigned short next_read;
unsigned short next_write;
- /* some statistics for tracking, if added/changed update xstats fns*/
- uint64_t enqueue_failed __rte_cache_aligned;
- uint64_t enqueued;
- uint64_t started;
- uint64_t completed;
-
/* to report completions, the device will write status back here */
volatile uint64_t status __rte_cache_aligned;
struct rte_ioat_generic_hw_desc *desc;
if (space == 0) {
- ioat->enqueue_failed++;
+ ioat->xstats.enqueue_failed++;
return 0;
}
(int64_t)src_hdl);
rte_prefetch0(&ioat->desc_ring[ioat->next_write & mask]);
- ioat->enqueued++;
+ ioat->xstats.enqueued++;
return 1;
}
.control.completion_update = 1;
rte_compiler_barrier();
*ioat->doorbell = ioat->next_write;
- ioat->started = ioat->enqueued;
+ ioat->xstats.started = ioat->xstats.enqueued;
}
/**
end:
ioat->next_read = read;
- ioat->completed += count;
+ ioat->xstats.completed += count;
return count;
}