PERFORCE change 180424 for review

Alexandre Fiveg afiveg at FreeBSD.org
Sat Jul 3 05:15:14 UTC 2010


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

Change 180424 by afiveg at cottonmouth on 2010/07/03 05:14:42

	Multithreading for ringmap alsmost ready. Cosmetic fixes remain.

Affected files ...

.. //depot/projects/soc2010/ringmap/current/contrib/libpcap/pcap-bpf.c#5 edit
.. //depot/projects/soc2010/ringmap/current/contrib/libpcap/pcap-int.h#5 edit
.. //depot/projects/soc2010/ringmap/current/contrib/libpcap/pcap.c#7 edit
.. //depot/projects/soc2010/ringmap/current/contrib/libpcap/ringmap_pcap.c#12 edit
.. //depot/projects/soc2010/ringmap/current/sys/dev/e1000/e1000_80003es2lan.c#5 edit
.. //depot/projects/soc2010/ringmap/current/sys/dev/e1000/e1000_80003es2lan.h#5 edit
.. //depot/projects/soc2010/ringmap/current/sys/dev/e1000/e1000_82540.c#5 edit
.. //depot/projects/soc2010/ringmap/current/sys/dev/e1000/e1000_82541.c#5 edit
.. //depot/projects/soc2010/ringmap/current/sys/dev/e1000/e1000_82541.h#5 edit
.. //depot/projects/soc2010/ringmap/current/sys/dev/e1000/e1000_82542.c#5 edit
.. //depot/projects/soc2010/ringmap/current/sys/dev/e1000/e1000_82543.c#5 edit
.. //depot/projects/soc2010/ringmap/current/sys/dev/e1000/e1000_82543.h#5 edit
.. //depot/projects/soc2010/ringmap/current/sys/dev/e1000/e1000_82571.c#5 edit
.. //depot/projects/soc2010/ringmap/current/sys/dev/e1000/e1000_82571.h#5 edit
.. //depot/projects/soc2010/ringmap/current/sys/dev/e1000/e1000_82575.c#5 edit
.. //depot/projects/soc2010/ringmap/current/sys/dev/e1000/e1000_82575.h#5 edit
.. //depot/projects/soc2010/ringmap/current/sys/dev/e1000/e1000_api.c#5 edit
.. //depot/projects/soc2010/ringmap/current/sys/dev/e1000/e1000_api.h#6 edit
.. //depot/projects/soc2010/ringmap/current/sys/dev/e1000/e1000_defines.h#5 edit
.. //depot/projects/soc2010/ringmap/current/sys/dev/e1000/e1000_hw.h#8 edit
.. //depot/projects/soc2010/ringmap/current/sys/dev/e1000/e1000_ich8lan.c#5 edit
.. //depot/projects/soc2010/ringmap/current/sys/dev/e1000/e1000_ich8lan.h#5 edit
.. //depot/projects/soc2010/ringmap/current/sys/dev/e1000/e1000_mac.c#5 edit
.. //depot/projects/soc2010/ringmap/current/sys/dev/e1000/e1000_mac.h#5 edit
.. //depot/projects/soc2010/ringmap/current/sys/dev/e1000/e1000_manage.c#5 edit
.. //depot/projects/soc2010/ringmap/current/sys/dev/e1000/e1000_manage.h#5 edit
.. //depot/projects/soc2010/ringmap/current/sys/dev/e1000/e1000_nvm.c#5 edit
.. //depot/projects/soc2010/ringmap/current/sys/dev/e1000/e1000_nvm.h#5 edit
.. //depot/projects/soc2010/ringmap/current/sys/dev/e1000/e1000_osdep.c#5 edit
.. //depot/projects/soc2010/ringmap/current/sys/dev/e1000/e1000_osdep.h#5 edit
.. //depot/projects/soc2010/ringmap/current/sys/dev/e1000/e1000_phy.c#5 edit
.. //depot/projects/soc2010/ringmap/current/sys/dev/e1000/e1000_phy.h#5 edit
.. //depot/projects/soc2010/ringmap/current/sys/dev/e1000/e1000_regs.h#5 edit
.. //depot/projects/soc2010/ringmap/current/sys/dev/e1000/if_em.c#9 edit
.. //depot/projects/soc2010/ringmap/current/sys/dev/e1000/if_em.h#7 edit
.. //depot/projects/soc2010/ringmap/current/sys/dev/e1000/if_igb.c#7 edit
.. //depot/projects/soc2010/ringmap/current/sys/dev/e1000/if_igb.h#5 edit
.. //depot/projects/soc2010/ringmap/current/sys/dev/e1000/if_lem.c#20 edit
.. //depot/projects/soc2010/ringmap/current/sys/dev/e1000/if_lem.h#18 edit
.. //depot/projects/soc2010/ringmap/current/sys/dev/e1000/ringmap_8254.c#19 edit
.. //depot/projects/soc2010/ringmap/current/sys/dev/e1000/ringmap_8254.h#17 edit
.. //depot/projects/soc2010/ringmap/current/sys/dev/e1000/ringmap_e1000.h#9 edit
.. //depot/projects/soc2010/ringmap/current/sys/net/ringmap.c#23 edit
.. //depot/projects/soc2010/ringmap/current/sys/net/ringmap.h#23 edit
.. //depot/projects/soc2010/ringmap/scripts/build_ringmap.sh#7 edit
.. //depot/projects/soc2010/ringmap/scripts/set_ringmap.sh#8 edit
.. //depot/projects/soc2010/ringmap/scripts/tailf_ringmap_msgs.sh#3 edit

