PERFORCE change 180774 for review

Alexandre Fiveg afiveg at FreeBSD.org
Sun Jul 11 18:49:34 UTC 2010


http://p4web.freebsd.org/@@180774?ac=10

Change 180774 by afiveg at cottonmouth on 2010/07/11 18:48:41

	Cosmetic fixes

Affected files ...

.. //depot/projects/soc2010/ringmap/current/contrib/libpcap/pcap-bpf.c#9 edit
.. //depot/projects/soc2010/ringmap/current/contrib/libpcap/pcap-int.h#9 edit
.. //depot/projects/soc2010/ringmap/current/contrib/libpcap/pcap.c#11 edit
.. //depot/projects/soc2010/ringmap/current/contrib/libpcap/ringmap_pcap.c#16 edit
.. //depot/projects/soc2010/ringmap/current/sys/dev/e1000/if_lem.c#24 edit
.. //depot/projects/soc2010/ringmap/current/sys/dev/e1000/ringmap_8254.c#23 edit
.. //depot/projects/soc2010/ringmap/current/sys/dev/e1000/ringmap_8254.h#21 edit
.. //depot/projects/soc2010/ringmap/current/sys/dev/e1000/ringmap_e1000.h#13 edit
.. //depot/projects/soc2010/ringmap/current/sys/net/ringmap.c#27 edit
.. //depot/projects/soc2010/ringmap/current/sys/net/ringmap.h#27 edit
.. //depot/projects/soc2010/ringmap/scripts/build_ringmap.sh#11 edit
.. //depot/projects/soc2010/ringmap/scripts/set_ringmap.sh#12 edit
.. //depot/projects/soc2010/ringmap/scripts/tailf_ringmap_msgs.sh#7 edit

Differences ...

==== //depot/projects/soc2010/ringmap/current/contrib/libpcap/pcap-bpf.c#9 (text+ko) ====


==== //depot/projects/soc2010/ringmap/current/contrib/libpcap/pcap-int.h#9 (text+ko) ====


==== //depot/projects/soc2010/ringmap/current/contrib/libpcap/pcap.c#11 (text+ko) ====


==== //depot/projects/soc2010/ringmap/current/contrib/libpcap/ringmap_pcap.c#16 (text+ko) ====

@@ -89,7 +89,7 @@
 		RINGMAP_ERROR(Can not read phys addr of ring from kernel);
 		return (-1);
 	}
-#ifdef __RINGMAP_DEB
+#if (__RINGMAP_DEB)
 	printf("[%s] Phys addr of ring 0x%X\n", __func__, ring);
 #endif
 
@@ -278,12 +278,11 @@
 
 		curr_slot = R_MODULO( SW_TAIL(ring) + 1 );
 		if (!(ring->slot[curr_slot].is_ok)) {
-#ifdef __RINGMAP_DEB
+#if (__RINGMAP_DEB)
 			printf("Slot %d was not accepted by driver!\n", curr_slot);
 #endif 
 			goto out;
 		}
-		ring->cur_slot_user = curr_slot;
 
 		mb = (struct mbuf *)U_MBUF(ring, curr_slot);
 
@@ -296,8 +295,8 @@
 
 		(*callback)(user, &pkthdr, datap);
 
-#ifdef __RINGMAP_DEB
-		PRINT_SLOT(ring, ring->cur_slot_user);
+#if (__RINGMAP_DEB)
+		PRINT_SLOT(ring, curr_slot);
 #endif
 
 out:
@@ -350,141 +349,3 @@
 
 	return (err);
 }
