From owner-p4-projects@FreeBSD.ORG Wed Jul 28 08:21:36 2010 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 1CAEA1065BF7; Wed, 28 Jul 2010 08:21:35 +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 903D61065B45 for ; Wed, 28 Jul 2010 08:21:35 +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 7B03B8FC18 for ; Wed, 28 Jul 2010 08:21:35 +0000 (UTC) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.4/8.14.4) with ESMTP id o6S8LZZ8009132 for ; Wed, 28 Jul 2010 08:21:35 GMT (envelope-from afiveg@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.4/8.14.4/Submit) id o6S8LZWj009130 for perforce@freebsd.org; Wed, 28 Jul 2010 08:21:35 GMT (envelope-from afiveg@FreeBSD.org) Date: Wed, 28 Jul 2010 08:21:35 GMT Message-Id: <201007280821.o6S8LZWj009130@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 181463 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: Wed, 28 Jul 2010 08:21:36 -0000 http://p4web.freebsd.org/@@181463?ac=10 Change 181463 by afiveg@ringmap-2 on 2010/07/25 17:02:26 ringmap is ported to 10GbE (integrated with ixgbe driver). Restrictions: 1. only one predefined queue is used (DEFAULT_QUEUE ringmap.h) - all incoming traffic on the adapter is posted into this predefined queue. 2. Currently no packet filtering - whole traffic will be captured. I am not sure if it is good idea to filter the packets in the user-space. If we want later write the packets into the disk from kernel, then filtering should be done using kernel-BPF. Affected files ... .. //depot/projects/soc2010/ringmap/current/contrib/libpcap/ringmap_pcap.c#22 edit .. //depot/projects/soc2010/ringmap/current/sys/dev/ixgbe/ixgbe.c#7 edit .. //depot/projects/soc2010/ringmap/current/sys/dev/ixgbe/ixgbe.h#6 edit .. //depot/projects/soc2010/ringmap/current/sys/dev/ixgbe/ringmap_8259.h#5 edit .. //depot/projects/soc2010/ringmap/current/sys/dev/ixgbe/ringmap_ixgbe.c#6 edit .. //depot/projects/soc2010/ringmap/current/sys/net/ringmap.c#36 edit .. //depot/projects/soc2010/ringmap/current/sys/net/ringmap.h#36 edit .. //depot/projects/soc2010/ringmap/current/sys/net/ringmap_kernel.h#6 edit .. //depot/projects/soc2010/ringmap/scripts/build_ringmap.sh#17 edit .. //depot/projects/soc2010/ringmap/scripts/set_ringmap.sh#18 edit .. //depot/projects/soc2010/ringmap/scripts/tailf_ringmap_msgs.sh#12 edit .. //depot/projects/soc2010/ringmap/tests/ringmap/close.c#5 edit .. //depot/projects/soc2010/ringmap/tests/ringmap/ioctl.c#5 edit .. //depot/projects/soc2010/ringmap/tests/ringmap/main.c#7 edit .. //depot/projects/soc2010/ringmap/tests/ringmap/mmap.c#7 edit .. //depot/projects/soc2010/ringmap/tests/ringmap/open.c#7 edit .. //depot/projects/soc2010/ringmap/tests/ringmap/tests.h#5 edit Differences ... ==== //depot/projects/soc2010/ringmap/current/contrib/libpcap/ringmap_pcap.c#22 (text+ko) ==== @@ -60,7 +60,7 @@ } /* - * Open mem device for mmaping of kernel memory regions in space of our + * Open mem device for mmaping of kernel memory regions into space of our * process */ if ((devmem_fd = open("/dev/mem", O_RDWR)) == -1){ @@ -78,6 +78,7 @@ RINGMAP_ERROR(Can not read phys addr of ring from kernel); return (-1); } + #if (__RINGMAP_DEB) printf("[%s] Phys addr of ring 0x%X\n", __func__, ring); #endif @@ -116,10 +117,7 @@ #endif /* - * Mapping mbufs from kern to userspace. - * mbufs internal pointers contain kernel space addresses - - * it means, we schould notice kernel space addresses of mbufs - * to be able to get correct mbufs from mbufs chain + * Mapping mbufs and packet buffers from kern into userspace. */ for (i = 0; i < SLOTS_NUMBER; i++){ @@ -128,7 +126,7 @@ tmp_addr = mmap ( 0, /* System will choose the addrress */ - sizeof(struct mbuf), /* Size of mapped region = mbuf */ + sizeof(struct mbuf), /* Size of mapped region (mbuf) */ PROT_WRITE|PROT_READ, /* protection: write & read */ MAP_SHARED, /* shared maping */ devmem_fd, /* device is /dev/mem */ @@ -183,11 +181,17 @@ RINGMAP_FUNC_DEBUG(start); - if ( (p == NULL) || (p->ring == NULL) ){ - RINGMAP_FUNC_DEBUG(NULL pointer. Debugging is needed!); + if (p == NULL) { + RINGMAP_FUNC_DEBUG(NULL pointer to pcap structure); + goto out; + } + + if (p->ring == NULL) { + RINGMAP_FUNC_DEBUG(NULL pointer to ringstructure); goto out; } + /* Unmap slots */ for (i = 0; i < SLOTS_NUMBER; i++){ tmp_res = munmap((void *)p->ring->slot[i].mbuf.user, sizeof(struct mbuf)); @@ -202,6 +206,7 @@ __func__, i); } + /* Unmap ring */ tmp_res = munmap(p->ring, sizeof(struct ring)); if (tmp_res == -1) { RINGMAP_ERROR(Unmaping the ring pointer); @@ -245,8 +250,11 @@ again: if ( RING_IS_EMPTY(ring) ) { + +#if (__RINGMAP_DEB) RINGMAP_FUNC_DEBUG(Ring is empty. Sleep...); PRINT_RING_PTRS(ring); +#endif /* Sleep and wait for new incoming packets */ ioctl(ringmap_cdev_fd, IOCTL_SLEEP_WAIT); goto again; @@ -292,6 +300,7 @@ SW_INCR_TAIL(ring); ring->slot[curr_slot].filtered = 0; + ring->slot[curr_slot].is_ok = 0; } RINGMAP_FUNC_DEBUG(end); ==== //depot/projects/soc2010/ringmap/current/sys/dev/ixgbe/ixgbe.c#7 (text+ko) ==== @@ -160,6 +160,8 @@ #ifndef RINGMAP static void ixgbe_refresh_mbufs(struct rx_ring *, int); +#else +void ixgbe_refresh_mbufs(struct rx_ring *, int); #endif static int ixgbe_xmit(struct tx_ring *, struct mbuf **); @@ -657,6 +659,9 @@ #ifdef RINGMAP +#if (__RINGMAP_DEB) + printf(RINGMAP_PREFIX" Descriptors Number: %d\n", adapter->num_rx_desc); +#endif ringmap_attach(dev, &ringmap_8259_f); #endif @@ -1319,6 +1324,8 @@ #ifdef RINGMAP struct capt_object *co = NULL; + + adapter->rm->funcs->delayed_isr(que); #endif if (ifp->if_drv_flags & IFF_DRV_RUNNING) { @@ -1336,14 +1343,14 @@ IXGBE_TX_UNLOCK(txr); #ifdef RINGMAP - adapter->rm->funcs->sync_head(que); + adapter->rm->funcs->sync_head(que); - /* Wakeup threads with not empty rings */ - SLIST_FOREACH(co, &adapter->rm->object_list, objects) { - if (RING_NOT_EMPTY(co->ring)){ - wakeup(co->ring); - } + /* TODO: don't wake up the all threads, only our thread! */ + SLIST_FOREACH(co, &adapter->rm->object_list, objects) { + if (RING_NOT_EMPTY(co->ring)){ + wakeup(co->ring); } + } #endif if (more) { @@ -1426,11 +1433,12 @@ bool more_tx, more_rx; u32 newitr = 0; + ++que->irqs; + #ifdef RINGMAP struct capt_object *co = NULL; adapter->rm->funcs->delayed_isr(que); #endif - ++que->irqs; more_rx = ixgbe_rxeof(que, adapter->rx_process_limit); @@ -1443,7 +1451,7 @@ #ifdef RINGMAP adapter->rm->funcs->sync_head(que); - /* Wakeup threads with not empty rings */ + /* TODO: Only our co not all */ SLIST_FOREACH(co, &adapter->rm->object_list, objects) { if (RING_NOT_EMPTY(co->ring)){ wakeup(co->ring); @@ -3432,20 +3440,31 @@ * **********************************************************************/ #ifndef RINGMAP -static void +static +#else +void +#endif ixgbe_refresh_mbufs(struct rx_ring *rxr, int limit) { struct adapter *adapter = rxr->adapter; +#ifndef RINGMAP bus_dma_segment_t hseg[1]; +#endif bus_dma_segment_t pseg[1]; struct ixgbe_rx_buf *rxbuf; +#ifndef RINGMAP struct mbuf *mh, *mp; +#else + struct mbuf *mp; +#endif + int i, nsegs, error, cleaned; i = rxr->next_to_refresh; cleaned = -1; /* Signify no completions */ while (i != limit) { rxbuf = &rxr->rx_buffers[i]; +#ifndef RINGMAP if ((rxbuf->m_head == NULL) && (rxr->hdr_split)) { mh = m_gethdr(M_DONTWAIT, MT_DATA); if (mh == NULL) @@ -3470,9 +3489,13 @@ htole64(hseg[0].ds_addr); } + /* RINGMAP: Don't allocate new buffers! */ if (rxbuf->m_pack == NULL) { mp = m_getjcl(M_DONTWAIT, MT_DATA, M_PKTHDR, adapter->rx_mbuf_sz); +#else + mp = rxbuf->m_pack; +#endif if (mp == NULL) goto update; mp->m_pkthdr.len = mp->m_len = adapter->rx_mbuf_sz; @@ -3490,7 +3513,9 @@ BUS_DMASYNC_PREREAD); rxr->rx_base[i].read.pkt_addr = htole64(pseg[0].ds_addr); +#ifndef RINGMAP } +#endif cleaned = i; /* Calculate next index */ @@ -3500,12 +3525,14 @@ rxr->next_to_refresh = i; } update: + +#ifndef RINGMAP if (cleaned != -1) /* If we refreshed some, bump tail */ IXGBE_WRITE_REG(&adapter->hw, IXGBE_RDT(rxr->me), cleaned); +#endif return; } -#endif /* !RINGMAP */ /********************************************************************* * @@ -3927,6 +3954,7 @@ /* Set up the redirection table */ for (i = 0, j = 0; i < 128; i++, j++) { if (j == adapter->num_queues) j = 0; + /* TODO: do it more beautiful */ #ifndef RINGMAP reta = (reta << 8) | (j * 0x11); #else @@ -4288,8 +4316,9 @@ ** that determines what we are */ sendmp = rbuf->fmp; +#ifndef RINGMAP rbuf->m_pack = rbuf->fmp = NULL; - +#endif if (sendmp != NULL) /* secondary frag */ sendmp->m_pkthdr.len += mp->m_len; else { @@ -4335,7 +4364,7 @@ #ifndef RINGMAP -/* RINGMAP: Do not send packet to the IP-stack. Andd do not refresh */ +/* RINGMAP: Do not send packet to the IP-stack. And do not refresh */ /* Now send to the stack or do LRO */ if (sendmp != NULL) ==== //depot/projects/soc2010/ringmap/current/sys/dev/ixgbe/ixgbe.h#6 (text+ko) ==== ==== //depot/projects/soc2010/ringmap/current/sys/dev/ixgbe/ringmap_8259.h#5 (text+ko) ==== @@ -27,17 +27,20 @@ #define HW_WRITE_REG(que, reg, val) \ RINGMAP_HW_WRITE_REG(HW_STRUCT(que), (reg), (val)) -#define RINGMAP_HW_READ_HEAD(que) \ + +#define 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 HW_READ_TAIL(que) \ + HW_READ_REG((que), HW_RDT(que)) -#define RINGMAP_HW_WRITE_TAIL(que, val) \ +#define HW_WRITE_TAIL(que, val) \ HW_WRITE_REG((que), HW_RDT(que), (val)) + +#define RINGMAP_HW_SYNC_HEAD(que, ring) \ + SW_HEAD(ring) = HW_READ_HEAD(que); + #define RINGMAP_HW_SYNC_TAIL(que, ring) \ - RINGMAP_HW_WRITE_TAIL((que), SW_TAIL(ring)) + HW_WRITE_TAIL((que), SW_TAIL(ring)) -#define RINGMAP_HW_READ_TAIL(que) \ - HW_READ_REG((que), HW_RDT(que)) ==== //depot/projects/soc2010/ringmap/current/sys/dev/ixgbe/ringmap_ixgbe.c#6 (text+ko) ==== @@ -18,6 +18,19 @@ #include "ixgbe.h" #include "ringmap_8259.h" + +/* External things */ +extern devclass_t ixgbe_devclass; + +extern void ixgbe_enable_intr(struct adapter *); +extern void ixgbe_disable_intr(struct adapter *); +extern void ixgbe_refresh_mbufs(struct rx_ring *, int); + +extern void ringmap_print_slot(struct ring *, unsigned int); +extern void print_capt_obj(struct capt_object *); +/*******************/ + + int rm_8259_set_ringmap_to_adapter(device_t, struct ringmap *); struct ringmap * rm_8259_get_ringmap_p(device_t); device_t rm_8259_get_device_p(struct cdev *); @@ -28,7 +41,6 @@ void rm_8259_interrupt(void *); void rm_8259_delayed_interrupt(void *); int rm_8259_print_ring_pointers(void *); -void rm_8259_sync_head_tail(void *); void rm_8259_sync_tail(void *); void rm_8259_sync_head(void *); void rm_8259_delayed_interrupt_per_packet(void *, int); @@ -37,12 +49,6 @@ struct ix_queue * rm_8259_get_free_queue(device_t); struct capt_object * get_capt_obj(void *context); -extern devclass_t ixgbe_devclass; -extern void ixgbe_enable_intr(struct adapter *); -extern void ixgbe_disable_intr(struct adapter *); -extern void ringmap_print_slot(struct ring *, unsigned int); -extern void print_capt_obj(struct capt_object *); - struct ringmap_functions ringmap_8259_f = { rm_8259_set_ringmap_to_adapter, @@ -51,7 +57,6 @@ rm_8259_interrupt, rm_8259_delayed_interrupt, rm_8259_delayed_interrupt_per_packet, - rm_8259_sync_head_tail, rm_8259_sync_tail, rm_8259_sync_head, rm_8259_set_slot, @@ -61,6 +66,7 @@ }; + /* * Set pointer to ringmap in the adapter structure. */ @@ -80,36 +86,18 @@ } -/* - * This function synchronize the tail and head hardware registers - * with head and tail software varibles, that are visible from - * software process. - * - * Synchronisation rules: - * 1. SYNC_HEAD: ring->kernrp = RDH - * 2. SYNC_TAIL: RDT = ring->userrp - */ void -rm_8259_sync_head_tail(void *context) -{ - rm_8259_sync_tail(context); - rm_8259_sync_head(context); -} - - -void rm_8259_sync_tail(void *context) { struct ix_queue *que = (struct ix_queue *)context; struct adapter *adapter = que->adapter; struct capt_object *co = NULL; - + RINGMAP_LOCK(adapter->rm); - if (adapter->rm->open_cnt) { - co = get_capt_obj(que); - if (co != NULL) { - RINGMAP_HW_SYNC_TAIL(que, co->ring); - } + co = get_capt_obj(que); + if (co != NULL) { + ixgbe_refresh_mbufs(que->rxr, SW_TAIL(co->ring)); + RINGMAP_HW_SYNC_TAIL(que, co->ring); } RINGMAP_UNLOCK(adapter->rm); } @@ -123,35 +111,14 @@ struct capt_object *co = NULL; RINGMAP_LOCK(adapter->rm); - if (adapter->rm->open_cnt) { - co = get_capt_obj(que); - if (co != NULL) { - RINGMAP_HW_SYNC_HEAD(que, co->ring); - } else { - RINGMAP_ERROR(There is no capturing object associated with queue); - } - } + co = get_capt_obj(que); + if (co != NULL) { + RINGMAP_HW_SYNC_HEAD(que, co->ring); + } RINGMAP_UNLOCK(adapter->rm); } -struct capt_object * -get_capt_obj(void *queue) -{ - struct ix_queue *que = (struct ix_queue *)queue; - struct adapter *adapter = que->adapter; - struct ringmap *rm = adapter->rm; - struct capt_object *co = NULL; - - SLIST_FOREACH(co, &rm->object_list, objects) { - if (co->que == que) - return (co); - } - - return (co); -} - - /* * This should be called from ISR. Other interrupts are disallowed! * It means the functions must be as small as possible @@ -172,19 +139,18 @@ { struct ix_queue *que = (struct ix_queue *)context; struct adapter *adapter = (struct adapter *)que->adapter; - struct timeval last_ts; struct capt_object *co = NULL; RINGMAP_LOCK(adapter->rm); + + adapter->rm->interrupts_counter++; + if ( adapter->rm->open_cnt > 0 ) { co = get_capt_obj(que); if (co != NULL) { - adapter->rm->interrupts_counter++; - getmicrotime(&last_ts); - co->ring->last_ts = last_ts; + co->ring->intr_num = que->irqs; + getmicrotime(&co->ring->last_ts); rm_8259_sync_tail(context); - } else { - RINGMAP_ERROR(There is no capturing object associated with queue); } } RINGMAP_UNLOCK(adapter->rm); @@ -203,19 +169,28 @@ RINGMAP_LOCK(rm); -#if (RINGMAP_INTR_DEB) - rm_8259_print_ring_pointers(que); -#endif + if (slot_num >= SLOTS_NUMBER){ + RINGMAP_ERROR(STOP! ERROR! Unallowed slot Number!); + goto out; + } + if (adapter->rm->open_cnt) { co = get_capt_obj(que); if (co != NULL) { - co->ring->slot[slot_num].intr_num = que->irqs; + +#if (RINGMAP_INTR_DEB) + printf(RINGMAP_PREFIX"[%s] Slot = %d\n", __func__, slot_num); + rm_8259_print_ring_pointers(que); + PRINT_RING_PTRS(co->ring); +#endif + co->ring->slot[slot_num].intr_num = co->ring->intr_num; co->ring->slot[slot_num].ts = co->ring->last_ts; - } else { - RINGMAP_ERROR(There is no capturing object associated with queue); + co->ring->slot[slot_num].is_ok = 1; } } +out: + RINGMAP_UNLOCK(rm); RINGMAP_INTR(end); @@ -231,12 +206,11 @@ printf("[%s] Set slot: %d\n", __func__, slot_num); #endif + /* First check the pointers */ if (que == NULL) { RINGMAP_ERROR(Null pointer to the queue); goto fail; } - /* First check pointers */ -//TODO; if (GET_MBUF_P(que, slot_num) == NULL){ RINGMAP_ERROR(Pointer to mbuf is NULL); goto fail; @@ -246,7 +220,7 @@ goto fail; } - /* Now if everything is Ok, we can initialize ring pointers */ + /* Now if everything is Ok, we can initialize slots variables */ ring->slot[slot_num].mbuf.kern = (vm_offset_t)GET_MBUF_P(que, slot_num); ring->slot[slot_num].mbuf.phys = @@ -316,8 +290,6 @@ } - - /* * Returns pointer to ringmap structure */ @@ -361,6 +333,7 @@ } +/* Return a queue that is not associate with any capturing objects */ struct ix_queue * rm_8259_get_free_queue(device_t dev) { @@ -374,9 +347,6 @@ que = adapter->queues; rm = adapter->rm; - /* - * Look for the queue that is not used by any capturing object (co) - */ for (i = 0; (i < adapter->num_queues); i++, que++) { j = 0; SLIST_FOREACH(co, &rm->object_list, objects) { @@ -390,6 +360,7 @@ } +/* Associate the capturing object with the queue */ int rm_8259_set_queue(struct capt_object *co, unsigned int queue_num) { @@ -397,12 +368,18 @@ struct adapter *adapter; int err = -1; + RINGMAP_FUNC_DEBUG(start); + if (co->rm != NULL) { dev = co->rm->dev; adapter = (struct adapter *)device_get_softc(dev); +#if (__RINGMAP_DEB) + printf("[%s] Before initialization\n", __func__); + print_capt_obj(co); +#endif if (queue_num < adapter->num_queues) { - co->que = &adapter->queues[queue_num]; + co->que = &(adapter->queues[queue_num]); err = 0; } else { RINGMAP_ERROR(Wrong queue number); @@ -411,24 +388,48 @@ RINGMAP_ERROR(Capturing object is not associated with ringmap); } +#if (__RINGMAP_DEB) + printf("[%s] After initialization\n", __func__); + print_capt_obj(co); +#endif + + RINGMAP_FUNC_DEBUG(end); + return (err); } - + +struct capt_object * +get_capt_obj(void *queue) +{ + struct ix_queue *que = (struct ix_queue *)queue; + struct adapter *adapter = que->adapter; + struct ringmap *rm = adapter->rm; + struct capt_object *co = NULL; + + SLIST_FOREACH(co, &rm->object_list, objects) { + if (co->que == queue) + return (co); + } + + return (co); +} + + int rm_8259_print_ring_pointers(void *context) { struct ix_queue *que = (struct ix_queue *)context; unsigned int rdt, rdh; - rdh = RINGMAP_HW_READ_HEAD(que); - rdt = RINGMAP_HW_READ_TAIL(que); + rdt = HW_READ_TAIL(que); + rdh = HW_READ_HEAD(que); printf("\n== +++++++++ RING POINTERS ++++++++++++ \n"); - printf("== + Queue Number: %d\n", que->rxr->me); + printf("== + Queue Number: %d\n", que->rxr->me); printf("== + \n"); + printf("== + HW TAIL = %d (USER POINTER)\n", rdt); printf("== + HW HEAD = %d (KERN POINTER)\n", rdh); - printf("== + HW TAIL = %d (USER POINTER)\n", rdt); printf("== ++++++++++++++++++++++++++++++++++++++ \n\n"); return (0); ==== //depot/projects/soc2010/ringmap/current/sys/net/ringmap.c#36 (text+ko) ==== @@ -177,7 +177,7 @@ RINGMAP_LOCK(rm); /* TODO: set max number of threads in the ringmap struct as a variable */ - if (rm->open_cnt == RINGMAP_MAX_THREADS){ + if (rm->open_cnt == RINGMAP_MAX_THREADS) { RINGMAP_ERROR(Can not open device!); err = EIO; goto out; @@ -227,7 +227,15 @@ /* The next should be probably done in the ioctl() */ #ifdef DEFAULT_QUEUE - rm->funcs->set_queue(co, DEFAULT_QUEUE); + /* Associate the capturing object with a queue */ + if (rm->funcs->set_queue(co, DEFAULT_QUEUE) == -1) { + RINGMAP_ERROR(Can not associate que with the capturing object!); + contigfree(ring, sizeof(struct ring), M_DEVBUF); + + err = EIO; goto out; + } + + /* Init ring-slots with mbufs and packets adrresses */ for (i = 0 ; i < SLOTS_NUMBER ; i++){ if (rm->funcs->set_slot(ring, co->que, i) == -1){ RINGMAP_ERROR(Ring initialization failed!); @@ -241,6 +249,10 @@ } #endif + /* + * Insert the capturing object in the single linked list + * the head of the list is in the ringmap structure + */ SLIST_INSERT_HEAD(&rm->object_list, co, objects); /* @@ -255,7 +267,7 @@ err = EIO; goto out; } - rm->funcs->sync_head_tail(co->que); + rm->funcs->sync_tail(co->que); rm->open_cnt++; #if (__RINGMAP_DEB) @@ -272,7 +284,6 @@ } - int ringmap_close(struct cdev *cdev, int flag, int otyp, struct thread *td) { @@ -289,6 +300,42 @@ } +void +clear_capt_object(void * data) +{ + struct capt_object *co = NULL; + struct ringmap *rm = NULL; + + RINGMAP_FUNC_DEBUG(start); + + if (data != NULL) { + co = (struct capt_object *)data; + rm = co->rm; + + RINGMAP_LOCK(rm); +#if (__RINGMAP_DEB) + printf("[%s] Object to delete:\n", __func__); + print_capt_obj(co); +#endif + if (co->ring != NULL) + contigfree(co->ring, sizeof(struct ring), M_DEVBUF); + + SLIST_REMOVE(&rm->object_list, co, capt_object, objects); + FREE(co, M_DEVBUF); + data = NULL; + } else { + RINGMAP_FUNC_DEBUG(NULL pointer to the capturing object!); + } + + if (rm->open_cnt) + rm->open_cnt--; + + RINGMAP_UNLOCK(rm); + + RINGMAP_FUNC_DEBUG(end); +} + + int ringmap_mmap_single(struct cdev *cdev, vm_ooffset_t *offset, vm_size_t size, struct vm_object **object, int nprot) @@ -349,29 +396,31 @@ { struct ringmap *rm = NULL; struct capt_object *co = NULL; - vm_paddr_t phys_ring; + vm_paddr_t phys_ring_addr; - RINGMAP_FUNC_DEBUG(end); + RINGMAP_FUNC_DEBUG(start); /* Get pointer to the ringmap structure */ rm = get_ringmap_p(get_device_p(cdev)); if (devfs_get_cdevpriv((void **)&co)) { - RINGMAP_ERROR(Wrong capturing object!); + RINGMAP_ERROR(Can not get capturing object); return(EIO); } + if (co->td != curthread ){ RINGMAP_ERROR(Wrong capturing object!); return(EIO); } - phys_ring = vtophys(co->ring); + phys_ring_addr = vtophys(co->ring); + #if (__RINGMAP_DEB) print_capt_obj(co); PRINT_RING_PTRS(co->ring); #endif - uiomove(&phys_ring, sizeof(phys_ring), uio); + uiomove(&phys_ring_addr, sizeof(phys_ring_addr), uio); RINGMAP_FUNC_DEBUG(end); @@ -393,9 +442,9 @@ printf("[%s] pid = %d\n", __func__, td->td_proc->p_pid); #endif - /* Eliminate it */ + /* Eliminate it. Use devfs_* funcs */ rm = get_ringmap_p(get_device_p(cdev)); - if ( rm == NULL ){ + if (rm == NULL) { RINGMAP_ERROR(NULL pointer. ioctl can not be accomplished); /* TODO: look whether ENODEV is a correctly for this case */ @@ -431,12 +480,15 @@ rm->funcs->disable_intr(rm->dev); RINGMAP_IOCTL(interrupts schould be disabled); break; - + /* Sleep and wait for new packets */ case IOCTL_SLEEP_WAIT: + /* Count how many times we should wait for new packets */ co->ring->user_wait_kern++; - rm->funcs->sync_head_tail(co->que); + + /* Set adapter TAIL register */ + rm->funcs->sync_tail(co->que); #if (__RINGMAP_DEB) print_capt_obj(co); @@ -450,14 +502,10 @@ if (RING_IS_EMPTY(co->ring)) { RINGMAP_IOCTL(Sleep and wait for new packets); - err_sleep = tsleep(co->ring, (PRI_MIN) | PCATCH, "ioctl", 0); + err_sleep = tsleep(co->ring, (PRI_MAX_ITHD) | PCATCH, "ioctl", 0); } break; - case IOCTL_SYNC_HEAD_TAIL: - rm->funcs->sync_head_tail(co->que); - break; - /* Synchronize sowftware ring-tail with hardware-ring-tail (RDT) */ case IOCTL_SYNC_TAIL: rm->funcs->sync_tail(co->que); @@ -467,59 +515,24 @@ RINGMAP_ERROR("Undefined command!"); return (ENODEV); } - + RINGMAP_IOCTL(end); - + return (err); } void -clear_capt_object(void * data) -{ - struct capt_object *co = NULL; - struct ringmap *rm = NULL; - - RINGMAP_FUNC_DEBUG(start); - - if (data != NULL) { - co = (struct capt_object *)data; - rm = co->rm; - - RINGMAP_LOCK(rm); -#if (__RINGMAP_DEB) - print_capt_obj(co); -#endif - if (co->ring != NULL) - contigfree(co->ring, sizeof(struct ring), M_DEVBUF); - - SLIST_REMOVE(&rm->object_list, co, capt_object, objects); - FREE(co, M_DEVBUF); - data = NULL; - } else { - RINGMAP_FUNC_DEBUG(NULL pointer to the capturing instance!); - } - - if (rm->open_cnt) - rm->open_cnt--; - - RINGMAP_UNLOCK(rm); - - RINGMAP_FUNC_DEBUG(end); -} - - -void print_capt_obj(struct capt_object *co) { if (co != NULL) { - printf("=== co->td->proc->pid: %d\n", + printf("\n=== co->td->proc->pid: %d\n", co->td->td_proc->p_pid); printf("=== Ring Kernel Addr:0x%X\n", (unsigned int)co->ring); - printf("=== Queue Kernel Addr:0x%X\n", + printf("=== Queue Kernel Addr:0x%X\n\n", (unsigned int)co->que); } } ==== //depot/projects/soc2010/ringmap/current/sys/net/ringmap.h#36 (text+ko) ==== @@ -1,7 +1,7 @@ /* * value for number of descriptors (a.k.a. slots in the ringbuffer) */ -#define SLOTS_NUMBER 16 +#define SLOTS_NUMBER 64 /* * Prefix for name of device (for example /dev/ringmap0 will full name) @@ -246,19 +246,19 @@ * DEBUG OUTPUT */ #ifndef RINGMAP_IOCTL_DEB -#define RINGMAP_IOCTL_DEB 1 +#define RINGMAP_IOCTL_DEB 0 #else #define RINGMAP_IOCTL_DEB 1 #endif #ifndef RINGMAP_INTR_DEB -#define RINGMAP_INTR_DEB 1 +#define RINGMAP_INTR_DEB 0 #else #define RINGMAP_INTR_DEB 1 #endif #ifndef __RINGMAP_DEB -#define __RINGMAP_DEB 1 +#define __RINGMAP_DEB 0 #endif #define RINGMAP_PREFIX "--> RINGMAP: " @@ -304,14 +304,6 @@ (unsigned int)ring->slot[i].mbuf.kern); \ } while (0); -#define PRINT_DECRIPTOR_ADDR(ring, i) \ - do { \ - printf("=+= descr.user=0x%X, descr.phys=0x%X, descr.kern=0x%X\n", \ - (unsigned int)ring->slot[i].descriptor.user, \ - (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)){ \ printf("\n=+= ==================================\n"); \ @@ -322,7 +314,6 @@ (ring)->slot[(i)].ts.tv_usec))); \ printf("=+= Accepted: %d\n", (ring)->slot[(i)].is_ok); \ printf("=+= -------------------------\n"); \ - PRINT_DECRIPTOR_ADDR(ring, i); \ PRINT_MBUF_ADDR(ring, i); \ PRINT_PACKET_ADDR(ring, i); \ printf("=+= -------------------------\n"); \ @@ -339,13 +330,13 @@ #define PRINT_RING_PTRS(ring) \ do { \ - printf("=+= [%s] pid = %d\n", __func__, ring->pid); \ + printf("\n=+= [%s] pid = %d\n", __func__, ring->pid); \ PRINT_TAIL(ring) \ PRINT_HEAD(ring) \ + printf("\n"); \ } while (0); - #ifdef _KERNEL #include #endif ==== //depot/projects/soc2010/ringmap/current/sys/net/ringmap_kernel.h#6 (text+ko) ==== @@ -100,7 +100,6 @@ * the value of ring->userrp. Kernel will check this value and set it * into the hardware TAIL-register. */ - void (*sync_head_tail)(void *); void (*sync_tail)(void *); void (*sync_head)(void *); ==== //depot/projects/soc2010/ringmap/scripts/build_ringmap.sh#17 (text+ko) ==== @@ -3,18 +3,6 @@ RINGMAP_BUILD_DIR=../current/sys/modules/ringmap/ LIBPCAP_BUILD_DIR=../current/lib/libpcap/ -check_make_vars() { - cat /etc/make.conf | grep "RINGMAP" >/dev/null - if [ $? -eq 1 ] >>> TRUNCATED FOR MAIL (1000 lines) <<<