* [net-next 1/8] tipc: refactor function tipc_enable_bearer()
From: Jon Maloy @ 2018-03-22 19:42 UTC (permalink / raw)
To: davem, netdev; +Cc: tipc-discussion, mohan.krishna.ghanta.krishnamurthy
In-Reply-To: <1521747772-7727-1-git-send-email-jon.maloy@ericsson.com>
As a preparation for the next commits we try to reduce the footprint of
the function tipc_enable_bearer(), while hopefully making is simpler to
follow.
Acked-by: Ying Xue <ying.xue@windriver.com>
Signed-off-by: Jon Maloy <jon.maloy@ericsson.com>
---
net/tipc/bearer.c | 136 ++++++++++++++++++++++++++++--------------------------
1 file changed, 70 insertions(+), 66 deletions(-)
diff --git a/net/tipc/bearer.c b/net/tipc/bearer.c
index f3d2e83..e18cb27 100644
--- a/net/tipc/bearer.c
+++ b/net/tipc/bearer.c
@@ -230,88 +230,90 @@ void tipc_bearer_remove_dest(struct net *net, u32 bearer_id, u32 dest)
* tipc_enable_bearer - enable bearer with the given name
*/
static int tipc_enable_bearer(struct net *net, const char *name,
- u32 disc_domain, u32 priority,
+ u32 disc_domain, u32 prio,
struct nlattr *attr[])
{
- struct tipc_net *tn = net_generic(net, tipc_net_id);
+ struct tipc_net *tn = tipc_net(net);
+ struct tipc_bearer_names b_names;
+ u32 self = tipc_own_addr(net);
+ int with_this_prio = 1;
struct tipc_bearer *b;
struct tipc_media *m;
- struct tipc_bearer_names b_names;
struct sk_buff *skb;
char addr_string[16];
- u32 bearer_id;
- u32 with_this_prio;
- u32 i;
+ int bearer_id = 0;
int res = -EINVAL;
+ char *errstr = "";
- if (!tn->own_addr) {
- pr_warn("Bearer <%s> rejected, not supported in standalone mode\n",
- name);
- return -ENOPROTOOPT;
+ if (!self) {
+ errstr = "not supported in standalone mode";
+ res = -ENOPROTOOPT;
+ goto rejected;
}
+
if (!bearer_name_validate(name, &b_names)) {
- pr_warn("Bearer <%s> rejected, illegal name\n", name);
- return -EINVAL;
+ errstr = "illegal name";
+ goto rejected;
}
- if (tipc_addr_domain_valid(disc_domain) &&
- (disc_domain != tn->own_addr)) {
- if (tipc_in_scope(disc_domain, tn->own_addr)) {
- disc_domain = tn->own_addr & TIPC_ZONE_CLUSTER_MASK;
- res = 0; /* accept any node in own cluster */
- } else if (in_own_cluster_exact(net, disc_domain))
- res = 0; /* accept specified node in own cluster */
+
+ if (tipc_addr_domain_valid(disc_domain) && disc_domain != self) {
+ if (tipc_in_scope(disc_domain, self)) {
+ /* Accept any node in own cluster */
+ disc_domain = self & TIPC_ZONE_CLUSTER_MASK;
+ res = 0;
+ } else if (in_own_cluster_exact(net, disc_domain)) {
+ /* Accept specified node in own cluster */
+ res = 0;
+ }
}
if (res) {
- pr_warn("Bearer <%s> rejected, illegal discovery domain\n",
- name);
- return -EINVAL;
+ errstr = "illegal discovery domain";
+ goto rejected;
}
- if ((priority > TIPC_MAX_LINK_PRI) &&
- (priority != TIPC_MEDIA_LINK_PRI)) {
- pr_warn("Bearer <%s> rejected, illegal priority\n", name);
- return -EINVAL;
+
+ if (prio > TIPC_MAX_LINK_PRI && prio != TIPC_MEDIA_LINK_PRI) {
+ errstr = "illegal priority";
+ goto rejected;
}
m = tipc_media_find(b_names.media_name);
if (!m) {
- pr_warn("Bearer <%s> rejected, media <%s> not registered\n",
- name, b_names.media_name);
- return -EINVAL;
+ errstr = "media not registered";
+ goto rejected;
}
- if (priority == TIPC_MEDIA_LINK_PRI)
- priority = m->priority;
+ if (prio == TIPC_MEDIA_LINK_PRI)
+ prio = m->priority;
-restart:
- bearer_id = MAX_BEARERS;
- with_this_prio = 1;
- for (i = MAX_BEARERS; i-- != 0; ) {
- b = rtnl_dereference(tn->bearer_list[i]);
- if (!b) {
- bearer_id = i;
- continue;
- }
+ /* Check new bearer vs existing ones and find free bearer id if any */
+ while (bearer_id < MAX_BEARERS) {
+ b = rtnl_dereference(tn->bearer_list[bearer_id]);
+ if (!b)
+ break;
if (!strcmp(name, b->name)) {
- pr_warn("Bearer <%s> rejected, already enabled\n",
- name);
- return -EINVAL;
+ errstr = "already enabled";
+ goto rejected;
}
- if ((b->priority == priority) &&
- (++with_this_prio > 2)) {
- if (priority-- == 0) {
- pr_warn("Bearer <%s> rejected, duplicate priority\n",
- name);
- return -EINVAL;
- }
- pr_warn("Bearer <%s> priority adjustment required %u->%u\n",
- name, priority + 1, priority);
- goto restart;
+ bearer_id++;
+ if (b->priority != prio)
+ continue;
+ if (++with_this_prio <= 2)
+ continue;
+ pr_warn("Bearer <%s>: already 2 bearers with priority %u\n",
+ name, prio);
+ if (prio == TIPC_MIN_LINK_PRI) {
+ errstr = "cannot adjust to lower";
+ goto rejected;
}
+ pr_warn("Bearer <%s>: trying with adjusted priority\n", name);
+ prio--;
+ bearer_id = 0;
+ with_this_prio = 1;
}
+
if (bearer_id >= MAX_BEARERS) {
- pr_warn("Bearer <%s> rejected, bearer limit reached (%u)\n",
- name, MAX_BEARERS);
- return -EINVAL;
+ errstr = "max 3 bearers permitted";
+ goto rejected;
}
b = kzalloc(sizeof(*b), GFP_ATOMIC);
@@ -322,10 +324,9 @@ static int tipc_enable_bearer(struct net *net, const char *name,
b->media = m;
res = m->enable_media(net, b, attr);
if (res) {
- pr_warn("Bearer <%s> rejected, enable failure (%d)\n",
- name, -res);
kfree(b);
- return -EINVAL;
+ errstr = "failed to enable media";
+ goto rejected;
}
b->identity = bearer_id;
@@ -333,15 +334,15 @@ static int tipc_enable_bearer(struct net *net, const char *name,
b->window = m->window;
b->domain = disc_domain;
b->net_plane = bearer_id + 'A';
- b->priority = priority;
+ b->priority = prio;
test_and_set_bit_lock(0, &b->up);
res = tipc_disc_create(net, b, &b->bcast_addr, &skb);
if (res) {
bearer_disable(net, b);
- pr_warn("Bearer <%s> rejected, discovery object creation failed\n",
- name);
- return -EINVAL;
+ kfree(b);
+ errstr = "failed to create discoverer";
+ goto rejected;
}
rcu_assign_pointer(tn->bearer_list[bearer_id], b);
@@ -353,9 +354,12 @@ static int tipc_enable_bearer(struct net *net, const char *name,
return -ENOMEM;
}
- pr_info("Enabled bearer <%s>, discovery domain %s, priority %u\n",
- name,
- tipc_addr_string_fill(addr_string, disc_domain), priority);
+ tipc_addr_string_fill(addr_string, disc_domain);
+ pr_info("Enabled bearer <%s>, discovery scope %s, priority %u\n",
+ name, addr_string, prio);
+ return res;
+rejected:
+ pr_warn("Bearer <%s> rejected, %s\n", name, errstr);
return res;
}
--
2.1.4
------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
^ permalink raw reply related
* [net-next 0/8] tipc: introduce 128-bit auto-configurable node id
From: Jon Maloy @ 2018-03-22 19:42 UTC (permalink / raw)
To: davem, netdev; +Cc: tipc-discussion, mohan.krishna.ghanta.krishnamurthy
We introduce a 128-bit free-format node identity as an alternative to
the legacy <Zone.Cluster.Node> structured 32-bit node address.
We also make configuration of this identity optional; if a bearer is
enabled without a pre-configured node id it will be set automatically
based on the used interface's MAC or IP address.
Jon Maloy (8):
tipc: refactor function tipc_enable_bearer()
tipc: some cleanups in the file discover.c
tipc: remove restrictions on node address values
tipc: allow closest-first lookup algorithm when legacy address is
configured
tipc: remove direct accesses to own_addr field in struct tipc_net
tipc: add 128-bit node identifier
tipc: handle collisions of 32-bit node address hash values
tipc: obtain node identity from interface by default
include/uapi/linux/tipc_netlink.h | 2 +
net/tipc/addr.c | 128 +++++++------
net/tipc/addr.h | 37 ++--
net/tipc/bearer.c | 152 +++++++--------
net/tipc/bearer.h | 2 +-
net/tipc/core.c | 6 +-
net/tipc/core.h | 11 +-
net/tipc/discover.c | 392 ++++++++++++++++++++++----------------
net/tipc/discover.h | 8 +-
net/tipc/link.c | 33 ++--
net/tipc/link.h | 4 +-
net/tipc/msg.h | 23 ++-
net/tipc/name_distr.c | 17 +-
net/tipc/name_table.c | 14 +-
net/tipc/net.c | 80 ++++----
net/tipc/net.h | 5 +-
net/tipc/node.c | 101 ++++++++--
net/tipc/node.h | 8 +-
net/tipc/socket.c | 23 +--
net/tipc/udp_media.c | 13 ++
20 files changed, 634 insertions(+), 425 deletions(-)
--
2.1.4
------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
^ permalink raw reply
* Re: [PATCH net-next 0/9] Add support of VF Reset to HNS3 VF driver
From: David Miller @ 2018-03-22 19:34 UTC (permalink / raw)
To: salil.mehta; +Cc: yisen.zhuang, mehta.salil.lnk, netdev, linux-kernel, linuxarm
In-Reply-To: <20180322142900.22860-1-salil.mehta@huawei.com>
From: Salil Mehta <salil.mehta@huawei.com>
Date: Thu, 22 Mar 2018 14:28:51 +0000
> This patch-set adds the support of VF reset to the existing VF driver.
> VF Reset can be triggered due to TX watchdog firing as a result of TX
> data-path not working. VF reset could also be a result of some internal
> configuration changes if that requires reset, or as a result of the
> PF/Core/Global/IMP(Integrated Management Processor) reset happened in
> the PF.
>
> Summary of Patches:
> * Watchdog timer trigger chnages are present in Patch 1.
> * Reset Service Task and related Event handling is present in Patches {2,3}
> * Changes to send reset request to PF, reset stack and re-initialization
> of the hclge device is present in Patches {4,5,6}
> * Changes related to ARQ (Asynchronous Receive Queue) and its event handling
> are present in Patches {7,8}
> * Changes required in PF to handle the VF Reset request and actually perform
> hardware VF reset is there in Patch 9.
>
>
> NOTE: This patch depends upon "[PATCH net-next 00/11] fix some bugs for HNS3 driver"
> Link: https://lkml.org/lkml/2018/3/21/72
Series applied, thank you.
Please audit your usage of the various reset state bits.
In most places you do the correct atomic sequence by making use of
test_and_set_bit() and test_and_clear_bit().
But in some cases you do things like:
if (!test_bit(X) && !test_bit(Y)) {
...
set_bit(Y);
}
which is racy.
^ permalink raw reply
* Re: [PATCH v3 bpf-next 01/10] treewide: remove struct-pass-by-value from tracepoints arguments
From: Alexei Starovoitov @ 2018-03-22 19:31 UTC (permalink / raw)
To: Steven Rostedt
Cc: davem, daniel, torvalds, peterz, netdev, kernel-team, linux-api
In-Reply-To: <20180322141119.7c876c13@gandalf.local.home>
On 3/22/18 11:11 AM, Steven Rostedt wrote:
> On Thu, 22 Mar 2018 11:01:48 -0700
> Alexei Starovoitov <ast@fb.com> wrote:
>
>> From: Alexei Starovoitov <ast@kernel.org>
>>
>> Fix all tracepoint arguments to pass structures (large and small) by reference
>> instead of by value.
>> Avoiding passing large structs by value is a good coding style.
>> Passing small structs sometimes is beneficial, but in all cases
>> it makes no difference vs readability of the code.
>> The subsequent patch enforces that all tracepoints args are either integers
>> or pointers and fit into 64-bit.
>
> But some of these structures are used to force type checking, and are
> just the same size as a number. That's why they don't have "struct" in
> front of them. Like pmd_t. Will the subsequent patches really break if
> the structure itself has one element that is of size long? Just seems
> to add extra code to pass in an address to something that fits into a
> single register.
yeah. C doesn't allow casting of 'struct s { u64 var };' into u64
without massive hacks and aliasing warnings by compiler.
CAST_TO_U64 macro in patch 7 will prevent tracepoint arguments to be
things like pmd_t. It's not perfect, but doing & of pmd_t variable
is imo clean enough as you can see in this patch.
The macro can be tweaked to do the cast like
*(sizeof(typeof(arg))*)&arg,
but there is no way to get rid of compiler warning.
^ permalink raw reply
* Re: [RESEND PATCH net-next 1/1] tc-testing: updated police, mirred, skbedit and skbmod with more tests
From: Roman Mashak @ 2018-03-22 19:29 UTC (permalink / raw)
To: David Miller; +Cc: netdev, jhs, xiyou.wangcong, jiri
In-Reply-To: <20180322.151449.503087758560703302.davem@davemloft.net>
David Miller <davem@davemloft.net> writes:
> From: Roman Mashak <mrv@mojatatu.com>
> Date: Thu, 22 Mar 2018 08:23:22 -0400
>
>> diff --git a/tools/testing/selftests/tc-testing/tc-tests/actions/skbmod.json b/tools/testing/selftests/tc-testing/tc-tests/actions/skbmod.json
>> index 90bba48c3f07..8aa5a88ccb19 100644
>> --- a/tools/testing/selftests/tc-testing/tc-tests/actions/skbmod.json
>> +++ b/tools/testing/selftests/tc-testing/tc-tests/actions/skbmod.json
> ...
>> ]
>> }
>> -]
>> +]
>> \ No newline at end of file
>> --
>> 2.7.4
>
> Please fix this.
The patch updates police.json, mirred.json, skbedit.json and
skbmod.json files that initially had no newline on the end.
^ permalink raw reply
* Re: [patch net-next RFC 00/12] devlink: introduce port flavours and common phys_port_name generation
From: Andy Gospodarek @ 2018-03-22 19:25 UTC (permalink / raw)
To: David Ahern
Cc: Jiri Pirko, netdev, davem, idosch, jakub.kicinski, mlxsw, andrew,
vivien.didelot, f.fainelli, michael.chan, ganeshgr, saeedm,
simon.horman, pieter.jansenvanvuuren, john.hurley,
dirk.vandermerwe, alexander.h.duyck, ogerlitz, vijaya.guvva,
satananda.burla, raghu.vatsavayi, felix.manlunas, sathya.perla,
vasundhara-v.volam, tariqt, eranbe, jeffrey.t.kirsher
In-Reply-To: <fde6feca-9616-c3a9-2ab5-1ecfe8741ca6@gmail.com>
On Thu, Mar 22, 2018 at 01:10:38PM -0600, David Ahern wrote:
> On 3/22/18 11:49 AM, Jiri Pirko wrote:
> > Thu, Mar 22, 2018 at 04:34:07PM CET, dsahern@gmail.com wrote:
> >> On 3/22/18 4:55 AM, Jiri Pirko wrote:
> >>> From: Jiri Pirko <jiri@mellanox.com>
> >>>
> >>> This patchset resolves 2 issues we have right now:
> >>> 1) There are many netdevices / ports in the system, for port, pf, vf
> >>> represenatation but the user has no way to see which is which
> >>> 2) The ndo_get_phys_port_name is implemented in each driver separatelly,
> >>> which may lead to inconsistent names between drivers.
> >>
> >> Similar to ndo_get_phys_port_{name,id}, devlink requires drivers to opt
> >> in with an implementation right, so you can't really force a solution to
> >> the consistent naming.
> >
> > Yeah, drivers would still have free choice to implemen the ndo
> > themselves. But most of them, like all sriov switch drivers should use
> > the devlink helper to have consistent naming. In other words, devlink
> > helper should be the standard way, in weird cases (like rocker), driver
> > implements it himself.
>
> That's an assumption that somehow the devlink API will be better
> supported than ndo_get_phys_port_{name,id}. Don't get me wrong -- an API
> to show the kind of device is needed, but I do not think this enforces
> any kind of consistency in naming.
>
> >
> >
> >>
> >>>
> >>> This patchset introduces port flavours which should address the first
> >>> problem. I'm testing this with Netronome nfp hardware. When the user
> >>> has 2 physical ports, 1 pf, and 4 vfs, he should see something like this:
> >>> # devlink port
> >>> pci/0000:05:00.0/0: type eth netdev enp5s0np0 flavour physical number 0
> >>> pci/0000:05:00.0/268435456: type eth netdev eth0 flavour physical number 0
> >>> pci/0000:05:00.0/268435460: type eth netdev enp5s0np1 flavour physical number 1
> >>> pci/0000:05:00.0/536875008: type eth netdev eth2 flavour pf_rep number 536875008
> >>> pci/0000:05:00.0/536870912: type eth netdev eth1 flavour vf_rep number 0
> >>> pci/0000:05:00.0/536870976: type eth netdev eth3 flavour vf_rep number 1
> >>> pci/0000:05:00.0/536871040: type eth netdev eth4 flavour vf_rep number 2
> >>> pci/0000:05:00.0/536871104: type eth netdev eth5 flavour vf_rep number 3
> >>
> >> How about 'kind' instead of flavo{u}r?
> >
> > Yeah, kind is often used in kernel already with different meaning
> > git grep kind net/core
> > I wanted to avoid confusions
>
> Roopa's amendment works as well; I just think flavor / flavour is the
> wrong word. Make me thinks of food ... ice cream vs netdevices.
Naming it a 'subtype' could also work. It's a bit longer than 'kind'
(no longer than 'flavour') and accurately describes the characteristic
of this port. It also avoids the namespace collision of 'kind' that
Jiri points out.
It also fits with the names used in the PCI world with vendor:device and
subsystem vendor:subsystem device naming used there for further
granularity.
^ permalink raw reply
* Re: [PATCH] caif_dev: use true and false for boolean values
From: Gustavo A. R. Silva @ 2018-03-22 19:24 UTC (permalink / raw)
To: Dmitry Tarnyagin, David S. Miller; +Cc: netdev, linux-kernel
In-Reply-To: <20180305220537.GA15924@embeddedor.com>
Hi all,
I was just wondering about the status of this patch.
Thanks!
--
Gustavo
On 03/05/2018 04:05 PM, Gustavo A. R. Silva wrote:
> Assign true or false to boolean variables instead of an integer value.
>
> This issue was detected with the help of Coccinelle.
>
> Signed-off-by: Gustavo A. R. Silva <garsilva@embeddedor.com>
> ---
> net/caif/caif_dev.c | 8 ++++----
> 1 file changed, 4 insertions(+), 4 deletions(-)
>
> diff --git a/net/caif/caif_dev.c b/net/caif/caif_dev.c
> index e0adcd1..f2848d6 100644
> --- a/net/caif/caif_dev.c
> +++ b/net/caif/caif_dev.c
> @@ -139,7 +139,7 @@ static void caif_flow_cb(struct sk_buff *skb)
>
> spin_lock_bh(&caifd->flow_lock);
> send_xoff = caifd->xoff;
> - caifd->xoff = 0;
> + caifd->xoff = false;
> dtor = caifd->xoff_skb_dtor;
>
> if (WARN_ON(caifd->xoff_skb != skb))
> @@ -213,7 +213,7 @@ static int transmit(struct cflayer *layer, struct cfpkt *pkt)
> pr_debug("queue has stopped(%d) or is full (%d > %d)\n",
> netif_queue_stopped(caifd->netdev),
> qlen, high);
> - caifd->xoff = 1;
> + caifd->xoff = true;
> caifd->xoff_skb = skb;
> caifd->xoff_skb_dtor = skb->destructor;
> skb->destructor = caif_flow_cb;
> @@ -400,7 +400,7 @@ static int caif_device_notify(struct notifier_block *me, unsigned long what,
> break;
> }
>
> - caifd->xoff = 0;
> + caifd->xoff = false;
> cfcnfg_set_phy_state(cfg, &caifd->layer, true);
> rcu_read_unlock();
>
> @@ -435,7 +435,7 @@ static int caif_device_notify(struct notifier_block *me, unsigned long what,
> if (caifd->xoff_skb_dtor != NULL && caifd->xoff_skb != NULL)
> caifd->xoff_skb->destructor = caifd->xoff_skb_dtor;
>
> - caifd->xoff = 0;
> + caifd->xoff = false;
> caifd->xoff_skb_dtor = NULL;
> caifd->xoff_skb = NULL;
>
>
^ permalink raw reply
* Re: [PATCH net-next 1/1] tc-testing: Correct compound statements for namespace execution
From: Lucas Bates @ 2018-03-22 19:14 UTC (permalink / raw)
To: David Miller
Cc: Linux Kernel Network Developers, kernel, Jamal Hadi Salim,
Cong Wang, Jiri Pirko
In-Reply-To: <20180322.144805.414248356089707277.davem@davemloft.net>
On Thu, Mar 22, 2018 at 2:48 PM, David Miller <davem@davemloft.net> wrote:
> From: Lucas Bates <lucasb@mojatatu.com>
> Date: Wed, 21 Mar 2018 11:49:40 -0400
>
>> }
>> -]
>> \ No newline at end of file
>> +]
>> --
>> 2.7.4
>
> Please fix this.
This patch fixes the gact.json file that had no newline on the end.
^ permalink raw reply
* Re: [PATCH net-next v2] net: mvpp2: Don't use dynamic allocs for local variables
From: Maxime Chevallier @ 2018-03-22 19:14 UTC (permalink / raw)
To: David Miller
Cc: netdev, linux-kernel, antoine.tenart, thomas.petazzoni,
gregory.clement, miquel.raynal, nadavh, stefanc, ymarkman, mw
In-Reply-To: <20180322.144709.550558706036978967.davem@davemloft.net>
Hello David,
On Thu, 22 Mar 2018 14:47:09 -0400 (EDT),
David Miller <davem@davemloft.net> wrote :
> From: Maxime Chevallier <maxime.chevallier@bootlin.com>
> Date: Wed, 21 Mar 2018 16:14:00 +0100
>
> > diff --git a/drivers/net/ethernet/marvell/mvpp2.c
> > b/drivers/net/ethernet/marvell/mvpp2.c index
> > 9bd35f2291d6..28e33e139178 100644 ---
> > a/drivers/net/ethernet/marvell/mvpp2.c +++
> > b/drivers/net/ethernet/marvell/mvpp2.c @@ -1913,16 +1913,11 @@
> > static void mvpp2_prs_sram_offset_set(struct mvpp2_prs_entry *pe, }
> >
> > /* Find parser flow entry */
> > -static struct mvpp2_prs_entry *mvpp2_prs_flow_find(struct mvpp2
> > *priv, int flow) +static int mvpp2_prs_flow_find(struct mvpp2
> > *priv, int flow) {
> > - struct mvpp2_prs_entry *pe;
> > + struct mvpp2_prs_entry pe;
> > int tid;
> >
> > - pe = kzalloc(sizeof(*pe), GFP_KERNEL);
> > - if (!pe)
> > - return NULL;
> > - mvpp2_prs_tcam_lu_set(pe, MVPP2_PRS_LU_FLOWS);
> > -
>
> In order to be an equivalent change you must bzero out this 'pe'
> object on the stack. You are only initializing the index member
> before passing it into other functions.
I agree that this is unclear, but the functions I pass these objects to
only need the index field to be set, and will fill the rest of the
object according to the underlying HW representation (these objects
mirror the HW configuration).
I can see that this is confusing, we might want to make the
mvpp2_prs_hw_read function more explicit about this.
Would comments explaning this be enough, or should I try another way to
make this cleaner ?
Thanks,
Maxime
^ permalink raw reply
* Re: [RESEND PATCH net-next 1/1] tc-testing: updated police, mirred, skbedit and skbmod with more tests
From: David Miller @ 2018-03-22 19:14 UTC (permalink / raw)
To: mrv; +Cc: netdev, jhs, xiyou.wangcong, jiri
In-Reply-To: <1521721402-28750-1-git-send-email-mrv@mojatatu.com>
From: Roman Mashak <mrv@mojatatu.com>
Date: Thu, 22 Mar 2018 08:23:22 -0400
> diff --git a/tools/testing/selftests/tc-testing/tc-tests/actions/skbmod.json b/tools/testing/selftests/tc-testing/tc-tests/actions/skbmod.json
> index 90bba48c3f07..8aa5a88ccb19 100644
> --- a/tools/testing/selftests/tc-testing/tc-tests/actions/skbmod.json
> +++ b/tools/testing/selftests/tc-testing/tc-tests/actions/skbmod.json
...
> ]
> }
> -]
> +]
> \ No newline at end of file
> --
> 2.7.4
Please fix this.
^ permalink raw reply
* Re: [PATCH net-next v3 0/5] Rework ip_ra_chain protection
From: David Miller @ 2018-03-22 19:14 UTC (permalink / raw)
To: ktkhai
Cc: yoshfuji, edumazet, yanhaishuang, nikolay, yotamg, soheil, avagin,
nicolas.dichtel, ebiederm, fw, roman.kapl, netdev, xiyou.wangcong,
dvyukov, andreyknvl, lkp
In-Reply-To: <152171176936.18202.11912079579606814167.stgit@localhost.localdomain>
From: Kirill Tkhai <ktkhai@virtuozzo.com>
Date: Thu, 22 Mar 2018 12:44:46 +0300
> Commit 1215e51edad1 "ipv4: fix a deadlock in ip_ra_control"
> made rtnl_lock() be used in raw_close(). This function is called
> on every RAW socket destruction, so that rtnl_mutex is taken
> every time. This scales very sadly. I observe cleanup_net()
> spending a lot of time in rtnl_lock() and raw_close() is one
> of the biggest rtnl user (since we have percpu net->ipv4.icmp_sk).
>
> This patchset reworks the locking: reverts the problem commit
> and its descendant, and introduces rtnl-independent locking.
> This may have a continuation, and someone may work on killing
> rtnl_lock() in mrtsock_destruct() in the future.
>
> Thanks,
> Kirill
>
> ---
> v3: Change patches order: [2/5] and [3/5].
> v2: Fix sparse warning [4/5], as reported by kbuild test robot.
This looks a lot better, series applied, thank you.
^ permalink raw reply
* Re: [patch net-next RFC 00/12] devlink: introduce port flavours and common phys_port_name generation
From: David Ahern @ 2018-03-22 19:10 UTC (permalink / raw)
To: Jiri Pirko
Cc: netdev, davem, idosch, jakub.kicinski, mlxsw, andrew,
vivien.didelot, f.fainelli, michael.chan, ganeshgr, saeedm,
simon.horman, pieter.jansenvanvuuren, john.hurley,
dirk.vandermerwe, alexander.h.duyck, ogerlitz, vijaya.guvva,
satananda.burla, raghu.vatsavayi, felix.manlunas, gospo,
sathya.perla, vasundhara-v.volam, tariqt, eranbe,
jeffrey.t.kirsher
In-Reply-To: <20180322174904.GG2074@nanopsycho.orion>
On 3/22/18 11:49 AM, Jiri Pirko wrote:
> Thu, Mar 22, 2018 at 04:34:07PM CET, dsahern@gmail.com wrote:
>> On 3/22/18 4:55 AM, Jiri Pirko wrote:
>>> From: Jiri Pirko <jiri@mellanox.com>
>>>
>>> This patchset resolves 2 issues we have right now:
>>> 1) There are many netdevices / ports in the system, for port, pf, vf
>>> represenatation but the user has no way to see which is which
>>> 2) The ndo_get_phys_port_name is implemented in each driver separatelly,
>>> which may lead to inconsistent names between drivers.
>>
>> Similar to ndo_get_phys_port_{name,id}, devlink requires drivers to opt
>> in with an implementation right, so you can't really force a solution to
>> the consistent naming.
>
> Yeah, drivers would still have free choice to implemen the ndo
> themselves. But most of them, like all sriov switch drivers should use
> the devlink helper to have consistent naming. In other words, devlink
> helper should be the standard way, in weird cases (like rocker), driver
> implements it himself.
That's an assumption that somehow the devlink API will be better
supported than ndo_get_phys_port_{name,id}. Don't get me wrong -- an API
to show the kind of device is needed, but I do not think this enforces
any kind of consistency in naming.
>
>
>>
>>>
>>> This patchset introduces port flavours which should address the first
>>> problem. I'm testing this with Netronome nfp hardware. When the user
>>> has 2 physical ports, 1 pf, and 4 vfs, he should see something like this:
>>> # devlink port
>>> pci/0000:05:00.0/0: type eth netdev enp5s0np0 flavour physical number 0
>>> pci/0000:05:00.0/268435456: type eth netdev eth0 flavour physical number 0
>>> pci/0000:05:00.0/268435460: type eth netdev enp5s0np1 flavour physical number 1
>>> pci/0000:05:00.0/536875008: type eth netdev eth2 flavour pf_rep number 536875008
>>> pci/0000:05:00.0/536870912: type eth netdev eth1 flavour vf_rep number 0
>>> pci/0000:05:00.0/536870976: type eth netdev eth3 flavour vf_rep number 1
>>> pci/0000:05:00.0/536871040: type eth netdev eth4 flavour vf_rep number 2
>>> pci/0000:05:00.0/536871104: type eth netdev eth5 flavour vf_rep number 3
>>
>> How about 'kind' instead of flavo{u}r?
>
> Yeah, kind is often used in kernel already with different meaning
> git grep kind net/core
> I wanted to avoid confusions
Roopa's amendment works as well; I just think flavor / flavour is the
wrong word. Make me thinks of food ... ice cream vs netdevices.
^ permalink raw reply
* Re: [RFC PATCH] net: stmmac: dwmac-sun8i: sun8i_syscon_reg_field can be static
From: David Miller @ 2018-03-22 19:07 UTC (permalink / raw)
To: lkp
Cc: mark.rutland, devicetree, maxime.ripard, netdev, mturquette,
sboyd, wens, robh+dt, broonie, kbuild-all, clabbe.montjoie,
peppe.cavallaro, linux-clk, linux-arm-kernel, icenowy
In-Reply-To: <20180322074217.GA7358@ivytown2.lkp.intel.com>
From: kbuild test robot <lkp@intel.com>
Date: Thu, 22 Mar 2018 15:42:18 +0800
>
> Fixes: e3c10deef23c ("net: stmmac: dwmac-sun8i: Use regmap_field for syscon register access")
> Signed-off-by: Fengguang Wu <fengguang.wu@intel.com>
This commit ID and this symbol are both not present in any of my trees.
Please avoid using SHA1 IDs which don't actually exist in an upstream
tree. When I see a "Fixes: " tag like this, I expect that it is for a
change in my tree.
^ permalink raw reply
* Re: [PATCH net-next v4 0/5] net: qualcomm: rmnet: Updates 2018-03-12
From: David Miller @ 2018-03-22 19:04 UTC (permalink / raw)
To: subashab; +Cc: joe, netdev
In-Reply-To: <1521683295-22935-1-git-send-email-subashab@codeaurora.org>
From: Subash Abhinov Kasiviswanathan <subashab@codeaurora.org>
Date: Wed, 21 Mar 2018 19:48:10 -0600
> This series contains some minor updates for rmnet driver.
>
> Patch 1 contains fixes for sparse warnings.
> Patch 2 updates the copyright date to 2018.
> Patch 3 is a cleanup in receive path.
> Patch 4 has the new rmnet netlink attributes in uapi and updates the usage.
> Patch 5 has the implementation of the fill_info operation.
>
> v1->v2: Remove the force casts since the data type is changed to __be
> types as mentioned by David.
> v2->v3: Update copyright in files which actually had changes as
> mentioned by Joe.
> v3->v4: Add new netlink attributes for mux_id and flags instead of using the
> the vlan attributes as mentioned by David. The rmnet specific flags are also
> moved to uapi. The netlink updates are done as part of #4 and #5 has the
> fill_info operation.
Series applied, thanks.
^ permalink raw reply
* Re: [PATCH V2 net-next] liquidio: Added support for trusted VF
From: David Miller @ 2018-03-22 19:04 UTC (permalink / raw)
To: felix.manlunas
Cc: netdev, raghu.vatsavayi, derek.chickles, satananda.burla,
intiyaz.basha
In-Reply-To: <20180322063054.GA5037@felix-thinkpad.cavium.com>
From: Felix Manlunas <felix.manlunas@cavium.com>
Date: Wed, 21 Mar 2018 23:30:54 -0700
> From: Intiyaz Basha <intiyaz.basha@cavium.com>
>
> When a VF is trusted, all promiscuous traffic will only be sent to that VF.
> In normal operation promiscuous traffic is sent to the PF. There can be
> only one trusted VF per PF
>
> Signed-off-by: Intiyaz Basha <intiyaz.basha@cavium.com>
> Signed-off-by: Felix Manlunas <felix.manlunas@cavium.com>
> ---
> Patch Change Log:
> V1 -> V2:
> Used completion in place of wait queue
Applied, thank you.
^ permalink raw reply
* [PATCH net-next, 2/2] hv_netvsc: Add range checking for rx packet offset and length
From: Haiyang Zhang @ 2018-03-22 19:01 UTC (permalink / raw)
To: davem, netdev; +Cc: olaf, sthemmin, haiyangz, linux-kernel, devel, vkuznets
In-Reply-To: <20180322190114.25596-1-haiyangz@linuxonhyperv.com>
From: Haiyang Zhang <haiyangz@microsoft.com>
This patch adds range checking for rx packet offset and length.
It may only happen if there is a host side bug.
Signed-off-by: Haiyang Zhang <haiyangz@microsoft.com>
---
drivers/net/hyperv/hyperv_net.h | 1 +
drivers/net/hyperv/netvsc.c | 17 +++++++++++++++--
2 files changed, 16 insertions(+), 2 deletions(-)
diff --git a/drivers/net/hyperv/hyperv_net.h b/drivers/net/hyperv/hyperv_net.h
index 0db3bd1ea06f..49c05ac894e5 100644
--- a/drivers/net/hyperv/hyperv_net.h
+++ b/drivers/net/hyperv/hyperv_net.h
@@ -793,6 +793,7 @@ struct netvsc_device {
/* Receive buffer allocated by us but manages by NetVSP */
void *recv_buf;
+ u32 recv_buf_size; /* allocated bytes */
u32 recv_buf_gpadl_handle;
u32 recv_section_cnt;
u32 recv_section_size;
diff --git a/drivers/net/hyperv/netvsc.c b/drivers/net/hyperv/netvsc.c
index 1ddb2c39b6e4..a6700d65f206 100644
--- a/drivers/net/hyperv/netvsc.c
+++ b/drivers/net/hyperv/netvsc.c
@@ -289,6 +289,8 @@ static int netvsc_init_buf(struct hv_device *device,
goto cleanup;
}
+ net_device->recv_buf_size = buf_size;
+
/*
* Establish the gpadl handle for this buffer on this
* channel. Note: This call uses the vmbus connection rather
@@ -1095,11 +1097,22 @@ static int netvsc_receive(struct net_device *ndev,
/* Each range represents 1 RNDIS pkt that contains 1 ethernet frame */
for (i = 0; i < count; i++) {
- void *data = recv_buf
- + vmxferpage_packet->ranges[i].byte_offset;
+ u32 offset = vmxferpage_packet->ranges[i].byte_offset;
u32 buflen = vmxferpage_packet->ranges[i].byte_count;
+ void *data;
int ret;
+ if (unlikely(offset + buflen > net_device->recv_buf_size)) {
+ status = NVSP_STAT_FAIL;
+ netif_err(net_device_ctx, rx_err, ndev,
+ "Packet offset:%u + len:%u too big\n",
+ offset, buflen);
+
+ continue;
+ }
+
+ data = recv_buf + offset;
+
trace_rndis_recv(ndev, q_idx, data);
/* Pass it to the upper layer */
--
2.15.1
^ permalink raw reply related
* [PATCH net-next,1/2] hv_netvsc: Fix the return status in RX path
From: Haiyang Zhang @ 2018-03-22 19:01 UTC (permalink / raw)
To: davem, netdev; +Cc: olaf, sthemmin, haiyangz, linux-kernel, devel, vkuznets
In-Reply-To: <20180322190114.25596-1-haiyangz@linuxonhyperv.com>
From: Haiyang Zhang <haiyangz@microsoft.com>
As defined in hyperv_net.h, the NVSP_STAT_SUCCESS is one not zero.
Some functions returns 0 when it actually means NVSP_STAT_SUCCESS.
This patch fixes them.
In netvsc_receive(), it puts the last RNDIS packet's receive status
for all packets in a vmxferpage which may contain multiple RNDIS
packets.
This patch puts NVSP_STAT_FAIL in the receive completion if one of
the packets in a vmxferpage fails.
Signed-off-by: Haiyang Zhang <haiyangz@microsoft.com>
---
drivers/net/hyperv/netvsc.c | 8 ++++++--
drivers/net/hyperv/netvsc_drv.c | 2 +-
drivers/net/hyperv/rndis_filter.c | 4 ++--
3 files changed, 9 insertions(+), 5 deletions(-)
diff --git a/drivers/net/hyperv/netvsc.c b/drivers/net/hyperv/netvsc.c
index aa95e81af6e5..1ddb2c39b6e4 100644
--- a/drivers/net/hyperv/netvsc.c
+++ b/drivers/net/hyperv/netvsc.c
@@ -1098,12 +1098,16 @@ static int netvsc_receive(struct net_device *ndev,
void *data = recv_buf
+ vmxferpage_packet->ranges[i].byte_offset;
u32 buflen = vmxferpage_packet->ranges[i].byte_count;
+ int ret;
trace_rndis_recv(ndev, q_idx, data);
/* Pass it to the upper layer */
- status = rndis_filter_receive(ndev, net_device,
- channel, data, buflen);
+ ret = rndis_filter_receive(ndev, net_device,
+ channel, data, buflen);
+
+ if (unlikely(ret != NVSP_STAT_SUCCESS))
+ status = NVSP_STAT_FAIL;
}
enq_receive_complete(ndev, net_device, q_idx,
diff --git a/drivers/net/hyperv/netvsc_drv.c b/drivers/net/hyperv/netvsc_drv.c
index cdb78eefab67..33607995be62 100644
--- a/drivers/net/hyperv/netvsc_drv.c
+++ b/drivers/net/hyperv/netvsc_drv.c
@@ -818,7 +818,7 @@ int netvsc_recv_callback(struct net_device *net,
u64_stats_update_end(&rx_stats->syncp);
napi_gro_receive(&nvchan->napi, skb);
- return 0;
+ return NVSP_STAT_SUCCESS;
}
static void netvsc_get_drvinfo(struct net_device *net,
diff --git a/drivers/net/hyperv/rndis_filter.c b/drivers/net/hyperv/rndis_filter.c
index 2dc00f714482..591fb8080f11 100644
--- a/drivers/net/hyperv/rndis_filter.c
+++ b/drivers/net/hyperv/rndis_filter.c
@@ -443,10 +443,10 @@ int rndis_filter_receive(struct net_device *ndev,
"unhandled rndis message (type %u len %u)\n",
rndis_msg->ndis_msg_type,
rndis_msg->msg_len);
- break;
+ return NVSP_STAT_FAIL;
}
- return 0;
+ return NVSP_STAT_SUCCESS;
}
static int rndis_filter_query_device(struct rndis_device *dev,
--
2.15.1
^ permalink raw reply related
* [PATCH net-next,0/2] hv_netvsc: Fix/improve RX path error handling
From: Haiyang Zhang @ 2018-03-22 19:01 UTC (permalink / raw)
To: davem, netdev; +Cc: olaf, sthemmin, haiyangz, linux-kernel, devel, vkuznets
From: Haiyang Zhang <haiyangz@microsoft.com>
Fix the status code returned to the host. Also add range
check for rx packet offset and length.
Haiyang Zhang (2):
hv_netvsc: Fix the return status in RX path
hv_netvsc: Add range checking for rx packet offset and length
drivers/net/hyperv/hyperv_net.h | 1 +
drivers/net/hyperv/netvsc.c | 25 +++++++++++++++++++++----
drivers/net/hyperv/netvsc_drv.c | 2 +-
drivers/net/hyperv/rndis_filter.c | 4 ++--
4 files changed, 25 insertions(+), 7 deletions(-)
--
2.15.1
^ permalink raw reply
* Re: [PATCH net-next 1/1] tc-testing: updated police, mirred, skbedit and skbmod with more tests
From: David Miller @ 2018-03-22 18:58 UTC (permalink / raw)
To: mrv; +Cc: stephen, netdev, kernel, jhs, xiyou.wangcong, jiri
In-Reply-To: <1521670670-28439-1-git-send-email-mrv@mojatatu.com>
From: Roman Mashak <mrv@mojatatu.com>
Date: Wed, 21 Mar 2018 18:17:50 -0400
> diff --git a/tools/testing/selftests/tc-testing/tc-tests/actions/skbmod.json b/tools/testing/selftests/tc-testing/tc-tests/actions/skbmod.json
> index 90bba48c3f07..8aa5a88ccb19 100644
> --- a/tools/testing/selftests/tc-testing/tc-tests/actions/skbmod.json
> +++ b/tools/testing/selftests/tc-testing/tc-tests/actions/skbmod.json
...
> }
> -]
> +]
> \ No newline at end of file
> --
> 2.7.4
Please fix this.
^ permalink raw reply
* Re: [PATCH][next] gre: fix TUNNEL_SEQ bit check on sequence numbering
From: David Miller @ 2018-03-22 18:53 UTC (permalink / raw)
To: colin.king; +Cc: kuznet, yoshfuji, netdev, kernel-janitors, linux-kernel
In-Reply-To: <20180321193458.4451-1-colin.king@canonical.com>
From: Colin King <colin.king@canonical.com>
Date: Wed, 21 Mar 2018 19:34:58 +0000
> From: Colin Ian King <colin.king@canonical.com>
>
> The current logic of flags | TUNNEL_SEQ is always non-zero and hence
> sequence numbers are always incremented no matter the setting of the
> TUNNEL_SEQ bit. Fix this by using & instead of |.
>
> Detected by CoverityScan, CID#1466039 ("Operands don't affect result")
>
> Fixes: 77a5196a804e ("gre: add sequence number for collect md mode.")
> Signed-off-by: Colin Ian King <colin.king@canonical.com>
Applied, thanks Colin.
^ permalink raw reply
* Re: [PATCH net-next V2] Documentation/networking: Add net DIM documentation
From: David Miller @ 2018-03-22 18:51 UTC (permalink / raw)
To: talgi; +Cc: netdev, tariqt
In-Reply-To: <1521657225-65392-1-git-send-email-talgi@mellanox.com>
From: Tal Gilboa <talgi@mellanox.com>
Date: Wed, 21 Mar 2018 20:33:45 +0200
> Net DIM is a generic algorithm, purposed for dynamically
> optimizing network devices interrupt moderation. This
> document describes how it works and how to use it.
>
> Signed-off-by: Tal Gilboa <talgi@mellanox.com>
Applied, although several improvements have been suggested.
Please handle that as follow-ups.
Thank you.
^ permalink raw reply
* Re: [PATCH][next] net: mvpp2: use correct index on array mvpp2_pools
From: David Miller @ 2018-03-22 18:48 UTC (permalink / raw)
To: colin.king; +Cc: antoine.tenart, netdev, kernel-janitors, linux-kernel
In-Reply-To: <20180321173115.1820-1-colin.king@canonical.com>
From: Colin King <colin.king@canonical.com>
Date: Wed, 21 Mar 2018 17:31:15 +0000
> From: Colin Ian King <colin.king@canonical.com>
>
> Array mvpp2_pools is being indexed by long_log_pool, however this
> looks like a cut-n-paste bug and in fact should be short_log_pool.
>
> Detected by CoverityScan, CID#1466113 ("Copy-paste error")
>
> Fixes: 576193f2d579 ("net: mvpp2: jumbo frames support")
> Signed-off-by: Colin Ian King <colin.king@canonical.com>
Applied, thank you.
^ permalink raw reply
* Re: [PATCH net-next 1/1] tc-testing: Correct compound statements for namespace execution
From: David Miller @ 2018-03-22 18:48 UTC (permalink / raw)
To: lucasb; +Cc: netdev, kernel, jhs, xiyou.wangcong, jiri
In-Reply-To: <1521647380-20679-1-git-send-email-lucasb@mojatatu.com>
From: Lucas Bates <lucasb@mojatatu.com>
Date: Wed, 21 Mar 2018 11:49:40 -0400
> }
> -]
> \ No newline at end of file
> +]
> --
> 2.7.4
Please fix this.
^ permalink raw reply
* Re: [PATCH net-next v2] net: mvpp2: Don't use dynamic allocs for local variables
From: David Miller @ 2018-03-22 18:47 UTC (permalink / raw)
To: maxime.chevallier
Cc: netdev, linux-kernel, antoine.tenart, thomas.petazzoni,
gregory.clement, miquel.raynal, nadavh, stefanc, ymarkman, mw
In-Reply-To: <20180321151400.6658-1-maxime.chevallier@bootlin.com>
From: Maxime Chevallier <maxime.chevallier@bootlin.com>
Date: Wed, 21 Mar 2018 16:14:00 +0100
> diff --git a/drivers/net/ethernet/marvell/mvpp2.c b/drivers/net/ethernet/marvell/mvpp2.c
> index 9bd35f2291d6..28e33e139178 100644
> --- a/drivers/net/ethernet/marvell/mvpp2.c
> +++ b/drivers/net/ethernet/marvell/mvpp2.c
> @@ -1913,16 +1913,11 @@ static void mvpp2_prs_sram_offset_set(struct mvpp2_prs_entry *pe,
> }
>
> /* Find parser flow entry */
> -static struct mvpp2_prs_entry *mvpp2_prs_flow_find(struct mvpp2 *priv, int flow)
> +static int mvpp2_prs_flow_find(struct mvpp2 *priv, int flow)
> {
> - struct mvpp2_prs_entry *pe;
> + struct mvpp2_prs_entry pe;
> int tid;
>
> - pe = kzalloc(sizeof(*pe), GFP_KERNEL);
> - if (!pe)
> - return NULL;
> - mvpp2_prs_tcam_lu_set(pe, MVPP2_PRS_LU_FLOWS);
> -
In order to be an equivalent change you must bzero out this 'pe' object
on the stack. You are only initializing the index member before passing
it into other functions.
Thank you.
^ permalink raw reply
* [PATCH v2] net/mlx5: Fix use-after-free
From: Gustavo A. R. Silva @ 2018-03-22 18:44 UTC (permalink / raw)
To: Yuval Shaia, Ilan Tayari, Boris Pismenny, Saeed Mahameed,
Matan Barak, Leon Romanovsky
Cc: netdev, linux-rdma, linux-kernel, Gustavo A. R. Silva
_rule_ is being freed and then dereferenced by accessing rule->ctx
Fix this by copying the value returned by PTR_ERR(rule->ctx) into a local
variable for its safe use after freeing _rule_
Addresses-Coverity-ID: 1466041 ("Read from pointer after free")
Fixes: 05564d0ae075 ("net/mlx5: Add flow-steering commands for FPGA IPSec implementation")
Reviewed-by: Yuval Shaia <yuval.shaia@oracle.com>
Signed-off-by: Gustavo A. R. Silva <gustavo@embeddedor.com>
---
Changes in v2:
- Use a short subject prefix as suggested by Yuval Shaia.
- Add Yuval's Reviewed-by.
drivers/net/ethernet/mellanox/mlx5/core/fpga/ipsec.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/fpga/ipsec.c b/drivers/net/ethernet/mellanox/mlx5/core/fpga/ipsec.c
index 4f15685..0f5da49 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/fpga/ipsec.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/fpga/ipsec.c
@@ -1061,8 +1061,9 @@ static int fpga_ipsec_fs_create_fte(struct mlx5_core_dev *dev,
rule->ctx = mlx5_fpga_ipsec_fs_create_sa_ctx(dev, fte, is_egress);
if (IS_ERR(rule->ctx)) {
+ int err = PTR_ERR(rule->ctx);
kfree(rule);
- return PTR_ERR(rule->ctx);
+ return err;
}
rule->fte = fte;
--
2.7.4
^ permalink raw reply related
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox