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
{
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);
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;
}
{
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);
return 0;
}
} while ((nflags = synch_cmpxchg(&gnttab_table[ref].flags, flags, 0)) !=
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) {
printk("Release unused transfer grant.\n");
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);
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;
printk("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;
struct net_buffer* buf;
void* page;
+ BUG_ON(len > PAGE_SIZE);
+
down(&dev->tx_sem);
local_irq_save(flags);