-
-/* 
- * Levels : 
- * 		0 	- only received and lose pkts
- * 		1 	- received pkts with pkts sizes and lose pkts
- * 		>2 	- full statistic
- */
-//void
-//print_hw_stats(int level, pcap_t *p)
-//{
-//	if (p->nic_statistics == NULL){
-//		return;
-//	}
-//
-//	printf("VALUES FROM HARDWARE REGISTERS:\n");
-//	printf("------------------------------ \n");
-//	if (level >= 0){
-//		/* 
-//		 * Missed Packets Count:
-//		 * Counts the number of missed packets. Packets are missed when 
-//		 * the receive FIFO has insufficient space to store the incoming 
-//		 * packet. This can be caused because of too few buffers allocated, 
-//		 * or because there is insufficient bandwidth on the PCI bus. 
-//		 * Events setting this counter cause RXO, the Receiver Overrun 
-//		 * Interrupt, to be set. This register does not increment if receives are 
-//		 * not enabled.
-//		 */
-//		printf("Missed Packets = %lld\n",
-//			(long long)p->nic_statistics->mpc);
-//		
-//		/*
-//		 * Good Packets Received Count:
-//		 * Counts the number of good packets received of any legal length. This 
-//		 * counter does not include received flow control packets and only counts 
-//		 * packets that pass hardware filtering. 
-//		 *
-//		 * DOES NOT COUNT PACKETS COUNTED by the  Missed Packet Count.
-//		 */
-//		printf("Good Packets Rcvd = %lld\n",
-//	    	(long long)p->nic_statistics->gprc);
-//		
-//	}
-//	if (level >= 1){
-//	
-//		/* Will happen each time if RDH = RDT */
-//		printf("Receive No Memory Buffers = %lld\n",
-//			(long long)p->nic_statistics->rnbc);
-//
-//		/* 
-//		 * Packets Received (64 Bytes) Count:
-//		 * Counts the number of good packets received that are exactly 64 bytes
-//		 * in length. Packets that are counted in the Missed Packet Count are not 
-//		 * counted in this counter. This counter does not count received flow control 
-//		 * packets.
-//		 */
-//		printf("Packets Received (64 Bytes) Count = %lld\n",
-//	    	(long long)p->nic_statistics->prc64);
-//
-//		/* 
-//		 * Packets Received (65-127 Bytes) Count:
-//		 * Counts the number of good packets received that are 65-127 bytes in length. 
-//		 */
-//		printf("Packets Received (65-127 Bytes) Count = %lld\n",
-//	    	(long long)p->nic_statistics->prc127);
-//
-//		/* 
-//		 * Packets Received (128-255 Bytes) Count
-//		 */
-//		printf("Packets Received (128-255 Bytes) Count = %lld\n",
-//	    	(long long)p->nic_statistics->prc255);
-//
-//		/* 
-//		 * Packets Received (256-511 Bytes) Count
-//		 */
-//		printf("Packets Received (256-511 Bytes) Count = %lld\n",
-//	    	(long long)p->nic_statistics->prc511);
-//
-//		/* 
-//		 * Packets Received (512-1023 Bytes) Count
-//		 */
-//		printf("Packets Received (512-1023 Bytes) Count = %lld\n",
-//	    	(long long)p->nic_statistics->prc1023);
-//
-//		/* 
-//		 * Packets Received (1024 to Max Bytes) Count
-//		 */
-//		printf("Packets Received (1024 to Max Bytes) Count = %lld\n",
-//	    	(long long)p->nic_statistics->prc1522);
-//
-//		/* 
-//		 * Total Packets Received:
-//		 * Counts the total number of all packets received. All packets received 
-//		 * are counted regardless of their length, whether they have errors, or whether 
-//		 * they are flow control packets.
-//		 */
-//		//printf("Total Packets Received = %lld\n",
-//	    //	(long long)p->nic_statistics->tpr);
-//	}
-//
-//	if (level >= 2){
-//
-//		printf("Sequence errors = %lld\n",
-//			(long long)p->nic_statistics->sec);
-//
-//		printf("Defer count = %lld\n",
-//			(long long)p->nic_statistics->dc);
-//
-//
-//		printf("Receive Length Errors = %lld\n",
-//			((long long)p->nic_statistics->roc + (long long)p->nic_statistics->ruc));
-//
-//		printf("Receive errors = %lld\n",
-//			(long long)p->nic_statistics->rxerrc);
-//
-//		printf("Crc errors = %lld\n",
-//			(long long)p->nic_statistics->crcerrs);
-//
-//		printf("Alignment errors = %lld\n",
-//			(long long)p->nic_statistics->algnerrc);
-//
-//		printf("Collision/Carrier extension errors = %lld\n",
-//			(long long)p->nic_statistics->cexterr);
-//	}
-//}
-
-//int 
-//ringmap_stats(pcap_t *p, struct pcap_stat *ps)
-//{
-//
-//	if ((ps == NULL) || (p->nic_statistics == NULL)){
-//		return (-1);
-//	}
-//	
-//	ps->ps_recv = p->nic_statistics->gprc;
-//	ps->ps_drop = p->nic_statistics->mpc;
-//
-//	return (0);
-//}

==== //depot/projects/soc2010/ringmap/current/sys/dev/e1000/if_lem.c#24 (text+ko) ====