Differences ...

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


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


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


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

@@ -131,12 +131,8 @@
 		return (-1); 
 	}
 
-#if (__RINGMAP_DEB)
-	printf("[%s] Number of descriptors: %d \n", __func__, SLOTS_NUMBER);
-#endif
-	
 	if (ringmap_cdev_fd < 0){
-		RINGMAP_ERROR(ringmap char device seems tgo be not open);
+		RINGMAP_ERROR(ringmap char device is not open);
 		return (-1);
 	}
 	tmp_addr = mmap(0, sizeof(struct ring), PROT_WRITE|PROT_READ, MAP_SHARED, ringmap_cdev_fd, 0);
@@ -299,13 +295,12 @@
 	//	if (tmp_res == -1)
 	//		printf(ERR_PREFIX"[%s] Error by unmapping of statistic structure %d\n", __func__, i);
 	//}
-	
+out:	
 	if (ringmap_cdev_fd >= 0){
 		if ( close(ringmap_cdev_fd) == -1 )
 			perror("close()");
 	}
 
-out:
 	RINGMAP_FUNC_DEBUG(end);
 }
 
@@ -337,8 +332,8 @@
 again: 
 	
 #ifdef __RINGMAP_DEB
-	printf("[%s] user to kern distance = %d\n", __func__, 
-			SW_TAIL_TO_HEAD_DIST(ring));
+// 	printf("[%s] user to kern distance = %d\n", __func__, 
+		//	SW_TAIL_TO_HEAD_DIST(ring));
 #endif
 
 	if ( RING_IS_EMPTY(ring) ) {
@@ -432,10 +427,6 @@
 	printf("Ring-Full  counter:  %llu\n", p->ring->kern_wait_user);
 	printf("Ring-Empty counter:  %llu\n", p->ring->user_wait_kern);
 
-	printf("Number of interrupts: %llu\n", p->ring->interrupts_counter);
-	printf("Packets per Interrupt: %llu\n", 
-		(((unsigned long long )p->ring->pkt_counter) / (p->ring->interrupts_counter)));
-
 	return (err);
 }
 

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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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

@@ -1389,7 +1389,7 @@
 		if (lem_rxeof(adapter, adapter->rx_process_limit) != 0)
 			taskqueue_enqueue(adapter->tq, &adapter->rxtx_task);
 #ifdef RINGMAP
-			adapter->rm->funcs->sync_head(adapter->dev, adapter->rm->ring);
+			adapter->rm->funcs->sync_head(adapter->dev);
 
 			wakeup(adapter->rm);
 		}
