Hi all:
        My questions are as follows.

///////////////////< code from linux-2.6.35.4
/*
 *      Free an skbuff by memory without cleaning the state.
 */
static void kfree_skbmem(struct sk_buff *skb)
{
        struct sk_buff *other;
        atomic_t *fclone_ref;

        switch (skb->fclone) {
        case SKB_FCLONE_UNAVAILABLE:
                kmem_cache_free(skbuff_head_cache, skb);
                break;

        case SKB_FCLONE_ORIG:
                fclone_ref = (atomic_t *) (skb + 2);      
///////////////////////////< question here
                if (atomic_dec_and_test(fclone_ref))
                        kmem_cache_free(skbuff_fclone_cache, skb);
                break;

        case SKB_FCLONE_CLONE:
                fclone_ref = (atomic_t *) (skb + 1);    
/////////////////////////////< question here
                other = skb - 1;

                /* The clone portion is available for
                 * fast-cloning again.
                 */
                skb->fclone = SKB_FCLONE_UNAVAILABLE;

                if (atomic_dec_and_test(fclone_ref))
                        kmem_cache_free(skbuff_fclone_cache, other);
                break;
        }
}

        skb->|--------------------|
             |struct sk_buff *next| 
             |--------------------|
             |struct sk_buff *prev| 
             |--------------------|
             |      ......        | 
             |--------------------|
             |  automic_t users   | 
  skb+1->|--------------------| fclone_ref = (atomic_t *) (skb + 1);
             |struct sk_buff *next| 
             |--------------------|
             |struct sk_buff *prve| 
             |--------------------|
             |      ......        | 
             |--------------------|
             |  automic_t users   | 
  skb+2->|--------------------| fclone_ref = (atomic_t *) (skb + 2);    
             |struct sk_buff *next| 
             |--------------------|
             |struct sk_buff *prve| 
             |--------------------|
             |      ......        | 
             |--------------------|
             |  automic_t users   | 
             |--------------------|

typedef struct {
        int counter;
} atomic_t;

so when skb+1, it poins to  the member next. if we use  "(atomic_t *) (skb + 
1);", what the hell result is? and how can we visit the member "counter" of 
atomic_t?
                        
Thanks
 
Huangqiang Zhou
------------------      
2010-09-19


--
To unsubscribe from this list: send an email with
"unsubscribe kernelnewbies" to [email protected]
Please read the FAQ at http://kernelnewbies.org/FAQ

Reply via email to