@@ -1382,7 +1382,7 @@
 {
 	struct adapter	*adapter = context;
 	struct ifnet	*ifp = adapter->ifp;
-	struct capt_instance *ci = NULL;
+	struct capt_object *co = NULL;
 
 	if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
 #ifdef RINGMAP
@@ -1394,9 +1394,9 @@
 #ifdef RINGMAP
 			adapter->rm->funcs->sync_head(adapter->dev);
 			
-			SLIST_FOREACH(ci, &adapter->rm->instance_list, next_instance) {
-				if (RING_NOT_EMPTY(ci->ring)){
-					wakeup(ci->ring);
+			SLIST_FOREACH(co, &adapter->rm->object_list, objects) {
+				if (RING_NOT_EMPTY(co->ring)){
+					wakeup(co->ring);
 				}
 			}
 		}

==== //depot/projects/soc2010/ringmap/current/sys/dev/e1000/ringmap_8254.c#23 (text+ko) ====

@@ -26,7 +26,7 @@
 int rm_8254_set_slot(struct ring *, device_t, unsigned int);
 void rm_8254_interrupt(void *);
 void rm_8254_delayed_interrupt(void *);
-int rm_8254_print_ring_pointers(struct adapter *, struct ring *);
+int rm_8254_print_ring_pointers(struct adapter *);
 void rm_8254_sync_head_tail(device_t);
 void rm_8254_sync_tail(device_t);
 void rm_8254_sync_head(device_t);
@@ -37,7 +37,7 @@
 extern void	lem_enable_intr(struct adapter *);
 extern void	lem_disable_intr(struct adapter *);
 extern void ringmap_print_slot(struct ring *, unsigned int);
-extern void print_capt_inst(struct capt_instance *);
+extern void print_capt_obj(struct capt_object *);
 
 
 struct ringmap_functions ringmap_f = {
@@ -68,10 +68,8 @@
 void 
 rm_8254_sync_head_tail(device_t dev)
 {
-	RINGMAP_FUNC_DEBUG(start);
 	rm_8254_sync_tail(dev);
 	rm_8254_sync_head(dev);
-	RINGMAP_FUNC_DEBUG(end);
 }
 
 
@@ -86,8 +84,8 @@
 
 	ring = rm_8254_find_next(adapter);
 
-#ifdef __RINGMAP_DEB
-	printf("Next ring is 0x%X\n", (unsigned int)ring);
+#if (__RINGMAP_DEB)
+	printf("Next ring->pid is %d\n", ring->pid);
 #endif 
 
 	RINGMAP_HW_SYNC_TAIL(adapter, ring);
@@ -99,7 +97,7 @@
 void 
 rm_8254_sync_head(device_t dev)
 {
-	struct capt_instance *ci = NULL;
+	struct capt_object *co = NULL;
 	struct adapter *adapter;
 
 	RINGMAP_FUNC_DEBUG(start);
@@ -108,12 +106,12 @@
 
 	RINGMAP_LOCK(adapter->rm);
 
-	SLIST_FOREACH(ci, &adapter->rm->instance_list, next_instance) {
-		if (ci->ring != NULL) {
-			RINGMAP_HW_SYNC_HEAD(adapter, ci->ring); /* SW_TAIL ==> HW_HEAD */
-#ifdef __RINGMAP_DEB
-			print_capt_inst(ci);
-			PRINT_RING_PTRS(ci->ring);
+	SLIST_FOREACH(co, &adapter->rm->object_list, objects) {
+		if (co->ring != NULL) {
+			RINGMAP_HW_SYNC_HEAD(adapter, co->ring); 
+#if (__RINGMAP_DEB)
+			print_capt_obj(co);
+			PRINT_RING_PTRS(co->ring);
 #endif 
 		}
 	}
@@ -133,7 +131,7 @@
 {
 	struct adapter	*adapter = (struct adapter *) arg;
 
-	/* count interrupts */
+	/* count interrupts only if there is capturing object */
 	if ( adapter->rm->open_cnt > 0 )
 		adapter->rm->interrupts_counter++;
 }
@@ -143,21 +141,20 @@
 rm_8254_delayed_interrupt(void *context)
 {
 	struct adapter	*adapter = (struct adapter *)context;
-	struct capt_instance *ci = NULL;
+	struct capt_object *co = NULL;
 
 	RINGMAP_INTR(start);
 
 	RINGMAP_LOCK(adapter->rm);
 
-	SLIST_FOREACH(ci, &adapter->rm->instance_list, next_instance) {
-#ifdef __RINGMAP_DEB
-		printf("[%s] Ring Kernel Addr:0x%X\n", __func__, (unsigned int)ci->ring);
+	SLIST_FOREACH(co, &adapter->rm->object_list, objects) {
+		if (co->ring != NULL) {
+#if (__RINGMAP_DEB)
+			PRINT_RING_PTRS(co->ring);
 #endif
-		if (ci->ring != NULL) {
-			/* TODO: find the next ring */
 			rm_8254_sync_tail(adapter->dev);
 #ifdef RINGMAP_TIMESTAMP
-			getmicrotime(&ci->ring->last_ts);
+			getmicrotime(&co->ring->last_ts);
 #endif
 		}
 	}
@@ -167,58 +164,58 @@
 	RINGMAP_INTR(end);
 }
 
+/* The ring which TAIL pointer is mostly near to to the HEAD(RDH) */
 struct ring *
 rm_8254_find_next(struct adapter *adapter)
 {
 	unsigned int rdh, rdt, dist, min_dist = SLOTS_NUMBER;
 	struct ringmap *rm = adapter->rm;
-	struct capt_instance *ci = NULL, *min_ci = NULL;
+	struct capt_object *co = NULL, *min_co = NULL;
 
 	rdh = RINGMAP_HW_READ_HEAD(adapter);
 
-	SLIST_FOREACH(ci, &rm->instance_list, next_instance) {
-		rdt = ci->ring->userrp;
+	SLIST_FOREACH(co, &rm->object_list, objects) {
+		rdt = co->ring->userrp;
 		dist = R_DISTANCE(rdh, rdt);
 		if (dist <= min_dist) {
 			min_dist = dist;
-			min_ci = ci;
+			min_co = co;
 		}
 	}
 
-	return (min_ci->ring);
+	return (min_co->ring);
 }
 
 void 
 rm_8254_delayed_interrupt_per_packet(device_t dev, int slot_num)
 {
-	struct capt_instance *ci = NULL;
+	struct capt_object *co = NULL;
 	struct adapter *adapter = NULL;
 	struct ringmap *rm = NULL;
 
 	adapter = (struct adapter *)device_get_softc(dev);
 	rm = adapter->rm;
 
-	//RINGMAP_INTR(start);
+	RINGMAP_INTR(start);
 
 	RINGMAP_LOCK(rm);
-	SLIST_FOREACH(ci, &rm->instance_list, next_instance) {
-		if ( ci->ring != NULL ) {
-			ci->ring->cur_slot_kern = slot_num;
-			ci->ring->slot[slot_num].is_ok = 1;
-			ci->ring->slot[slot_num].intr_num = rm->interrupts_counter;
+	SLIST_FOREACH(co, &rm->object_list, objects) {
+		if ( co->ring != NULL ) {
+			co->ring->slot[slot_num].is_ok = 1;
+			co->ring->slot[slot_num].intr_num = rm->interrupts_counter;
 
 #ifdef RINGMAP_TIMESTAMP
-			ci->ring->slot[slot_num].ts = ci->ring->last_ts;
+			co->ring->slot[slot_num].ts = co->ring->last_ts;
 #endif 
 
-#ifdef __RINGMAP_DEB
-			PRINT_SLOT((ci->ring), (slot_num));
+#if (__RINGMAP_DEB)
+			PRINT_SLOT((co->ring), (slot_num));
 #endif 
 		}
 	}
 	RINGMAP_UNLOCK(rm);
 
-	//RINGMAP_INTR(end);
+	RINGMAP_INTR(end);
 }
 
 
@@ -238,11 +235,11 @@
 		goto fail;
 	}
 	if (GET_PACKET_P(adapter, slot_num) == NULL){
-		RINGMAP_ERROR(pointer to packet is NULL);
+		RINGMAP_ERROR(Pointer to packet is NULL);
 		goto fail;
 	}
 	if (GET_DESCRIPTOR_P(adapter, slot_num) == NULL){
-		RINGMAP_ERROR(pointer to descriptor is NULL);
+		RINGMAP_ERROR(Pointer to descriptor is NULL);
 		goto fail;
 	}
 
@@ -311,7 +308,7 @@
 	struct adapter *adapter;
 
 	adapter = (struct adapter *)devclass_get_softc(em_devclass, dev2unit(cdev));
-#ifdef __RINGMAP_DEB
+#if (__RINGMAP_DEB)
 	if (adapter == NULL){
 		RINGMAP_WARN(Can not get pointer to adapter structure);
 	}
@@ -350,24 +347,14 @@
 
 
 int 
-rm_8254_print_ring_pointers(struct adapter *adapter, struct ring *ring)
+rm_8254_print_ring_pointers(struct adapter *adapter)
 {
 	unsigned int rdt, rdh;
 	struct ringmap *rm = NULL;
 
 	rm = adapter->rm;
 	
-	/* 
-	 * We should lock our data because while printing 
-	 * other process (for instance from other CPU) can 
-	 * free the memory regions that we are access in 
-	 * this functions 
-	 */ 
-
-	/* -> Critical Section: begin */
-	RINGMAP_LOCK(rm);
-
-	if ( (rm == NULL) || (ring == NULL) )
+	if (rm == NULL)
 		goto out;
 
 	rdh = RINGMAP_HW_READ_HEAD(adapter);
@@ -376,15 +363,8 @@
 	printf("\n==  +++++++++  RING POINTERS  ++++++++++++ \n");
 	printf("==  +  HW HEAD = %d (KERN POINTER)\n", rdh);
 	printf("==  +  HW TAIL = %d (USER POINTER)\n", rdt);
-	printf("==  +\n");
-	printf("==  +  kernrp = %d \n", ring->kernrp);
-	printf("==  +  userrp = %d \n", ring->userrp);
 	printf("==  ++++++++++++++++++++++++++++++++++++++ \n\n");
 
 out:
-
-	RINGMAP_UNLOCK(rm);
-	/* -> Critical Section: end */
-
 	return (0);
 }

==== //depot/projects/soc2010/ringmap/current/sys/dev/e1000/ringmap_8254.h#21 (text+ko) ====


==== //depot/projects/soc2010/ringmap/current/sys/dev/e1000/ringmap_e1000.h#13 (text+ko) ====


==== //depot/projects/soc2010/ringmap/current/sys/net/ringmap.c#27 (text+ko) ====

@@ -36,8 +36,8 @@
 int ringmap_attach (device_t, struct ringmap_functions *);
 int ringmap_detach (device_t);
 void ringmap_close_cb (void *data);
-void clear_capt_instance(void *);
-void print_capt_inst(struct capt_instance *);
+void clear_capt_object(void *);
+void print_capt_obj(struct capt_object *);
 
 struct ringmap *(*get_ringmap_p)(device_t);
 device_t 		(*get_device_p)(struct cdev *);
@@ -46,7 +46,6 @@
 d_close_t	ringmap_close;
 d_ioctl_t	ringmap_ioctl;
 d_read_t	ringmap_read;
-//d_mmap_t	ringmap_mmap;
 
 /*
  *	Character Device for access on if_em driver structures
@@ -57,7 +56,6 @@
 	.d_close 	= ringmap_close,
 	.d_ioctl	= ringmap_ioctl,
 	.d_read		= ringmap_read,
-//	.d_mmap		= ringmap_mmap,
 	.d_name 	= "ringmap_cdev"
 };
 
@@ -102,7 +100,7 @@
 	rm->dev = dev;
 
 	/* Initialize the list of capturing instances */
-	SLIST_INIT(&rm->instance_list);
+	SLIST_INIT(&rm->object_list);
 
 	/* Init the mutex to protecting our data */
 	RINGMAP_LOCK_INIT(rm, device_get_nameunit(dev));
@@ -120,7 +118,7 @@
 ringmap_detach(device_t dev)
 {
 	struct ringmap *rm = NULL;
-	struct capt_instance *ci = NULL;
+	struct capt_object *co = NULL;
 
 	RINGMAP_FUNC_DEBUG(start);
 	
@@ -130,10 +128,10 @@
 		return (-1);
 	}
 
-    while (!SLIST_EMPTY(&rm->instance_list)) {
-	    ci = SLIST_FIRST(&rm->instance_list);
-	    SLIST_REMOVE_HEAD(&rm->instance_list, next_instance);
-	    clear_capt_instance((void *)ci);
+    while (!SLIST_EMPTY(&rm->object_list)) {
+	    co = SLIST_FIRST(&rm->object_list);
+	    SLIST_REMOVE_HEAD(&rm->object_list, objects);
+	    clear_capt_object((void *)co);
     }
 
 	destroy_dev(rm->cdev);
@@ -159,13 +157,12 @@
 	int err = 0, i = 0;
 	struct ringmap *rm = NULL;
 	struct ring *ring = NULL;
-	struct capt_instance *ci = NULL;
+	struct capt_object *co = NULL;
 
 	RINGMAP_FUNC_DEBUG(start);
-#ifdef __RINGMAP_DEB
-	printf("cdev = 0x%X, td = %d\n", 
-			(unsigned int)cdev,
-			td->td_proc->p_pid);
+
+#if (__RINGMAP_DEB)
+	printf("[%s] pid = %d\n", __func__, td->td_proc->p_pid);
 #endif 
 
 	/* a little magic */
@@ -176,17 +173,15 @@
 		return (EIO);
 	}
 
-	rm->funcs->disable_intr(rm->dev);
 	RINGMAP_LOCK(rm);
 
 	/* check: the current thread shouldn't open(2) more than one time */
 	if (rm->open_cnt) {
-		SLIST_FOREACH(ci, &rm->instance_list, next_instance) {
-			if (ci->td == td) {
+		SLIST_FOREACH(co, &rm->object_list, objects) {
+			if (co->td == td) {
 				RINGMAP_ERROR(Device is opened!);
 
-				err = EIO; 
-				goto out;
+				err = EIO; goto out;
 			}
 		}
 	}
@@ -200,61 +195,59 @@
 	if (ring == NULL) {
 		RINGMAP_ERROR(Can not allocate space for ring);
 
-		err = EIO; 
-		goto out;
+		err = EIO; goto out;
 	}
 	for (i = 0 ; i < SLOTS_NUMBER ; i++){
 		if (rm->funcs->set_slot(ring, rm->dev, i) == -1){
 			RINGMAP_ERROR(Ring initialization failed!);
 			contigfree(ring, sizeof(struct ring), M_DEVBUF);
 
-			err = EIO; 
-			goto out;
+			err = EIO; goto out;
 		}
 	}
 
+	ring->size = SLOTS_NUMBER;
+	ring->pid = td->td_proc->p_pid;
+
 	/* 
 	 * create the capturing instance wich will represent 
 	 * current thread and packets ring 
 	 */
-	MALLOC(	ci, struct capt_instance *, 
-			sizeof(struct capt_instance), M_DEVBUF, (M_ZERO | M_WAITOK));
-	if ( ci == NULL ){
+	MALLOC(	co, struct capt_object *, 
+			sizeof(struct capt_object), M_DEVBUF, (M_ZERO | M_WAITOK));
+	if ( co == NULL ){
 		contigfree(ring, sizeof(struct ring), M_DEVBUF);
 
-		err = EIO; 
-		goto out;
+		err = EIO; goto out;
 	}
-	
-	ci->ring = ring;
-	ci->ring->size = SLOTS_NUMBER;
-	ci->td = td;
-	ci->rm = rm;
+	co->ring = ring;
+	co->td = td;
+	co->rm = rm;
 
-	ci->ring->pid = ci->td->td_proc->p_pid;
+	SLIST_INSERT_HEAD(&rm->object_list, co, objects);
 
-	SLIST_INSERT_HEAD(&rm->instance_list, ci, next_instance);
-
-	if ( devfs_set_cdevpriv((void *)ci, clear_capt_instance) ) {
-		RINGMAP_ERROR(Can not store private data!);
-		FREE(ci, M_DEVBUF);
+	/* 
+	 * Store capturing object as private date. So we can access our capturing
+	 * object in other syscalls, e.g. read, close, etc... 
+	 */
+	if ( devfs_set_cdevpriv((void *)co, clear_capt_object) ) {
+		RINGMAP_ERROR(Can not set private data!);
+		FREE(co, M_DEVBUF);
 		contigfree(ring, sizeof(struct ring), M_DEVBUF);
 
-		err = EIO; 
-		goto out;
+		err = EIO; goto out;
 	}
 	
 	rm->funcs->sync_head_tail(rm->dev);
-#ifdef __RINGMAP_DEB
-	print_capt_inst(ci);
-	PRINT_RING_PTRS(ci->ring); 
+#if (__RINGMAP_DEB)
+	print_capt_obj(co);
+	PRINT_RING_PTRS(co->ring); 
 #endif
 
 	rm->open_cnt++;
 
 out:
 	RINGMAP_UNLOCK(rm);
-	rm->funcs->enable_intr(rm->dev);
 
 	RINGMAP_FUNC_DEBUG(end);
 
@@ -264,37 +257,13 @@
 int
 ringmap_close(struct cdev *cdev, int flag, int otyp, struct thread *td)
 {
-	struct capt_instance *ci = NULL;
-	struct capt_instance *ki = NULL;
-	struct ringmap *rm = NULL;
 
 	RINGMAP_FUNC_DEBUG(start);
 
-#ifdef __RINGMAP_DEB
-	printf("cdev = 0x%X, td = %d\n", 
-			(unsigned int)cdev,
-			td->td_proc->p_pid);
+#if (__RINGMAP_DEB)
+	printf("[%s] pid = %d\n", __func__, td->td_proc->p_pid);
 #endif 
 
-	rm = get_ringmap_p(get_device_p(cdev));
-
-	RINGMAP_LOCK(rm);
-
-	devfs_get_cdevpriv((void **)&ci);
-
-#ifdef __RINGMAP_DEB
-	print_capt_inst(ci);
-#endif
-
-#ifdef __RINGMAP_DEB
-	SLIST_FOREACH(ki, &rm->instance_list, next_instance) {
-		printf("[%s] Aufter dealocation: ", __func__);
-		print_capt_inst(ki);
-	}
-#endif
-
-	RINGMAP_UNLOCK(rm);
-
 	RINGMAP_FUNC_DEBUG(end);
 
     return (0);
@@ -304,7 +273,7 @@
 ringmap_read(struct cdev *cdev, struct uio *uio, int ioflag)
 {
 	struct ringmap *rm = NULL;
-	struct capt_instance *ci = NULL;
+	struct capt_object *co = NULL;
 	vm_paddr_t phys_ring;
 
 	RINGMAP_FUNC_DEBUG(end);
@@ -312,23 +281,19 @@
 	/* Get pointer to the ringmap structure */
 	rm = get_ringmap_p(get_device_p(cdev));
 
-	if (devfs_get_cdevpriv((void **)&ci)) {
-		SLIST_FOREACH(ci, &rm->instance_list, next_instance) {
-			if ( ci->td == curthread)
-				break;
-		}
+	if (devfs_get_cdevpriv((void **)&co)) {
+		RINGMAP_ERROR(Wrong capturing object!);
+		return(EIO);
 	} 
-
-	if (ci->td != curthread ){
+	if (co->td != curthread ){
 		RINGMAP_ERROR(Wrong capturing object!);
 		return(EIO);
 	}
 
-	phys_ring = vtophys(ci->ring);
-#ifdef __RINGMAP_DEB
-	print_capt_inst(ci);
-	PRINT_RING_PTRS(ci->ring);
-	printf("[%s] phys addr of ring 0x%X\n", __func__, phys_ring);
+	phys_ring = vtophys(co->ring);
+#if (__RINGMAP_DEB)
+	print_capt_obj(co);
+	PRINT_RING_PTRS(co->ring);
 #endif
 
 	uiomove(&phys_ring, sizeof(phys_ring), uio);
@@ -338,47 +303,6 @@
 	return (0);
 }
 
-//int
-//ringmap_mmap(struct cdev *cdev, vm_ooffset_t offset, vm_paddr_t *paddr, 
-//				int nprot, vm_memattr_t *memattr)
-//{
-//	int err = 0;
-//	struct ringmap *rm = NULL;
-//	struct capt_instance *ci = NULL;
-//	pid_t pid = 0;
-//
-//	pid = curthread->td_proc->p_pid;
-//
-//	RINGMAP_FUNC_DEBUG(start);
-//	
-//	/* Get pointer to the ringmap structure */
-//	rm = get_ringmap_p(get_device_p(cdev));
-//	
-//	rm->funcs->disable_intr(rm->dev);
-//	RINGMAP_LOCK(rm);
-//
-//	if (devfs_get_cdevpriv((void **)&ci)) {
-//		SLIST_FOREACH(ci, &rm->instance_list, next_instance) {
-//			if ( ci->td == curthread)
-//				break;
-//		}
-//	} 
-//#ifdef __RINGMAP_DEB
-//	print_capt_inst(ci);
-//	PRINT_RING_PTRS(ci->ring);
-//	printf("[%s] phys addr of ring 0x%X\n", __func__, vtophys(ci->ring));
-//#endif
-//
-//	*paddr = vtophys(ci->ring);
-//
-//	RINGMAP_UNLOCK(rm);
-//	rm->funcs->enable_intr(rm->dev);
-//
-//	RINGMAP_FUNC_DEBUG(end);
-//
-//    return(err);
-//}
-
 
 int
 ringmap_ioctl (struct cdev *cdev, u_long cmd, caddr_t data, 
@@ -386,14 +310,12 @@
 {
 	int err = 0, err_sleep = err_sleep;
 	struct ringmap *rm = NULL;
-	struct capt_instance *ci;
+	struct capt_object *co;
 
 	RINGMAP_IOCTL(start);
 
-#ifdef __RINGMAP_DEB
-	printf("cdev = 0x%X, td = %d\n", 
-			(unsigned int)cdev,
-			td->td_proc->p_pid);
+#if (__RINGMAP_DEB)
+	printf("[%s] pid = %d\n", __func__, td->td_proc->p_pid);
 #endif 
 
 	/* Eliminate it */
@@ -406,16 +328,16 @@
 	}
 
 	RINGMAP_LOCK(rm);
-	if ( devfs_get_cdevpriv((void **)&ci) ) {
+	if ( devfs_get_cdevpriv((void **)&co) ) {
 		RINGMAP_IOCTL(Error! Can not get private date!)
 		return (ENODEV);
 	}
-	if (ci->td != curthread){
+	if (co->td != curthread){
 
 		RINGMAP_IOCTL(Wrong private data!);
 
-		SLIST_FOREACH(ci, &rm->instance_list, next_instance) {
-			if ( ci->td == curthread)
+		SLIST_FOREACH(co, &rm->object_list, objects) {
+			if ( co->td == curthread)
 				break;
 		}
 	}
@@ -438,22 +360,22 @@
 		/* Sleep and wait for new packets */
 		case IOCTL_SLEEP_WAIT:
 
-			ci->ring->user_wait_kern++;
+			co->ring->user_wait_kern++;
 			rm->funcs->sync_head_tail(rm->dev);
 
-#ifdef __RINGMAP_DEB
-			print_capt_inst(ci);
-			PRINT_RING_PTRS(ci->ring);
+#if (__RINGMAP_DEB)
+			print_capt_obj(co);
+			PRINT_RING_PTRS(co->ring);
 #endif
 			/* 
 			 * In the time: from user has called ioctl() until now could 
 			 * come the new packets. It means, before we are going to sleep
 			 * it makes a sence to check if we really must do it :)
 			 */
-			if (RING_IS_EMPTY(ci->ring)) {
+			if (RING_IS_EMPTY(co->ring)) {
 				RINGMAP_IOCTL(Sleep and wait for new packets);
 
-				err_sleep = tsleep(ci->ring, (PRI_MIN) | PCATCH, "ioctl", 0);
+				err_sleep = tsleep(co->ring, (PRI_MIN) | PCATCH, "ioctl", 0);
 			}
 		break;
 
@@ -478,32 +400,33 @@
 
 
 void 
-clear_capt_instance(void * data)
+clear_capt_object(void * data)
 {
-	struct capt_instance *ci = NULL;
+	struct capt_object *co = NULL;
 	struct ringmap *rm = NULL;
 
 	RINGMAP_FUNC_DEBUG(start);
 
-	if ( data != NULL ) {
-		ci = (struct capt_instance *)data;
-		rm = ci->rm;
+	if (data != NULL) {
+		co = (struct capt_object *)data;
+		rm = co->rm;
 
 		RINGMAP_LOCK(rm);
-#ifdef __RINGMAP_DEB
-		print_capt_inst(ci);
+#if (__RINGMAP_DEB)
+		print_capt_obj(co);
 #endif 
-		if ( ci->ring != NULL ){
-			contigfree(ci->ring, sizeof(struct ring), M_DEVBUF);
-			SLIST_REMOVE(&ci->rm->instance_list, ci, capt_instance, next_instance);
-			FREE(ci, M_DEVBUF);
-			data = NULL;
-		}
+		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!);
 	}
 	
-	rm->open_cnt--;
+	if (rm->open_cnt)
+		rm->open_cnt--;
 
 	RINGMAP_UNLOCK(rm);
 
@@ -512,13 +435,13 @@
 
 
 void 
-print_capt_inst(struct capt_instance *ci)
+print_capt_obj(struct capt_object *co)
 {
-	if (ci != NULL) {
-		printf("[%s] ci->td->proc->pid: %d\n", 
-				__func__, ci->td->td_proc->p_pid);
+	if (co != NULL) {
+		printf("[%s] co->td->proc->pid: %d\n", 
+				__func__, co->td->td_proc->p_pid);
 
 		printf("[%s] Ring Kernel Addr:0x%X\n", 
-				__func__, (unsigned int)ci->ring);
+				__func__, (unsigned int)co->ring);
 	}
 }

==== //depot/projects/soc2010/ringmap/current/sys/net/ringmap.h#27 (text+ko) ====

@@ -59,7 +59,7 @@
 	 * Next fields are for statistics:
 	 */
 
-	/* Time stamp of packet which placed in the slot */
+	/* Time stamp of packet stored in this slot */
 	struct timeval	ts;
 
 	/* Interrupts number in which kontext the packet was received */
@@ -98,7 +98,7 @@
 	/* Number of slots (descriptors a.k.a memory areas for frames) */
 	unsigned int size;
 
-	/* Values from adapters statistic registers */
+	/* Values from adapters statistic registers. Currently is not used */
 	struct address 	hw_stats;
 
 	/* 
@@ -117,20 +117,7 @@
 	 */
 	unsigned long long user_wait_kern;
 
-
 	/* 
-	 * Slot which currently processed by driver in context of 
-	 * delayed interupt 
-	 */
-	unsigned int volatile cur_slot_kern;
-
-	/*
-	 * Slot which currently processed by user-space process
-	 * in the pcap_read_ringmap() function (ringmap_pcap.c)
-	 */
-	unsigned int volatile cur_slot_user;
-
-	/* 
 	 * Number of received packets. This variable should be changed  only in
 	 * user-space. We want to count the packets, that was seen by user-space
 	 * process. I am not sure we are need it :( 
@@ -139,6 +126,7 @@
 
 	struct timeval	last_ts;
 
+	/* Ring identification. Should be initialized with process ID */
 	unsigned int pid;
 
 	/* Array of slots */
@@ -149,13 +137,12 @@
 #ifdef _KERNEL
 struct ringmap_functions;
 
-struct capt_instance {
+struct capt_object {
 	struct thread *td;
 	struct ring *ring;
 	struct ringmap *rm;

>>> TRUNCATED FOR MAIL (1000 lines) <<<


More information about the p4-projects mailing list