Date: Thu, 1 Jul 2010 00:17:29 GMT From: Alexandre Fiveg <afiveg@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 180356 for review Message-ID: <201007010017.o610HTTG001640@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://p4web.freebsd.org/@@180356?ac=10 Change 180356 by afiveg@cottonmouth on 2010/07/01 00:16:33 Using EM_RX_LOCK for locking the ringmap data structures Affected files ... .. //depot/projects/soc2010/ringmap/current/contrib/libpcap/pcap.c#5 edit .. //depot/projects/soc2010/ringmap/current/contrib/libpcap/ringmap_pcap.c#10 edit .. //depot/projects/soc2010/ringmap/current/sys/dev/e1000/if_lem.c#18 edit .. //depot/projects/soc2010/ringmap/current/sys/dev/e1000/if_lem.h#16 edit .. //depot/projects/soc2010/ringmap/current/sys/dev/e1000/ringmap_8254.c#17 edit .. //depot/projects/soc2010/ringmap/current/sys/dev/e1000/ringmap_8254.h#15 edit .. //depot/projects/soc2010/ringmap/current/sys/net/ringmap.c#21 edit .. //depot/projects/soc2010/ringmap/current/sys/net/ringmap.h#21 edit .. //depot/projects/soc2010/ringmap/scripts/build_ringmap.sh#5 edit .. //depot/projects/soc2010/ringmap/scripts/set_ringmap.sh#6 edit .. //depot/projects/soc2010/ringmap/tests/libpcap/easy_pcap.c#6 edit .. //depot/projects/soc2010/ringmap/tests/libpcap/test_pcap.c#5 edit Differences ... ==== //depot/projects/soc2010/ringmap/current/contrib/libpcap/pcap.c#5 (text+ko) ==== ==== //depot/projects/soc2010/ringmap/current/contrib/libpcap/ringmap_pcap.c#10 (text+ko) ==== @@ -347,7 +347,7 @@ goto again; } - if (cnt == -1) + if ( (cnt == -1) || (cnt == 0) ) cnt = SW_TAIL_TO_HEAD_DIST(p->ring); for (ws = cnt ; ( (ws) && (RING_NOT_EMPTY(p->ring)) ) ; ) ==== //depot/projects/soc2010/ringmap/current/sys/dev/e1000/if_lem.c#18 (text+ko) ==== ==== //depot/projects/soc2010/ringmap/current/sys/dev/e1000/if_lem.h#16 (text+ko) ==== ==== //depot/projects/soc2010/ringmap/current/sys/dev/e1000/ringmap_8254.c#17 (text+ko) ==== @@ -47,25 +47,22 @@ { struct adapter *adapter = (struct adapter *)device_get_softc(dev); - if ( adapter == NULL ) + if ( (adapter == NULL) || (ring == NULL) ) goto out; /* Disable interrupts of adapter */ rm_8254_disable_intr(dev); - /* - * Check whether we have some tasks in the queue. It should be done - * because we want to free the memory regions that could be accessed - * from the delayed interrupt tasks - */ - taskqueue_run(adapter->tq); - - if (ring != NULL){ - contigfree(ring, sizeof(struct ring), M_DEVBUF); - } else { - RINGMAP_ERROR(The pointer to ring structure is NULL); - } + EM_RX_LOCK(adapter); + + contigfree(ring, sizeof(struct ring), M_DEVBUF); + + adapter->rm->ring = NULL; + + EM_RX_UNLOCK(adapter); + out: ; + } struct ring * @@ -74,7 +71,7 @@ struct ring *ring; struct adapter *adapter = (struct adapter *)device_get_softc(dev); - if ( adapter == NULL ) { + if ( (adapter == NULL) || (adapter->rm == NULL) ) { return (NULL); } @@ -93,12 +90,7 @@ /* Disable interrupts of adapter while allocating the ring */ rm_8254_disable_intr(dev); - - /* - * Before continue look whether any delayed interrupt tasks are - * in the taskqueue. - */ - taskqueue_run(adapter->tq); + EM_RX_LOCK(adapter); /* Set ring fields in the initial state */ ring->kern_wait_user = 0; @@ -111,9 +103,28 @@ RINGMAP_ERROR(The ring is not initialized. Device will not be opened!); contigfree(ring, sizeof(struct ring), M_DEVBUF); + EM_RX_UNLOCK(adapter); + rm_8254_enable_intr(dev); + return (NULL); } + + /** + ** Currently only one process only one time can open our device !!! + **/ + if (!atomic_cmpset_int(&adapter->rm->open_cnt, 0, 1)){ + RINGMAP_ERROR(Sorry! Can not open device more then one time!); + atomic_readandclear_int(&adapter->rm->open_cnt); + + EM_RX_UNLOCK(adapter); + rm_8254_enable_intr(dev); + + return (NULL); + } + adapter->rm->ring = ring; + + EM_RX_UNLOCK(adapter); rm_8254_enable_intr(dev); return (ring); @@ -123,14 +134,17 @@ rm_8254_delayed_interrupt_per_packet(struct ring *ring, int slot_num) { RINGMAP_INTR(start); - ring->cur_slot_kern = slot_num; - ring->slot[slot_num].is_ok = 1; - ring->slot[slot_num].intr_num = ring->interrupts_counter; + + if ( ring != NULL ) { + ring->cur_slot_kern = slot_num; + ring->slot[slot_num].is_ok = 1; + ring->slot[slot_num].intr_num = ring->interrupts_counter; #ifdef RINGMAP_TIMESTAMP - ring->slot[slot_num].ts.tv_sec = ring->last_ts.tv_sec; - ring->slot[slot_num].ts.tv_usec = ring->last_ts.tv_usec; + ring->slot[slot_num].ts.tv_sec = ring->last_ts.tv_sec; + ring->slot[slot_num].ts.tv_usec = ring->last_ts.tv_usec; #endif + } RINGMAP_INTR(end); } ==== //depot/projects/soc2010/ringmap/current/sys/dev/e1000/ringmap_8254.h#15 (text+ko) ==== ==== //depot/projects/soc2010/ringmap/current/sys/net/ringmap.c#21 (text+ko) ==== @@ -43,7 +43,6 @@ device_t (*get_device_p)(struct cdev *); extern int rm_8254_set_ringmap_to_adapter(device_t, struct ringmap *); -extern int rm_8254_init_slots(struct ring *, device_t); extern struct ringmap * rm_8254_get_ringmap_p(device_t); extern device_t rm_8254_get_device_p(struct cdev *); extern void rm_8254_enable_intr(device_t); @@ -120,7 +119,6 @@ rm_8254_set_ringmap_to_adapter; rm->funcs->enable_intr = rm_8254_enable_intr; rm->funcs->disable_intr = rm_8254_disable_intr; - rm->funcs->init_slots = rm_8254_init_slots; rm->funcs->isr = rm_8254_interrupt; rm->funcs->delayed_isr = rm_8254_delayed_interrupt; rm->funcs->delayed_isr_per_packet = @@ -176,7 +174,6 @@ return (-1); } - funcs = (struct ringmap_functions *) contigmalloc ( sizeof (struct ringmap_functions), @@ -266,35 +263,29 @@ /* a little magic */ rm = get_ringmap_p(get_device_p(cdev)); - if (rm == NULL) { + if ( rm == NULL ) { RINGMAP_ERROR(Null pointer to ringmap structure); return (EIO); } - /** - ** Currently only one process only one time can open our device !!! - **/ - if (!atomic_cmpset_int(&rm->open_cnt, 0, 1)){ - RINGMAP_ERROR(Sorry! Can not open device more then one time!); - atomic_readandclear_int(&rm->open_cnt); - return (EIO); - } - - if (rm->dev == NULL){ + if ( rm->dev == NULL ) { RINGMAP_ERROR(Null pointer to device structure of adapter); - atomic_readandclear_int(&rm->open_cnt); return (EIO); } /* Allocate ring */ - rm->ring = rm->funcs->alloc_ring(rm->dev); - if (rm->ring == NULL){ + if ( rm->funcs->alloc_ring(rm->dev ) == NULL) { RINGMAP_ERROR(Null pointer to ring the structure); - atomic_readandclear_int(&rm->open_cnt); + + return (EIO); + } + /* Check for any cases */ + if ( rm->ring == NULL ) { + RINGMAP_ERROR(Error! Please debug!); return (EIO); } ==== //depot/projects/soc2010/ringmap/current/sys/net/ringmap.h#21 (text+ko) ==== ==== //depot/projects/soc2010/ringmap/scripts/build_ringmap.sh#5 (text+ko) ==== ==== //depot/projects/soc2010/ringmap/scripts/set_ringmap.sh#6 (text+ko) ==== ==== //depot/projects/soc2010/ringmap/tests/libpcap/easy_pcap.c#6 (text+ko) ==== @@ -15,31 +15,66 @@ #include "../../current/sys/net/ringmap.h" - int capture_pkts (const char*); void got_packet(u_char *, const struct pcap_pkthdr *, const u_char *); - +void stop_cpusage_measurement(void); +void start_cpusage_measurement(void); +void exitFunc(void); +void sig_ctrlc(int); +void sig_alarm(int); pcap_t *handle; -unsigned int pcnt = 0; +unsigned long pcnt = 0; +long pkt_limit = 0; -#define HOWMANY 20 +/* Time stamps from first and last captured packets */ +struct timeval first_timestamp ; +struct timeval last_timestamp ; int main(int argc, char **argv) { char *iface; - if (argc < 2) { - printf("Usage: %s iface \n", argv[0]); + /* Proof the number of parameters */ + if (argc < 3) { + printf("Usage: %s iface pkt_limit\n", argv[0]); exit(1); } + /* Network interface name */ iface = argv[1]; + /* Packets number */ + pkt_limit = strtol(argv[2], NULL, 10); + if ( (pkt_limit == 0) && (errno == EINVAL)){ + printf("Wrong second parameter\n"); + exit (1); + } + if ( pkt_limit < 0 ) + pkt_limit = -1; + + /* Register Exit function */ + if (atexit(exitFunc)){ + printf("Error: Can't register exit function!\n"); + exit(1); + } + + /* Register signals */ + if (signal(SIGINT, sig_ctrlc) == SIG_ERR){ + printf("Error: Can't register signal\n"); + exit(1); + } + if (signal(SIGALRM, sig_alarm) == SIG_ERR){ + printf("Error: Can't register signal\n"); + exit(1); + } + + /* Let's go to capture */ capture_pkts(iface); - return (0); + /* Call our exitFunc() to end the job */ + exit(0); } int @@ -53,11 +88,8 @@ return (-1); } - pcap_loop(handle, HOWMANY, got_packet, NULL); - - if (handle != NULL) - pcap_close(handle); - + pcap_loop(handle, pkt_limit, got_packet, NULL); + return (0); } @@ -65,8 +97,85 @@ * Callback function. Will called for each captured packet */ void -got_packet(u_char *args, const struct pcap_pkthdr *header, const u_char *packet) +got_packet(u_char *args, const struct pcap_pkthdr *header, + const u_char *packet) { pcnt++; - printf("===> [%s] Packet %d \n", __func__, pcnt); + if ( pcnt == 1 ){ + start_cpusage_measurement(); + first_timestamp = header->ts; + } + last_timestamp = header->ts; + + printf("\n===> [%s] Packet %d\n", __func__, pcnt); +} + +/* + * Signal function for catching Ctrl-C + */ +void +sig_ctrlc(int signo) +{ + if (signo == SIGINT) { + printf("Stop Capturing. Exit!\n"); + exit(0); + } +} + +void +sig_alarm(int signo) +{ + if (signo == SIGALRM){ + printf("Stop capturing. Exit!\n"); + exit(0); + } +} + +/* Exit Point */ +void +exitFunc() +{ + unsigned long pps = 0; + unsigned long cap_time = 0; + + stop_cpusage_measurement(); + + cap_time = + ((last_timestamp.tv_sec*1000000+last_timestamp.tv_usec) - + (first_timestamp.tv_sec*1000000+first_timestamp.tv_usec))/1000000; + if ( !cap_time ) + cap_time = 1; + + pps = pcnt / cap_time; + + /* Print stats */ + printf("\n\nRESULTS:\n \n"); + printf("++++++++++++++++++++++++++++++++++++++++++++++++++ \n"); + printf("\n"); + printf("PROCESS STATISTICS: \n"); + printf("------------------ \n"); + printf("Captured: %lu pkts\n", pcnt); + printf("Capturing time: %lu (seconds)\n", cap_time); + printf("Packets per Second: %lu \n", pps); + printf("------------------\n\n"); + +#ifdef RINGMAP + /* Our function from libpcap */ + printf("RINGMAP STATISTICS: \n"); + printf("------------------ \n"); +#endif + + + /* close pcap */ + if (handle != NULL) + pcap_close(handle); +} + +void stop_cpusage_measurement() +{ + ; +} +void start_cpusage_measurement() +{ + ; } ==== //depot/projects/soc2010/ringmap/tests/libpcap/test_pcap.c#5 (text+ko) ====
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201007010017.o610HTTG001640>