PERFORCE change 180741 for review
Alexandre Fiveg
afiveg at FreeBSD.org
Sun Jul 11 03:09:22 UTC 2010
http://p4web.freebsd.org/@@180741?ac=10
Change 180741 by afiveg at cottonmouth on 2010/07/11 03:08:49
d_mmap is eliminated from ringmap because of very strange behavior. Now: user-space process calls read(/dev/ringmap ... ) in order get physical addres of ring. Then by calling mmap(/dev/mem, .... , offset=ring_phys_addr) the ring will be mapped into user-space.
Affected files ...
.. //depot/projects/soc2010/ringmap/current/contrib/libpcap/pcap-bpf.c#8 edit
.. //depot/projects/soc2010/ringmap/current/contrib/libpcap/pcap-int.h#8 edit
.. //depot/projects/soc2010/ringmap/current/contrib/libpcap/pcap.c#10 edit
.. //depot/projects/soc2010/ringmap/current/contrib/libpcap/ringmap_pcap.c#15 edit
.. //depot/projects/soc2010/ringmap/current/sys/dev/e1000/if_lem.c#23 edit
.. //depot/projects/soc2010/ringmap/current/sys/dev/e1000/ringmap_8254.c#22 edit
.. //depot/projects/soc2010/ringmap/current/sys/dev/e1000/ringmap_8254.h#20 edit
.. //depot/projects/soc2010/ringmap/current/sys/dev/e1000/ringmap_e1000.h#12 edit
.. //depot/projects/soc2010/ringmap/current/sys/net/ringmap.c#26 edit
.. //depot/projects/soc2010/ringmap/current/sys/net/ringmap.h#26 edit
.. //depot/projects/soc2010/ringmap/scripts/build_ringmap.sh#10 edit
.. //depot/projects/soc2010/ringmap/scripts/set_ringmap.sh#11 edit
.. //depot/projects/soc2010/ringmap/scripts/tailf_ringmap_msgs.sh#6 edit
.. //depot/projects/soc2010/ringmap/tests/ringmap/main.c#4 edit
.. //depot/projects/soc2010/ringmap/tests/ringmap/mmap.c#4 edit
.. //depot/projects/soc2010/ringmap/tests/ringmap/open.c#4 edit
.. //depot/projects/soc2010/ringmap/tests/ringmap/tests.h#4 edit
Differences ...
==== //depot/projects/soc2010/ringmap/current/contrib/libpcap/pcap-bpf.c#8 (text+ko) ====
==== //depot/projects/soc2010/ringmap/current/contrib/libpcap/pcap-int.h#8 (text+ko) ====
==== //depot/projects/soc2010/ringmap/current/contrib/libpcap/pcap.c#10 (text+ko) ====
==== //depot/projects/soc2010/ringmap/current/contrib/libpcap/ringmap_pcap.c#15 (text+ko) ====
@@ -56,6 +56,7 @@
char dev_path[1024];
struct ring tmp_ring;
off_t memoffset = 0;
+ vm_paddr_t ring;
bus_addr_t rspp;
RINGMAP_FUNC_DEBUG(start);
@@ -84,13 +85,21 @@
** Here we map the ring structure into the
** memory space of current process.
**/
+ if (read(ringmap_cdev_fd, &ring, sizeof(vm_paddr_t)) == -1) {
+ RINGMAP_ERROR(Can not read phys addr of ring from kernel);
+ return (-1);
+ }
+#ifdef __RINGMAP_DEB
+ printf("[%s] Phys addr of ring 0x%X\n", __func__, ring);
+#endif
+
tmp_addr =
mmap( 0, /* Kernel gives us the address */
sizeof(struct ring), /* Number of bytes we are mapping */
PROT_WRITE|PROT_READ, /* We want both read and write */
MAP_SHARED, /* Changes shoud be visible in kernel */
- ringmap_cdev_fd, /* file decriptor */
- 0);
+ devmem_fd, /* /dev/mem device */
+ ring); /* offset = phys addr of ring */
if (tmp_addr == MAP_FAILED){
RINGMAP_ERROR("Mapping of Ring Pointers structure failed! Exit!");
return -1;
@@ -101,6 +110,10 @@
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);
@@ -109,6 +122,8 @@
for(i=0 ;i < SLOTS_NUMBER; i++){
PRINT_PACKET_ADDR(p->ring, i);
}
+
+ PRINT_RING_PTRS(p->ring);
#endif
/*
@@ -242,6 +257,7 @@
if ( RING_IS_EMPTY(ring) ) {
RINGMAP_FUNC_DEBUG(Ring is empty. Sleep...);
+ PRINT_RING_PTRS(ring);
/* Sleep and wait for new incoming packets */
ioctl(ringmap_cdev_fd, IOCTL_SLEEP_WAIT);
goto again;
@@ -275,14 +291,13 @@
pkthdr.caplen = pkthdr.len = mb->m_len;
datap = (caddr_t)U_PACKET(ring, curr_slot);
- ring->slot[curr_slot].is_ok=0;
ring->pkt_counter++;
--ws;
(*callback)(user, &pkthdr, datap);
#ifdef __RINGMAP_DEB
- PRINT_SLOT(ring, ring->cur_slot_user, datap);
+ PRINT_SLOT(ring, ring->cur_slot_user);
#endif
out:
==== //depot/projects/soc2010/ringmap/current/sys/dev/e1000/if_lem.c#23 (text+ko) ====
@@ -1382,6 +1382,7 @@
{
struct adapter *adapter = context;
struct ifnet *ifp = adapter->ifp;
+ struct capt_instance *ci = NULL;
if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
#ifdef RINGMAP
@@ -1392,8 +1393,12 @@
taskqueue_enqueue(adapter->tq, &adapter->rxtx_task);
#ifdef RINGMAP
adapter->rm->funcs->sync_head(adapter->dev);
-
- wakeup(adapter->rm);
+
+ SLIST_FOREACH(ci, &adapter->rm->instance_list, next_instance) {
+ if (RING_NOT_EMPTY(ci->ring)){
+ wakeup(ci->ring);
+ }
+ }
}
#endif
==== //depot/projects/soc2010/ringmap/current/sys/dev/e1000/ringmap_8254.c#22 (text+ko) ====
@@ -19,40 +19,38 @@
#include "ringmap_8254.h"
int rm_8254_set_ringmap_to_adapter(device_t, struct ringmap *);
-int rm_8254_init_slots(struct ring *, device_t);
struct ringmap * rm_8254_get_ringmap_p(device_t);
device_t rm_8254_get_device_p(struct cdev *);
void rm_8254_enable_intr(device_t);
void rm_8254_disable_intr(device_t);
-int rm_8254_set_slot(struct ring *, struct adapter *, unsigned int);
+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 *);
-void rm_8254_sync_head_tail(device_t, struct ring *);
-void rm_8254_sync_tail(device_t, struct ring *);
+void rm_8254_sync_head_tail(device_t);
+void rm_8254_sync_tail(device_t);
void rm_8254_sync_head(device_t);
void rm_8254_delayed_interrupt_per_packet(device_t, int);
struct ring * rm_8254_find_next(struct adapter *);
-struct ring *rm_8254_alloc_ring(device_t);
extern devclass_t em_devclass;
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 *);
struct ringmap_functions ringmap_f = {
rm_8254_set_ringmap_to_adapter,
rm_8254_enable_intr,
rm_8254_disable_intr,
- rm_8254_init_slots,
rm_8254_interrupt,
rm_8254_delayed_interrupt,
rm_8254_delayed_interrupt_per_packet,
rm_8254_sync_head_tail,
rm_8254_sync_tail,
rm_8254_sync_head,
- rm_8254_alloc_ring,
+ rm_8254_set_slot,
rm_8254_get_ringmap_p,
rm_8254_get_device_p
};
@@ -68,20 +66,33 @@
* 2. SYNC_TAIL: RDT = ring->userrp
*/
void
-rm_8254_sync_head_tail(device_t dev, struct ring *ring)
+rm_8254_sync_head_tail(device_t dev)
{
- rm_8254_sync_tail(dev, ring);
+ RINGMAP_FUNC_DEBUG(start);
+ rm_8254_sync_tail(dev);
rm_8254_sync_head(dev);
+ RINGMAP_FUNC_DEBUG(end);
}
void
-rm_8254_sync_tail(device_t dev, struct ring *ring)
+rm_8254_sync_tail(device_t dev)
{
struct adapter *adapter;
adapter = (struct adapter *)device_get_softc(dev);
+ struct ring *ring = NULL;
+
+ RINGMAP_FUNC_DEBUG(start);
- RINGMAP_HW_SYNC_TAIL(adapter, ring); /* SW_TAIL ==> HW_TAIL */
+ ring = rm_8254_find_next(adapter);
+
+#ifdef __RINGMAP_DEB
+ printf("Next ring is 0x%X\n", (unsigned int)ring);
+#endif
+
+ RINGMAP_HW_SYNC_TAIL(adapter, ring);
+
+ RINGMAP_FUNC_DEBUG(end);
}
@@ -91,6 +102,8 @@
struct capt_instance *ci = NULL;
struct adapter *adapter;
+ RINGMAP_FUNC_DEBUG(start);
+
adapter = (struct adapter *)device_get_softc(dev);
RINGMAP_LOCK(adapter->rm);
@@ -98,16 +111,22 @@
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);
+#endif
}
}
RINGMAP_UNLOCK(adapter->rm);
+
+ RINGMAP_FUNC_DEBUG(end);
}
/*
* This should be called from ISR. Other interrupts are disallowed!
- * It means the functions must be as small as possible
+ * It means the functions must be as small as possible
*/
void
rm_8254_interrupt(void *arg)
@@ -136,7 +155,7 @@
#endif
if (ci->ring != NULL) {
/* TODO: find the next ring */
- rm_8254_sync_tail(adapter->dev, rm_8254_find_next(adapter));
+ rm_8254_sync_tail(adapter->dev);
#ifdef RINGMAP_TIMESTAMP
getmicrotime(&ci->ring->last_ts);
#endif
@@ -161,7 +180,7 @@
rdt = ci->ring->userrp;
dist = R_DISTANCE(rdh, rdt);
if (dist <= min_dist) {
- dist = min_dist;
+ min_dist = dist;
min_ci = ci;
}
}
@@ -193,7 +212,7 @@
#endif
#ifdef __RINGMAP_DEB
- PRINT_SLOT((ci->ring), (slot_num), adapter);
+ PRINT_SLOT((ci->ring), (slot_num));
#endif
}
}
@@ -203,92 +222,12 @@
}
-struct ring *
-rm_8254_alloc_ring(device_t dev)
+int
+rm_8254_set_slot(struct ring *ring, device_t dev, unsigned int slot_num)
{
- 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);
-}
-
-
-/*
- * Get adapter structure of device and initialize the
- * pointers in ring (mbufs, packets, decriptors) with values
- * got from adapters structure.
- * Returns 0 by success, -1 otherwise.
- */
-int
-rm_8254_init_slots(struct ring *ring, device_t dev)
-{
- unsigned int slot_num;
- struct adapter *adapter;
-
- RINGMAP_FUNC_DEBUG(start);
-
+ struct adapter *adapter = NULL;
adapter = (struct adapter *)device_get_softc(dev);
- /* Check some pointers in the adapter structure */
- if (adapter->rx_buffer_area == NULL){
- RINGMAP_ERROR(mbufs array is not allocated)
- return (-1);
- }
- if (adapter->rx_desc_base == NULL){
- RINGMAP_ERROR(descriptors array is not allocated)
- return (-1);
- }
- if (adapter->num_rx_desc != SLOTS_NUMBER){
- RINGMAP_ERROR(SLOTS_NUMBER should be equal to the num_rx_desc);
- return (-1);
- }
-
-// RINGMAP_HW_WRITE_TAIL(adapter,
-// (R_MODULO(RINGMAP_HW_READ_HEAD(adapter) - 1)));
-
- SW_TAIL(ring) = RINGMAP_HW_READ_TAIL(adapter);
-
- /* Set ring pointers */
- for (slot_num = 0 ; slot_num < SLOTS_NUMBER ; slot_num ++){
- if (rm_8254_set_slot(ring, adapter, slot_num) == -1){
- RINGMAP_ERROR(Ring initialization failed!);
- return (-1);
- }
-#if (__RINGMAP_DEB)
- ringmap_print_slot(ring, slot_num);
-#endif
- }
-
- RINGMAP_FUNC_DEBUG(end);
-
- return (0);
-}
-
-
-int
-rm_8254_set_slot(struct ring *ring, struct adapter *adapter,
- unsigned int slot_num)
-{
-
#if (__RINGMAP_DEB)
printf("[%s] Set slot: %d\n", __func__, slot_num);
#endif
@@ -331,8 +270,6 @@
}
-
-
/*
* Disable interrupts on adapter
*/
==== //depot/projects/soc2010/ringmap/current/sys/dev/e1000/ringmap_8254.h#20 (text+ko) ====
@@ -23,17 +23,17 @@
#define RINGMAP_HW_READ_HEAD(adapter) \
- RINGMAP_HW_READ_REG(&adapter->hw, E1000_RDH(0))
+ RINGMAP_HW_READ_REG(&(adapter)->hw, E1000_RDH(0))
#define RINGMAP_HW_SYNC_HEAD(adapter, ring) \
SW_HEAD(ring) = RINGMAP_HW_READ_HEAD(adapter);
#define RINGMAP_HW_SYNC_TAIL(adapter, ring) \
- RINGMAP_HW_WRITE_REG(&adapter->hw, E1000_RDT(0), ring->userrp)
+ RINGMAP_HW_WRITE_REG(&(adapter)->hw, E1000_RDT(0), (ring)->userrp)
#define RINGMAP_HW_WRITE_TAIL(adapter, val) \
- RINGMAP_HW_WRITE_REG(&adapter->hw, E1000_RDT(0), val)
+ RINGMAP_HW_WRITE_REG(&(adapter)->hw, E1000_RDT(0), (val))
#define RINGMAP_HW_READ_TAIL(adapter) \
- RINGMAP_HW_READ_REG(&adapter->hw, E1000_RDT(0))
+ RINGMAP_HW_READ_REG(&(adapter)->hw, E1000_RDT(0))
==== //depot/projects/soc2010/ringmap/current/sys/dev/e1000/ringmap_e1000.h#12 (text+ko) ====
==== //depot/projects/soc2010/ringmap/current/sys/net/ringmap.c#26 (text+ko) ====
@@ -36,7 +36,6 @@
int ringmap_attach (device_t, struct ringmap_functions *);
int ringmap_detach (device_t);
void ringmap_close_cb (void *data);
-void ringmap_print_slot(struct ring *, unsigned int);
void clear_capt_instance(void *);
void print_capt_inst(struct capt_instance *);
@@ -46,7 +45,8 @@
d_open_t ringmap_open;
d_close_t ringmap_close;
d_ioctl_t ringmap_ioctl;
-d_mmap_t ringmap_mmap;
+d_read_t ringmap_read;
+//d_mmap_t ringmap_mmap;
/*
* Character Device for access on if_em driver structures
@@ -56,7 +56,8 @@
.d_open = ringmap_open,
.d_close = ringmap_close,
.d_ioctl = ringmap_ioctl,
- .d_mmap = ringmap_mmap,
+ .d_read = ringmap_read,
+// .d_mmap = ringmap_mmap,
.d_name = "ringmap_cdev"
};
@@ -97,10 +98,6 @@
UID_ROOT, GID_WHEEL, 0666,
RINGMAP_DEVICE"%d", device_get_unit(dev));
- /* Device open counter. Should count how many times the char device was
- * opened */
- rm->open_cnt = 0;
-
/* Store adapters device structure */
rm->dev = dev;
@@ -110,7 +107,7 @@
/* Init the mutex to protecting our data */
RINGMAP_LOCK_INIT(rm, device_get_nameunit(dev));
- /* set the pointer to ringmap in the adapters structure */
+ /* set the pointer to ringmap into the adapters structure */
rm->funcs->set_ringmap_to_adapter(dev, rm);
RINGMAP_FUNC_DEBUG(end);
@@ -143,7 +140,6 @@
RINGMAP_LOCK_DESTROY(rm);
- // contigfree(rm->funcs, sizeof(struct ringmap_functions), M_DEVBUF);
contigfree(rm, sizeof(struct ringmap), M_DEVBUF);
RINGMAP_FUNC_DEBUG(end);
@@ -160,11 +156,17 @@
int
ringmap_open(struct cdev *cdev, int flag, int otyp, struct thread *td)
{
- int err = 0;
+ int err = 0, i = 0;
struct ringmap *rm = NULL;
+ struct ring *ring = NULL;
struct capt_instance *ci = NULL;
RINGMAP_FUNC_DEBUG(start);
+#ifdef __RINGMAP_DEB
+ printf("cdev = 0x%X, td = %d\n",
+ (unsigned int)cdev,
+ td->td_proc->p_pid);
+#endif
/* a little magic */
rm = get_ringmap_p(get_device_p(cdev));
@@ -174,51 +176,84 @@
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) {
+ RINGMAP_ERROR(Device is opened!);
+
+ err = EIO;
+ goto out;
+ }
+ }
+ }
+
/*
- * crete the capturing instance wich will presents
- * current thread and packets ring
+ * Allocate memory for ring structure Use contigmalloc(9) to get PAGE_SIZE
+ * alignment that is needed for memory mapping.
*/
- MALLOC(ci, struct capt_instance *,
- sizeof(struct capt_instance), M_DEVBUF, (M_ZERO | M_WAITOK));
- if ( ci == NULL ){
- return (EIO);
+ 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);
+
+ 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;
+ }
}
/*
- * I think it is safe to disable interupts while we allocate
- * allocate memory for oure structures
+ * create the capturing instance wich will represent
+ * current thread and packets ring
*/
- rm->funcs->disable_intr(rm->dev);
+ MALLOC( ci, struct capt_instance *,
+ sizeof(struct capt_instance), M_DEVBUF, (M_ZERO | M_WAITOK));
+ if ( ci == NULL ){
+ contigfree(ring, sizeof(struct ring), M_DEVBUF);
- RINGMAP_LOCK(rm);
+ err = EIO;
+ goto out;
+ }
- /* Allocate ring */
- ci->ring = rm->funcs->alloc_ring(rm->dev);
- if ( ci->ring == NULL ) {
- RINGMAP_ERROR(The ring is not allocated);
-
- err = EIO; goto out;
- }
+ ci->ring = ring;
ci->ring->size = SLOTS_NUMBER;
ci->td = td;
ci->rm = rm;
+ ci->ring->pid = ci->td->td_proc->p_pid;
+
SLIST_INSERT_HEAD(&rm->instance_list, ci, next_instance);
if ( devfs_set_cdevpriv((void *)ci, clear_capt_instance) ) {
- RINGMAP_ERROR(The pointer to the private data is not set!);
- err = EIO; goto out;
+ RINGMAP_ERROR(Can not store private data!);
+ FREE(ci, M_DEVBUF);
+ contigfree(ring, sizeof(struct ring), M_DEVBUF);
+
+ err = EIO;
+ goto out;
}
- rm->open_cnt++;
-
+ rm->funcs->sync_head_tail(rm->dev);
#ifdef __RINGMAP_DEB
print_capt_inst(ci);
-#endif
+ PRINT_RING_PTRS(ci->ring);
+#endif
+
+ rm->open_cnt++;
out:
RINGMAP_UNLOCK(rm);
-
rm->funcs->enable_intr(rm->dev);
RINGMAP_FUNC_DEBUG(end);
@@ -235,6 +270,12 @@
RINGMAP_FUNC_DEBUG(start);
+#ifdef __RINGMAP_DEB
+ printf("cdev = 0x%X, td = %d\n",
+ (unsigned int)cdev,
+ td->td_proc->p_pid);
+#endif
+
rm = get_ringmap_p(get_device_p(cdev));
RINGMAP_LOCK(rm);
@@ -243,15 +284,14 @@
#ifdef __RINGMAP_DEB
print_capt_inst(ci);
-#endif
-
+#endif
#ifdef __RINGMAP_DEB
SLIST_FOREACH(ki, &rm->instance_list, next_instance) {
printf("[%s] Aufter dealocation: ", __func__);
print_capt_inst(ki);
}
-#endif
+#endif
RINGMAP_UNLOCK(rm);
@@ -260,32 +300,18 @@
return (0);
}
-
-int
-ringmap_mmap(struct cdev *cdev, vm_ooffset_t offset, vm_paddr_t *paddr,
- int nprot, vm_memattr_t *memattr)
+int
+ringmap_read(struct cdev *cdev, struct uio *uio, int ioflag)
{
- int err = 0;
struct ringmap *rm = NULL;
struct capt_instance *ci = NULL;
- pid_t pid = 0;
+ vm_paddr_t phys_ring;
- pid = curthread->td_proc->p_pid;
+ RINGMAP_FUNC_DEBUG(end);
- RINGMAP_FUNC_DEBUG(start);
-
/* Get pointer to the ringmap structure */
rm = get_ringmap_p(get_device_p(cdev));
-
- /* Check protections */
- if (nprot & PROT_EXEC) {
- RINGMAP_WARN("PROT_EXEC ist set");
-
- err = ERESTART; goto out;
- }
- RINGMAP_LOCK(rm);
-
if (devfs_get_cdevpriv((void **)&ci)) {
SLIST_FOREACH(ci, &rm->instance_list, next_instance) {
if ( ci->td == curthread)
@@ -293,79 +319,151 @@
}
}
- *paddr = vtophys(ci->ring);
+ if (ci->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);
+#endif
-out:
- RINGMAP_UNLOCK(rm);
+ uiomove(&phys_ring, sizeof(phys_ring), uio);
RINGMAP_FUNC_DEBUG(end);
- return(err);
+ 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,
int fflag, struct thread *td)
{
int err = 0, err_sleep = err_sleep;
- struct ringmap *ringmap = NULL;
+ struct ringmap *rm = NULL;
struct capt_instance *ci;
RINGMAP_IOCTL(start);
+#ifdef __RINGMAP_DEB
+ printf("cdev = 0x%X, td = %d\n",
+ (unsigned int)cdev,
+ td->td_proc->p_pid);
+#endif
+
/* Eliminate it */
- ringmap = get_ringmap_p(get_device_p(cdev));
- if ( ringmap == NULL ){
+ rm = get_ringmap_p(get_device_p(cdev));
+ if ( rm == NULL ){
RINGMAP_ERROR(NULL pointer. ioctl can not be accomplished);
- /* TODO: look if ENODEV is a correctly for this case */
+ /* TODO: look whether ENODEV is a correctly for this case */
return(ENODEV);
}
+ RINGMAP_LOCK(rm);
if ( devfs_get_cdevpriv((void **)&ci) ) {
RINGMAP_IOCTL(Error! Can not get private date!)
return (ENODEV);
}
+ if (ci->td != curthread){
+
+ RINGMAP_IOCTL(Wrong private data!);
+ SLIST_FOREACH(ci, &rm->instance_list, next_instance) {
+ if ( ci->td == curthread)
+ break;
+ }
+ }
+ RINGMAP_UNLOCK(rm);
+
switch( cmd ){
/* Enable Interrupts */
case IOCTL_ENABLE_INTR:
- ringmap->funcs->enable_intr(ringmap->dev);
+ rm->funcs->enable_intr(rm->dev);
RINGMAP_IOCTL(interrupts schould be enabled);
break;
/* Disable Interrupts */
case IOCTL_DISABLE_INTR:
- ringmap->funcs->disable_intr(ringmap->dev);
+ rm->funcs->disable_intr(rm->dev);
RINGMAP_IOCTL(interrupts schould be disabled);
break;
/* Sleep and wait for new packets */
case IOCTL_SLEEP_WAIT:
- RINGMAP_IOCTL(Sleep and wait for new packets);
ci->ring->user_wait_kern++;
- ringmap->funcs->sync_head_tail(ringmap->dev, ci->ring);
+ rm->funcs->sync_head_tail(rm->dev);
+#ifdef __RINGMAP_DEB
+ print_capt_inst(ci);
+ PRINT_RING_PTRS(ci->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)) {
- err_sleep = tsleep(ringmap, (PRI_MIN) | PCATCH, "ioctl", 0);
+ RINGMAP_IOCTL(Sleep and wait for new packets);
+
+ err_sleep = tsleep(ci->ring, (PRI_MIN) | PCATCH, "ioctl", 0);
}
break;
case IOCTL_SYNC_HEAD_TAIL:
- ringmap->funcs->sync_head_tail(ringmap->dev, ci->ring);
+ rm->funcs->sync_head_tail(rm->dev);
break;
/* Synchronize sowftware ring-tail with hardware-ring-tail (RDT) */
case IOCTL_SYNC_TAIL:
- ringmap->funcs->sync_tail(ringmap->dev, ci->ring);
+ rm->funcs->sync_tail(rm->dev);
break;
default:
@@ -412,33 +510,6 @@
RINGMAP_FUNC_DEBUG(end);
}
-void
-ringmap_print_slot(struct ring *ring, unsigned int slot_number)
-{
- printf("\n[%s] Slot Number: %d\n", __func__, slot_number);
- printf("---------------- \n");
-
- printf("physical addr of descriptor[%d] = 0x%X\n", slot_number,
- (unsigned int) ring->slot[slot_number].descriptor.phys);
-
- printf("kernel addr of descriptor[%d] = 0x%X\n", slot_number,
- (unsigned int) ring->slot[slot_number].descriptor.kern);
-
- printf("physical addr of mbuf[%d] = 0x%X\n", slot_number,
- (unsigned int) ring->slot[slot_number].mbuf.phys);
-
- printf("kernel addr of mbuf[%d] = 0x%X\n", slot_number,
- (unsigned int) ring->slot[slot_number].mbuf.kern);
-
- printf("physical addr of packet_buffer[%d] = 0x%X\n", slot_number,
- (unsigned int) ring->slot[slot_number].packet.phys);
-
- printf("kernel addr of packet_buffer[%d] = 0x%X\n", slot_number,
- (unsigned int) ring->slot[slot_number].packet.kern);
-
- printf("---------------- \n");
-}
-
void
print_capt_inst(struct capt_instance *ci)
==== //depot/projects/soc2010/ringmap/current/sys/net/ringmap.h#26 (text+ko) ====
@@ -4,7 +4,7 @@
#define SLOTS_NUMBER 16
/*
- * Prefix for name of device (for example /dev/ringmap_cdev0 will full name)
+ * Prefix for name of device (for example /dev/ringmap0 will full name)
*/
#define RINGMAP_DEVICE "ringmap"
@@ -139,6 +139,8 @@
struct timeval last_ts;
+ unsigned int pid;
+
/* Array of slots */
struct ring_slot slot[SLOTS_NUMBER];
};
@@ -201,12 +203,6 @@
void (*disable_intr)(device_t);
/*
- * Initialize the ring slots with pointers to the
- * mbufs, packets buffers and descriptors.
- */
- int (*init_slots)(struct ring *, device_t);
-
- /*
* This function should be calld from ISR. It should contain
* the very fast executable operations (don't sleep!).
*/
@@ -221,7 +217,7 @@
/*
* The native driver should have cycle for checking
- * the the packets that was transfered in the RAM from
+ * the packets that was transfered in the RAM from
* network adapter. The function delayed_isr_per_packet()
* should be called from this cycle, so it will be called
* per packet.
@@ -245,16 +241,16 @@
* 2. SYNC_TAIL: SOFTWARE_TAIL => HARDWARE_TAIL
* set value from software TAIL-variable: ring->userrp into the
* hardware TAIL-register. Hardware shouldn't change the content of
- * TAIL-register. Software after reading one packet in RAM increment
+ * TAIL-register. Software after reading one packet in RAM increments
* the value of ring->userrp. Kernel will check this value and set it
* into the hardware TAIL-register.
*/
- void (*sync_head_tail)(device_t, struct ring *);
- void (*sync_tail)(device_t, struct ring *);
+ void (*sync_head_tail)(device_t);
+ void (*sync_tail)(device_t);
void (*sync_head)(device_t);
- /* Alloc memory for our ring and initialize the slots */
- struct ring *(*alloc_ring)(device_t);
+ /* Initialize the ring slot */
+ int (*set_slot)(struct ring *, device_t, unsigned int);
struct ringmap *(*dev_to_ringmap)(device_t);
device_t (*cdev_to_dev)(struct cdev *);
@@ -286,6 +282,7 @@
*/
#define IOCTL_SYNC_TAIL _IO(RINGMAP_IOC_MAGIC, 1)
+/* Synchronize both head and tail */
#define IOCTL_SYNC_HEAD_TAIL _IO(RINGMAP_IOC_MAGIC, 2)
/*
@@ -418,50 +415,52 @@
if (__RINGMAP_DEB) printf(WARN_PREFIX"[%s]: " #x "\n", __func__);
-#ifdef _KERNEL
-#define RINGMAP_PRINT_DESC(adapter, i) \
- printf("[%s] - DESC INFO: desc_num=%d, status=0x%X, pktlen=%d\n[%s] - ADDRESSES: pkt_virt=0x%X (kern), pkt_phys=0x%X\n", \
- __func__, \
- i, \
- (unsigned int)(adapter->rx_desc_base[i].status) & 255, \
- adapter->rx_desc_base[i].length, \
- __func__, \
- (unsigned int)adapter->rx_buffer_area[i].m_head->m_data,\
- (unsigned int)adapter->rx_desc_base[i].buffer_addr);
+#define PRINT_PKT_BYTES(pktp, i) \
+ printf("=+= [%s] SOME BYTES FROM PKT: %hhX %hhX %hhX %hhX %hhX\n", \
+ __func__, pktp[0], pktp[1], pktp[16], pktp[32], pktp[59]);
+
+#define PRINT_PACKET_ADDR(ring, i) \
+printf("=+= packet.user=0x%X, packet.phys=0x%X, packet.kern=0x%X\n", \
+ (unsigned int)ring->slot[i].packet.user, \
+ ring->slot[i].packet.phys, \
+ ring->slot[i].packet.kern);
+
+#define PRINT_MBUF_ADDR(ring, i) \
+printf("=+= mbuf.user=0x%X, mbuf.phys=0x%X, mbuf.kern=0x%X\n", \
+ (unsigned int)ring->slot[i].mbuf.user, \
+ ring->slot[i].mbuf.phys, \
+ ring->slot[i].mbuf.kern);
-#define PRINT_SOME_BYTES_FROM_PKT(adapter, i) \
- printf("=+= [%s] SOME BYTES FROM PKT: %hhX %hhX %hhX %hhX %hhX\n", \
- __func__, \
- adapter->rx_buffer_area[i].m_head->m_data[0], \
- adapter->rx_buffer_area[i].m_head->m_data[1], \
- adapter->rx_buffer_area[i].m_head->m_data[16], \
- adapter->rx_buffer_area[i].m_head->m_data[32], \
- adapter->rx_buffer_area[i].m_head->m_data[59]);
-#else
-#define PRINT_SOME_BYTES_FROM_PKT(pktp, i) \
- printf("=+= [%s] SOME BYTES FROM PKT: %hhX %hhX %hhX %hhX %hhX\n", \
- __func__, \
- pktp[0], \
- pktp[1], \
- pktp[16], \
- pktp[32], \
- pktp[59]);
-#endif
+#define PRINT_DECRIPTOR_ADDR(ring, i) \
+printf("=+= descr.user=0x%X, descr.phys=0x%X, descr.kern=0x%X\n", \
+ (unsigned int)ring->slot[i].descriptor.user, \
+ ring->slot[i].descriptor.phys, \
+ ring->slot[i].descriptor.kern);
>>> TRUNCATED FOR MAIL (1000 lines) <<<
More information about the p4-projects
mailing list