@@ -3574,15 +3574,8 @@
 		if (accept_frame) {
 
 #ifdef RINGMAP
-			if (adapter->rm != NULL) {
-				RINGMAP_LOCK(adapter->rm);
-				adapter->rm->funcs->delayed_isr_per_packet(adapter->rm->ring, 
-					i);
-#ifdef __RINGMAP_DEB
-				PRINT_SLOT((adapter->rm->ring), (i), (adapter));
-#endif 
-				RINGMAP_UNLOCK(adapter->rm);
-			}
+			if (adapter->rm != NULL) 
+				adapter->rm->funcs->delayed_isr_per_packet(adapter->dev, i);
 #endif
 
 #ifndef RINGMAP

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


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

@@ -27,11 +27,11 @@
 int rm_8254_set_slot(struct ring *, struct adapter *, unsigned int);
 void rm_8254_interrupt(void *);
 void rm_8254_delayed_interrupt(void *);
-int rm_8254_print_ring_pointers(struct adapter *);
+int rm_8254_print_ring_pointers(struct adapter *, struct ring *);
 void rm_8254_sync_head_tail(device_t, struct ring *);
 void rm_8254_sync_tail(device_t, struct ring *);
-void rm_8254_sync_head(device_t, struct ring *);
-void rm_8254_delayed_interrupt_per_packet(struct ring *, int);
+void rm_8254_sync_head(device_t);
+void rm_8254_delayed_interrupt_per_packet(device_t, int);
 struct ring *rm_8254_alloc_ring(device_t);
 
 extern devclass_t em_devclass;
@@ -41,53 +41,6 @@
 
 
 
-struct ring *
-rm_8254_alloc_ring(device_t dev)
-{
-	struct ring *ring;
-
-	/* 
-	 * Allocate memory for ring structure 
-	 * Use contigmalloc(9) to get PAGE_SIZE alignment that is needed 
-	 * for memory mapping.  
-	 */
-	ring = (struct ring *) contigmalloc (sizeof(struct ring), 
-			M_DEVBUF, M_ZERO, 0, -1L, PAGE_SIZE, 0);
-	if (ring == NULL) { 
-		RINGMAP_ERROR(Can not allocate space for ring structure);
-
-		return (NULL);
-	}
-
-
-	if (rm_8254_init_slots(ring, dev) == -1) { 
-		RINGMAP_ERROR(The ring is not initialized. Device will not be opened!);
-		contigfree(ring, sizeof(struct ring), M_DEVBUF);
-
-		return (NULL);
-	}	
-
-	return (ring);
-}
-
-void 
-rm_8254_delayed_interrupt_per_packet(struct ring *ring, int slot_num)
-{
-	RINGMAP_INTR(start);
-
-	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 = ring->last_ts;
-#endif 
-	}
-
-	RINGMAP_INTR(end);
-}
-
 
 /* 
  * This function synchronize the tail and head hardware registers
@@ -102,7 +55,7 @@
 rm_8254_sync_head_tail(device_t dev, struct ring *ring)
 {
 	rm_8254_sync_tail(dev, ring);
-	rm_8254_sync_head(dev, ring);
+	rm_8254_sync_head(dev);
 }
 
 
@@ -112,24 +65,26 @@
 	struct adapter *adapter;
 	adapter = (struct adapter *)device_get_softc(dev);
 
-	RINGMAP_LOCK(adapter->rm);
-	if (ring != NULL) {
-		RINGMAP_HW_SYNC_TAIL(adapter, ring);	/* SW_TAIL ==> HW_TAIL */
-	}
-	RINGMAP_UNLOCK(adapter->rm);
+	RINGMAP_HW_SYNC_TAIL(adapter, ring);	/* SW_TAIL ==> HW_TAIL */
 }
 
 
 void 
