Example #1
0
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);
}
Example #2
0
/*
 * 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);
    }
    
}
Example #3
0
/*
 * 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);
    }
}
Example #4
0
/*
 * 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);
    }
}
Example #5
0
/* 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);
}
Example #6
0
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);
}