Netdev List
 help / color / mirror / Atom feed
* Re: [PATCH iproute2 net-next] bridge: add option extern_learn to set NTF_EXT_LEARNED on fdb entries
From: Roopa Prabhu @ 2018-03-19 18:05 UTC (permalink / raw)
  To: David Ahern; +Cc: Stephen Hemminger, netdev, Nikolay Aleksandrov
In-Reply-To: <4da9d3be-b5b0-aa91-bed0-ecb99f271a63@gmail.com>

On Mon, Mar 19, 2018 at 10:56 AM, David Ahern <dsahern@gmail.com> wrote:
> On 3/19/18 11:54 AM, Stephen Hemminger wrote:
>> On Mon, 19 Mar 2018 10:20:10 -0700
>> Roopa Prabhu <roopa@cumulusnetworks.com> wrote:
>>
>>> From: Roopa Prabhu <roopa@cumulusnetworks.com>
>>>
>>> NTF_EXT_LEARNED can be set by a user on bridge fdb entry.
>>> Provide a bridge command option to allow a user to set
>>> NTF_EXT_LEARNED on a bridge fdb entry.
>>>
>>> Signed-off-by: Roopa Prabhu <roopa@cumulusnetworks.com>
>>> ---
>>>  bridge/fdb.c      | 4 +++-
>>>  man/man8/bridge.8 | 8 +++++++-
>>>  2 files changed, 10 insertions(+), 2 deletions(-)
>>>
>>> diff --git a/bridge/fdb.c b/bridge/fdb.c
>>> index 205b4fa..4dbc894 100644
>>> --- a/bridge/fdb.c
>>> +++ b/bridge/fdb.c
>>> @@ -36,7 +36,7 @@ static void usage(void)
>>>  {
>>>      fprintf(stderr,
>>>              "Usage: bridge fdb { add | append | del | replace } ADDR dev DEV\n"
>>> -            "              [ self ] [ master ] [ use ] [ router ]\n"
>>> +            "              [ self ] [ master ] [ use ] [ router ] [ extern_learn ]\n"
>>>              "              [ local | static | dynamic ] [ dst IPADDR ] [ vlan VID ]\n"
>>>              "              [ port PORT] [ vni VNI ] [ via DEV ]\n"
>>>              "       bridge fdb [ show [ br BRDEV ] [ brport DEV ] [ vlan VID ] [ state STATE ] ]\n");
>>> @@ -412,6 +412,8 @@ static int fdb_modify(int cmd, int flags, int argc, char **argv)
>>>                      vid = atoi(*argv);
>>>              } else if (matches(*argv, "use") == 0) {
>>>                      req.ndm.ndm_flags |= NTF_USE;
>>> +            } else if (matches(*argv, "extern_learn") == 0) {
>>> +                    req.ndm.ndm_flags |= NTF_EXT_LEARNED;
>>>              } else {
>>>                      if (strcmp(*argv, "to") == 0)
>>>                              NEXT_ARG();
>>> diff --git a/man/man8/bridge.8 b/man/man8/bridge.8
>>> index 05512b0..e7f7148 100644
>>> --- a/man/man8/bridge.8
>>> +++ b/man/man8/bridge.8
>>> @@ -61,7 +61,7 @@ bridge \- show / manipulate bridge addresses and devices
>>>  .B dev
>>>  .IR DEV " { "
>>>  .BR local " | " static " | " dynamic " } [ "
>>> -.BR self " ] [ " master " ] [ " router " ] [ " use " ] [ "
>>> +.BR self " ] [ " master " ] [ " router " ] [ " use " ] [ " extern_learn " ] [ "
>>>  .B dst
>>>  .IR IPADDR " ] [ "
>>>  .B vni
>>> @@ -414,6 +414,12 @@ route shortcircuit enabled.
>>>  indicate to the kernel that the fdb entry is in use.
>>>  .sp
>>>
>>> +.B extern_learn
>>> +- this entry was learned externally. This option can be used to
>>> +indicate to the kernel that an entry was hardware or user-space
>>> +controller learnt dynamic entry. Kernel will not age such an entry.
>>> +.sp
>>> +
>>>  .in -8
>>>  The next command line parameters apply only
>>>  when the specified device
>>
>>
>> What about displaying the flag as well?
>>
>
> Also, I believe other commands have converged on 'external' for the keyword.


There is already code to display it and it displays it as
'extern_learn' (hence the choice of extern_learn)

static void fdb_print_flags(FILE *fp, unsigned int flags)

{

        ....


        if (flags & NTF_EXT_LEARNED)

                print_string(PRINT_ANY, NULL, "%s ", "extern_learn");

        ....
}

^ permalink raw reply

* [PATCH 3.18 34/68] MIPS: BPF: Quit clobbering callee saved registers in JIT code.
From: Greg Kroah-Hartman @ 2018-03-19 18:06 UTC (permalink / raw)
  To: linux-kernel
  Cc: Greg Kroah-Hartman, stable, David Daney, James Hogan,
	Alexei Starovoitov, Steven J. Hill, linux-mips, netdev,
	Ralf Baechle, Sasha Levin
In-Reply-To: <20180319171827.899658615@linuxfoundation.org>

3.18-stable review patch.  If anyone has any objections, please let me know.

------------------

From: David Daney <david.daney@cavium.com>


[ Upstream commit 1ef0910cfd681f0bd0b81f8809935b2006e9cfb9 ]

If bpf_needs_clear_a() returns true, only actually clear it if it is
ever used.  If it is not used, we don't save and restore it, so the
clearing has the nasty side effect of clobbering caller state.

Also, don't emit stack pointer adjustment instructions if the
adjustment amount is zero.

Signed-off-by: David Daney <david.daney@cavium.com>
Cc: James Hogan <james.hogan@imgtec.com>
Cc: Alexei Starovoitov <ast@kernel.org>
Cc: Steven J. Hill <steven.hill@cavium.com>
Cc: linux-mips@linux-mips.org
Cc: netdev@vger.kernel.org
Cc: linux-kernel@vger.kernel.org
Patchwork: https://patchwork.linux-mips.org/patch/15745/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
 arch/mips/net/bpf_jit.c |   16 ++++++++++++----
 1 file changed, 12 insertions(+), 4 deletions(-)

--- a/arch/mips/net/bpf_jit.c
+++ b/arch/mips/net/bpf_jit.c
@@ -562,7 +562,8 @@ static void save_bpf_jit_regs(struct jit
 	u32 sflags, tmp_flags;
 
 	/* Adjust the stack pointer */
-	emit_stack_offset(-align_sp(offset), ctx);
+	if (offset)
+		emit_stack_offset(-align_sp(offset), ctx);
 
 	if (ctx->flags & SEEN_CALL) {
 		/* Argument save area */
@@ -641,7 +642,8 @@ static void restore_bpf_jit_regs(struct
 		emit_load_stack_reg(r_ra, r_sp, real_off, ctx);
 
 	/* Restore the sp and discard the scrach memory */
-	emit_stack_offset(align_sp(offset), ctx);
+	if (offset)
+		emit_stack_offset(align_sp(offset), ctx);
 }
 
 static unsigned int get_stack_depth(struct jit_ctx *ctx)
@@ -689,8 +691,14 @@ static void build_prologue(struct jit_ct
 	if (ctx->flags & SEEN_X)
 		emit_jit_reg_move(r_X, r_zero, ctx);
 
-	/* Do not leak kernel data to userspace */
-	if (bpf_needs_clear_a(&ctx->skf->insns[0]))
+	/*
+	 * Do not leak kernel data to userspace, we only need to clear
+	 * r_A if it is ever used.  In fact if it is never used, we
+	 * will not save/restore it, so clearing it in this case would
+	 * corrupt the state of the caller.
+	 */
+	if (bpf_needs_clear_a(&ctx->skf->insns[0]) &&
+	    (ctx->flags & SEEN_A))
 		emit_jit_reg_move(r_A, r_zero, ctx);
 }
 

^ permalink raw reply

* [PATCH 4.9 129/241] MIPS: BPF: Quit clobbering callee saved registers in JIT code.
From: Greg Kroah-Hartman @ 2018-03-19 18:06 UTC (permalink / raw)
  To: linux-kernel
  Cc: Greg Kroah-Hartman, stable, David Daney, James Hogan,
	Alexei Starovoitov, Steven J. Hill, linux-mips, netdev,
	Ralf Baechle, Sasha Levin
In-Reply-To: <20180319180751.172155436@linuxfoundation.org>

4.9-stable review patch.  If anyone has any objections, please let me know.

------------------

From: David Daney <david.daney@cavium.com>


[ Upstream commit 1ef0910cfd681f0bd0b81f8809935b2006e9cfb9 ]

If bpf_needs_clear_a() returns true, only actually clear it if it is
ever used.  If it is not used, we don't save and restore it, so the
clearing has the nasty side effect of clobbering caller state.

Also, don't emit stack pointer adjustment instructions if the
adjustment amount is zero.

Signed-off-by: David Daney <david.daney@cavium.com>
Cc: James Hogan <james.hogan@imgtec.com>
Cc: Alexei Starovoitov <ast@kernel.org>
Cc: Steven J. Hill <steven.hill@cavium.com>
Cc: linux-mips@linux-mips.org
Cc: netdev@vger.kernel.org
Cc: linux-kernel@vger.kernel.org
Patchwork: https://patchwork.linux-mips.org/patch/15745/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
 arch/mips/net/bpf_jit.c |   16 ++++++++++++----
 1 file changed, 12 insertions(+), 4 deletions(-)

--- a/arch/mips/net/bpf_jit.c
+++ b/arch/mips/net/bpf_jit.c
@@ -526,7 +526,8 @@ static void save_bpf_jit_regs(struct jit
 	u32 sflags, tmp_flags;
 
 	/* Adjust the stack pointer */
-	emit_stack_offset(-align_sp(offset), ctx);
+	if (offset)
+		emit_stack_offset(-align_sp(offset), ctx);
 
 	tmp_flags = sflags = ctx->flags >> SEEN_SREG_SFT;
 	/* sflags is essentially a bitmap */
@@ -578,7 +579,8 @@ static void restore_bpf_jit_regs(struct
 		emit_load_stack_reg(r_ra, r_sp, real_off, ctx);
 
 	/* Restore the sp and discard the scrach memory */
-	emit_stack_offset(align_sp(offset), ctx);
+	if (offset)
+		emit_stack_offset(align_sp(offset), ctx);
 }
 
 static unsigned int get_stack_depth(struct jit_ctx *ctx)
@@ -625,8 +627,14 @@ static void build_prologue(struct jit_ct
 	if (ctx->flags & SEEN_X)
 		emit_jit_reg_move(r_X, r_zero, ctx);
 
-	/* Do not leak kernel data to userspace */
-	if (bpf_needs_clear_a(&ctx->skf->insns[0]))
+	/*
+	 * Do not leak kernel data to userspace, we only need to clear
+	 * r_A if it is ever used.  In fact if it is never used, we
+	 * will not save/restore it, so clearing it in this case would
+	 * corrupt the state of the caller.
+	 */
+	if (bpf_needs_clear_a(&ctx->skf->insns[0]) &&
+	    (ctx->flags & SEEN_A))
 		emit_jit_reg_move(r_A, r_zero, ctx);
 }
 

^ permalink raw reply

* [PATCH 4.9 130/241] MIPS: BPF: Fix multiple problems in JIT skb access helpers.
From: Greg Kroah-Hartman @ 2018-03-19 18:06 UTC (permalink / raw)
  To: linux-kernel
  Cc: Greg Kroah-Hartman, stable, David Daney, James Hogan,
	Alexei Starovoitov, Steven J. Hill, linux-mips, netdev,
	Ralf Baechle, Sasha Levin
In-Reply-To: <20180319180751.172155436@linuxfoundation.org>

4.9-stable review patch.  If anyone has any objections, please let me know.

------------------

From: David Daney <david.daney@cavium.com>


[ Upstream commit a81507c79f4ae9a0f9fb1054b59b62a090620dd9 ]

o Socket data is unsigned, so use unsigned accessors instructions.

 o Fix path result pointer generation arithmetic.

 o Fix half-word byte swapping code for unsigned semantics.

Signed-off-by: David Daney <david.daney@cavium.com>
Cc: James Hogan <james.hogan@imgtec.com>
Cc: Alexei Starovoitov <ast@kernel.org>
Cc: Steven J. Hill <steven.hill@cavium.com>
Cc: linux-mips@linux-mips.org
Cc: netdev@vger.kernel.org
Cc: linux-kernel@vger.kernel.org
Patchwork: https://patchwork.linux-mips.org/patch/15747/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
 arch/mips/net/bpf_jit_asm.S |   23 ++++++++++++-----------
 1 file changed, 12 insertions(+), 11 deletions(-)

--- a/arch/mips/net/bpf_jit_asm.S
+++ b/arch/mips/net/bpf_jit_asm.S
@@ -90,18 +90,14 @@ FEXPORT(sk_load_half_positive)
 	is_offset_in_header(2, half)
 	/* Offset within header boundaries */
 	PTR_ADDU t1, $r_skb_data, offset
-	.set	reorder
-	lh	$r_A, 0(t1)
-	.set	noreorder
+	lhu	$r_A, 0(t1)
 #ifdef CONFIG_CPU_LITTLE_ENDIAN
 # if defined(__mips_isa_rev) && (__mips_isa_rev >= 2)
-	wsbh	t0, $r_A
-	seh	$r_A, t0
+	wsbh	$r_A, $r_A
 # else
-	sll	t0, $r_A, 24
-	andi	t1, $r_A, 0xff00
-	sra	t0, t0, 16
-	srl	t1, t1, 8
+	sll	t0, $r_A, 8
+	srl	t1, $r_A, 8
+	andi	t0, t0, 0xff00
 	or	$r_A, t0, t1
 # endif
 #endif
@@ -115,7 +111,7 @@ FEXPORT(sk_load_byte_positive)
 	is_offset_in_header(1, byte)
 	/* Offset within header boundaries */
 	PTR_ADDU t1, $r_skb_data, offset
-	lb	$r_A, 0(t1)
+	lbu	$r_A, 0(t1)
 	jr	$r_ra
 	 move	$r_ret, zero
 	END(sk_load_byte)
@@ -139,6 +135,11 @@ FEXPORT(sk_load_byte_positive)
  * (void *to) is returned in r_s0
  *
  */
+#ifdef CONFIG_CPU_LITTLE_ENDIAN
+#define DS_OFFSET(SIZE) (4 * SZREG)
+#else
+#define DS_OFFSET(SIZE) ((4 * SZREG) + (4 - SIZE))
+#endif
 #define bpf_slow_path_common(SIZE)				\
 	/* Quick check. Are we within reasonable boundaries? */ \
 	LONG_ADDIU	$r_s1, $r_skb_len, -SIZE;		\
@@ -150,7 +151,7 @@ FEXPORT(sk_load_byte_positive)
 	PTR_LA		t0, skb_copy_bits;			\
 	PTR_S		$r_ra, (5 * SZREG)($r_sp);		\
 	/* Assign low slot to a2 */				\
-	move		a2, $r_sp;				\
+	PTR_ADDIU	a2, $r_sp, DS_OFFSET(SIZE);		\
 	jalr		t0;					\
 	/* Reset our destination slot (DS but it's ok) */	\
 	 INT_S		zero, (4 * SZREG)($r_sp);		\

^ permalink raw reply

* Re: [PATCH net-next 3/4] net: dsa: Plug in PHYLINK support
From: Russell King - ARM Linux @ 2018-03-19 18:09 UTC (permalink / raw)
  To: Florian Fainelli
  Cc: Andrew Lunn, netdev, privat, vivien.didelot, davem, sean.wang,
	Woojung.Huh, john, cphealy
In-Reply-To: <639992a2-d651-8030-1a54-919e8e5827cf@gmail.com>

On Mon, Mar 19, 2018 at 10:59:55AM -0700, Florian Fainelli wrote:
> Hi Andrew,
> 
> On 03/18/2018 12:19 PM, Andrew Lunn wrote:
> >> +static int dsa_slave_nway_reset(struct net_device *dev)
> >> +{
> >> +	struct dsa_port *dp = dsa_slave_to_port(dev);
> >> +
> >> +	return phylink_ethtool_nway_reset(dp->pl);
> >> +}
> > 
> > Hi Florian
> > 
> > I've seen in one of Russells trees a patch to put a phylink into
> > net_device. That would make a generic slave_nway_reset() possible, and
> > a few others as well. Maybe it makes sense to pull in that patch?
> 
> To make this generic, we would have to have net_device carry a reference
> to a phylink instance, which I would rather not do. Were you possibly
> referring to this patch set:
> 
> http://git.armlinux.org.uk/cgit/linux-arm.git/commit/?h=phy&id=4eda3b76573473d811bc80a6f0e5a2e06dd76bf6
> 
> in which case I think it was discussed and rejected (that was my
> recollection).

Unfortunately, that rejection kind'a prevents SFP support on a PHY,
which is why I'm not pushing the 3310 patches (I don't have any other
solution to this problem at the moment as PHYLIB gets in the way of
knowing what state the network interface is in.)

-- 
RMK's Patch system: http://www.armlinux.org.uk/developer/patches/
FTTC broadband for 0.8mile line in suburbia: sync at 8.8Mbps down 630kbps up
According to speedtest.net: 8.21Mbps down 510kbps up

^ permalink raw reply

* Re: [PATCH net-next 3/4] net: dsa: Plug in PHYLINK support
From: Florian Fainelli @ 2018-03-19 18:11 UTC (permalink / raw)
  To: Russell King - ARM Linux
  Cc: Andrew Lunn, netdev, privat, vivien.didelot, davem, sean.wang,
	Woojung.Huh, john, cphealy
In-Reply-To: <20180319180929.GF2743@n2100.armlinux.org.uk>

On 03/19/2018 11:09 AM, Russell King - ARM Linux wrote:
> On Mon, Mar 19, 2018 at 10:59:55AM -0700, Florian Fainelli wrote:
>> Hi Andrew,
>>
>> On 03/18/2018 12:19 PM, Andrew Lunn wrote:
>>>> +static int dsa_slave_nway_reset(struct net_device *dev)
>>>> +{
>>>> +	struct dsa_port *dp = dsa_slave_to_port(dev);
>>>> +
>>>> +	return phylink_ethtool_nway_reset(dp->pl);
>>>> +}
>>>
>>> Hi Florian
>>>
>>> I've seen in one of Russells trees a patch to put a phylink into
>>> net_device. That would make a generic slave_nway_reset() possible, and
>>> a few others as well. Maybe it makes sense to pull in that patch?
>>
>> To make this generic, we would have to have net_device carry a reference
>> to a phylink instance, which I would rather not do. Were you possibly
>> referring to this patch set:
>>
>> http://git.armlinux.org.uk/cgit/linux-arm.git/commit/?h=phy&id=4eda3b76573473d811bc80a6f0e5a2e06dd76bf6
>>
>> in which case I think it was discussed and rejected (that was my
>> recollection).
> 
> Unfortunately, that rejection kind'a prevents SFP support on a PHY,
> which is why I'm not pushing the 3310 patches (I don't have any other
> solution to this problem at the moment as PHYLIB gets in the way of
> knowing what state the network interface is in.)

I don't remember the basis on which this was rejected, and since then, I
had many sleepless nights which don't help with long term memory :) Can
you refresh the context?
-- 
Florian

^ permalink raw reply

* [PATCH v2 iproute2 1/1] tc: fix conversion types when printing actions unsigned values
From: Roman Mashak @ 2018-03-19 18:13 UTC (permalink / raw)
  To: stephen; +Cc: netdev, kernel, jhs, xiyou.wangcong, jiri, Roman Mashak

v2:
   fixed coding style

Signed-off-by: Roman Mashak <mrv@mojatatu.com>
---
 tc/m_action.c     | 2 +-
 tc/m_gact.c       | 2 +-
 tc/m_ife.c        | 2 +-
 tc/m_pedit.c      | 2 +-
 tc/m_sample.c     | 6 +++---
 tc/m_tunnel_key.c | 2 +-
 6 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/tc/m_action.c b/tc/m_action.c
index 148f1372d414..244c1ec00f28 100644
--- a/tc/m_action.c
+++ b/tc/m_action.c
@@ -408,7 +408,7 @@ int print_action(const struct sockaddr_nl *who,
 	if (tb[TCA_ROOT_COUNT])
 		tot_acts = RTA_DATA(tb[TCA_ROOT_COUNT]);
 
-	fprintf(fp, "total acts %d\n", tot_acts ? *tot_acts:0);
+	fprintf(fp, "total acts %u\n", tot_acts ? *tot_acts : 0);
 	if (tb[TCA_ACT_TAB] == NULL) {
 		if (n->nlmsg_type != RTM_GETACTION)
 			fprintf(stderr, "print_action: NULL kind\n");
diff --git a/tc/m_gact.c b/tc/m_gact.c
index 16c4413f4217..52022415db48 100644
--- a/tc/m_gact.c
+++ b/tc/m_gact.c
@@ -194,7 +194,7 @@ print_gact(struct action_util *au, FILE *f, struct rtattr *arg)
 	print_string(PRINT_ANY, "random_type", "\n\t random type %s",
 		     prob_n2a(pp->ptype));
 	print_action_control(f, " ", pp->paction, " ");
-	print_int(PRINT_ANY, "val", "val %d", pp->pval);
+	print_int(PRINT_ANY, "val", "val %u", pp->pval);
 	close_json_object();
 #endif
 	print_uint(PRINT_ANY, "index", "\n\t index %u", p->index);
diff --git a/tc/m_ife.c b/tc/m_ife.c
index 205efc9f1d9a..e1dbd3a79649 100644
--- a/tc/m_ife.c
+++ b/tc/m_ife.c
@@ -280,7 +280,7 @@ static int print_ife(struct action_util *au, FILE *f, struct rtattr *arg)
 			if (len) {
 				mtcindex =
 					rta_getattr_u16(metalist[IFE_META_TCINDEX]);
-				fprintf(f, "use tcindex %d ", mtcindex);
+				fprintf(f, "use tcindex %u ", mtcindex);
 			} else
 				fprintf(f, "allow tcindex ");
 		}
diff --git a/tc/m_pedit.c b/tc/m_pedit.c
index 26549eeea899..151dfe1a230a 100644
--- a/tc/m_pedit.c
+++ b/tc/m_pedit.c
@@ -817,7 +817,7 @@ int print_pedit(struct action_util *au, FILE *f, struct rtattr *arg)
 				(unsigned int)ntohl(key->mask));
 		}
 	} else {
-		fprintf(f, "\npedit %x keys %d is not LEGIT", sel->index,
+		fprintf(f, "\npedit %x keys %u is not LEGIT", sel->index,
 			sel->nkeys);
 	}
 
diff --git a/tc/m_sample.c b/tc/m_sample.c
index 01763cb4c356..d42a6a327965 100644
--- a/tc/m_sample.c
+++ b/tc/m_sample.c
@@ -155,17 +155,17 @@ static int print_sample(struct action_util *au, FILE *f, struct rtattr *arg)
 	}
 	p = RTA_DATA(tb[TCA_SAMPLE_PARMS]);
 