-rm_8254_sync_head(device_t dev, struct ring *ring)
+rm_8254_sync_head(device_t dev)
 {
+	struct capt_instance *ci = NULL;
 	struct adapter *adapter;
+
 	adapter = (struct adapter *)device_get_softc(dev);
 
 	RINGMAP_LOCK(adapter->rm);
-	if (ring != NULL) {
-		RINGMAP_HW_SYNC_HEAD(adapter, ring);	/* SW_TAIL ==> HW_HEAD */
+
+	SLIST_FOREACH(ci, &adapter->rm->instance_list, next_instance) {
+		if (ci->ring != NULL) {
+			RINGMAP_HW_SYNC_HEAD(adapter, ci->ring); /* SW_TAIL ==> HW_HEAD */
+		}
 	}
+
 	RINGMAP_UNLOCK(adapter->rm);
 }
 
@@ -144,33 +99,100 @@
 	struct adapter	*adapter = (struct adapter *) arg;
 
 	/* count interrupts */
-	if ( (adapter->rm != NULL) && (adapter->rm->ring != NULL) &&
-			adapter->rm->ring->td != NULL) {
+	if ( adapter->rm->open_cnt > 0 )
+		adapter->rm->interrupts_counter++;
+}
+
+
+void 
+rm_8254_delayed_interrupt(void *context)
+{
+	struct adapter	*adapter = (struct adapter *)context;
+	struct capt_instance *ci = NULL;
+
+//	RINGMAP_INTR(start);
 
-		adapter->rm->ring->interrupts_counter++;
+	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);
+#endif
+		if (ci->ring != NULL) {
+			/* TODO: find the next ring */
+			rm_8254_sync_tail(adapter->dev, ci->ring);
+#ifdef RINGMAP_TIMESTAMP
+			getmicrotime(&ci->ring->last_ts);
+#endif
+		}
 	}
+
+	RINGMAP_UNLOCK(adapter->rm);
+
+//	RINGMAP_INTR(end);
 }
 
 
 void 
-rm_8254_delayed_interrupt(void *context)
+rm_8254_delayed_interrupt_per_packet(device_t dev, int slot_num)
 {
-	struct adapter	*adapter = (struct adapter *)context;
+	struct capt_instance *ci = 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);
 
-	rm_8254_sync_tail(adapter->dev, adapter->rm->ring);
+	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;
 
 #ifdef RINGMAP_TIMESTAMP
-	RINGMAP_LOCK(adapter->rm);
-	if (adapter->rm->ring != NULL) {
-		getmicrotime(&adapter->rm->ring->last_ts);
+			ci->ring->slot[slot_num].ts = ci->ring->last_ts;
+#endif 
+
+#ifdef __RINGMAP_DEB
+			PRINT_SLOT((ci->ring), (slot_num), adapter);
+#endif 
+		}
+	}
+	RINGMAP_UNLOCK(rm);
+
+	//RINGMAP_INTR(end);
+}
+
+
+struct ring *
+rm_8254_alloc_ring(device_t dev)
+{
+	struct ring *ring;
+
+	/* 
+	 * Allocate memory for ring structure 
+	 * Use contigmalloc(9) to get PAGE_SIZE alignment that is needed 
+	 * for memory mapping.  
+	 */
+	ring = (struct ring *) contigmalloc (sizeof(struct ring), 
+			M_DEVBUF, M_ZERO, 0, -1L, PAGE_SIZE, 0);
+	if (ring == NULL) { 
+		RINGMAP_ERROR(Can not allocate space for ring structure);
+
+		return (NULL);
 	}
-	RINGMAP_UNLOCK(adapter->rm);
-#endif
+
+	if (rm_8254_init_slots(ring, dev) == -1) { 
+		RINGMAP_ERROR(The ring is not initialized. Device will not be opened!);
+		contigfree(ring, sizeof(struct ring), M_DEVBUF);
+
+		return (NULL);
+	}	
 
-	RINGMAP_INTR(end);
+	return (ring);
 }
 
 
@@ -215,6 +237,9 @@
 			RINGMAP_ERROR(Ring initialization failed!);
 			return (-1);
 		}
+#if (__RINGMAP_DEB)
+		ringmap_print_slot(ring, slot_num);
+#endif
 	}
 
 	RINGMAP_FUNC_DEBUG(end);
@@ -262,9 +287,6 @@
 	ring->slot[slot_num].descriptor.phys = 
 		(bus_addr_t)vtophys(GET_DESCRIPTOR_P(adapter, slot_num));
 
