PERFORCE change 181158 for review
Alexandre Fiveg
afiveg at FreeBSD.org
Mon Jul 19 00:16:43 UTC 2010
http://p4web.freebsd.org/@@181158?ac=10
Change 181158 by afiveg at ringmap-2 on 2010/07/19 00:16:37
Macroses for accessing 8259x registers (ringmap_8259.h)
Affected files ...
.. //depot/projects/soc2010/ringmap/current/sys/dev/ixgbe/ixgbe.c#5 edit
.. //depot/projects/soc2010/ringmap/current/sys/dev/ixgbe/ixgbe.h#4 edit
.. //depot/projects/soc2010/ringmap/current/sys/dev/ixgbe/ringmap_8259.h#3 edit
.. //depot/projects/soc2010/ringmap/current/sys/dev/ixgbe/ringmap_ixgbe.c#4 edit
.. //depot/projects/soc2010/ringmap/current/sys/net/ringmap.c#34 edit
.. //depot/projects/soc2010/ringmap/current/sys/net/ringmap.h#34 edit
.. //depot/projects/soc2010/ringmap/current/sys/net/ringmap_kernel.h#4 edit
Differences ...
==== //depot/projects/soc2010/ringmap/current/sys/dev/ixgbe/ixgbe.c#5 (text+ko) ====
@@ -1429,7 +1429,7 @@
#ifdef RINGMAP
struct capt_object *co = NULL;
- adapter->rm->funcs->delayed_isr(adapter);
+ adapter->rm->funcs->delayed_isr(que);
#endif
++que->irqs;
@@ -2180,8 +2180,6 @@
struct ix_queue *que = adapter->queues;
int error, rid, vector = 0;
-/*TODO: remove it ASAP */
- RINGMAP_FUNC_DEBUG(start);
for (int i = 0; i < adapter->num_queues; i++, vector++, que++) {
rid = vector + 1;
@@ -4344,7 +4342,7 @@
}
#else
if (adapter->rm != NULL)
- adapter->rm->funcs->delayed_isr_per_packet(adapter->dev,
+ adapter->rm->funcs->delayed_isr_per_packet(que,
R_MODULO(i-1));
#endif
}
==== //depot/projects/soc2010/ringmap/current/sys/dev/ixgbe/ixgbe.h#4 (text+ko) ====
==== //depot/projects/soc2010/ringmap/current/sys/dev/ixgbe/ringmap_8259.h#3 (text+ko) ====
@@ -1,0 +1,49 @@
+#define DESC_AREA(que) (que)->rxr->rx_base
+#define MBUF_AREA(que) (que)->rxr->rx_buffers
+
+
+/* Kernel address of mbuf wich placed in the slot "i" */
+#define GET_MBUF_P(que) \
+ (MBUF_AREA(que)[(que)->rxr->me].m_head)
+
+
+/* Kernel address of the packet wich placed in the slot "i" */
+#define GET_PACKET_P(que) \
+ (MBUF_AREA(que)[(que)->rxr->me].m_head->m_data)
+
+
+/* Kernel address of the descriptor wich placed in the slot "i" */
+#define GET_DESCRIPTOR_P(que) \
+ (&(DESC_AREA(que)[(que)->rxr->me]))
+
+
+/* Registers access */
+#define RINGMAP_HW_READ_REG IXGBE_READ_REG
+#define RINGMAP_HW_WRITE_REG IXGBE_WRITE_REG
+
+#define HW_RDT(que) IXGBE_RDT((que)->rxr->me)
+#define HW_RDH(que) IXGBE_RDH((que)->rxr->me)
+
+#define HW_STRUCT(que) (&(que)->adapter->hw)
+
+#define HW_READ_REG(que, reg) \
+ RINGMAP_HW_READ_REG(HW_STRUCT(que), (reg))
+
+#define HW_WRITE_REG(que, reg, val) \
+ RINGMAP_HW_READ_REG(HW_STRUCT(que), (reg), (val))
+
+#define RINGMAP_HW_READ_HEAD(que) \
+ HW_READ_REG((que), HW_RDH(que))
+
+#define RINGMAP_HW_SYNC_HEAD(que, ring) \
+ SW_HEAD(ring) = RINGMAP_HW_READ_HEAD(que);
+
+#define RINGMAP_HW_SYNC_TAIL(que, ring) \
+ HW_WRITE_REG((que), HW_RDT(que), SW_TAIL(ring))
+
+#define RINGMAP_HW_WRITE_TAIL(que, val) \
+ HW_WRITE_REG((que), HW_RDT(que), (val))
+
+#define RINGMAP_HW_READ_TAIL(que) \
+ HW_READ_REG((que), HW_RDT(que))
+
==== //depot/projects/soc2010/ringmap/current/sys/dev/ixgbe/ringmap_ixgbe.c#4 (text+ko) ====
@@ -26,11 +26,11 @@
int rm_8259_set_slot(struct ring *, device_t, unsigned int);
void rm_8259_interrupt(void *);
void rm_8259_delayed_interrupt(void *);
-int rm_8259_print_ring_pointers(struct adapter *);
+int rm_8259_print_ring_pointers(void *);
void rm_8259_sync_head_tail(device_t);
void rm_8259_sync_tail(device_t);
void rm_8259_sync_head(device_t);
-void rm_8259_delayed_interrupt_per_packet(device_t, int);
+void rm_8259_delayed_interrupt_per_packet(void *, int);
extern devclass_t ixgbe_devclass;
extern void ixgbe_enable_intr(struct adapter *);
@@ -135,12 +135,14 @@
void
rm_8259_delayed_interrupt(void *context)
{
- struct adapter *adapter = (struct adapter *)context;
+ struct ix_queue *que = (struct ix_queue *)context;
+ struct adapter *adapter = (struct adapter *)que->adapter;
struct timeval last_ts;
RINGMAP_LOCK(adapter->rm);
if ( adapter->rm->open_cnt > 0 ) {
+
adapter->rm->interrupts_counter++;
getmicrotime(&last_ts);
rm_8259_sync_tail(adapter->dev);
@@ -151,18 +153,20 @@
void
-rm_8259_delayed_interrupt_per_packet(device_t dev, int slot_num)
+rm_8259_delayed_interrupt_per_packet(void *context, int slot_num)
{
- struct adapter *adapter = NULL;
- struct ringmap *rm = NULL;
+ struct ix_queue *que = (struct ix_queue *)context;
+ struct adapter *adapter = (struct adapter *)que->adapter;
+ struct ringmap *rm = adapter->rm;;
- adapter = (struct adapter *)device_get_softc(dev);
- rm = adapter->rm;
-
RINGMAP_INTR(start);
RINGMAP_LOCK(rm);
+#if (RINGMAP_INTR_DEB)
+ rm_8259_print_ring_pointers(que);
+#endif
+
RINGMAP_UNLOCK(rm);
RINGMAP_INTR(end);
@@ -252,24 +256,20 @@
int
-rm_8259_print_ring_pointers(struct adapter *adapter)
+rm_8259_print_ring_pointers(void *context)
{
+ struct ix_queue *que = (struct ix_queue *)context;
unsigned int rdt, rdh;
- struct ringmap *rm = NULL;
- rm = adapter->rm;
-
- if (rm == NULL)
- goto out;
+ rdh = RINGMAP_HW_READ_HEAD(que);
+ rdt = RINGMAP_HW_READ_TAIL(que);
- rdh = 0;
- rdt = 0;
-
printf("\n== +++++++++ RING POINTERS ++++++++++++ \n");
+ printf("== + Queue Number: %d\n", que->rxr->me);
+ printf("== + \n");
printf("== + HW HEAD = %d (KERN POINTER)\n", rdh);
printf("== + HW TAIL = %d (USER POINTER)\n", rdt);
printf("== ++++++++++++++++++++++++++++++++++++++ \n\n");
-out:
return (0);
}
==== //depot/projects/soc2010/ringmap/current/sys/net/ringmap.c#34 (text+ko) ====
@@ -176,6 +176,12 @@
RINGMAP_LOCK(rm);
+ if (rm->open_cnt == RINGMAP_MAX_THREADS){
+ RINGMAP_ERROR(Can not open device!);
+
+ err = EIO; goto out;
+ }
+
/* check: the current thread shouldn't open(2) more than one time */
if (rm->open_cnt) {
SLIST_FOREACH(co, &rm->object_list, objects) {
==== //depot/projects/soc2010/ringmap/current/sys/net/ringmap.h#34 (text+ko) ====
@@ -8,9 +8,6 @@
*/
#define RINGMAP_DEVICE "ringmap"
-/* Name of module to be loaded*/
-#define MOD_NAME "if_ringmap.ko"
-
/*
* Driver works only with device wich has the following device ID. If 0
* then work with all devices that was found and accepted in the "probe"
@@ -73,8 +70,8 @@
* This structure represents the packets ringbuffer. The structure should be
* mapped into the user-space to be visible and accessible from the user
* capturing application. The ring contains the pointer to SLOTs array. Each
- * SLOT represents one packet. Additionaly, the structure the ring-HEAD
- * (kernrp) and ring-TAIL (userrp).
+ * SLOT represents one packet. Additionaly, the structure contains
+ * ring-HEAD (kernrp) and ring-TAIL (userrp) poiners.
*/
struct ring {
@@ -154,10 +151,10 @@
* Disable interrupts on NIC. In some cases it is safe
* to disable interrupts in order to avoid kernel panics
*/
-#define IOCTL_DISABLE_INTR _IO(RINGMAP_IOC_MAGIC, 4)
+#define IOCTL_DISABLE_INTR _IO(RINGMAP_IOC_MAGIC, 3)
/* Enable interrupts on NIC */
-#define IOCTL_ENABLE_INTR _IO(RINGMAP_IOC_MAGIC, 3)
+#define IOCTL_ENABLE_INTR _IO(RINGMAP_IOC_MAGIC, 4)
/*
* Sleep and wait for new pkts in ring buffer. By this
@@ -205,37 +202,37 @@
((SW_TAIL(ringp) == SW_HEAD(ringp)) ? SLOTS_NUMBER : \
R_DISTANCE(SW_TAIL(ringp), SW_HEAD(ringp)))
-#define SW_INCR_TAIL(ringp) \
+#define SW_INCR_TAIL(ringp) \
(SW_TAIL(ringp)) = R_MODULO(SW_TAIL(ringp) + 1);
-#define RING_IS_EMPTY(ringp) \
+#define RING_IS_EMPTY(ringp) \
((SW_TAIL_TO_HEAD_DIST(ringp)) == 1)
-#define RING_NOT_EMPTY(ringp) \
+#define RING_NOT_EMPTY(ringp) \
((SW_TAIL_TO_HEAD_DIST(ringp)) != 1)
-#define RING_IS_FULL(ringp) \
+#define RING_IS_FULL(ringp) \
((SW_HEAD_TO_TAIL_DIST(ringp)) == 0)
-#define RING_SLOT(ringp, i) \
+#define RING_SLOT(ringp, i) \
((ringp)->slot[(i)])
-#define TAIL_SLOT(ringp) \
+#define TAIL_SLOT(ringp) \
RING_SLOT((ringp), (SW_TAIL((ringp))))
-#define TAIL_PACKET(ringp) \
+#define TAIL_PACKET(ringp) \
TAIL_SLOT(ringp).packet
-#define U_MBUF(ringp, i) \
+#define U_MBUF(ringp, i) \
RING_SLOT((ringp), (i)).mbuf.user
-#define K_MBUF(ringp, i) \
+#define K_MBUF(ringp, i) \
RING_SLOT((ringp), (i)).mbuf.kern
-#define U_PACKET(ringp, i) \
+#define U_PACKET(ringp, i) \
RING_SLOT((ringp), (i)).packet.user
-#define K_PACKET(ringp, i) \
+#define K_PACKET(ringp, i) \
RING_SLOT((ringp), (i)).packet.kern
/*
@@ -285,22 +282,28 @@
__func__, pktp[0], pktp[1], pktp[16], pktp[32], pktp[59]);
#define PRINT_PACKET_ADDR(ring, i) \
-printf("=+= packet.user=0x%X, packet.phys=0x%X, packet.kern=0x%X\n", \
+ do { \
+ printf("=+= packet.user=0x%X, packet.phys=0x%X, packet.kern=0x%X\n",\
(unsigned int)ring->slot[i].packet.user, \
- ring->slot[i].packet.phys, \
- ring->slot[i].packet.kern);
+ (unsigned int)ring->slot[i].packet.phys, \
+ (unsigned int)ring->slot[i].packet.kern); \
+ } while (0);
#define PRINT_MBUF_ADDR(ring, i) \
-printf("=+= mbuf.user=0x%X, mbuf.phys=0x%X, mbuf.kern=0x%X\n", \
+ do { \
+ printf("=+= mbuf.user=0x%X, mbuf.phys=0x%X, mbuf.kern=0x%X\n", \
(unsigned int)ring->slot[i].mbuf.user, \
- ring->slot[i].mbuf.phys, \
- ring->slot[i].mbuf.kern);
+ (unsigned int)ring->slot[i].mbuf.phys, \
+ (unsigned int)ring->slot[i].mbuf.kern); \
+ } while (0);
#define PRINT_DECRIPTOR_ADDR(ring, i) \
-printf("=+= descr.user=0x%X, descr.phys=0x%X, descr.kern=0x%X\n", \
+ do { \
+ printf("=+= descr.user=0x%X, descr.phys=0x%X, descr.kern=0x%X\n", \
(unsigned int)ring->slot[i].descriptor.user, \
- ring->slot[i].descriptor.phys, \
- ring->slot[i].descriptor.kern);
+ (unsigned int)ring->slot[i].descriptor.phys, \
+ (unsigned int)ring->slot[i].descriptor.kern); \
+ } while (0);
#define PRINT_SLOT(ring, i) \
if (((ring) != NULL) && ((i) < SLOTS_NUMBER)){ \
@@ -328,9 +331,11 @@
printf("=+= [%s] head = %d\n", __func__, SW_HEAD(ring));
#define PRINT_RING_PTRS(ring) \
- PRINT_TAIL(ring) \
- PRINT_HEAD(ring) \
- printf("=+= [%s] pid = %d\n", __func__, ring->pid);
+ do { \
+ printf("=+= [%s] pid = %d\n", __func__, ring->pid); \
+ PRINT_TAIL(ring) \
+ PRINT_HEAD(ring) \
+ } while (0);
==== //depot/projects/soc2010/ringmap/current/sys/net/ringmap_kernel.h#4 (text+ko) ====
@@ -75,7 +75,7 @@
* should be called from this cycle, so it will be called
* per packet.
*/
- void (*delayed_isr_per_packet)(device_t, int);
+ void (*delayed_isr_per_packet)(void *, int);
/*
* Next functions synchronize the tail and head hardware registers
More information about the p4-projects
mailing list