From owner-p4-projects@FreeBSD.ORG Mon Jul 19 00:16:43 2010 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id AF56E1065673; Mon, 19 Jul 2010 00:16:43 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 73BFC1065670 for ; Mon, 19 Jul 2010 00:16:42 +0000 (UTC) (envelope-from afiveg@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id A67D68FC0C for ; Mon, 19 Jul 2010 00:16:42 +0000 (UTC) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.3/8.14.3) with ESMTP id o6J0GgYH036672 for ; Mon, 19 Jul 2010 00:16:42 GMT (envelope-from afiveg@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.3/8.14.3/Submit) id o6J0Gghc036670 for perforce@freebsd.org; Mon, 19 Jul 2010 00:16:42 GMT (envelope-from afiveg@FreeBSD.org) Date: Mon, 19 Jul 2010 00:16:42 GMT Message-Id: <201007190016.o6J0Gghc036670@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to afiveg@FreeBSD.org using -f From: Alexandre Fiveg To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 181158 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 19 Jul 2010 00:16:43 -0000 http://p4web.freebsd.org/@@181158?ac=10 Change 181158 by afiveg@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