-#if (__RINGMAP_DEB)
-		ringmap_print_slot(ring, slot_num);
-#endif
 	return (0);
 
 fail:
@@ -355,7 +377,7 @@
 
 
 int 
-rm_8254_print_ring_pointers(struct adapter *adapter)
+rm_8254_print_ring_pointers(struct adapter *adapter, struct ring *ring)
 {
 	unsigned int rdt, rdh;
 	struct ringmap *rm = NULL;
@@ -372,7 +394,7 @@
 	/* -> Critical Section: begin */
 	RINGMAP_LOCK(rm);
 
-	if ( (rm == NULL) || (rm->ring == NULL) )
+	if ( (rm == NULL) || (ring == NULL) )
 		goto out;
 
 	rdh = RINGMAP_HW_READ_HEAD(adapter);
@@ -382,8 +404,8 @@
 	printf("==  +  HW HEAD = %d (KERN POINTER)\n", rdh);
 	printf("==  +  HW TAIL = %d (USER POINTER)\n", rdt);
 	printf("==  +\n");
-	printf("==  +  kernrp = %d \n", rm->ring->kernrp);
-	printf("==  +  userrp = %d \n", rm->ring->userrp);
+	printf("==  +  kernrp = %d \n", ring->kernrp);
+	printf("==  +  userrp = %d \n", ring->userrp);
 	printf("==  ++++++++++++++++++++++++++++++++++++++ \n\n");
 
 out:

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


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


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

@@ -39,6 +39,7 @@
 int set_ringmap_funcs (struct ringmap *, unsigned int);
 void ringmap_close_cb (void *data);
 void ringmap_print_slot(struct ring *, unsigned int);
+void clear_capt_instance(void *);
 
 struct ringmap *(*get_ringmap_p)(device_t);
 device_t 		(*get_device_p)(struct cdev *);
@@ -52,8 +53,8 @@
 extern void rm_8254_delayed_interrupt(void *);
 extern void rm_8254_sync_head_tail(device_t, struct ring *);
 extern void rm_8254_sync_tail(device_t, struct ring *);
-extern void rm_8254_sync_head(device_t, struct ring *);
-extern void rm_8254_delayed_interrupt_per_packet(struct ring *, int);
+extern void rm_8254_sync_head(device_t);
+extern void rm_8254_delayed_interrupt_per_packet(device_t, int);
 extern struct ring *rm_8254_alloc_ring(device_t);
 
 d_open_t	ringmap_open;
@@ -206,6 +207,9 @@
 	/* Store adapters device structure */
 	rm->dev = dev;
 
+	/* Initialize our list of capturing instances */
+	SLIST_INIT(&rm->instance_list);
+
 	/* Init the mutex to protecting our data */
 	RINGMAP_LOCK_INIT(rm, device_get_nameunit(dev));
 
@@ -222,6 +226,7 @@
 ringmap_detach(device_t dev)
 {
 	struct ringmap *rm = NULL;
+	struct capt_instance *ci = NULL;
 
 	RINGMAP_FUNC_DEBUG(start);
 	
@@ -231,6 +236,12 @@
 		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);
+    }
+
 	destroy_dev(rm->cdev);
 	
 	RINGMAP_LOCK_DESTROY(rm);
@@ -238,8 +249,6 @@
 	contigfree(rm->funcs, sizeof(struct ringmap_functions), M_DEVBUF);
 	contigfree(rm, sizeof(struct ringmap), M_DEVBUF);
 
-	rm = NULL;
-	
 	RINGMAP_FUNC_DEBUG(end);
 
 	return (0);
@@ -257,6 +266,7 @@
 {
 	int err = 0;
 	struct ringmap *rm = NULL;
+	struct capt_instance *ci = NULL;
 
 	RINGMAP_FUNC_DEBUG(start);
 
@@ -273,54 +283,48 @@
 		return (EIO);
 	}
 
