|
@@ -31,7 +31,8 @@ struct xdp_umem_ring {
|
|
|
};
|
|
|
|
|
|
struct xsk_queue {
|
|
|
- struct xdp_umem_props umem_props;
|
|
|
+ u64 chunk_mask;
|
|
|
+ u64 size;
|
|
|
u32 ring_mask;
|
|
|
u32 nentries;
|
|
|
u32 prod_head;
|
|
@@ -78,7 +79,7 @@ static inline u32 xskq_nb_free(struct xsk_queue *q, u32 producer, u32 dcnt)
|
|
|
|
|
|
static inline bool xskq_is_valid_addr(struct xsk_queue *q, u64 addr)
|
|
|
{
|
|
|
- if (addr >= q->umem_props.size) {
|
|
|
+ if (addr >= q->size) {
|
|
|
q->invalid_descs++;
|
|
|
return false;
|
|
|
}
|
|
@@ -92,7 +93,7 @@ static inline u64 *xskq_validate_addr(struct xsk_queue *q, u64 *addr)
|
|
|
struct xdp_umem_ring *ring = (struct xdp_umem_ring *)q->ring;
|
|
|
unsigned int idx = q->cons_tail & q->ring_mask;
|
|
|
|
|
|
- *addr = READ_ONCE(ring->desc[idx]) & q->umem_props.chunk_mask;
|
|
|
+ *addr = READ_ONCE(ring->desc[idx]) & q->chunk_mask;
|
|
|
if (xskq_is_valid_addr(q, *addr))
|
|
|
return addr;
|
|
|
|
|
@@ -173,8 +174,8 @@ static inline bool xskq_is_valid_desc(struct xsk_queue *q, struct xdp_desc *d)
|
|
|
if (!xskq_is_valid_addr(q, d->addr))
|
|
|
return false;
|
|
|
|
|
|
- if (((d->addr + d->len) & q->umem_props.chunk_mask) !=
|
|
|
- (d->addr & q->umem_props.chunk_mask)) {
|
|
|
+ if (((d->addr + d->len) & q->chunk_mask) !=
|
|
|
+ (d->addr & q->chunk_mask)) {
|
|
|
q->invalid_descs++;
|
|
|
return false;
|
|
|
}
|
|
@@ -253,7 +254,7 @@ static inline bool xskq_empty_desc(struct xsk_queue *q)
|
|
|
return xskq_nb_free(q, q->prod_tail, q->nentries) == q->nentries;
|
|
|
}
|
|
|
|
|
|
-void xskq_set_umem(struct xsk_queue *q, struct xdp_umem_props *umem_props);
|
|
|
+void xskq_set_umem(struct xsk_queue *q, u64 size, u64 chunk_mask);
|
|
|
struct xsk_queue *xskq_create(u32 nentries, bool umem_queue);
|
|
|
void xskq_destroy(struct xsk_queue *q_ops);
|
|
|
|