Exemplo n.º 1
0
static inline struct sk_buff *
osl_pktfastget(osl_t *osh, uint len)
{
	struct sk_buff *skb;
#ifdef CTFPOOL_SPINLOCK
	unsigned long flags;
#endif /* CTFPOOL_SPINLOCK */

	/* Try to do fast allocate. Return null if ctfpool is not in use
	 * or if there are no items in the ctfpool.
	 */
	if (osh->ctfpool == NULL)
		return NULL;

	CTFPOOL_LOCK(osh->ctfpool, flags);
	if (osh->ctfpool->head == NULL) {
		ASSERT(osh->ctfpool->curr_obj == 0);
		osh->ctfpool->slow_allocs++;
		CTFPOOL_UNLOCK(osh->ctfpool, flags);
		return NULL;
	}

	if (len > osh->ctfpool->obj_size) {
		CTFPOOL_UNLOCK(osh->ctfpool, flags);
		return NULL;
	}

	ASSERT(len <= osh->ctfpool->obj_size);

	/* Get an object from ctfpool */
	skb = (struct sk_buff *)osh->ctfpool->head;
	osh->ctfpool->head = (void *)skb->next;

	osh->ctfpool->fast_allocs++;
	osh->ctfpool->curr_obj--;
	ASSERT(CTFPOOLHEAD(osh, skb) == (struct sock *)osh->ctfpool->head);
	CTFPOOL_UNLOCK(osh->ctfpool, flags);

	/* Init skb struct */
	skb->next = skb->prev = NULL;
#if defined(__ARM_ARCH_7A__)
	skb->data = skb->head + NET_SKB_PAD;
	skb->tail = skb->head + NET_SKB_PAD;
#else
	skb->data = skb->head + 16;
	skb->tail = skb->head + 16;
#endif /* __ARM_ARCH_7A__ */
	skb->len = 0;
	skb->cloned = 0;
#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 14)
	skb->list = NULL;
#endif
	atomic_set(&skb->users, 1);

	PKTSETCLINK(skb, NULL);
	PKTCCLRATTR(skb);
	PKTFAST(osh, skb) &= ~(CTFBUF | SKIPCT | CHAINED);

	return skb;
}
void *
osl_ctfpool_add(osl_t *osh)
{
    struct sk_buff *skb;
#ifdef CTFPOOL_SPINLOCK
    unsigned long flags;
#endif

    if ((osh == NULL) || (osh->ctfpool == NULL))
        return NULL;

    CTFPOOL_LOCK(osh->ctfpool, flags);
    ASSERT(osh->ctfpool->curr_obj <= osh->ctfpool->max_obj);


    if (osh->ctfpool->curr_obj == osh->ctfpool->max_obj) {
        CTFPOOL_UNLOCK(osh->ctfpool, flags);
        return NULL;
    }


    skb = osl_alloc_skb(osh->ctfpool->obj_size);
    if (skb == NULL) {
        printf("%s:
        skb alloc of len %d failed\n", __FUNCTION__,
        osh->ctfpool->obj_size);
        CTFPOOL_UNLOCK(osh->ctfpool, flags);
        return NULL;
    }


    skb->next = (struct sk_buff *)osh->ctfpool->head;
    osh->ctfpool->head = skb;
    osh->ctfpool->fast_frees++;
    osh->ctfpool->curr_obj++;


    CTFPOOLPTR(osh, skb) = (void *)osh->ctfpool;


    PKTFAST(osh, skb) = FASTBUF;

    CTFPOOL_UNLOCK(osh->ctfpool, flags);

    return skb;
}
Exemplo n.º 3
0
/*
 * Allocate and add an object to packet pool.
 */