+	MALLOC(ci, struct capt_instance *, 
+			sizeof(struct capt_instance), M_DEVBUF, (M_ZERO | M_WAITOK));
+	if ( ci == NULL ){
+		return (EIO);
+	}
+
 	/* 
 	 * I think it is safe to disable interupts while we allocate 
 	 * allocate memory for oure structures 
 	 */
 	rm->funcs->disable_intr(rm->dev);
 
-	/* -> Critical Section: begin */
 	RINGMAP_LOCK(rm);
-
-	if ( rm->dev == NULL ) {
-		RINGMAP_ERROR(Null pointer to device structure of adapter);
-
-		err = EIO; goto out;
-	}
 	
 	/* Allocate ring */
-	rm->ring = rm->funcs->alloc_ring(rm->dev);
-
-	/* Check for any cases */
-	if ( rm->ring == NULL ) {
+	ci->ring = rm->funcs->alloc_ring(rm->dev);
+	if ( ci->ring == NULL ) {
 		RINGMAP_ERROR(Error! Please debug!);
 
 		err = EIO; goto out;
 	}
-	
-	/* Set ring fields in the initial state */
-	rm->ring->kern_wait_user 		= 0;
-    rm->ring->user_wait_kern 		= 0;
-    rm->ring->interrupts_counter 	= 0;
-	rm->ring->pkt_counter 			= 0;
-	rm->ring->size 		= SLOTS_NUMBER;
+	ci->ring->size = SLOTS_NUMBER;
+	ci->td = td;
+	ci->rm = rm;
 
-	/* Store pointer to the thread */
-	rm->ring->td = td;
-	
-	/*
-	 *	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); 
+	SLIST_INSERT_HEAD(&rm->instance_list, ci, next_instance);
 
+	if ( devfs_set_cdevpriv((void *)ci, clear_capt_instance) ) {
+		RINGMAP_ERROR(Ooooooooooooooohhhhhhhh !!!!!);
 		err = EIO; goto out;
 	}
+	
+	rm->open_cnt++;
+#ifdef __RINGMAP_DEB
+	printf("[%s] currthread->proc->pid: %d \n", __func__, curthread->td_proc->p_pid);
+	printf("[%s] ci->td->proc->pid: %d\n", __func__, ci->td->td_proc->p_pid);
+
+	printf("[%s] Ring Kernel Addr:0x%X\n", __func__, (unsigned int)ci->ring);
+#endif 
 
 out:
 	RINGMAP_UNLOCK(rm);
-	/* -> Critical Section: end */
 
 	rm->funcs->enable_intr(rm->dev);
 
@@ -333,32 +337,43 @@
 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);
 
 	rm = get_ringmap_p(get_device_p(cdev));
-	if (rm == NULL){
-		RINGMAP_ERROR(Can not get pointer to ringmap structure);
 
-		/* TODO: Fix it! */
-		return (0);
-	}
+	RINGMAP_LOCK(rm);
 
-	rm->funcs->disable_intr(rm->dev);
+	devfs_get_cdevpriv((void **)&ci);
 
-	atomic_readandclear_int(&rm->open_cnt); 
+#ifdef __RINGMAP_DEB
+	printf("[%s] currthread->proc->pid: %d \n", __func__, curthread->td_proc->p_pid);
+	printf("[%s] ci->td->proc->pid: %d\n", __func__, ci->td->td_proc->p_pid);
 
-	/* -> Critical Section: begin */
-	RINGMAP_LOCK(rm);
+	printf("[%s] Ring Kernel Addr:0x%X\n", __func__, (unsigned int)ci->ring);
+#endif 
+//	if (ci->ring != NULL) 
+//		contigfree(ci->ring, sizeof(struct ring), M_DEVBUF);
+//	ci->ring = NULL;
+//
+//	/* Remove the capturing instance from list */
+//	SLIST_REMOVE(&rm->instance_list, ci, capt_instance, next_instance);
+//	FREE(ci, M_DEVBUF);
+//	ci = NULL;
+//	rm->open_cnt--;
 
