PERFORCE change 184865 for review
Alexandre Fiveg
afiveg at FreeBSD.org
Mon Oct 18 17:56:44 UTC 2010
http://p4web.freebsd.org/@@184865?ac=10
Change 184865 by afiveg at cottonmouth on 2010/10/18 17:55:43
Initialization of ring and association it with the capturing object is moved to ioctl IOCTL_ATTACH_RING. I've done it in order make it easier the attachment of certain queues to the capturing object in case if we have to do with multiqueue controller. Affected function: ringmap_ioctl. Two new ioctls: IOCTL_GETQUEUE_NUM, IOCTL_ATTACH_RING.
Affected files ...
.. //depot/projects/soc2010/ringmap/current/contrib/libpcap/ringmap_pcap.c#35 edit
.. //depot/projects/soc2010/ringmap/current/sys/dev/e1000/ringmap_8254.c#36 edit
.. //depot/projects/soc2010/ringmap/current/sys/net/ringmap.c#51 edit
.. //depot/projects/soc2010/ringmap/current/sys/net/ringmap.h#50 edit
.. //depot/projects/soc2010/ringmap/current/sys/net/ringmap_kernel.h#20 edit
.. //depot/projects/soc2010/ringmap/scripts/build_ringmap.sh#33 edit
.. //depot/projects/soc2010/ringmap/scripts/set_ringmap.sh#34 edit
.. //depot/projects/soc2010/ringmap/scripts/tailf_ringmap_msgs.sh#28 edit
Differences ...
==== //depot/projects/soc2010/ringmap/current/contrib/libpcap/ringmap_pcap.c#35 (text+ko) ====
@@ -43,7 +43,7 @@
int
init_mmapped_capturing(const char *device, pcap_t *p)
{
- int devmem_fd, i;
+ int devmem_fd, i, queue_num;
void *tmp_addr;
char dev_path[1024];
off_t memoffset = 0;
@@ -70,7 +70,7 @@
}
/**
- ** !!! Very important piece of code !!!
+ ** !!! Very important !!!
**
** Here we map the ring structure into the
** memory space of current process.
@@ -80,6 +80,11 @@
return (-1);
}
+ /* TODO: extend this for multiple queue case */
+ queue_num = DEFAULT_QUEUE;
+ /* Attach and init the ring to our thread */
+ ioctl(ringmap_cdev_fd, IOCTL_ATTACH_RING, &queue_num);
+
#if (__RINGMAP_DEB)
printf("[%s] Phys addr of ring 0x%X\n", __func__, ring);
#endif
@@ -101,10 +106,6 @@
RINGMAP_ERROR("Wrong size of ring buffer!");
return -1;
}
- if (p->ring->pid != getpid() ){
- RINGMAP_ERROR(Wrong ring was mapped! Exit!);
- return (-1);
- }
#if (__RINGMAP_DEB)
printf("Virtual address of ring is 0x%X\n", p->ring);
==== //depot/projects/soc2010/ringmap/current/sys/dev/e1000/ringmap_8254.c#36 (text+ko) ====
@@ -25,7 +25,7 @@
struct mbuf * rm_8254_get_mbuf(void *buffer_area, unsigned int num);
vm_offset_t rm_8254_get_packet(void *buffer_area, unsigned int num);
vm_offset_t rm8254_get_rx_desc(void * rx_desc_area, unsigned int num);
-
+int rm_8245_get_queuesnum(void);
extern devclass_t em_devclass;
@@ -41,6 +41,7 @@
.get_packet = rm_8254_get_packet,
.set_queue = rm_8254_set_queue,
.pkt_filter = NULL,
+ .get_queuesnum = rm_8245_get_queuesnum,
};
@@ -52,6 +53,13 @@
}
+int
+rm_8245_get_queuesnum()
+{
+ return (1);
+}
+
+
vm_offset_t
rm_8254_get_packet(void *buffer_area, unsigned int num)
{
==== //depot/projects/soc2010/ringmap/current/sys/net/ringmap.c#51 (text+ko) ====
@@ -263,40 +263,12 @@
}
ring->size = SLOTS_NUMBER;
- ring->pid = td->td_proc->p_pid; /* Unneeded thing. TODO: Replace it with somth more resonable */
co->ring = ring;
co->td = td;
co->rm = rm;
- /* The next should be probably done in the ioctl() */
-#ifdef 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);
- FREE(co, M_DEVBUF);
- err = EIO; goto out;
- }
-#endif
-
- /* Init ring-slots with mbufs and packets adrresses */
- for (i = 0 ; i < SLOTS_NUMBER ; i++) {
- if (set_slot(co, i) == -1){
- RINGMAP_ERROR(Ring initialization failed!);
-
- contigfree(ring, sizeof(struct ring), M_DEVBUF);
- FREE(co, M_DEVBUF);
-
- err = EIO; goto out;
- }
-#if (__RINGMAP_DEB)
- PRINT_SLOT(ring, i);
-#endif
- }
-
/*
* Insert the capturing object in the single linked list
*/
@@ -487,7 +459,7 @@
ringmap_ioctl (struct cdev *cdev, u_long cmd, caddr_t data,
int fflag, struct thread *td)
{
- int err = 0, err_sleep = err_sleep, size, flen;
+ int err = 0, err_sleep = err_sleep, size, flen, qn, i;
struct ringmap *rm = NULL;
struct capt_object *co;
@@ -576,6 +548,37 @@
co->rm->funcs->pkt_filter = ringmap_bpf_filter;
break;
+ /* Tell to user how many queues we have */
+ case IOCTL_GETQUEUE_NUM:
+ qn = rm->funcs->get_queuesnum();
+ *(int *)data = qn;
+ break;
+
+ /* Associate the ring/queue with the capturing object */
+ case IOCTL_ATTACH_RING:
+ qn = *(int *)data;
+
+ /* Associate the capturing object with a queue */
+ if (rm->funcs->set_queue(co, qn) == -1) {
+ RINGMAP_ERROR(Queue attachment failed!);
+ err = EINVAL;
+ goto out;
+ }
+
+ /* Init ring-slots with mbufs and packets adrresses */
+ for (i = 0 ; i < SLOTS_NUMBER ; i++) {
+ if (set_slot(co, i) == -1){
+ RINGMAP_ERROR(Ring initialization failed!);
+ err = EINVAL;
+ goto out;
+ }
+#if (__RINGMAP_DEB)
+ PRINT_SLOT(co->ring, i);
+#endif
+ }
+ break;
+
+
default:
RINGMAP_ERROR("Undefined command!");
err = ENODEV;
@@ -599,9 +602,12 @@
printf("[%s] Set slot: %d\n", __func__, slot_num);
#endif
- /* Now if everything is Ok, we can initialize ring pointers */
ring->slot[slot_num].mbuf.kern =
(vm_offset_t)rm->funcs->get_mbuf(co->rx_buffers, slot_num);
+
+ if (ring->slot[slot_num].mbuf.kern == 0)
+ return (-1);
+
ring->slot[slot_num].mbuf.phys =
(bus_addr_t)vtophys(ring->slot[slot_num].mbuf.kern);
==== //depot/projects/soc2010/ringmap/current/sys/net/ringmap.h#50 (text+ko) ====
@@ -132,10 +132,6 @@
unsigned long long intr_num;
- /* Ring identification. Should be initialized with process ID */
- /* TODO: use other ID. Using PID is a wrong way */
- unsigned int pid;
-
/* Array of slots (A.K.A packet buffers) */
struct ring_slot volatile slot[SLOTS_NUMBER];
};
@@ -179,7 +175,18 @@
*/
#define IOCTL_SETFILTER _IOW(RINGMAP_IOC_MAGIC, 6, struct bpf_program)
+/*
+ * Returns the number of available queues (A.K.A. rings)
+ */
+#define IOCTL_GETQUEUE_NUM _IOR(RINGMAP_IOC_MAGIC, 7, int)
+/*
+ * Associate user-space capturing process with a queue
+ */
+#define IOCTL_ATTACH_RING _IOW(RINGMAP_IOC_MAGIC, 8, int)
+
+
+
/**********************************************
* Arithmetic in Ring Buffer
**********************************************/
@@ -338,10 +345,8 @@
#define PRINT_RING_PTRS(ring) \
do { \
- printf("\n=+= [%s] pid = %d\n", __func__, ring->pid); \
PRINT_TAIL(ring) \
PRINT_HEAD(ring) \
- printf("\n"); \
} while (0);
==== //depot/projects/soc2010/ringmap/current/sys/net/ringmap_kernel.h#20 (text+ko) ====
@@ -116,6 +116,10 @@
*/
void (*pkt_filter)(struct capt_object *, int);
+ /* Retunrns the number of available queues */
+ int (*get_queuesnum)(void);
+
+
/*
* Set timestamp for packet placed in the slot. If ts != NULL set ts as
* timestamp. Else compute timestamp calling getmicrotime(9) or take
==== //depot/projects/soc2010/ringmap/scripts/build_ringmap.sh#33 (text+ko) ====
==== //depot/projects/soc2010/ringmap/scripts/set_ringmap.sh#34 (text+ko) ====
==== //depot/projects/soc2010/ringmap/scripts/tailf_ringmap_msgs.sh#28 (text+ko) ====
More information about the p4-projects
mailing list