From patchwork Thu Jun 1 16:42:18 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Soheil Hassas Yeganeh X-Patchwork-Id: 769819 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3wdtSX1wX0z9ryv for ; Fri, 2 Jun 2017 02:43:08 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=google.com header.i=@google.com header.b="YbXy5Ul4"; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752067AbdFAQnH (ORCPT ); Thu, 1 Jun 2017 12:43:07 -0400 Received: from mail-it0-f46.google.com ([209.85.214.46]:36974 "EHLO mail-it0-f46.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751161AbdFAQnF (ORCPT ); Thu, 1 Jun 2017 12:43:05 -0400 Received: by mail-it0-f46.google.com with SMTP id m47so24092034iti.0 for ; Thu, 01 Jun 2017 09:43:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc; bh=Go5rsSoxgeoMGp10sw9EmtqKUG8S7KCsiOFUhoP8YXM=; b=YbXy5Ul4HkmuSwh5Bp4T8OCAr82cYj8AymkhIUjPvVvTd0LIQBbxBetHN3QKz1WxFG Ix42xA1pdvTDiu+yZxg9QYNbdhUgayxbPeJFelVUitmyvNckNP3BVRXa8BRCdgkeojdU l2wft1GYxQZLTr90aGOrKsRXDE78jACcjP0ZmhQtLn0GZtO4nHsfTXeHFcta1zFBYFrm 77mbo6BBVy2wi1VvxgKTSohlThC8sDG94a13HMrWNZEuQPNk+Xy330dkCLODgfd9u6Fl DjsBJF2/BPYy2YGSTKaAXBtOEovU8FtqIOvGmC9bGvh1ju8pKZvs9m9scclqwK2ioF+d QweA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=Go5rsSoxgeoMGp10sw9EmtqKUG8S7KCsiOFUhoP8YXM=; b=IHWR8sjSi3XP9w4ZpUYs5K9nq2RIcONzfJpYTDBFejWMREQKheYRoKqVoB6tQDgwW9 wsj95pWEUGRUerqu6C6B1bR9clX6RnNk2DVjBE4rEkokSG+Z0FzuR6BuxKS7sUnHqb2U 3bnnXlSVrpMoRyWZRmGU/6DANsZJKML3aVeEaj4nIkvU0KeYhL/G20EglTXPGU8xI7Ur 11DOTHcrL3wtP6S8xkrbuLogO9Js2XAIfRBfzfcgQEeVcdnOcVTByQC0wxVmVZxHuIo8 x+Yhsxbx96oRQLB8+0X2kJhFc0bJytK2QfOofUW/wdpjCwBH3q9P4BSe3kxs+M8dycjn wRLQ== X-Gm-Message-State: AODbwcCKXuE5NmSK8tXR8+ybZ6tbVITc20XxFv704Q0GOZABUy0yp2Jc sAtvAOsGBKpMzvZy2eyOYoP96JsuoHrL X-Received: by 10.36.78.201 with SMTP id r192mr111929ita.45.1496335378800; Thu, 01 Jun 2017 09:42:58 -0700 (PDT) MIME-Version: 1.0 Received: by 10.79.3.194 with HTTP; Thu, 1 Jun 2017 09:42:18 -0700 (PDT) In-Reply-To: <20170601153645.GC10526@rei.suse.de> References: <20170601140048.GA24401@rei.lan> <20170601143141.GB24401@rei.lan> <20170601151003.GB10526@rei.suse.de> <20170601153645.GC10526@rei.suse.de> From: Soheil Hassas Yeganeh Date: Thu, 1 Jun 2017 12:42:18 -0400 Message-ID: Subject: Re: commit f5f99309 (sock: do not set sk_err in sock_dequeue_err_skb) has broken ping To: Cyril Hrubis Cc: "David S. Miller" , Shmulik Ladkani , Marcelo Ricardo Leitner , Pravin B Shelar , Eric Dumazet , WANG Cong , Yaogong Wang , Steffen Klassert , Al Viro , netdev , linux-kernel@vger.kernel.org Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org On Thu, Jun 1, 2017 at 11:36 AM, Cyril Hrubis wrote: > It seems to repeatedly produce (until I plug the cable back): > > ee_errno = 113 ee_origin = 2 ee_type = 3 ee_code = 1 ee_info = 0 ee_data = 0 > > So we get EHOSTUNREACH on SO_EE_ORIGIN_ICMP. Thank you very much! I have a wild guess that, when we have a train of skbs on the error queue starting from a local error, we will see this issue. Ping (without my patch) considers EAGAIN on a normal read as an indication that there is nothing on the error queue, but that's a flawed assumption. Would you mind trying another shot in the darkness please? Thanks! diff --git a/net/core/skbuff.c b/net/core/skbuff.c index 5a726161f4e4..097152a03c74 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c @@ -3742,7 +3742,8 @@ EXPORT_SYMBOL(sock_queue_err_skb); static bool is_icmp_err_skb(const struct sk_buff *skb) { return skb && (SKB_EXT_ERR(skb)->ee.ee_origin == SO_EE_ORIGIN_ICMP || - SKB_EXT_ERR(skb)->ee.ee_origin == SO_EE_ORIGIN_ICMP6); + SKB_EXT_ERR(skb)->ee.ee_origin == SO_EE_ORIGIN_ICMP6 || + SKB_EXT_ERR(skb)->ee.ee_origin == SO_EE_ORIGIN_LOCAL); } struct sk_buff *sock_dequeue_err_skb(struct sock *sk) @@ -3751,14 +3752,19 @@ struct sk_buff *sock_dequeue_err_skb(struct sock *sk) struct sk_buff *skb, *skb_next = NULL; bool icmp_next = false; unsigned long flags; + int err = 0; spin_lock_irqsave(&q->lock, flags); skb = __skb_dequeue(q); - if (skb && (skb_next = skb_peek(q))) + if (skb && (skb_next = skb_peek(q))) { icmp_next = is_icmp_err_skb(skb_next); + err = SKB_EXT_ERR(skb_next)->ee.ee_origin; + } spin_unlock_irqrestore(&q->lock, flags); - if (is_icmp_err_skb(skb) && !icmp_next) + if (icmp_next) + sk->sk_err = err; + else if (is_icmp_err_skb(skb) && !icmp_next) sk->sk_err = 0; if (skb_next)