Re: Query on skb buffer

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, 06 Mar 2013 10:39:13 -0800, Kumar amit mehta said:

> Now, if alloc_skb(4096, GFP_KERNEL) is the routine that gets called to allocate
> the kernel buffer then, how does the kernel manages such prospective memory
> allocation failures and how kernel manages large packet requests from the
> application.

Did you actually look at the source for use of alloc_skb() and how it
handles error returns?

(Hint - the kernel doesn't do the same thing at every use of alloc_skb(),
because an allocation failure needs to be handled differently depending on
where it happens.  At some places, just bailing out and dropping the packet
on the floor without any notification to anybody is appropriate.  At other
places, we need to propagate an error condition to the caller).

Typical pattern (from net/core/sock.c:)

/*
 * Allocate a skb from the socket's send buffer.
 */
struct sk_buff *sock_wmalloc(struct sock *sk, unsigned long size, int force,
                             gfp_t priority)
{
        if (force || atomic_read(&sk->sk_wmem_alloc) < sk->sk_sndbuf) {
                struct sk_buff *skb = alloc_skb(size, priority);
                if (skb) {
                        skb_set_owner_w(skb, sk);
                        return skb;
                }
        }
        return NULL;
}
EXPORT_SYMBOL(sock_wmalloc);

and then the caller does something like this (net/ipv4/ip_output.c,
in function __ip_append_data():

                         } else {
                                skb = NULL;
                                if (atomic_read(&sk->sk_wmem_alloc) <=
                                    2 * sk->sk_sndbuf)
                                        skb = sock_wmalloc(sk,
                                                           alloclen + hh_len + 15, 1,
                                                           sk->sk_allocation);
                                if (unlikely(skb == NULL))
                                        err = -ENOBUFS;
                                else
                                        /* only the initial fragment is
                                           time stamped */
                                        cork->tx_flags = 0;
                        }
                        if (skb == NULL)
                                goto error;


Attachment: pgpG2EsIF5vb5.pgp
Description: PGP signature

_______________________________________________
Kernelnewbies mailing list
Kernelnewbies@xxxxxxxxxxxxxxxxx
http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies

[Index of Archives]     [Newbies FAQ]     [Linux Kernel Mentors]     [Linux Kernel Development]     [IETF Annouce]     [Git]     [Networking]     [Security]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux SCSI]     [Linux ACPI]
  Powered by Linux