-	if (rm->ring != NULL) 
-		contigfree(rm->ring, sizeof(struct ring), M_DEVBUF);
+	SLIST_FOREACH(ki, &rm->instance_list, next_instance) {
+#ifdef __RINGMAP_DEB
+	printf("[%s] Aufter dealocation: ", __func__);
+	printf("[%s] ki->td->proc->pid: %d\n", __func__, ki->td->td_proc->p_pid);
+	printf("[%s] Ring Kernel Addr:0x%X\n", __func__, (unsigned int)ki->ring);
+#endif 	
+	}
 
-	rm->ring = NULL;
-
 	RINGMAP_UNLOCK(rm);
-	/* -> Critical Section: end */
 
 	RINGMAP_FUNC_DEBUG(end);
 
@@ -372,27 +387,16 @@
 {
 	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));
-
-	/* Check pointers: rm and rm->ring should be allocated */
-	if (rm == NULL){
-		RINGMAP_ERROR(Can not get pointer to ringmap structure);
-		return (ENXIO);
-	}
-
-	/* -> Critical Section: begin */
-	RINGMAP_LOCK(rm);
-
-	if (rm->ring == NULL){
-		RINGMAP_ERROR(Can not get pointer to ring structure);
-
-		err = ENXIO; goto out;
-	}
-
+	
 	/* Check protections */
 	if (nprot & PROT_EXEC) {
 		RINGMAP_WARN("PROT_EXEC ist set");
@@ -400,11 +404,20 @@
 		err = ERESTART; goto out;
 	}
 
-	*paddr = vtophys(rm->ring);
+	/* -> Critical Section: begin */
+	RINGMAP_LOCK(rm);
+
+	if (devfs_get_cdevpriv((void **)&ci)) {
+		SLIST_FOREACH(ci, &rm->instance_list, next_instance) {
+			if ( ci->td == curthread)
+				break;
+		}
+	} 
+
+	*paddr = vtophys(ci->ring);
 
 out:
 	RINGMAP_UNLOCK(rm);
-	/* -> Critical Section: end */
 
 	RINGMAP_FUNC_DEBUG(end);
 