void *
osl_ctfpool_add(osl_t *osh)
{
	struct sk_buff *skb;
#ifdef CTFPOOL_SPINLOCK
	unsigned long flags;
#endif /* CTFPOOL_SPINLOCK */

	if ((osh == NULL) || (osh->ctfpool == NULL))
		return NULL;

	CTFPOOL_LOCK(osh->ctfpool, flags);
	ASSERT(osh->ctfpool->curr_obj <= osh->ctfpool->max_obj);

	/* No need to allocate more objects */
	if (osh->ctfpool->curr_obj == osh->ctfpool->max_obj) {
		CTFPOOL_UNLOCK(osh->ctfpool, flags);
		return NULL;
	}

	/* Allocate a new skb and add it to the ctfpool */
	skb = osl_alloc_skb(osh, osh->ctfpool->obj_size);
	if (skb == NULL) {
		printf("%s: skb alloc of len %d failed\n", __FUNCTION__,
		       osh->ctfpool->obj_size);
		CTFPOOL_UNLOCK(osh->ctfpool, flags);
		return NULL;
	}

	/* Add to ctfpool */
	skb->next = (struct sk_buff *)osh->ctfpool->head;
	osh->ctfpool->head = skb;
	osh->ctfpool->fast_frees++;
	osh->ctfpool->curr_obj++;

	/* Hijack a skb member to store ptr to ctfpool */
	CTFPOOLPTR(osh, skb) = (void *)osh->ctfpool;

	/* Use bit flag to indicate skb from fast ctfpool */
	PKTFAST(osh, skb) = FASTBUF;

	CTFPOOL_UNLOCK(osh->ctfpool, flags);

	return skb;
}
Exemplo n.º 4
0
void *
osl_ctfpool_add(osl_t *osh)
{
    struct sk_buff *skb;

    if ((osh == NULL) || (osh->ctfpool == NULL))
        return NULL;

    spin_lock_bh(&osh->ctfpool->lock);
    ASSERT(osh->ctfpool->curr_obj <= osh->ctfpool->max_obj);


    if (osh->ctfpool->curr_obj == osh->ctfpool->max_obj) {
        spin_unlock_bh(&osh->ctfpool->lock);
        return NULL;
    }


    skb = osl_alloc_skb(osh->ctfpool->obj_size);
    if (skb == NULL) {
        printf("%s:
        skb alloc of len %d failed\n", __FUNCTION__,
        osh->ctfpool->obj_size);
        spin_unlock_bh(&osh->ctfpool->lock);
        return NULL;
    }


    skb->next = (struct sk_buff *)osh->ctfpool->head;
    osh->ctfpool->head = skb;
    osh->ctfpool->fast_frees++;
    osh->ctfpool->curr_obj++;


    CTFPOOLPTR(osh, skb) = (void *)osh->ctfpool;


    PKTFAST(osh, skb) = FASTBUF;

    spin_unlock_bh(&osh->ctfpool->lock);

    return skb;
}
Exemplo n.º 5
0
/*
 * Allocate and add an object to packet pool.
 */
void *
osl_ctfpool_add(osl_t *osh)
{
	struct sk_buff *skb;

	if ((osh == NULL) || (osh->ctfpool == NULL))
		return NULL;

	spin_lock_bh(&osh->ctfpool->lock);
	ASSERT(osh->ctfpool->curr_obj <= osh->ctfpool->max_obj);

	/* No need to allocate more objects */
	if (osh->ctfpool->curr_obj == osh->ctfpool->max_obj) {
		spin_unlock_bh(&osh->ctfpool->lock);
		return NULL;
	}

	/* Allocate a new skb and add it to the ctfpool */
	skb = dev_alloc_skb(osh->ctfpool->obj_size);
	if (skb == NULL) {
		printf("%s: skb alloc of len %d failed\n", __FUNCTION__,
		       osh->ctfpool->obj_size);
		spin_unlock_bh(&osh->ctfpool->lock);
		return NULL;
	}

	/* Add to ctfpool */
	skb->next = (struct sk_buff *)osh->ctfpool->head;
	osh->ctfpool->head = skb;
	osh->ctfpool->fast_frees++;
	osh->ctfpool->curr_obj++;

	/* Hijack a skb member to store ptr to ctfpool */
	CTFPOOLPTR(osh, skb) = (void *)osh->ctfpool;

	/* Use bit flag to indicate skb from fast ctfpool */
	PKTFAST(osh, skb) = FASTBUF;

	spin_unlock_bh(&osh->ctfpool->lock);

	return skb;
}