minios: more assertions
PATCH 1/1 minios: more assertions
minios: more assertions
- assert that we never allocate or free the same grant twice
- assert that network packets do not exceed a page
- assert that incoming network event IDs make sense
Signed-off-by Samuel Thibault <[email protected]>
extras/mini-os/gnttab.c +19 -1
@@ -32,6 +32,9 @@static grant_entry_t *gnttab_table;static grant_ref_t gnttab_list[NR_GRANT_ENTRIES ]; +#ifdef GNT_DEBUG +static char inuse[NR_GRANT_ENTRIES ]; +#endif static __DECLARE_SEMAPHORE_GENERIC(gnttab_sem, NR_GRANT_ENTRIES); static void
@@ -39,6 +42,10 @@ put_free_entry(grant_ref_t ref) {unsigned long flags;local_irq_save (flags); +#ifdef GNT_DEBUG +BUG_ON (!inuse[ref]); + inuse[ref] =0 ; +#endif gnttab_list[ref] = gnttab_list[0 ]; gnttab_list[0 ] = ref;local_irq_restore (flags);
@@ -54,6 +61,10 @@ get_free_entry(void)local_irq_save (flags); ref = gnttab_list[0 ]; gnttab_list[0 ] = gnttab_list[ref]; +#ifdef GNT_DEBUG +BUG_ON (inuse[ref]); + inuse[ref] =1 ; +#endif local_irq_restore (flags);return ref; }
@@ -92,10 +103,12 @@ gnttab_end_access(grant_ref_t ref) {u16 flags, nflags; +BUG_ON (ref >=NR_GRANT_ENTRIES || ref <NR_RESERVED_ENTRIES ); + nflags = gnttab_table[ref].flags; do { if ((flags = nflags) & (GTF_reading|GTF_writing)) { - printk("WARNING: g.e. still in use!\n"); + printk("WARNING: g.e. still in use! (%x)\n", flags); stack_walk(); return 0; }
@@ -111,6 +124,8 @@ gnttab_end_transfer(grant_ref_t ref) {unsigned long frame;u16 flags; + +BUG_ON (ref >=NR_GRANT_ENTRIES || ref <NR_RESERVED_ENTRIES );while (!((flags = gnttab_table[ref].flags) & GTF_transfer_committed)) {if (synch_cmpxchg (&gnttab_table[ref].flags, flags,0 ) == flags) {
@@ -165,6 +180,9 @@ init_gnttab(void)unsigned long frames[NR_GRANT_FRAMES ];int i; +#ifdef GNT_DEBUG +memset (inuse,1 ,sizeof (inuse)); +#endif for (i =NR_RESERVED_ENTRIES ; i <NR_GRANT_ENTRIES ; i++)put_free_entry (i);
extras/mini-os/minios.mk +4 -0
@@ -16,6 +16,10 @@ DEF_LDFLAGS = ifeq ($(debug),y) DEF_CFLAGS += -g +#DEF_CFLAGS += MM_DEBUG +#DEF_CFLAGS += FS_DEBUG +#DEF_CFLAGS += LIBC_DEBUG +#DEF_CFLAGS += GNT_DEBUG else DEF_CFLAGS += -O3 endif
extras/mini-os/netfront.c +4 -0
@@ -120,6 +120,7 @@ moretodo:if (rx->status ==NETIF_RSP_NULL )continue ;int id = rx->id; +BUG_ON (id >=NET_TX_RING_SIZE ); buf = &dev->rx_buffers[id]; page = (unsigned char *)buf->page;
@@ -204,6 +205,7 @@ void network_tx_buf_gc(struct netfront_dprintk ("packet error\n" ); id = txrsp->id; +BUG_ON (id >=NET_TX_RING_SIZE );struct net_buffer * buf = &dev->tx_buffers[id];gnttab_end_access (buf->gref); buf->gref=GRANT_INVALID_REF ;
@@ -510,6 +512,8 @@ void netfront_xmit(struct netfront_dev *struct net_buffer * buf;void * page; +BUG_ON (len >PAGE_SIZE ); +down (&dev->tx_sem);local_irq_save (flags);