-	fprintf(f, "sample rate 1/%d group %d",
+	fprintf(f, "sample rate 1/%u group %u",
 		rta_getattr_u32(tb[TCA_SAMPLE_RATE]),
 		rta_getattr_u32(tb[TCA_SAMPLE_PSAMPLE_GROUP]));
 
 	if (tb[TCA_SAMPLE_TRUNC_SIZE])
-		fprintf(f, " trunc_size %d",
+		fprintf(f, " trunc_size %u",
 			rta_getattr_u32(tb[TCA_SAMPLE_TRUNC_SIZE]));
 
 	print_action_control(f, " ", p->action, "");
 
-	fprintf(f, "\n\tindex %d ref %d bind %d", p->index, p->refcnt,
+	fprintf(f, "\n\tindex %u ref %d bind %d", p->index, p->refcnt,
 		p->bindcnt);
 
 	if (show_stats) {
diff --git a/tc/m_tunnel_key.c b/tc/m_tunnel_key.c
index 1cdd03560c35..dd8f8e8c635b 100644
--- a/tc/m_tunnel_key.c
+++ b/tc/m_tunnel_key.c
@@ -292,7 +292,7 @@ static int print_tunnel_key(struct action_util *au, FILE *f, struct rtattr *arg)
 	}
 	print_action_control(f, " ", parm->action, "");
 
-	fprintf(f, "\n\tindex %d ref %d bind %d", parm->index, parm->refcnt,
+	fprintf(f, "\n\tindex %u ref %d bind %d", parm->index, parm->refcnt,
 		parm->bindcnt);
 
 	if (show_stats) {
-- 
2.7.4

^ permalink raw reply related

* Re: [PATCH iproute2 1/1] tc: fix conversion types when printing actions unsigned values
From: Roman Mashak @ 2018-03-19 18:14 UTC (permalink / raw)
  To: Stephen Hemminger; +Cc: netdev, jhs, xiyou.wangcong, jiri
In-Reply-To: <20180319105526.67094dcd@xeon-e3>

Stephen Hemminger <stephen@networkplumber.org> writes:

> On Mon, 19 Mar 2018 13:50:07 -0400
> Roman Mashak <mrv@mojatatu.com> wrote:
>
>> Signed-off-by: Roman Mashak <mrv@mojatatu.com>
>> ---
>>  tc/m_action.c     | 2 +-
>>  tc/m_gact.c       | 2 +-
>>  tc/m_ife.c        | 2 +-
>>  tc/m_pedit.c      | 2 +-
>>  tc/m_sample.c     | 6 +++---
>>  tc/m_tunnel_key.c | 2 +-
>>  6 files changed, 8 insertions(+), 8 deletions(-)
>> 
>> diff --git a/tc/m_action.c b/tc/m_action.c
>> index 148f1372d414..85c9d44c7e50 100644
>> --- a/tc/m_action.c
>> +++ b/tc/m_action.c
>> @@ -408,7 +408,7 @@ int print_action(const struct sockaddr_nl *who,
>>  	if (tb[TCA_ROOT_COUNT])
>>  		tot_acts = RTA_DATA(tb[TCA_ROOT_COUNT]);
>>  
>> -	fprintf(fp, "total acts %d\n", tot_acts ? *tot_acts:0);
>> +	fprintf(fp, "total acts %u\n", tot_acts ? *tot_acts:0);
>
> Please add spaces around : in trigraph.
>
> When fixing code, it has to pass style checkers.

Thanks, I will send v2.

^ permalink raw reply

* Re: get_user_pages returning 0 (was Re: kernel BUG at drivers/vhost/vhost.c:LINE!)
From: Dmitry Vyukov via Virtualization @ 2018-03-19 18:18 UTC (permalink / raw)
  To: dsterba, Michael S. Tsirkin, syzbot, Michel Lespinasse,
	syzkaller-bugs, Linux-MM, Andrew Morton, virtualization,
	Andrea Arcangeli, Jason Wang, KVM list, LKML, netdev
In-Reply-To: <20180319152936.GI6955@suse.cz>

On Mon, Mar 19, 2018 at 4:29 PM, David Sterba <dsterba@suse.cz> wrote:
> On Mon, Mar 19, 2018 at 05:09:28PM +0200,  Michael S. Tsirkin  wrote:
>> Hello!
>> The following code triggered by syzbot
>>
>>         r = get_user_pages_fast(log, 1, 1, &page);
>>         if (r < 0)
>>                 return r;
>>         BUG_ON(r != 1);
>>
>> Just looking at get_user_pages_fast's documentation this seems
>> impossible - it is supposed to only ever return # of pages
>> pinned or errno.
>>
>> However, poking at code, I see at least one path that might cause this:
>>
>>                         ret = faultin_page(tsk, vma, start, &foll_flags,
>>                                         nonblocking);
>>                         switch (ret) {
>>                         case 0:
>>                                 goto retry;
>>                         case -EFAULT:
>>                         case -ENOMEM:
>>                         case -EHWPOISON:
>>                                 return i ? i : ret;
>>                         case -EBUSY:
>>                                 return i;
>>
>> which originally comes from:
>>
>> commit 53a7706d5ed8f1a53ba062b318773160cc476dde
>> Author: Michel Lespinasse <walken@google.com>
>> Date:   Thu Jan 13 15:46:14 2011 -0800
>>
>>     mlock: do not hold mmap_sem for extended periods of time
>>
>>     __get_user_pages gets a new 'nonblocking' parameter to signal that the
>>     caller is prepared to re-acquire mmap_sem and retry the operation if
>>     needed.  This is used to split off long operations if they are going to
>>     block on a disk transfer, or when we detect contention on the mmap_sem.
>>
>>     [akpm@linux-foundation.org: remove ref to rwsem_is_contended()]
>>     Signed-off-by: Michel Lespinasse <walken@google.com>
>>     Cc: Hugh Dickins <hughd@google.com>
>>     Cc: Rik van Riel <riel@redhat.com>
>>     Cc: Peter Zijlstra <peterz@infradead.org>
>>     Cc: Nick Piggin <npiggin@kernel.dk>
>>     Cc: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
>>     Cc: Ingo Molnar <mingo@elte.hu>
>>     Cc: "H. Peter Anvin" <hpa@zytor.com>
>>     Cc: Thomas Gleixner <tglx@linutronix.de>
>>     Cc: David Howells <dhowells@redhat.com>
>>     Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
>>     Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
>>
>> I started looking into this, if anyone has any feedback meanwhile,
>> that would be appreciated.
>>
>> In particular I don't really see why would this trigger
>> on commit 8f5fd927c3a7576d57248a2d7a0861c3f2795973:
>>
>> Merge: 8757ae2 093e037
>> Author: Linus Torvalds <torvalds@linux-foundation.org>
>> Date:   Fri Mar 16 13:37:42 2018 -0700
>>
>>     Merge tag 'for-4.16-rc5-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux
>>
>> is btrfs used on these systems?
>
> There were 3 patches pulled by that tag, none of them is even remotely
> related to the reported bug, AFAICS. If there's some impact, it must be
> indirect, obvious bugs like NULL pointer would exhibit in a different
> way and leave at least some trace in the stacks.

That is just a commit on which the bug was hit. It's provided so that
developers can make sense out of line numbers and check if the tree
includes/not includes a particular commit, etc. It's not that that
commit introduced the bug.

^ permalink raw reply

* Re: [PATCH net-next] tc-testing: add selftests for 'bpf' action
From: Roman Mashak @ 2018-03-19 18:40 UTC (permalink / raw)
  To: Davide Caratti; +Cc: netdev, David S. Miller, Brenda J . Butler
In-Reply-To: <14be6cc1ace745b6ee37e552bc0e317e7ae765ec.1521418521.git.dcaratti@redhat.com>

Davide Caratti <dcaratti@redhat.com> writes:

> Test d959: Add cBPF action with valid bytecode
> Test f84a: Add cBPF action with invalid bytecode
> Test e939: Add eBPF action with valid object-file
> Test d819: Replace cBPF bytecode and action control
> Test 6ae3: Delete cBPF action
> Test 3e0d: List cBPF actions
> Test 55ce: Flush BPF actions
> Test ccc3: Add cBPF action with duplicate index
>
> Signed-off-by: Davide Caratti <dcaratti@redhat.com>
> ---
>  .../selftests/tc-testing/tc-tests/actions/bpf.json | 215 +++++++++++++++++++++
>  1 file changed, 215 insertions(+)
>  create mode 100644 tools/testing/selftests/tc-testing/tc-tests/actions/bpf.json
>
> diff --git a/tools/testing/selftests/tc-testing/tc-tests/actions/bpf.json b/tools/testing/selftests/tc-testing/tc-tests/actions/bpf.json
> new file mode 100644
> index 000000000000..0295a63dd0c8

[...]

Davide, thank you for efforts. Please also add a test for testing max
index value (since it is u32 type) and a test with cookie (every action
may have optional 128-bit value, that carries some user state and not
intepreted by the kernel).

^ permalink raw reply

* Re: recursive static routes
From: Saku Ytti @ 2018-03-19 18:58 UTC (permalink / raw)
  To: David Ahern; +Cc: netdev
In-Reply-To: <38e0c1a3-95e8-1917-49f3-6873ca924260@cumulusnetworks.com>

Hey David,

> The Linux stack does not flatten routes when inserting into the FIB.
> Recursion is expected to be done a routing daemon such as bgp which will
> be able to handle updates as the network changes.

Are you saying that routing protocol would observe the next-hop
change, then update the Linux kernel route to reflect that?

Wouldn't that add another layer of state and the implied delays of
maintaining and updating the state.

Is it not practical to do lookup per-packet to recurse until egress
rewrite information is found? So literally no state in memory anywhere
saying 0/0 next-hop is 192.0.2.42/22:22:22:22:22:22, it would always
have to walk the FIB to find it.

--
  ++ytti

^ permalink raw reply

* Re: [net-next 0/9][pull request] 40GbE Intel Wired LAN Driver Updates 2018-03-19
From: David Miller @ 2018-03-19 19:12 UTC (permalink / raw)
  To: jeffrey.t.kirsher; +Cc: netdev, nhorman, sassmann, jogreene
In-Reply-To: <20180319175659.17685-1-jeffrey.t.kirsher@intel.com>

From: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Date: Mon, 19 Mar 2018 10:56:50 -0700

> This series contains updates to i40e and i40evf only.

Pulled, thanks Jeff.

^ permalink raw reply

* Re: [RFC net-next] sfp/phylink: move module EEPROM ethtool access into netdev core ethtool
From: Florian Fainelli @ 2018-03-19 19:20 UTC (permalink / raw)
  To: Russell King, Andrew Lunn, David S. Miller; +Cc: netdev
In-Reply-To: <E1eQaEt-000329-8b@rmk-PC.armlinux.org.uk>

On 12/17/2017 06:48 AM, Russell King wrote:
> Provide a pointer to the SFP bus in struct net_device, so that the
> ethtool module EEPROM methods can access the SFP directly, rather
> than needing every user to provide a hook for it.
> 
> Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
> ---
> Questions:
> 1. Is it worth adding a pointer to struct net_device for these two
>    methods, rather than having multiple duplicate veneers to vector
>    the ethtool module EEPROM ioctls through to the SFP bus layer?

Considering the negative diffstat and the fact that it solves real
problems for you, I would say yes.

> 
> 2. Should this allow network/phy drivers to override the default -
>    the code is currently structured to allow phy drivers to override
>    network drivers implementations, which seems the wrong way around.

This would be nice, but at this point, I would defer until we have all
major PHYLINK, SFP et al. users merged in tree so we have a good
understanding and view of the different possible combinations that might
exist. Then we can try to define an interface allowing network drivers
more flexibility.

If that seems like an appropriate course of action, do you mind
resubmitting this as non RFC?


> 
>  drivers/net/phy/phylink.c             | 28 ----------------------------
>  drivers/net/phy/sfp-bus.c             |  6 ++----
>  include/linux/netdevice.h             |  3 +++
>  include/linux/phylink.h               |  3 ---
>  net/core/ethtool.c                    |  7 +++++++
>  5 files changed, 12 insertions(+), 35 deletions(-)
> 
> diff --git a/drivers/net/phy/phylink.c b/drivers/net/phy/phylink.c
> index db5d5726ced9..0f59d7149a61 100644
> --- a/drivers/net/phy/phylink.c
> +++ b/drivers/net/phy/phylink.c
> @@ -1247,34 +1247,6 @@ int phylink_ethtool_set_pauseparam(struct phylink *pl,
>  }
>  EXPORT_SYMBOL_GPL(phylink_ethtool_set_pauseparam);
>  
> -int phylink_ethtool_get_module_info(struct phylink *pl,
> -				    struct ethtool_modinfo *modinfo)
> -{
> -	int ret = -EOPNOTSUPP;
> -
> -	WARN_ON(!lockdep_rtnl_is_held());
> -
> -	if (pl->sfp_bus)
> -		ret = sfp_get_module_info(pl->sfp_bus, modinfo);
> -
> -	return ret;
> -}
> -EXPORT_SYMBOL_GPL(phylink_ethtool_get_module_info);
> -
> -int phylink_ethtool_get_module_eeprom(struct phylink *pl,
> -				      struct ethtool_eeprom *ee, u8 *buf)
> -{
> -	int ret = -EOPNOTSUPP;
> -
> -	WARN_ON(!lockdep_rtnl_is_held());
> -
> -	if (pl->sfp_bus)
> -		ret = sfp_get_module_eeprom(pl->sfp_bus, ee, buf);
> -
> -	return ret;
> -}
> -EXPORT_SYMBOL_GPL(phylink_ethtool_get_module_eeprom);
> -
>  /**
>   * phylink_ethtool_get_eee_err() - read the energy efficient ethernet error
>   *   counter
> diff --git a/drivers/net/phy/sfp-bus.c b/drivers/net/phy/sfp-bus.c
> index 1356dba0d9d3..4d61099b1357 100644
> --- a/drivers/net/phy/sfp-bus.c
> +++ b/drivers/net/phy/sfp-bus.c
> @@ -321,6 +321,7 @@ static int sfp_register_bus(struct sfp_bus *bus)
>  	}
>  	if (bus->started)
>  		bus->socket_ops->start(bus->sfp);
> +	bus->netdev->sfp_bus = bus;
>  	bus->registered = true;
>  	return 0;
>  }
> @@ -335,6 +336,7 @@ static void sfp_unregister_bus(struct sfp_bus *bus)
>  		if (bus->phydev && ops && ops->disconnect_phy)
>  			ops->disconnect_phy(bus->upstream);
>  	}
> +	bus->netdev->sfp_bus = NULL;
>  	bus->registered = false;
>  }
>  
> @@ -350,8 +352,6 @@ static void sfp_unregister_bus(struct sfp_bus *bus)
>   */
>  int sfp_get_module_info(struct sfp_bus *bus, struct ethtool_modinfo *modinfo)
>  {
> -	if (!bus->registered)
> -		return -ENOIOCTLCMD;
>  	return bus->socket_ops->module_info(bus->sfp, modinfo);
>  }
>  EXPORT_SYMBOL_GPL(sfp_get_module_info);
> @@ -370,8 +370,6 @@ EXPORT_SYMBOL_GPL(sfp_get_module_info);
>  int sfp_get_module_eeprom(struct sfp_bus *bus, struct ethtool_eeprom *ee,
>  			  u8 *data)
>  {
> -	if (!bus->registered)
> -		return -ENOIOCTLCMD;
>  	return bus->socket_ops->module_eeprom(bus->sfp, ee, data);
>  }
>  EXPORT_SYMBOL_GPL(sfp_get_module_eeprom);
> diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
> index ef789e1d679e..99a0a155c319 100644
> --- a/include/linux/netdevice.h
> +++ b/include/linux/netdevice.h
> @@ -57,6 +57,7 @@ struct device;
>  struct phy_device;
>  struct dsa_port;
>  
> +struct sfp_bus;
>  /* 802.11 specific */
>  struct wireless_dev;
>  /* 802.15.4 specific */
> @@ -1644,6 +1645,7 @@ enum netdev_priv_flags {
>   *	@priomap:	XXX: need comments on this one
>   *	@phydev:	Physical device may attach itself
>   *			for hardware timestamping
> + *	@sfp_bus:	attached &struct sfp_bus structure.
>   *
>   *	@qdisc_tx_busylock: lockdep class annotating Qdisc->busylock spinlock
>   *	@qdisc_running_key: lockdep class annotating Qdisc->running seqcount
> @@ -1922,6 +1924,7 @@ struct net_device {
>  	struct netprio_map __rcu *priomap;
>  #endif
>  	struct phy_device	*phydev;
> +	struct sfp_bus		*sfp_bus;
>  	struct lock_class_key	*qdisc_tx_busylock;
>  	struct lock_class_key	*qdisc_running_key;
>  	bool			proto_down;
> diff --git a/include/linux/phylink.h b/include/linux/phylink.h
> index bd137c273d38..618fa5e83564 100644
> --- a/include/linux/phylink.h
> +++ b/include/linux/phylink.h
> @@ -211,9 +211,6 @@ void phylink_ethtool_get_pauseparam(struct phylink *,
>  				    struct ethtool_pauseparam *);
>  int phylink_ethtool_set_pauseparam(struct phylink *,
>  				   struct ethtool_pauseparam *);
> -int phylink_ethtool_get_module_info(struct phylink *, struct ethtool_modinfo *);
> -int phylink_ethtool_get_module_eeprom(struct phylink *,
> -				      struct ethtool_eeprom *, u8 *);
>  int phylink_get_eee_err(struct phylink *);
>  int phylink_ethtool_get_eee(struct phylink *, struct ethtool_eee *);
>  int phylink_ethtool_set_eee(struct phylink *, struct ethtool_eee *);
> diff --git a/net/core/ethtool.c b/net/core/ethtool.c
> index f8fcf450a36e..86a6b3d05116 100644
> --- a/net/core/ethtool.c
> +++ b/net/core/ethtool.c
> @@ -22,6 +22,7 @@
>  #include <linux/bitops.h>
>  #include <linux/uaccess.h>
>  #include <linux/vmalloc.h>
> +#include <linux/sfp.h>
>  #include <linux/slab.h>
>  #include <linux/rtnetlink.h>
>  #include <linux/sched/signal.h>
> @@ -2217,6 +2218,9 @@ static int __ethtool_get_module_info(struct net_device *dev,
>  	const struct ethtool_ops *ops = dev->ethtool_ops;
>  	struct phy_device *phydev = dev->phydev;
>  
> +	if (dev->sfp_bus)
> +		return sfp_get_module_info(dev->sfp_bus, modinfo);
> +
>  	if (phydev && phydev->drv && phydev->drv->module_info)
>  		return phydev->drv->module_info(phydev, modinfo);
>  
> @@ -2251,6 +2255,9 @@ static int __ethtool_get_module_eeprom(struct net_device *dev,
>  	const struct ethtool_ops *ops = dev->ethtool_ops;
>  	struct phy_device *phydev = dev->phydev;
>  
> +	if (dev->sfp_bus)
> +		return sfp_get_module_eeprom(dev->sfp_bus, ee, data);
> +
>  	if (phydev && phydev->drv && phydev->drv->module_eeprom)
>  		return phydev->drv->module_eeprom(phydev, ee, data);
>  
> 


-- 
Florian

^ permalink raw reply

* Re: interdependencies with cxgb4 and iw_cxgb4
From: Steve Wise @ 2018-03-19 19:50 UTC (permalink / raw)
  To: David Miller
  Cc: rajur, dledford, linux-rdma, jgg, netdev, bharat, ganeshgr,
	rahul.lakkireddy
In-Reply-To: <20180316.122150.516267509367905206.davem@davemloft.net>



On 3/16/2018 11:21 AM, David Miller wrote:
> From: "Steve Wise" <swise@opengridcomputing.com>
> Date: Wed, 14 Mar 2018 10:31:24 -0500
>
>> This issue has also been dealt-with for Mellanox drivers, I believe.  I take
>> it the solution for them was a k.o. signed repo, that they maintain, where
>> both linux-rdma and netdev take PRs from for commits that are needed in both
>> repos.   Then these are reconciled when both repos are merged into Linus'
>> repo. (I hope my understanding of this is correct)
>>
>> For Chelsio, this is perhaps a possibility, but I'm wondering if there is a
>> simpler solution?  A few other option we've been discussing include:
>>
>> 1) submit the cxgb4-only changes to netdev in release cycle X, and then only
>> submit the iw_cxgb4 (or other upper drivers) changes that use them in
>> release cycle X+1.  The pro of this is simplicity.  The con is timeliness -
>> it takes 2 release cycles to get the feature upstream.
>>
>> 2) run the entire series through one maintainer's repo (with all
>> maintainers' ACK on the content and plan, of course), and ensuring no
>> conflicting commits are submitted for the rest of that release cycle.  I'm
>> not really sure that this is feasible given anyone could create commits for
>> upstream drivers.  So how could Chelsio really control this?
>>
>> Do you have any suggestions on how we should proceed?
> I think the Mellanox setup is working well currently.
>
> If the changes get pulled into both the rdma and networking tree, then it
> all gets resolved cleanly no matter which of rdma or networking goes into
> Linus's tree first during the merge window.
>
> It doesn't have the delay issues of suggestion #1, and I think avoiding
> conflicts in situation #2 is next to impossible.
>
> In fact, such conflict problems are how we arrived at the approach
> Mellanox is using in the first place.
>

Thanks Dave.

Let me ask a dumb question:  Why cannot one of the maintaners pull the 
commit from the other mainainer's git repo directly?  IE why have this 
third trusted/signed git repo that has to be on k.o, from which both 
maintainers pull?  If one of you can pull it in via a patch series, like 
you do for all other patches, and then notify the other maintainer to 
pull it from the first maintainers' repo if the series meets the 
requirements that it needs to be in both maintainers' repositories?  
This avoids adding more staging git repos on k.o.  But probably I'm 
missing something...

Steve.

^ permalink raw reply

* Re: [bpf-next PATCH v3 07/18] bpf: sockmap, add msg_cork_bytes() helper
From: John Fastabend @ 2018-03-19 20:00 UTC (permalink / raw)
  To: Alexei Starovoitov; +Cc: davejwatson, davem, daniel, ast, netdev
In-Reply-To: <20180319163012.imwxwjcp7x6dpi65@ast-mbp.dhcp.thefacebook.com>

On 03/19/2018 09:30 AM, Alexei Starovoitov wrote:
> On Sun, Mar 18, 2018 at 12:57:20PM -0700, John Fastabend wrote:
>> In the case where we need a specific number of bytes before a
>> verdict can be assigned, even if the data spans multiple sendmsg
>> or sendfile calls. The BPF program may use msg_cork_bytes().
>>
>> The extreme case is a user can call sendmsg repeatedly with
>> 1-byte msg segments. Obviously, this is bad for performance but
>> is still valid. If the BPF program needs N bytes to validate
>> a header it can use msg_cork_bytes to specify N bytes and the
>> BPF program will not be called again until N bytes have been
>> accumulated. The infrastructure will attempt to coalesce data
>> if possible so in many cases (most my use cases at least) the
>> data will be in a single scatterlist element with data pointers
>> pointing to start/end of the element. However, this is dependent
>> on available memory so is not guaranteed. So BPF programs must
>> validate data pointer ranges, but this is the case anyways to
>> convince the verifier the accesses are valid.
>>
>> Signed-off-by: John Fastabend <john.fastabend@gmail.com>
>> ---
>>  include/uapi/linux/bpf.h |    3 ++-
>>  net/core/filter.c        |   16 ++++++++++++++++
>>  2 files changed, 18 insertions(+), 1 deletion(-)
>>
>> diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h
>> index a557a2a..1765cfb 100644
>> --- a/include/uapi/linux/bpf.h
>> +++ b/include/uapi/linux/bpf.h
>> @@ -792,7 +792,8 @@ struct bpf_stack_build_id {
>>  	FN(override_return),		\
>>  	FN(sock_ops_cb_flags_set),	\
>>  	FN(msg_redirect_map),		\
>> -	FN(msg_apply_bytes),
>> +	FN(msg_apply_bytes),		\
>> +	FN(msg_cork_bytes),
>>  
>>  /* integer value in 'imm' field of BPF_CALL instruction selects which helper
>>   * function eBPF program intends to call
>> diff --git a/net/core/filter.c b/net/core/filter.c
>> index 17d6775..0c9daf6 100644
>> --- a/net/core/filter.c
>> +++ b/net/core/filter.c
>> @@ -1942,6 +1942,20 @@ struct sock *do_msg_redirect_map(struct sk_msg_buff *msg)
>>  	.arg2_type      = ARG_ANYTHING,
>>  };
>>  
>> +BPF_CALL_2(bpf_msg_cork_bytes, struct sk_msg_buff *, msg, u32, bytes)
>> +{
>> +	msg->cork_bytes = bytes;
>> +	return 0;
>> +}
> 
> my understanding that setting it here and in the other helper *_bytes to zero
> will be effectively a nop. Right?
> 

Correct, setting cork_bytes or apply_bytes to zero is just a nop.

> Acked-by: Alexei Starovoitov <ast@kernel.org>
> 

^ permalink raw reply

* RE: [PATCH v3 11/18] qlcnic: Eliminate duplicate barriers on weakly-ordered archs
From: Chopra, Manish @ 2018-03-19 20:10 UTC (permalink / raw)
  To: Sinan Kaya, netdev@vger.kernel.org, timur@codeaurora.org,
	sulrich@codeaurora.org
  Cc: linux-arm-msm@vger.kernel.org,
	linux-arm-kernel@lists.infradead.org, Patil, Harish,
	Dept-GE Linux NIC Dev, linux-kernel@vger.kernel.org
In-Reply-To: <1521216991-28706-12-git-send-email-okaya@codeaurora.org>

> -----Original Message-----
> From: Sinan Kaya [mailto:okaya@codeaurora.org]
> Sent: Friday, March 16, 2018 9:46 PM
> To: netdev@vger.kernel.org; timur@codeaurora.org; sulrich@codeaurora.org
> Cc: linux-arm-msm@vger.kernel.org; linux-arm-kernel@lists.infradead.org;
> Sinan Kaya <okaya@codeaurora.org>; Patil, Harish <Harish.Patil@cavium.com>;
> Chopra, Manish <Manish.Chopra@cavium.com>; Dept-GE Linux NIC Dev <Dept-
> GELinuxNICDev@cavium.com>; linux-kernel@vger.kernel.org
> Subject: [PATCH v3 11/18] qlcnic: Eliminate duplicate barriers on weakly-ordered
> archs
> 
> Code includes wmb() followed by writel(). writel() already has a barrier on some
> architectures like arm64.
> 
> This ends up CPU observing two barriers back to back before executing the
> register write.
> 
> Since code already has an explicit barrier call, changing writel() to
> writel_relaxed().
> 
> Signed-off-by: Sinan Kaya <okaya@codeaurora.org>
> ---
>  drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c
> b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c
> index 46b0372..97c146e7 100644
> --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c
> +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c
> @@ -478,7 +478,7 @@ irqreturn_t qlcnic_83xx_clear_legacy_intr(struct
> qlcnic_adapter *adapter)
>  	wmb();
> 
>  	/* clear the interrupt trigger control register */
> -	writel(0, adapter->isr_int_vec);
> +	writel_relaxed(0, adapter->isr_int_vec);
>  	intr_val = readl(adapter->isr_int_vec);
>  	do {
>  		intr_val = readl(adapter->tgt_status_reg);
> --
> 2.7.4

Acked-by: Manish Chopra <manish.chopra@cavium.com>

Thanks.

^ permalink raw reply

* Re: recursive static routes
From: David Ahern @ 2018-03-19 20:11 UTC (permalink / raw)
  To: Saku Ytti; +Cc: netdev
In-Reply-To: <CAAeewD8HKt6S=xDS=cPb2xZvDjZASZGOUBfs6584qcT5h2cb1Q@mail.gmail.com>

On 3/19/18 12:58 PM, Saku Ytti wrote:
> Hey David,
> 
>> The Linux stack does not flatten routes when inserting into the FIB.
>> Recursion is expected to be done a routing daemon such as bgp which will
>> be able to handle updates as the network changes.
> 
> Are you saying that routing protocol would observe the next-hop
> change, then update the Linux kernel route to reflect that?

yes

> 
> Wouldn't that add another layer of state and the implied delays of
> maintaining and updating the state.
> 
> Is it not practical to do lookup per-packet to recurse until egress
> rewrite information is found? So literally no state in memory anywhere
> saying 0/0 next-hop is 192.0.2.42/22:22:22:22:22:22, it would always
> have to walk the FIB to find it.
> 

you want per-packet overhead instead of deferring the overhead event
based updates? network events tend to be much less frequent than
sending/forwarding packets.

^ permalink raw reply

* Re: [bpf-next PATCH v3 00/18] bpf,sockmap: sendmsg/sendfile ULP
From: Daniel Borkmann @ 2018-03-19 20:20 UTC (permalink / raw)
  To: John Fastabend, davejwatson, davem, ast; +Cc: netdev
In-Reply-To: <20180318195501.14466.25366.stgit@john-Precision-Tower-5810>

On 03/18/2018 08:56 PM, John Fastabend wrote:
> This series adds a BPF hook for sendmsg and senfile by using
> the ULP infrastructure and sockmap. A simple pseudocode example
> would be,
[...]

Series applied to bpf-next, thanks John!

^ permalink raw reply

* Re: [bpf-next PATCH v3 08/18] bpf: sk_msg program helper bpf_sk_msg_pull_data
From: Alexei Starovoitov @ 2018-03-19 20:24 UTC (permalink / raw)
  To: John Fastabend; +Cc: davejwatson, davem, daniel, ast, netdev
In-Reply-To: <20180318195725.14466.97172.stgit@john-Precision-Tower-5810>

On Sun, Mar 18, 2018 at 12:57:25PM -0700, John Fastabend wrote:
> Currently, if a bpf sk msg program is run the program
> can only parse data that the (start,end) pointers already
> consumed. For sendmsg hooks this is likely the first
> scatterlist element. For sendpage this will be the range
> (0,0) because the data is shared with userspace and by
> default we want to avoid allowing userspace to modify
> data while (or after) BPF verdict is being decided.
> 
> To support pulling in additional bytes for parsing use
> a new helper bpf_sk_msg_pull(start, end, flags) which
> works similar to cls tc logic. This helper will attempt
> to point the data start pointer at 'start' bytes offest
> into msg and data end pointer at 'end' bytes offset into
> message.
> 
> After basic sanity checks to ensure 'start' <= 'end' and
> 'end' <= msg_length there are a few cases we need to
> handle.
> 
> First the sendmsg hook has already copied the data from
> userspace and has exclusive access to it. Therefor, it
> is not necessesary to copy the data. However, it may
> be required. After finding the scatterlist element with
> 'start' offset byte in it there are two cases. One the
> range (start,end) is entirely contained in the sg element
> and is already linear. All that is needed is to update the
> data pointers, no allocate/copy is needed. The other case
> is (start, end) crosses sg element boundaries. In this
> case we allocate a block of size 'end - start' and copy
> the data to linearize it.
> 
> Next sendpage hook has not copied any data in initial
> state so that data pointers are (0,0). In this case we
> handle it similar to the above sendmsg case except the
> allocation/copy must always happen. Then when sending
> the data we have possibly three memory regions that
> need to be sent, (0, start - 1), (start, end), and
> (end + 1, msg_length). This is required to ensure any
> writes by the BPF program are correctly transmitted.
> 
> Lastly this operation will invalidate any previous
> data checks so BPF programs will have to revalidate
> pointers after making this BPF call.
> 
> Signed-off-by: John Fastabend <john.fastabend@gmail.com>
..
> +
> +	page = alloc_pages(__GFP_NOWARN | GFP_ATOMIC, get_order(copy));
> +	if (unlikely(!page))
> +		return -ENOMEM;

I think that's fine. Just curious what order do you see in practice?

Acked-by: Alexei Starovoitov <ast@kernel.org>

^ permalink raw reply

* Re: [RFC net-next] sfp/phylink: move module EEPROM ethtool access into netdev core ethtool
From: Andrew Lunn @ 2018-03-19 20:39 UTC (permalink / raw)
  To: Florian Fainelli; +Cc: Russell King, David S. Miller, netdev
In-Reply-To: <a3b7907a-d7b7-093a-20c5-21beb982e825@gmail.com>

On Mon, Mar 19, 2018 at 12:20:32PM -0700, Florian Fainelli wrote:
> On 12/17/2017 06:48 AM, Russell King wrote:
> > Provide a pointer to the SFP bus in struct net_device, so that the
> > ethtool module EEPROM methods can access the SFP directly, rather
> > than needing every user to provide a hook for it.
> > 
> > Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
> > ---
> > Questions:
> > 1. Is it worth adding a pointer to struct net_device for these two
> >    methods, rather than having multiple duplicate veneers to vector
> >    the ethtool module EEPROM ioctls through to the SFP bus layer?
> 
> Considering the negative diffstat and the fact that it solves real
> problems for you, I would say yes.

We have also received a bunch of patches removing the phydev pointer
for driver private structures and making use of the net_device one. It
would be nice to avoid the same with phylink.

      Andrew

^ permalink raw reply

* Re: [PATCH v2 iproute2 1/1] tc: fix conversion types when printing actions unsigned values
From: Roman Mashak @ 2018-03-19 20:59 UTC (permalink / raw)
  To: Stephen Hemminger
  Cc: Linux Kernel Network Developers, kernel, Jamal Hadi Salim,
	Cong Wang, Jiri Pirko, Roman Mashak
In-Reply-To: <1521483222-31395-1-git-send-email-mrv@mojatatu.com>

Please disregard this patch, I will send v3.

On Mon, Mar 19, 2018 at 2:13 PM, Roman Mashak <mrv@mojatatu.com> wrote:
> v2:
>    fixed coding style
>
> Signed-off-by: Roman Mashak <mrv@mojatatu.com>
> ---
>  tc/m_action.c     | 2 +-
>  tc/m_gact.c       | 2 +-
>  tc/m_ife.c        | 2 +-
>  tc/m_pedit.c      | 2 +-
>  tc/m_sample.c     | 6 +++---
>  tc/m_tunnel_key.c | 2 +-
>  6 files changed, 8 insertions(+), 8 deletions(-)
>
> diff --git a/tc/m_action.c b/tc/m_action.c
> index 148f1372d414..244c1ec00f28 100644
> --- a/tc/m_action.c
> +++ b/tc/m_action.c
> @@ -408,7 +408,7 @@ int print_action(const struct sockaddr_nl *who,
>         if (tb[TCA_ROOT_COUNT])
>                 tot_acts = RTA_DATA(tb[TCA_ROOT_COUNT]);
>
> -       fprintf(fp, "total acts %d\n", tot_acts ? *tot_acts:0);
> +       fprintf(fp, "total acts %u\n", tot_acts ? *tot_acts : 0);
>         if (tb[TCA_ACT_TAB] == NULL) {
>                 if (n->nlmsg_type != RTM_GETACTION)
>                         fprintf(stderr, "print_action: NULL kind\n");
> diff --git a/tc/m_gact.c b/tc/m_gact.c
> index 16c4413f4217..52022415db48 100644
> --- a/tc/m_gact.c
> +++ b/tc/m_gact.c
> @@ -194,7 +194,7 @@ print_gact(struct action_util *au, FILE *f, struct rtattr *arg)
>         print_string(PRINT_ANY, "random_type", "\n\t random type %s",
>                      prob_n2a(pp->ptype));
>         print_action_control(f, " ", pp->paction, " ");
> -       print_int(PRINT_ANY, "val", "val %d", pp->pval);
> +       print_int(PRINT_ANY, "val", "val %u", pp->pval);
>         close_json_object();
>  #endif
>         print_uint(PRINT_ANY, "index", "\n\t index %u", p->index);
> diff --git a/tc/m_ife.c b/tc/m_ife.c
> index 205efc9f1d9a..e1dbd3a79649 100644
> --- a/tc/m_ife.c
> +++ b/tc/m_ife.c
> @@ -280,7 +280,7 @@ static int print_ife(struct action_util *au, FILE *f, struct rtattr *arg)
>                         if (len) {
>                                 mtcindex =
>                                         rta_getattr_u16(metalist[IFE_META_TCINDEX]);
> -                               fprintf(f, "use tcindex %d ", mtcindex);
> +                               fprintf(f, "use tcindex %u ", mtcindex);
>                         } else
>                                 fprintf(f, "allow tcindex ");
>                 }
> diff --git a/tc/m_pedit.c b/tc/m_pedit.c
> index 26549eeea899..151dfe1a230a 100644
> --- a/tc/m_pedit.c
> +++ b/tc/m_pedit.c
> @@ -817,7 +817,7 @@ int print_pedit(struct action_util *au, FILE *f, struct rtattr *arg)
>                                 (unsigned int)ntohl(key->mask));
>                 }
>         } else {
> -               fprintf(f, "\npedit %x keys %d is not LEGIT", sel->index,
> +               fprintf(f, "\npedit %x keys %u is not LEGIT", sel->index,
>                         sel->nkeys);
>         }
>
> diff --git a/tc/m_sample.c b/tc/m_sample.c
> index 01763cb4c356..d42a6a327965 100644
> --- a/tc/m_sample.c
> +++ b/tc/m_sample.c
> @@ -155,17 +155,17 @@ static int print_sample(struct action_util *au, FILE *f, struct rtattr *arg)
>         }
>         p = RTA_DATA(tb[TCA_SAMPLE_PARMS]);
>
> -       fprintf(f, "sample rate 1/%d group %d",
> +       fprintf(f, "sample rate 1/%u group %u",
>                 rta_getattr_u32(tb[TCA_SAMPLE_RATE]),
>                 rta_getattr_u32(tb[TCA_SAMPLE_PSAMPLE_GROUP]));
>
>         if (tb[TCA_SAMPLE_TRUNC_SIZE])
> -               fprintf(f, " trunc_size %d",
> +               fprintf(f, " trunc_size %u",
>                         rta_getattr_u32(tb[TCA_SAMPLE_TRUNC_SIZE]));
>
>         print_action_control(f, " ", p->action, "");
>
> -       fprintf(f, "\n\tindex %d ref %d bind %d", p->index, p->refcnt,
> +       fprintf(f, "\n\tindex %u ref %d bind %d", p->index, p->refcnt,
>                 p->bindcnt);
>
>         if (show_stats) {
> diff --git a/tc/m_tunnel_key.c b/tc/m_tunnel_key.c
> index 1cdd03560c35..dd8f8e8c635b 100644
> --- a/tc/m_tunnel_key.c
> +++ b/tc/m_tunnel_key.c
> @@ -292,7 +292,7 @@ static int print_tunnel_key(struct action_util *au, FILE *f, struct rtattr *arg)
>         }
>         print_action_control(f, " ", parm->action, "");
>
> -       fprintf(f, "\n\tindex %d ref %d bind %d", parm->index, parm->refcnt,
> +       fprintf(f, "\n\tindex %u ref %d bind %d", parm->index, parm->refcnt,
>                 parm->bindcnt);
>
>         if (show_stats) {
> --
> 2.7.4
>



-- 
Roman Mashak

^ permalink raw reply

* [PATCH v3 iproute2 1/1] tc: fix conversion types when printing actions unsigned values
From: Roman Mashak @ 2018-03-19 21:05 UTC (permalink / raw)
  To: stephen; +Cc: netdev, jhs, xiyou.wangcong, jiri, Roman Mashak

v3:
   fixed conversion in connmark missed out in first version
v2:
   fixed coding style

Signed-off-by: Roman Mashak <mrv@mojatatu.com>
---
 tc/m_action.c     | 2 +-
 tc/m_connmark.c   | 2 +-
 tc/m_gact.c       | 2 +-
 tc/m_ife.c        | 2 +-
 tc/m_pedit.c      | 2 +-
 tc/m_sample.c     | 6 +++---
 tc/m_tunnel_key.c | 2 +-
 7 files changed, 9 insertions(+), 9 deletions(-)

diff --git a/tc/m_action.c b/tc/m_action.c
index 148f1372d414..244c1ec00f28 100644
--- a/tc/m_action.c
+++ b/tc/m_action.c
@@ -408,7 +408,7 @@ int print_action(const struct sockaddr_nl *who,
 	if (tb[TCA_ROOT_COUNT])
 		tot_acts = RTA_DATA(tb[TCA_ROOT_COUNT]);
 
-	fprintf(fp, "total acts %d\n", tot_acts ? *tot_acts:0);
+	fprintf(fp, "total acts %u\n", tot_acts ? *tot_acts : 0);
 	if (tb[TCA_ACT_TAB] == NULL) {
 		if (n->nlmsg_type != RTM_GETACTION)
 			fprintf(stderr, "print_action: NULL kind\n");
diff --git a/tc/m_connmark.c b/tc/m_connmark.c
index 37d718541549..7c4ba7ae5301 100644
--- a/tc/m_connmark.c
+++ b/tc/m_connmark.c
@@ -121,7 +121,7 @@ static int print_connmark(struct action_util *au, FILE *f, struct rtattr *arg)
 
 	ci = RTA_DATA(tb[TCA_CONNMARK_PARMS]);
 
-	fprintf(f, " connmark zone %d\n", ci->zone);
+	fprintf(f, " connmark zone %u\n", ci->zone);
 	fprintf(f, "\t index %u ref %d bind %d", ci->index,
 		ci->refcnt, ci->bindcnt);
 
diff --git a/tc/m_gact.c b/tc/m_gact.c
index 16c4413f4217..52022415db48 100644
--- a/tc/m_gact.c
+++ b/tc/m_gact.c
@@ -194,7 +194,7 @@ print_gact(struct action_util *au, FILE *f, struct rtattr *arg)
 	print_string(PRINT_ANY, "random_type", "\n\t random type %s",
 		     prob_n2a(pp->ptype));
 	print_action_control(f, " ", pp->paction, " ");
-	print_int(PRINT_ANY, "val", "val %d", pp->pval);
+	print_int(PRINT_ANY, "val", "val %u", pp->pval);
 	close_json_object();
 #endif
 	print_uint(PRINT_ANY, "index", "\n\t index %u", p->index);
diff --git a/tc/m_ife.c b/tc/m_ife.c
index 205efc9f1d9a..e1dbd3a79649 100644
--- a/tc/m_ife.c
+++ b/tc/m_ife.c
@@ -280,7 +280,7 @@ static int print_ife(struct action_util *au, FILE *f, struct rtattr *arg)
 			if (len) {
 				mtcindex =
 					rta_getattr_u16(metalist[IFE_META_TCINDEX]);
-				fprintf(f, "use tcindex %d ", mtcindex);
+				fprintf(f, "use tcindex %u ", mtcindex);
 			} else
 				fprintf(f, "allow tcindex ");
 		}
diff --git a/tc/m_pedit.c b/tc/m_pedit.c
index 26549eeea899..151dfe1a230a 100644
--- a/tc/m_pedit.c
+++ b/tc/m_pedit.c
@@ -817,7 +817,7 @@ int print_pedit(struct action_util *au, FILE *f, struct rtattr *arg)
 				(unsigned int)ntohl(key->mask));
 		}
 	} else {
-		fprintf(f, "\npedit %x keys %d is not LEGIT", sel->index,
+		fprintf(f, "\npedit %x keys %u is not LEGIT", sel->index,
 			sel->nkeys);
 	}
 
diff --git a/tc/m_sample.c b/tc/m_sample.c
index 01763cb4c356..d42a6a327965 100644
--- a/tc/m_sample.c
+++ b/tc/m_sample.c
@@ -155,17 +155,17 @@ static int print_sample(struct action_util *au, FILE *f, struct rtattr *arg)
 	}
 	p = RTA_DATA(tb[TCA_SAMPLE_PARMS]);
 
-	fprintf(f, "sample rate 1/%d group %d",
+	fprintf(f, "sample rate 1/%u group %u",
 		rta_getattr_u32(tb[TCA_SAMPLE_RATE]),
 		rta_getattr_u32(tb[TCA_SAMPLE_PSAMPLE_GROUP]));
 
 	if (tb[TCA_SAMPLE_TRUNC_SIZE])
-		fprintf(f, " trunc_size %d",
+		fprintf(f, " trunc_size %u",
 			rta_getattr_u32(tb[TCA_SAMPLE_TRUNC_SIZE]));
 
 	print_action_control(f, " ", p->action, "");
 
-	fprintf(f, "\n\tindex %d ref %d bind %d", p->index, p->refcnt,
+	fprintf(f, "\n\tindex %u ref %d bind %d", p->index, p->refcnt,
 		p->bindcnt);
 
 	if (show_stats) {
diff --git a/tc/m_tunnel_key.c b/tc/m_tunnel_key.c
index 1cdd03560c35..dd8f8e8c635b 100644
--- a/tc/m_tunnel_key.c
+++ b/tc/m_tunnel_key.c
@@ -292,7 +292,7 @@ static int print_tunnel_key(struct action_util *au, FILE *f, struct rtattr *arg)
 	}
 	print_action_control(f, " ", parm->action, "");
 
-	fprintf(f, "\n\tindex %d ref %d bind %d", parm->index, parm->refcnt,
+	fprintf(f, "\n\tindex %u ref %d bind %d", parm->index, parm->refcnt,
 		parm->bindcnt);
 
 	if (show_stats) {
-- 
2.7.4

^ permalink raw reply related

* [PATCH net-next 0/2] Fixes to allow mv88e6xxx module to be reloaded
From: Andrew Lunn @ 2018-03-19 21:16 UTC (permalink / raw)
  To: David Miller; +Cc: netdev, u.kleine-koenig, Andrew Lunn

As reported by Uwe Kleine-K�nig, the interrupt trigger is first
configured by DT and then reconfigured to edge. This results in a
failure on EPROBE_DEFER, or if the module is unloaded and reloaded.

A second crash happens on module reload due to a missing call to the
common IRQ free code when using polled interrupts.

With these fixes in place, it becomes possible to load and unload the
kernel modules a few times without it crashing.

Andrew Lunn (2):
  net: dsa: mv88e6xxx: Use the DT IRQ trigger mode
  net: dsa: mv88e6xxx: Call the common IRQ free code

 drivers/net/dsa/mv88e6xxx/chip.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

-- 
2.16.2

^ permalink raw reply

* [PATCH net-next 2/2] net: dsa: mv88e6xxx: Call the common IRQ free code
From: Andrew Lunn @ 2018-03-19 21:16 UTC (permalink / raw)
  To: David Miller; +Cc: netdev, u.kleine-koenig, Andrew Lunn
In-Reply-To: <1521494181-4653-1-git-send-email-andrew@lunn.ch>

When free'ing the polled IRQs, call the common irq free code.
Otherwise the interrupts are left registered, and when we come to load
the driver a second time, we get an Opps.

Signed-off-by: Andrew Lunn <andrew@lunn.ch>
---
 drivers/net/dsa/mv88e6xxx/chip.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/net/dsa/mv88e6xxx/chip.c b/drivers/net/dsa/mv88e6xxx/chip.c
index 84e6febaf881..85de118c4838 100644
--- a/drivers/net/dsa/mv88e6xxx/chip.c
+++ b/drivers/net/dsa/mv88e6xxx/chip.c
@@ -467,6 +467,8 @@ static int mv88e6xxx_irq_poll_setup(struct mv88e6xxx_chip *chip)
 
 static void mv88e6xxx_irq_poll_free(struct mv88e6xxx_chip *chip)
 {
+	mv88e6xxx_g1_irq_free_common(chip);
+
 	kthread_cancel_delayed_work_sync(&chip->irq_poll_work);
 	kthread_destroy_worker(chip->kworker);
 }
-- 
2.16.2

^ permalink raw reply related

* [PATCH net-next 1/2] net: dsa: mv88e6xxx: Use the DT IRQ trigger mode
From: Andrew Lunn @ 2018-03-19 21:16 UTC (permalink / raw)
  To: David Miller; +Cc: netdev, u.kleine-koenig, Andrew Lunn
In-Reply-To: <1521494181-4653-1-git-send-email-andrew@lunn.ch>

By calling request_threaded_irq() with the flag IRQF_TRIGGER_FALLING
we override the trigger mode provided in device tree. And the
interrupt is actually active low, which is what all the current device
tree descriptions use.

Suggested-by: Uwe Kleine-K�nig <u.kleine-koenig@pengutronix.de>
Signed-off-by: Andrew Lunn <andrew@lunn.ch>
---
 drivers/net/dsa/mv88e6xxx/chip.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/net/dsa/mv88e6xxx/chip.c b/drivers/net/dsa/mv88e6xxx/chip.c
index fe46b40195fa..84e6febaf881 100644
--- a/drivers/net/dsa/mv88e6xxx/chip.c
+++ b/drivers/net/dsa/mv88e6xxx/chip.c
@@ -425,7 +425,7 @@ static int mv88e6xxx_g1_irq_setup(struct mv88e6xxx_chip *chip)
 
 	err = request_threaded_irq(chip->irq, NULL,
 				   mv88e6xxx_g1_irq_thread_fn,
-				   IRQF_ONESHOT | IRQF_TRIGGER_FALLING,
+				   IRQF_ONESHOT,
 				   dev_name(chip->dev), chip);
 	if (err)
 		mv88e6xxx_g1_irq_free_common(chip);
-- 
2.16.2

^ permalink raw reply related


This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox