void shared_enq( IN struct npq *q, IN ND_PKT *p, bool lifo ) { NdisAcquireSpinLock(&q->queue_lock); NEXTP(p) = NULL; if (q->tail == NULL) { ASSERT(q->head == NULL); q->head = q->tail = p; } else { ASSERT(q->head); ASSERT(NEXTP(q->tail) == NULL); if (lifo) { NEXTP(p) = q->head; q->head = p; } else { NEXTP(q->tail) = p; q->tail = p; } } NdisReleaseSpinLock(&q->queue_lock); }
/* * delete_freenode - delete the block from free list when it is allocated */ static void delete_freenode(void *bp) { void *next_free_block_addr = (void *)*NEXTP(bp); void *prev_free_block_addr = (void *)*PREVP(bp); PUT_ADDR(NEXTP(prev_free_block_addr), next_free_block_addr); if (next_free_block_addr != NULL) { PUT_ADDR(PREVP(next_free_block_addr), prev_free_block_addr); } }
/* * insert_freenode - insert the freed block to the free list */ static void insert_freenode(void *bp) { size_t size = GET_SIZE(HDRP(bp)); void *root = getroot(getclass(size)); void *next_free_block_addr = (void *)*NEXTP(root); PUT_ADDR(NEXTP(bp), *NEXTP(root)); PUT_ADDR(PREVP(bp), root); PUT_ADDR(NEXTP(root), bp); if (next_free_block_addr != NULL) { PUT_ADDR(PREVP(next_free_block_addr), bp); } }
/* * insert_freenode - insert the freed block to the free list */ inline void insert_freenode(void *bp) { size_t size = GET_SIZE(HDRP(bp)); void *root = getroot(getclass(size)); void *nextp = next_free_blck(root); void *prevp = root; for (; nextp!=NULL && GET_SIZE(HDRP(nextp)) < size; prevp = nextp, nextp = (char *)next_free_blck(nextp)) { } PUT_ADDR(NEXTP(bp), nextp); PUT_ADDR(PREVP(bp), prevp); PUT_ADDR(NEXTP(prevp), bp); if (nextp != NULL) { PUT_ADDR(PREVP(nextp), bp); } }
/* bust apart and free an rx ndis packet and buffer descriptor and lbuf */ void shared_free_ndispacket( IN shared_info_t *shared, IN ND_PKT *p ) { struct lbuf *lb; /* pick the associated lbuf off the ndis packet */ lb = (struct lbuf*) NEXTP(p); ASSERT(lb); ASSERT(lb->p == p); NEXTP(p) = NULL; lb->p = NULL; /* free the ndis packet and buffer descriptors */ shared_free_pkt(p); /* put our lbuf back on the freelist */ shared_lb_put(shared, lb->l, lb); }
ND_PKT * shared_deq( IN struct npq *q ) { ND_PKT *p; NdisAcquireSpinLock(&q->queue_lock); if (p = q->head) { ASSERT(q->tail); q->head = NEXTP(p); NEXTP(p) = NULL; if (q->head == NULL) q->tail = NULL; } else { ASSERT(q->tail == NULL); } NdisReleaseSpinLock(&q->queue_lock); return (p); }