@@ -418,18 +431,23 @@
 {
 	int err = 0, err_sleep = err_sleep;
 	struct ringmap *ringmap = NULL;
+	struct capt_instance *ci;
 
-	RINGMAP_IOCTL(start);
+//	RINGMAP_IOCTL(start);
 
-	/* TODO: use private data to set and get ring from curr. thread */
 	ringmap = get_ringmap_p(get_device_p(cdev));
-	if ((ringmap == NULL) || (ringmap->ring == NULL)){
+	if ( ringmap == NULL ){
 		RINGMAP_ERROR(NULL pointer. ioctl can not be accomplished);
 
 		/* TODO: look if ENODEV is a correctly for this case */
 		return(ENODEV);
 	}
 
+	if ( devfs_get_cdevpriv((void **)&ci) ) {
+		RINGMAP_IOCTL(Error! Can not get private date!)
+		return (ENODEV);
+	}
+
 	switch( cmd ){
 
 		/* Enable  Interrupts */
@@ -444,30 +462,30 @@
 			RINGMAP_IOCTL(interrupts schould be disabled);
 		break;
 		
-		/* Sleep and wait for new frames */
+		/* Sleep and wait for new packets */
 		case IOCTL_SLEEP_WAIT:
-			RINGMAP_IOCTL(Sleep and wait for new packets);
+//			RINGMAP_IOCTL(Sleep and wait for new packets);
 
-			ringmap->ring->user_wait_kern++;
-			ringmap->funcs->sync_head_tail(get_device_p(cdev), ringmap->ring);
+			ci->ring->user_wait_kern++;
+			ringmap->funcs->sync_head_tail(ringmap->dev, ci->ring);
 
 			/* 
 			 * 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(ringmap->ring)) {
+			if (RING_IS_EMPTY(ci->ring)) {
 				err_sleep = tsleep(ringmap, (PRI_MIN) | PCATCH, "ioctl", 0);
 			}
 		break;
 
 		case IOCTL_SYNC_HEAD_TAIL:
-			ringmap->funcs->sync_head_tail(get_device_p(cdev), ringmap->ring);
+			ringmap->funcs->sync_head_tail(ringmap->dev, ci->ring);
 		break;
 
 		/* Synchronize sowftware ring-tail with hardware-ring-tail (RDT) */
 		case IOCTL_SYNC_TAIL:
-			ringmap->funcs->sync_tail(get_device_p(cdev), ringmap->ring);
+			ringmap->funcs->sync_tail(ringmap->dev, ci->ring);
 		break;
 
 		default:
@@ -475,11 +493,42 @@
 			return (ENODEV);
 	}   	
         	
-	RINGMAP_IOCTL(end);
+//	RINGMAP_IOCTL(end);
         	
 	return (err);
 }
 
+
+void 
+clear_capt_instance(void * data)
+{
+	struct capt_instance *ci = NULL;
+
+	RINGMAP_FUNC_DEBUG(start);
+
+	if ( data != NULL ) {
+		ci = (struct capt_instance *)data;
+		RINGMAP_LOCK(ci->rm);
+#ifdef __RINGMAP_DEB
+	printf("[%s] ci->td->proc->pid: %d\n", __func__, ci->td->td_proc->p_pid);
+	printf("[%s] Ring Kernel Addr:0x%X\n", __func__, (unsigned int)ci->ring);
+#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;
+		}
+	} else {
+		RINGMAP_FUNC_DEBUG(NULL pointer to the capturing instance!);
+	}
+	
+	RINGMAP_UNLOCK(ci->rm);
+
+	RINGMAP_FUNC_DEBUG(end);
+}
+
 void
 ringmap_print_slot(struct ring *ring, unsigned int slot_number)
 {

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

@@ -101,9 +101,6 @@
 	/* Values from adapters statistic registers */
 	struct address 	hw_stats;
 
-	/* Capturing thread */
-	struct 	thread 	*td;
-
 	/* 
 	 * Number of times kernel (hardware) waits for user process. More
 	 * specifically, this is the number of times that the write pointer (HEAD)
@@ -120,8 +117,6 @@
 	 */
 	unsigned long long user_wait_kern;
 
-	/* Counts number of hardware interrupts */
-	unsigned long long interrupts_counter;
 
 	/* 
 	 * Slot which currently processed by driver in context of 
@@ -157,6 +152,16 @@
 	unsigned int controller_type;
 };
 
+struct capt_instance {
+	struct thread *td;
+	struct ring *ring;
+	struct ringmap *rm;
+	void *private_data;
+
+	SLIST_ENTRY(capt_instance) next_instance;
+};
+
+
 /*
  * This structure will be visible only in the kernel. It contains 
  * the pointers to the ring that should be mapped in user-space, 
@@ -179,8 +184,10 @@
 	/* Mutex that should protect the data allocated in the ring */
 	struct mtx	ringmap_mtx;
 
-	/* Our ring that have to be mapped in space of user process */
-	struct ring *ring;
+	SLIST_HEAD(instance_list, capt_instance) instance_list;
+
+	/* Counts number of hardware interrupts */
+	unsigned long long interrupts_counter;
 };
 
 struct ringmap_functions {
@@ -224,7 +231,7 @@
 	 * should be called from this cycle, so it will be called 
 	 * per packet.
 	 */
-	void (*delayed_isr_per_packet)(struct ring *, int);
+	void (*delayed_isr_per_packet)(device_t, int);
 
 	/* 
 	 * Next functions synchronize the tail and head hardware registers
@@ -249,7 +256,7 @@
 	 */
 	void (*sync_head_tail)(device_t, struct ring *);
 	void (*sync_tail)(device_t, struct ring *);
-	void (*sync_head)(device_t, struct ring *);
+	void (*sync_head)(device_t);
 
 	/* Alloc memory for our ring and initialize the slots */
 	struct ring *(*alloc_ring)(device_t);

==== //depot/projects/soc2010/ringmap/scripts/build_ringmap.sh#7 (text+ko) ====


==== //depot/projects/soc2010/ringmap/scripts/set_ringmap.sh#8 (text+ko) ====


==== //depot/projects/soc2010/ringmap/scripts/tailf_ringmap_msgs.sh#3 (text+ko) ====



More information about the p4-projects mailing list