* [PATCH v2] packet: uses kfree_skb() for drops or errors.
@ 2016-04-06 21:14 Weongyo Jeong
2016-04-07 16:06 ` Willem de Bruijn
0 siblings, 1 reply; 3+ messages in thread
From: Weongyo Jeong @ 2016-04-06 21:14 UTC (permalink / raw)
To: netdev; +Cc: Weongyo Jeong, David S. Miller, Willem de Bruijn
consume_skb() isn't for drop or error cases that kfree_skb() is more proper
one. At this patch, it fixed tpacket_rcv() and packet_rcv() to be
consistent for error or non-error cases letting perf trace its event
properly.
Signed-off-by: Weongyo Jeong <weongyo.linux@gmail.com>
---
net/packet/af_packet.c | 16 ++++++++++++----
1 file changed, 12 insertions(+), 4 deletions(-)
diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c
index 1ecfa71..cd100cf 100644
--- a/net/packet/af_packet.c
+++ b/net/packet/af_packet.c
@@ -2040,7 +2040,7 @@ static int packet_rcv(struct sk_buff *skb, struct net_device *dev,
struct sockaddr_ll *sll;
struct packet_sock *po;
u8 *skb_head = skb->data;
- int skb_len = skb->len;
+ int err = 0, skb_len = skb->len;
unsigned int snaplen, res;
if (skb->pkt_type == PACKET_LOOPBACK)
@@ -2130,6 +2130,7 @@ static int packet_rcv(struct sk_buff *skb, struct net_device *dev,
return 0;
drop_n_acct:
+ err = -1;
spin_lock(&sk->sk_receive_queue.lock);
po->stats.stats1.tp_drops++;
atomic_inc(&sk->sk_drops);
@@ -2141,7 +2142,10 @@ drop_n_restore:
skb->len = skb_len;
}
drop:
- consume_skb(skb);
+ if (!err)
+ consume_skb(skb);
+ else
+ kfree_skb(skb);
return 0;
}
@@ -2153,7 +2157,7 @@ static int tpacket_rcv(struct sk_buff *skb, struct net_device *dev,
struct sockaddr_ll *sll;
union tpacket_uhdr h;
u8 *skb_head = skb->data;
- int skb_len = skb->len;
+ int err = 0, skb_len = skb->len;
unsigned int snaplen, res;
unsigned long status = TP_STATUS_USER;
unsigned short macoff, netoff, hdrlen;
@@ -2367,10 +2371,14 @@ drop_n_restore:
skb->len = skb_len;
}
drop:
- kfree_skb(skb);
+ if (!err)
+ consume_skb(skb);
+ else
+ kfree_skb(skb);
return 0;
drop_n_account:
+ err = -1;
po->stats.stats1.tp_drops++;
spin_unlock(&sk->sk_receive_queue.lock);
--
2.1.3
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH v2] packet: uses kfree_skb() for drops or errors.
2016-04-06 21:14 [PATCH v2] packet: uses kfree_skb() for drops or errors Weongyo Jeong
@ 2016-04-07 16:06 ` Willem de Bruijn
2016-04-08 16:27 ` Weongyo Jeong
0 siblings, 1 reply; 3+ messages in thread
From: Willem de Bruijn @ 2016-04-07 16:06 UTC (permalink / raw)
To: Weongyo Jeong; +Cc: Network Development, David S. Miller, Willem de Bruijn
On Wed, Apr 6, 2016 at 5:14 PM, Weongyo Jeong <weongyo.linux@gmail.com> wrote:
> consume_skb() isn't for drop or error cases
for drop or error -> for error
> that kfree_skb() is more proper
> one. At this patch, it fixed tpacket_rcv() and packet_rcv() to be
> consistent for error or non-error cases letting perf trace its event
> properly.
>
> Signed-off-by: Weongyo Jeong <weongyo.linux@gmail.com>
Don't forget to add the target to your subject line: PATCH net-next v3.
> ---
> net/packet/af_packet.c | 16 ++++++++++++----
> 1 file changed, 12 insertions(+), 4 deletions(-)
>
> diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c
> index 1ecfa71..cd100cf 100644
> --- a/net/packet/af_packet.c
> +++ b/net/packet/af_packet.c
> @@ -2040,7 +2040,7 @@ static int packet_rcv(struct sk_buff *skb, struct net_device *dev,
> struct sockaddr_ll *sll;
> struct packet_sock *po;
> u8 *skb_head = skb->data;
> - int skb_len = skb->len;
> + int err = 0, skb_len = skb->len;
bool
Otherwise looks good.
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH v2] packet: uses kfree_skb() for drops or errors.
2016-04-07 16:06 ` Willem de Bruijn
@ 2016-04-08 16:27 ` Weongyo Jeong
0 siblings, 0 replies; 3+ messages in thread
From: Weongyo Jeong @ 2016-04-08 16:27 UTC (permalink / raw)
To: Willem de Bruijn; +Cc: Network Development, David S. Miller, Willem de Bruijn
On Thu, Apr 07, 2016 at 12:06:12PM -0400, Willem de Bruijn wrote:
> On Wed, Apr 6, 2016 at 5:14 PM, Weongyo Jeong <weongyo.linux@gmail.com> wrote:
> > consume_skb() isn't for drop or error cases
>
> for drop or error -> for error
>
> > that kfree_skb() is more proper
> > one. At this patch, it fixed tpacket_rcv() and packet_rcv() to be
> > consistent for error or non-error cases letting perf trace its event
> > properly.
> >
> > Signed-off-by: Weongyo Jeong <weongyo.linux@gmail.com>
>
> Don't forget to add the target to your subject line: PATCH net-next v3.
>
> > ---
> > net/packet/af_packet.c | 16 ++++++++++++----
> > 1 file changed, 12 insertions(+), 4 deletions(-)
> >
> > diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c
> > index 1ecfa71..cd100cf 100644
> > --- a/net/packet/af_packet.c
> > +++ b/net/packet/af_packet.c
> > @@ -2040,7 +2040,7 @@ static int packet_rcv(struct sk_buff *skb, struct net_device *dev,
> > struct sockaddr_ll *sll;
> > struct packet_sock *po;
> > u8 *skb_head = skb->data;
> > - int skb_len = skb->len;
> > + int err = 0, skb_len = skb->len;
>
> bool
>
> Otherwise looks good.
Thank you for review Willem. I just had submitted v3 version.
Regards,
Weongyo Jeong
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2016-04-08 16:27 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-04-06 21:14 [PATCH v2] packet: uses kfree_skb() for drops or errors Weongyo Jeong
2016-04-07 16:06 ` Willem de Bruijn
2016-04-08 16:27 ` Weongyo Jeong
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.