* [patch iproute2 rfc 2/2] devlink: introduce support for showing port number and split subport number
From: Jiri Pirko @ 2018-03-23 6:35 UTC (permalink / raw)
To: netdev
Cc: 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, dsahern, vijaya.guvva,
satananda.burla, raghu.vatsavayi, felix.manlunas, gospo,
sathya.perla, vasundhara-v.volam, tariqt, eranbe,
jeffrey.t.kirsher
In-Reply-To: <20180322233550.GE6544@lunn.ch>
From: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: Jiri Pirko <jiri@mellanox.com>
---
devlink/devlink.c | 6 ++++++
include/uapi/linux/devlink.h | 2 ++
2 files changed, 8 insertions(+)
diff --git a/devlink/devlink.c b/devlink/devlink.c
index 952b7cabbccf..50fec26781f4 100644
--- a/devlink/devlink.c
+++ b/devlink/devlink.c
@@ -1725,9 +1725,15 @@ static void pr_out_port(struct dl *dl, struct nlattr **tb)
pr_out_str(dl, "flavour", port_flavour_name(port_flavour));
}
+ if (tb[DEVLINK_ATTR_PORT_NUMBER])
+ pr_out_uint(dl, "number",
+ mnl_attr_get_u32(tb[DEVLINK_ATTR_PORT_NUMBER]));
if (tb[DEVLINK_ATTR_PORT_SPLIT_GROUP])
pr_out_uint(dl, "split_group",
mnl_attr_get_u32(tb[DEVLINK_ATTR_PORT_SPLIT_GROUP]));
+ if (tb[DEVLINK_ATTR_PORT_SPLIT_SUBPORT_NUMBER])
+ pr_out_uint(dl, "subport",
+ mnl_attr_get_u32(tb[DEVLINK_ATTR_PORT_SPLIT_SUBPORT_NUMBER]));
pr_out_port_handle_end(dl);
}
diff --git a/include/uapi/linux/devlink.h b/include/uapi/linux/devlink.h
index 5ea871c2739d..4a39ad2ecd08 100644
--- a/include/uapi/linux/devlink.h
+++ b/include/uapi/linux/devlink.h
@@ -243,6 +243,8 @@ enum devlink_attr {
DEVLINK_ATTR_DPIPE_TABLE_RESOURCE_UNITS,/* u64 */
DEVLINK_ATTR_PORT_FLAVOUR, /* u16 */
+ DEVLINK_ATTR_PORT_NUMBER, /* u32 */
+ DEVLINK_ATTR_PORT_SPLIT_SUBPORT_NUMBER, /* u32 */
/* add new attributes above here, update the policy in devlink.c */
--
2.14.3
^ permalink raw reply related
* [patch iproute2 rfc 1/2] devlink: introduce support for showing port flavours
From: Jiri Pirko @ 2018-03-23 6:35 UTC (permalink / raw)
To: netdev
Cc: 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, dsahern, vijaya.guvva,
satananda.burla, raghu.vatsavayi, felix.manlunas, gospo,
sathya.perla, vasundhara-v.volam, tariqt, eranbe,
jeffrey.t.kirsher
In-Reply-To: <20180322233550.GE6544@lunn.ch>
From: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: Jiri Pirko <jiri@mellanox.com>
---
devlink/devlink.c | 16 ++++++++++++++++
include/uapi/linux/devlink.h | 20 ++++++++++++++++++++
2 files changed, 36 insertions(+)
diff --git a/devlink/devlink.c b/devlink/devlink.c
index 69c3c5d9dd31..952b7cabbccf 100644
--- a/devlink/devlink.c
+++ b/devlink/devlink.c
@@ -1685,6 +1685,16 @@ static const char *port_type_name(uint32_t type)
}
}
+static const char *port_flavour_name(uint16_t flavour)
+{
+ switch (flavour) {
+ case DEVLINK_PORT_FLAVOUR_PHYSICAL: return "physical";
+ case DEVLINK_PORT_FLAVOUR_PF_REP: return "pf_rep";
+ case DEVLINK_PORT_FLAVOUR_VF_REP: return "vf_rep";
+ default: return "<unknown flavour>";
+ }
+}
+
static void pr_out_port(struct dl *dl, struct nlattr **tb)
{
struct nlattr *pt_attr = tb[DEVLINK_ATTR_PORT_TYPE];
@@ -1709,6 +1719,12 @@ static void pr_out_port(struct dl *dl, struct nlattr **tb)
if (tb[DEVLINK_ATTR_PORT_IBDEV_NAME])
pr_out_str(dl, "ibdev",
mnl_attr_get_str(tb[DEVLINK_ATTR_PORT_IBDEV_NAME]));
+ if (tb[DEVLINK_ATTR_PORT_FLAVOUR]) {
+ uint16_t port_flavour =
+ mnl_attr_get_u16(tb[DEVLINK_ATTR_PORT_FLAVOUR]);
+
+ pr_out_str(dl, "flavour", port_flavour_name(port_flavour));
+ }
if (tb[DEVLINK_ATTR_PORT_SPLIT_GROUP])
pr_out_uint(dl, "split_group",
mnl_attr_get_u32(tb[DEVLINK_ATTR_PORT_SPLIT_GROUP]));
diff --git a/include/uapi/linux/devlink.h b/include/uapi/linux/devlink.h
index 9f17286ec89f..5ea871c2739d 100644
--- a/include/uapi/linux/devlink.h
+++ b/include/uapi/linux/devlink.h
@@ -132,6 +132,24 @@ enum devlink_eswitch_encap_mode {
DEVLINK_ESWITCH_ENCAP_MODE_BASIC,
};
+enum devlink_port_flavour {
+ DEVLINK_PORT_FLAVOUR_PHYSICAL, /* Any kind of a port physically
+ * facing the user.
+ */
+ DEVLINK_PORT_FLAVOUR_PF_REP, /* Port represents a SR-IOV physical
+ * function counterpart port of
+ * embedded switch.
+ */
+ DEVLINK_PORT_FLAVOUR_VF_REP, /* Port represents a SR-IOV virtual
+ * function counterpart port of
+ * embedded switch.
+ */
+ DEVLINK_PORT_FLAVOUR_CPU, /* CPU port */
+ DEVLINK_PORT_FLAVOUR_DSA, /* Distributed switch architecture
+ * interconnect port.
+ */
+};
+
enum devlink_attr {
/* don't change the order or add anything between, this is ABI! */
DEVLINK_ATTR_UNSPEC,
@@ -224,6 +242,8 @@ enum devlink_attr {
DEVLINK_ATTR_DPIPE_TABLE_RESOURCE_ID, /* u64 */
DEVLINK_ATTR_DPIPE_TABLE_RESOURCE_UNITS,/* u64 */
+ DEVLINK_ATTR_PORT_FLAVOUR, /* u16 */
+
/* add new attributes above here, update the policy in devlink.c */
__DEVLINK_ATTR_MAX,
--
2.14.3
^ permalink raw reply related
* Re: [patch net-next RFC 00/12] devlink: introduce port flavours and common phys_port_name generation
From: Jiri Pirko @ 2018-03-23 6:34 UTC (permalink / raw)
To: David Ahern
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: <fde6feca-9616-c3a9-2ab5-1ecfe8741ca6@gmail.com>
Thu, Mar 22, 2018 at 08:10:38PM CET, dsahern@gmail.com 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.
So you say that we need to enforce it somehow?
>
>>
>>
>>>
>>>>
>>>> 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.
Ok
^ permalink raw reply
* Re: [patch net-next RFC 02/12] devlink: extend attrs_set for setting port flavours
From: Jiri Pirko @ 2018-03-23 6:30 UTC (permalink / raw)
To: Jakub Kicinski
Cc: netdev, davem, idosch, mlxsw, andrew, vivien.didelot, f.fainelli,
michael.chan, ganeshgr, saeedm, simon.horman,
pieter.jansenvanvuuren, john.hurley, dirk.vandermerwe,
alexander.h.duyck, ogerlitz, dsahern, vijaya.guvva,
satananda.burla, raghu.vatsavayi, felix.manlunas, gospo,
sathya.perla, vasundhara-v.volam, tariqt, eranbe,
jeffrey.t.kirsher
In-Reply-To: <20180322203624.36e8b693@cakuba.netronome.com>
Fri, Mar 23, 2018 at 04:36:24AM CET, jakub.kicinski@netronome.com wrote:
>On Thu, 22 Mar 2018 11:55:12 +0100, Jiri Pirko wrote:
>> enum devlink_attr {
>> /* don't change the order or add anything between, this is ABI! */
>> DEVLINK_ATTR_UNSPEC,
>> @@ -224,6 +242,7 @@ enum devlink_attr {
>> DEVLINK_ATTR_DPIPE_TABLE_RESOURCE_ID, /* u64 */
>> DEVLINK_ATTR_DPIPE_TABLE_RESOURCE_UNITS,/* u64 */
>>
>> + DEVLINK_ATTR_PORT_FLAVOUR, /* u16 */
>> DEVLINK_ATTR_PORT_NUMBER, /* u32 */
>> DEVLINK_ATTR_PORT_SPLIT_SUBPORT_NUMBER, /* u32 */
>
>nit: why is it OK to add the attr in the middle of enum?
Well, I added the next 2 in previous the patch.
^ permalink raw reply
* Re: [patch net-next RFC 10/12] nfp: flower: create port for flower vnic
From: Jiri Pirko @ 2018-03-23 6:29 UTC (permalink / raw)
To: Jakub Kicinski
Cc: netdev, davem, idosch, mlxsw, andrew, vivien.didelot, f.fainelli,
michael.chan, ganeshgr, saeedm, simon.horman,
pieter.jansenvanvuuren, john.hurley, dirk.vandermerwe,
alexander.h.duyck, ogerlitz, dsahern, vijaya.guvva,
satananda.burla, raghu.vatsavayi, felix.manlunas, gospo,
sathya.perla, vasundhara-v.volam, tariqt, eranbe,
jeffrey.t.kirsher
In-Reply-To: <20180322203828.5167c0ac@cakuba.netronome.com>
Fri, Mar 23, 2018 at 04:38:28AM CET, jakub.kicinski@netronome.com wrote:
>On Thu, 22 Mar 2018 11:55:20 +0100, Jiri Pirko wrote:
>> From: Jiri Pirko <jiri@mellanox.com>
>>
>> Signed-off-by: Jiri Pirko <jiri@mellanox.com>
>> ---
>> drivers/net/ethernet/netronome/nfp/flower/main.c | 3 +--
>> 1 file changed, 1 insertion(+), 2 deletions(-)
>>
>> diff --git a/drivers/net/ethernet/netronome/nfp/flower/main.c b/drivers/net/ethernet/netronome/nfp/flower/main.c
>> index aed8df0e9d41..1890af7e6196 100644
>> --- a/drivers/net/ethernet/netronome/nfp/flower/main.c
>> +++ b/drivers/net/ethernet/netronome/nfp/flower/main.c
>> @@ -427,10 +427,9 @@ static int nfp_flower_vnic_alloc(struct nfp_app *app, struct nfp_net *nn,
>> goto err_invalid_port;
>> }
>>
>> - eth_hw_addr_random(nn->dp.netdev);
>> netif_keep_dst(nn->dp.netdev);
>>
>> - return 0;
>> + return nfp_app_nic_vnic_alloc(app, nn, id);
>>
>> err_invalid_port:
>> nn->port = nfp_port_alloc(app, NFP_PORT_INVALID, nn->dp.netdev);
>
>This will associate the PF netdev with physical port, incl. all ethtool
>information. Im not sure we want to do that. phy_repr carries this
>functionality.
I was not sure originally what this port is. Okay, what I would like to
see is another port flavour for "pf" and "vf". I guess that since the pf
has the same pci address, it would fall under the same devlink instance.
For vfs, which have each separate pci address, I would like to create
devlink instance for each and associate with one devlink port flavour
"vf".
^ permalink raw reply
* Re: [PATCH net-next] bridge: Allow max MTU when multiple VLANs present
From: Roopa Prabhu @ 2018-03-23 4:53 UTC (permalink / raw)
To: Chas Williams; +Cc: David Miller, netdev, Stephen Hemminger
In-Reply-To: <20180322153406.17760-1-3chas3@gmail.com>
On Thu, Mar 22, 2018 at 8:34 AM, Chas Williams <3chas3@gmail.com> wrote:
> If the bridge is allowing multiple VLANs, some VLANs may have
> different MTUs. Instead of choosing the minimum MTU for the
> bridge interface, choose the maximum MTU of the bridge members.
> With this the user only needs to set a larger MTU on the member
> ports that are participating in the large MTU VLANS.
>
> Signed-off-by: Chas Williams <3chas3@gmail.com>
> ---
Acked-by: Roopa Prabhu <roopa@cumulusnetworks.com>
This or an equivalent fix is necessary: as stated above, today the
bridge mtu capped at min port mtu limits all
vlan devices on top of the vlan filtering bridge to min port mtu.
^ permalink raw reply
* Re: linux-next: manual merge of the net-next tree with the rdma-fixes tree
From: Jason Gunthorpe @ 2018-03-23 4:33 UTC (permalink / raw)
To: David Miller
Cc: dledford, sfr, netdev, linux-next, linux-kernel, markb, leonro
In-Reply-To: <20180323.001900.849305099701511845.davem@davemloft.net>
On Fri, Mar 23, 2018 at 12:19:00AM -0400, David Miller wrote:
> From: Doug Ledford <dledford@redhat.com>
> Date: Thu, 15 Mar 2018 21:18:02 -0400
>
> > Here's the commit (from the rdma git repo) with the proper merge fix
> > (although it also has other minor merge stuff that needs to be ignored):
> >
> > 2d873449a202 (Merge branch 'k.o/wip/dl-for-rc' into k.o/wip/dl-for-next)
>
> Really?
>
> [davem@localhost GIT]$ git clone --reference linux/.git git://git.kernel.org/pub/scm/linux/kernel/git/dledford/rdma.git
> Cloning into 'rdma'...
Doug and I moved to a shared repo location when we started maintain it
as a team:
git://git.kernel.org/pub/scm/linux/kernel/git/rdma/rdma.git
The commit is here:
https://git.kernel.org/pub/scm/linux/kernel/git/rdma/rdma.git/commit/?h=for-next&id=2d873449a202d02e0c4d90009fb2beb7013ac575
Jason
^ permalink raw reply
* Re: linux-next: manual merge of the net-next tree with the rdma-fixes tree
From: David Miller @ 2018-03-23 4:19 UTC (permalink / raw)
To: dledford; +Cc: sfr, netdev, jgg, linux-next, linux-kernel, markb, leonro
In-Reply-To: <1521163082.18703.191.camel@redhat.com>
From: Doug Ledford <dledford@redhat.com>
Date: Thu, 15 Mar 2018 21:18:02 -0400
> Here's the commit (from the rdma git repo) with the proper merge fix
> (although it also has other minor merge stuff that needs to be ignored):
>
> 2d873449a202 (Merge branch 'k.o/wip/dl-for-rc' into k.o/wip/dl-for-next)
Really?
[davem@localhost GIT]$ git clone --reference linux/.git git://git.kernel.org/pub/scm/linux/kernel/git/dledford/rdma.git
Cloning into 'rdma'...
remote: Counting objects: 32, done.
remote: Compressing objects: 100% (31/31), done.
remote: Total 32 (delta 0), reused 32 (delta 0)
Receiving objects: 100% (32/32), 186.52 KiB | 3.01 MiB/s, done.
Checking connectivity: 5706198, done.
Checking out files: 100% (61622/61622), done.
[davem@localhost GIT]$ cd rdma
[davem@localhost rdma]$ git show 2d873449a202
fatal: ambiguous argument '2d873449a202': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'
[davem@localhost rdma]$
^ permalink raw reply
* Re: [patch net-next RFC 10/12] nfp: flower: create port for flower vnic
From: Jakub Kicinski @ 2018-03-23 3:38 UTC (permalink / raw)
To: Jiri Pirko
Cc: netdev, davem, idosch, mlxsw, andrew, vivien.didelot, f.fainelli,
michael.chan, ganeshgr, saeedm, simon.horman,
pieter.jansenvanvuuren, john.hurley, dirk.vandermerwe,
alexander.h.duyck, ogerlitz, dsahern, vijaya.guvva,
satananda.burla, raghu.vatsavayi, felix.manlunas, gospo,
sathya.perla, vasundhara-v.volam, tariqt, eranbe,
jeffrey.t.kirsher
In-Reply-To: <20180322105522.8186-11-jiri@resnulli.us>
On Thu, 22 Mar 2018 11:55:20 +0100, Jiri Pirko wrote:
> From: Jiri Pirko <jiri@mellanox.com>
>
> Signed-off-by: Jiri Pirko <jiri@mellanox.com>
> ---
> drivers/net/ethernet/netronome/nfp/flower/main.c | 3 +--
> 1 file changed, 1 insertion(+), 2 deletions(-)
>
> diff --git a/drivers/net/ethernet/netronome/nfp/flower/main.c b/drivers/net/ethernet/netronome/nfp/flower/main.c
> index aed8df0e9d41..1890af7e6196 100644
> --- a/drivers/net/ethernet/netronome/nfp/flower/main.c
> +++ b/drivers/net/ethernet/netronome/nfp/flower/main.c
> @@ -427,10 +427,9 @@ static int nfp_flower_vnic_alloc(struct nfp_app *app, struct nfp_net *nn,
> goto err_invalid_port;
> }
>
> - eth_hw_addr_random(nn->dp.netdev);
> netif_keep_dst(nn->dp.netdev);
>
> - return 0;
> + return nfp_app_nic_vnic_alloc(app, nn, id);
>
> err_invalid_port:
> nn->port = nfp_port_alloc(app, NFP_PORT_INVALID, nn->dp.netdev);
This will associate the PF netdev with physical port, incl. all ethtool
information. Im not sure we want to do that. phy_repr carries this
functionality.
^ permalink raw reply
* Re: [patch net-next RFC 02/12] devlink: extend attrs_set for setting port flavours
From: Jakub Kicinski @ 2018-03-23 3:36 UTC (permalink / raw)
To: Jiri Pirko
Cc: netdev, davem, idosch, mlxsw, andrew, vivien.didelot, f.fainelli,
michael.chan, ganeshgr, saeedm, simon.horman,
pieter.jansenvanvuuren, john.hurley, dirk.vandermerwe,
alexander.h.duyck, ogerlitz, dsahern, vijaya.guvva,
satananda.burla, raghu.vatsavayi, felix.manlunas, gospo,
sathya.perla, vasundhara-v.volam, tariqt, eranbe,
jeffrey.t.kirsher
In-Reply-To: <20180322105522.8186-3-jiri@resnulli.us>
On Thu, 22 Mar 2018 11:55:12 +0100, Jiri Pirko wrote:
> enum devlink_attr {
> /* don't change the order or add anything between, this is ABI! */
> DEVLINK_ATTR_UNSPEC,
> @@ -224,6 +242,7 @@ enum devlink_attr {
> DEVLINK_ATTR_DPIPE_TABLE_RESOURCE_ID, /* u64 */
> DEVLINK_ATTR_DPIPE_TABLE_RESOURCE_UNITS,/* u64 */
>
> + DEVLINK_ATTR_PORT_FLAVOUR, /* u16 */
> DEVLINK_ATTR_PORT_NUMBER, /* u32 */
> DEVLINK_ATTR_PORT_SPLIT_SUBPORT_NUMBER, /* u32 */
nit: why is it OK to add the attr in the middle of enum?
^ permalink raw reply
* Re: [patch net-next RFC 00/12] devlink: introduce port flavours and common phys_port_name generation
From: Jakub Kicinski @ 2018-03-23 3:34 UTC (permalink / raw)
To: Jiri Pirko
Cc: netdev, davem, idosch, mlxsw, andrew, vivien.didelot, f.fainelli,
michael.chan, ganeshgr, saeedm, simon.horman,
pieter.jansenvanvuuren, john.hurley, dirk.vandermerwe,
alexander.h.duyck, ogerlitz, dsahern, vijaya.guvva,
satananda.burla, raghu.vatsavayi, felix.manlunas, gospo,
sathya.perla, vasundhara-v.volam, tariqt, eranbe,
jeffrey.t.kirsher
In-Reply-To: <20180322105522.8186-1-jiri@resnulli.us>
On Thu, 22 Mar 2018 11:55:10 +0100, Jiri Pirko wrote:
> Also, there is one extra port that I don't understand what
> is the purpose for it - something nfp specific perhaps.
Do you mean the PF netdev? There can be multiple of those on
multi-host cards. There is one pf_repr from ASIC's perspective and a
full-blown PF netdev which should be used by applications. pf_repr is
only for switch config.
^ permalink raw reply
* RE: [PATCH] qed: Use true and false for boolean values
From: Kalluru, Sudarsana @ 2018-03-23 3:20 UTC (permalink / raw)
To: Gustavo A. R. Silva, Elior, Ariel, Dept-Eng Everest Linux L2
Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org
In-Reply-To: <20180322200849.GA28033@embeddedgus>
-----Original Message-----
From: Gustavo A. R. Silva [mailto:gustavo@embeddedor.com]
Sent: 23 March 2018 01:39
To: Elior, Ariel <Ariel.Elior@cavium.com>; Dept-Eng Everest Linux L2 <Dept-EngEverestLinuxL2@cavium.com>
Cc: netdev@vger.kernel.org; linux-kernel@vger.kernel.org; Gustavo A. R. Silva <gustavo@embeddedor.com>
Subject: [PATCH] qed: Use true and false for boolean values
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 <gustavo@embeddedor.com>
---
drivers/net/ethernet/qlogic/qed/qed_dev.c | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/drivers/net/ethernet/qlogic/qed/qed_dev.c b/drivers/net/ethernet/qlogic/qed/qed_dev.c
index 553a6d1..cdb3eec 100644
--- a/drivers/net/ethernet/qlogic/qed/qed_dev.c
+++ b/drivers/net/ethernet/qlogic/qed/qed_dev.c
@@ -298,8 +298,8 @@ static void qed_init_qm_params(struct qed_hwfn *p_hwfn)
qm_info->start_vport = (u8) RESC_START(p_hwfn, QED_VPORT);
/* rate limiting and weighted fair queueing are always enabled */
- qm_info->vport_rl_en = 1;
- qm_info->vport_wfq_en = 1;
+ qm_info->vport_rl_en = true;
+ qm_info->vport_wfq_en = true;
/* TC config is different for AH 4 port */
four_port = p_hwfn->cdev->num_ports_in_engine == MAX_NUM_PORTS_K2; @@ -1276,9 +1276,9 @@ static int qed_hw_init_common(struct qed_hwfn *p_hwfn,
if (p_hwfn->mcp_info) {
if (p_hwfn->mcp_info->func_info.bandwidth_max)
- qm_info->pf_rl_en = 1;
+ qm_info->pf_rl_en = true;
if (p_hwfn->mcp_info->func_info.bandwidth_min)
- qm_info->pf_wfq_en = 1;
+ qm_info->pf_wfq_en = true;
}
memset(¶ms, 0, sizeof(params));
@@ -1630,7 +1630,7 @@ static int qed_vf_start(struct qed_hwfn *p_hwfn,
qed_vf_pf_tunnel_param_update(p_hwfn, p_params->p_tunn);
}
- p_hwfn->b_int_enabled = 1;
+ p_hwfn->b_int_enabled = true;
return 0;
}
--
2.7.4
Acked-by: Sudarsana Kalluru <Sudarsana.Kalluru@cavium.com>
^ permalink raw reply related
* Re: [PATCH net-next] modules: allow modprobe load regular elf binaries
From: Luis R. Rodriguez @ 2018-03-23 2:47 UTC (permalink / raw)
To: Andy Lutomirski
Cc: Alexei Starovoitov, Jessica Yu, Linus Torvalds, Mimi Zohar,
Djalal Harouni, David Miller, Kees Cook, Alexei Starovoitov,
Al Viro, Daniel Borkmann, Greg Kroah-Hartman, Network Development,
Linux Kernel Mailing List, kernel-team, Linux API, Michal Hocko,
Hannes Reinecke, werner
In-Reply-To: <CALCETrWFhTurv0gwxRcdLn4CD-1ySE=v4ZgvbsUYJqruZNMptQ@mail.gmail.com>
On Thu, Mar 22, 2018 at 3:15 PM, Andy Lutomirski <luto@kernel.org> wrote:
> All we need to do is to make sure that, if this is
> distributed as a module, that it's init routine doesn't wait for a
> long time, right?
Yeap.
Luis
^ permalink raw reply
* Re: [net-next:master 304/314] drivers/net/ethernet/mellanox/mlxsw/spectrum.c:3878:8: error: too few arguments to function 'devlink_resource_register'
From: David Ahern @ 2018-03-23 1:53 UTC (permalink / raw)
To: kbuild test robot; +Cc: kbuild-all, netdev
In-Reply-To: <201803230852.Y4PG4qcn%fengguang.wu@intel.com>
On 3/22/18 6:47 PM, kbuild test robot wrote:
> tree: https://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next.git master
> head: 6686c459e1449a3ee5f3fd313b0a559ace7a700e
> commit: 145307460ba9c11489807de7acd3f4c7395f60b7 [304/314] devlink: Remove top_hierarchy arg to devlink_resource_register
> config: x86_64-randconfig-s1-03230751 (attached as .config)
> compiler: gcc-6 (Debian 6.4.0-9) 6.4.0 20171026
> reproduce:
> git checkout 145307460ba9c11489807de7acd3f4c7395f60b7
> # save the attached .config to linux build tree
> make ARCH=x86_64
>
> All error/warnings (new ones prefixed by >>):
>
> drivers/net/ethernet/mellanox/mlxsw/spectrum.c: In function 'mlxsw_sp_resources_register':
>>> drivers/net/ethernet/mellanox/mlxsw/spectrum.c:3881:6: warning: passing argument 6 of 'devlink_resource_register' makes integer from pointer without a cast [-Wint-conversion]
> &kvd_size_params,
> ^
> In file included from drivers/net/ethernet/mellanox/mlxsw/core.h:47:0,
> from drivers/net/ethernet/mellanox/mlxsw/spectrum.h:54,
> from drivers/net/ethernet/mellanox/mlxsw/spectrum.c:64:
> include/net/devlink.h:560:1: note: expected 'u64 {aka long long unsigned int}' but argument is of type 'struct devlink_resource_size_params *'
> devlink_resource_register(struct devlink *devlink,
> ^~~~~~~~~~~~~~~~~~~~~~~~~
I just did another full build (allmodconfig) on net-next and did not hit
this error.
^ permalink raw reply
* [PATCH net-next 2/2] net: bcmgenet: Add support for adaptive RX coalescing
From: Florian Fainelli @ 2018-03-23 1:19 UTC (permalink / raw)
To: netdev
Cc: Florian Fainelli, davem, jaedon.shin, pgynther, opendmb,
michal.chan, gospo, talgi, saeedm
In-Reply-To: <20180323011933.29748-1-f.fainelli@gmail.com>
Unlike the moder modern SYSTEMPORT hardware, we do not have a
configurable TDMA timeout, which limits us to implement adaptive RX
interrupt coalescing only. We have each of our RX rings implement a
bcmgenet_net_dim structure which holds an interrupt counter, number of
packets, bytes, and a container for a net_dim instance.
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
---
drivers/net/ethernet/broadcom/genet/bcmgenet.c | 109 +++++++++++++++++++++----
drivers/net/ethernet/broadcom/genet/bcmgenet.h | 12 +++
2 files changed, 103 insertions(+), 18 deletions(-)
diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.c b/drivers/net/ethernet/broadcom/genet/bcmgenet.c
index b1e35a9accf1..7db8edc643ec 100644
--- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c
+++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c
@@ -603,6 +603,8 @@ static int bcmgenet_get_coalesce(struct net_device *dev,
struct ethtool_coalesce *ec)
{
struct bcmgenet_priv *priv = netdev_priv(dev);
+ struct bcmgenet_rx_ring *ring;
+ unsigned int i;
ec->tx_max_coalesced_frames =
bcmgenet_tdma_ring_readl(priv, DESC_INDEX,
@@ -613,15 +615,37 @@ static int bcmgenet_get_coalesce(struct net_device *dev,
ec->rx_coalesce_usecs =
bcmgenet_rdma_readl(priv, DMA_RING16_TIMEOUT) * 8192 / 1000;
+ for (i = 0; i < priv->hw_params->rx_queues; i++) {
+ ring = &priv->rx_rings[i];
+ ec->use_adaptive_rx_coalesce |= ring->dim.use_dim;
+ }
+ ring = &priv->rx_rings[DESC_INDEX];
+ ec->use_adaptive_rx_coalesce |= ring->dim.use_dim;
+
return 0;
}
+static void bcmgenet_set_rx_coalesce(struct bcmgenet_rx_ring *ring)
+{
+ struct bcmgenet_priv *priv = ring->priv;
+ unsigned int i = ring->index;
+ u32 reg;
+
+ bcmgenet_rdma_ring_writel(priv, i, ring->dim.coal_pkts,
+ DMA_MBUF_DONE_THRESH);
+
+ reg = bcmgenet_rdma_readl(priv, DMA_RING0_TIMEOUT + i);
+ reg &= ~DMA_TIMEOUT_MASK;
+ reg |= DIV_ROUND_UP(ring->dim.coal_usecs * 1000, 8192);
+ bcmgenet_rdma_writel(priv, reg, DMA_RING0_TIMEOUT + i);
+}
+
static int bcmgenet_set_coalesce(struct net_device *dev,
struct ethtool_coalesce *ec)
{
struct bcmgenet_priv *priv = netdev_priv(dev);
+ struct bcmgenet_rx_ring *ring;
unsigned int i;
- u32 reg;
/* Base system clock is 125Mhz, DMA timeout is this reference clock
* divided by 1024, which yields roughly 8.192us, our maximum value
@@ -641,7 +665,8 @@ static int bcmgenet_set_coalesce(struct net_device *dev,
* transmitted, or when the ring is empty.
*/
if (ec->tx_coalesce_usecs || ec->tx_coalesce_usecs_high ||
- ec->tx_coalesce_usecs_irq || ec->tx_coalesce_usecs_low)
+ ec->tx_coalesce_usecs_irq || ec->tx_coalesce_usecs_low ||
+ ec->use_adaptive_tx_coalesce)
return -EOPNOTSUPP;
/* Program all TX queues with the same values, as there is no
@@ -656,24 +681,26 @@ static int bcmgenet_set_coalesce(struct net_device *dev,
DMA_MBUF_DONE_THRESH);
for (i = 0; i < priv->hw_params->rx_queues; i++) {
- bcmgenet_rdma_ring_writel(priv, i,
- ec->rx_max_coalesced_frames,
- DMA_MBUF_DONE_THRESH);
-
- reg = bcmgenet_rdma_readl(priv, DMA_RING0_TIMEOUT + i);
- reg &= ~DMA_TIMEOUT_MASK;
- reg |= DIV_ROUND_UP(ec->rx_coalesce_usecs * 1000, 8192);
- bcmgenet_rdma_writel(priv, reg, DMA_RING0_TIMEOUT + i);
+ ring = &priv->rx_rings[i];
+ ring->dim.coal_usecs = ec->rx_coalesce_usecs;
+ ring->dim.coal_pkts = ec->rx_max_coalesced_frames;
+ if (!ec->use_adaptive_rx_coalesce && ring->dim.use_dim) {
+ ring->dim.coal_pkts = 1;
+ ring->dim.coal_usecs = 0;
+ }
+ ring->dim.use_dim = ec->use_adaptive_rx_coalesce;
+ bcmgenet_set_rx_coalesce(ring);
}
- bcmgenet_rdma_ring_writel(priv, DESC_INDEX,
- ec->rx_max_coalesced_frames,
- DMA_MBUF_DONE_THRESH);
-
- reg = bcmgenet_rdma_readl(priv, DMA_RING16_TIMEOUT);
- reg &= ~DMA_TIMEOUT_MASK;
- reg |= DIV_ROUND_UP(ec->rx_coalesce_usecs * 1000, 8192);
- bcmgenet_rdma_writel(priv, reg, DMA_RING16_TIMEOUT);
+ ring = &priv->rx_rings[DESC_INDEX];
+ ring->dim.coal_usecs = ec->rx_coalesce_usecs;
+ ring->dim.coal_pkts = ec->rx_max_coalesced_frames;
+ if (!ec->use_adaptive_rx_coalesce && ring->dim.use_dim) {
+ ring->dim.coal_pkts = 1;
+ ring->dim.coal_usecs = 0;
+ }
+ ring->dim.use_dim = ec->use_adaptive_rx_coalesce;
+ bcmgenet_set_rx_coalesce(ring);
return 0;
}
@@ -1713,6 +1740,7 @@ static unsigned int bcmgenet_desc_rx(struct bcmgenet_rx_ring *ring,
unsigned long dma_flag;
int len;
unsigned int rxpktprocessed = 0, rxpkttoprocess;
+ unsigned int bytes_processed = 0;
unsigned int p_index, mask;
unsigned int discards;
unsigned int chksum_ok = 0;
@@ -1832,6 +1860,8 @@ static unsigned int bcmgenet_desc_rx(struct bcmgenet_rx_ring *ring,
len -= ETH_FCS_LEN;
}
+ bytes_processed += len;
+
/*Finish setting up the received SKB and send it to the kernel*/
skb->protocol = eth_type_trans(skb, priv->dev);
ring->packets++;
@@ -1854,6 +1884,9 @@ static unsigned int bcmgenet_desc_rx(struct bcmgenet_rx_ring *ring,
bcmgenet_rdma_ring_writel(priv, ring->index, ring->c_index, RDMA_CONS_INDEX);
}
+ ring->dim.bytes = bytes_processed;
+ ring->dim.packets = rxpktprocessed;
+
return rxpktprocessed;
}
@@ -1862,6 +1895,7 @@ static int bcmgenet_rx_poll(struct napi_struct *napi, int budget)
{
struct bcmgenet_rx_ring *ring = container_of(napi,
struct bcmgenet_rx_ring, napi);
+ struct net_dim_sample dim_sample;
unsigned int work_done;
work_done = bcmgenet_desc_rx(ring, budget);
@@ -1871,9 +1905,32 @@ static int bcmgenet_rx_poll(struct napi_struct *napi, int budget)
ring->int_enable(ring);
}
+ if (ring->dim.use_dim) {
+ net_dim_sample(ring->dim.event_ctr, ring->dim.packets,
+ ring->dim.bytes, &dim_sample);
+ net_dim(&ring->dim.dim, dim_sample);
+ }
+
return work_done;
}
+static void bcmgenet_dim_work(struct work_struct *work)
+{
+ struct net_dim *dim = container_of(work, struct net_dim, work);
+ struct bcmgenet_net_dim *ndim =
+ container_of(dim, struct bcmgenet_net_dim, dim);
+ struct bcmgenet_rx_ring *ring =
+ container_of(ndim, struct bcmgenet_rx_ring, dim);
+ struct net_dim_cq_moder cur_profile =
+ net_dim_get_profile(dim->mode, dim->profile_ix);
+
+ ring->dim.coal_usecs = cur_profile.usec;
+ ring->dim.coal_pkts = cur_profile.pkts;
+
+ bcmgenet_set_rx_coalesce(ring);
+ dim->state = NET_DIM_START_MEASURE;
+}
+
/* Assign skb to RX DMA descriptor. */
static int bcmgenet_alloc_rx_buffers(struct bcmgenet_priv *priv,
struct bcmgenet_rx_ring *ring)
@@ -2022,6 +2079,16 @@ static void init_umac(struct bcmgenet_priv *priv)
dev_dbg(kdev, "done init umac\n");
}
+static void bcmgenet_init_dim(struct bcmgenet_net_dim *dim,
+ void (*cb)(struct work_struct *work))
+{
+ INIT_WORK(&dim->dim.work, cb);
+ dim->dim.mode = NET_DIM_CQ_PERIOD_MODE_START_FROM_EQE;
+ dim->event_ctr = 0;
+ dim->packets = 0;
+ dim->bytes = 0;
+}
+
/* Initialize a Tx ring along with corresponding hardware registers */
static void bcmgenet_init_tx_ring(struct bcmgenet_priv *priv,
unsigned int index, unsigned int size,
@@ -2111,6 +2178,8 @@ static int bcmgenet_init_rx_ring(struct bcmgenet_priv *priv,
if (ret)
return ret;
+ bcmgenet_init_dim(&ring->dim, bcmgenet_dim_work);
+
/* Initialize Rx NAPI */
netif_napi_add(priv->dev, &ring->napi, bcmgenet_rx_poll,
NAPI_POLL_WEIGHT);
@@ -2276,10 +2345,12 @@ static void bcmgenet_disable_rx_napi(struct bcmgenet_priv *priv)
for (i = 0; i < priv->hw_params->rx_queues; ++i) {
ring = &priv->rx_rings[i];
napi_disable(&ring->napi);
+ cancel_work_sync(&ring->dim.dim.work);
}
ring = &priv->rx_rings[DESC_INDEX];
napi_disable(&ring->napi);
+ cancel_work_sync(&ring->dim.dim.work);
}
static void bcmgenet_fini_rx_napi(struct bcmgenet_priv *priv)
@@ -2557,6 +2628,7 @@ static irqreturn_t bcmgenet_isr1(int irq, void *dev_id)
continue;
rx_ring = &priv->rx_rings[index];
+ rx_ring->dim.event_ctr++;
if (likely(napi_schedule_prep(&rx_ring->napi))) {
rx_ring->int_disable(rx_ring);
@@ -2601,6 +2673,7 @@ static irqreturn_t bcmgenet_isr0(int irq, void *dev_id)
if (status & UMAC_IRQ_RXDMA_DONE) {
rx_ring = &priv->rx_rings[DESC_INDEX];
+ rx_ring->dim.event_ctr++;
if (likely(napi_schedule_prep(&rx_ring->napi))) {
rx_ring->int_disable(rx_ring);
diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.h b/drivers/net/ethernet/broadcom/genet/bcmgenet.h
index 3c50431ccd2a..22c41e0430fb 100644
--- a/drivers/net/ethernet/broadcom/genet/bcmgenet.h
+++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.h
@@ -16,6 +16,7 @@
#include <linux/mii.h>
#include <linux/if_vlan.h>
#include <linux/phy.h>
+#include <linux/net_dim.h>
/* total number of Buffer Descriptors, same for Rx/Tx */
#define TOTAL_DESC 256
@@ -572,6 +573,16 @@ struct bcmgenet_tx_ring {
struct bcmgenet_priv *priv;
};
+struct bcmgenet_net_dim {
+ u16 use_dim;
+ u16 event_ctr;
+ unsigned long packets;
+ unsigned long bytes;
+ u32 coal_usecs;
+ u32 coal_pkts;
+ struct net_dim dim;
+};
+
struct bcmgenet_rx_ring {
struct napi_struct napi; /* Rx NAPI struct */
unsigned long bytes;
@@ -586,6 +597,7 @@ struct bcmgenet_rx_ring {
unsigned int cb_ptr; /* Rx ring initial CB ptr */
unsigned int end_ptr; /* Rx ring end CB ptr */
unsigned int old_discards;
+ struct bcmgenet_net_dim dim;
void (*int_enable)(struct bcmgenet_rx_ring *);
void (*int_disable)(struct bcmgenet_rx_ring *);
struct bcmgenet_priv *priv;
--
2.14.1
^ permalink raw reply related
* [PATCH net-next 1/2] net: systemport: Implement adaptive interrupt coalescing
From: Florian Fainelli @ 2018-03-23 1:19 UTC (permalink / raw)
To: netdev
Cc: Florian Fainelli, davem, jaedon.shin, pgynther, opendmb,
michal.chan, gospo, talgi, saeedm
In-Reply-To: <20180323011933.29748-1-f.fainelli@gmail.com>
Implement support for adaptive RX and TX interrupt coalescing using
net_dim. We have each of our TX ring and our single RX ring implement a
bcm_sysport_net_dim structure which holds an interrupt counter, number
of packets, bytes, and a container for a net_dim instance.
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
---
drivers/net/ethernet/broadcom/bcmsysport.c | 141 ++++++++++++++++++++++++++---
drivers/net/ethernet/broadcom/bcmsysport.h | 14 +++
2 files changed, 140 insertions(+), 15 deletions(-)
diff --git a/drivers/net/ethernet/broadcom/bcmsysport.c b/drivers/net/ethernet/broadcom/bcmsysport.c
index f15a8fc6dfc9..5a5a726bafa4 100644
--- a/drivers/net/ethernet/broadcom/bcmsysport.c
+++ b/drivers/net/ethernet/broadcom/bcmsysport.c
@@ -15,6 +15,7 @@
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/netdevice.h>
+#include <linux/net_dim.h>
#include <linux/etherdevice.h>
#include <linux/platform_device.h>
#include <linux/of.h>
@@ -574,21 +575,55 @@ static int bcm_sysport_set_wol(struct net_device *dev,
return 0;
}
+static void bcm_sysport_set_rx_coalesce(struct bcm_sysport_priv *priv)
+{
+ u32 reg;
+
+ reg = rdma_readl(priv, RDMA_MBDONE_INTR);
+ reg &= ~(RDMA_INTR_THRESH_MASK |
+ RDMA_TIMEOUT_MASK << RDMA_TIMEOUT_SHIFT);
+ reg |= priv->dim.coal_pkts;
+ reg |= DIV_ROUND_UP(priv->dim.coal_usecs * 1000, 8192) <<
+ RDMA_TIMEOUT_SHIFT;
+ rdma_writel(priv, reg, RDMA_MBDONE_INTR);
+}
+
+static void bcm_sysport_set_tx_coalesce(struct bcm_sysport_tx_ring *ring)
+{
+ struct bcm_sysport_priv *priv = ring->priv;
+ u32 reg;
+
+ reg = tdma_readl(priv, TDMA_DESC_RING_INTR_CONTROL(ring->index));
+ reg &= ~(RING_INTR_THRESH_MASK |
+ RING_TIMEOUT_MASK << RING_TIMEOUT_SHIFT);
+ reg |= ring->dim.coal_pkts;
+ reg |= DIV_ROUND_UP(ring->dim.coal_usecs * 1000, 8192) <<
+ RING_TIMEOUT_SHIFT;
+ tdma_writel(priv, reg, TDMA_DESC_RING_INTR_CONTROL(ring->index));
+}
+
static int bcm_sysport_get_coalesce(struct net_device *dev,
struct ethtool_coalesce *ec)
{
struct bcm_sysport_priv *priv = netdev_priv(dev);
+ struct bcm_sysport_tx_ring *ring;
+ unsigned int i;
u32 reg;
reg = tdma_readl(priv, TDMA_DESC_RING_INTR_CONTROL(0));
ec->tx_coalesce_usecs = (reg >> RING_TIMEOUT_SHIFT) * 8192 / 1000;
ec->tx_max_coalesced_frames = reg & RING_INTR_THRESH_MASK;
+ for (i = 0; i < dev->num_tx_queues; i++) {
+ ring = &priv->tx_rings[i];
+ ec->use_adaptive_tx_coalesce |= ring->dim.use_dim;
+ }
reg = rdma_readl(priv, RDMA_MBDONE_INTR);
ec->rx_coalesce_usecs = (reg >> RDMA_TIMEOUT_SHIFT) * 8192 / 1000;
ec->rx_max_coalesced_frames = reg & RDMA_INTR_THRESH_MASK;
+ ec->use_adaptive_rx_coalesce = priv->dim.use_dim;
return 0;
}
@@ -597,8 +632,8 @@ static int bcm_sysport_set_coalesce(struct net_device *dev,
struct ethtool_coalesce *ec)
{
struct bcm_sysport_priv *priv = netdev_priv(dev);
+ struct bcm_sysport_tx_ring *ring;
unsigned int i;
- u32 reg;
/* Base system clock is 125Mhz, DMA timeout is this reference clock
* divided by 1024, which yield roughly 8.192 us, our maximum value has
@@ -615,22 +650,26 @@ static int bcm_sysport_set_coalesce(struct net_device *dev,
return -EINVAL;
for (i = 0; i < dev->num_tx_queues; i++) {
- reg = tdma_readl(priv, TDMA_DESC_RING_INTR_CONTROL(i));
- reg &= ~(RING_INTR_THRESH_MASK |
- RING_TIMEOUT_MASK << RING_TIMEOUT_SHIFT);
- reg |= ec->tx_max_coalesced_frames;
- reg |= DIV_ROUND_UP(ec->tx_coalesce_usecs * 1000, 8192) <<
- RING_TIMEOUT_SHIFT;
- tdma_writel(priv, reg, TDMA_DESC_RING_INTR_CONTROL(i));
+ ring = &priv->tx_rings[i];
+ ring->dim.coal_pkts = ec->tx_max_coalesced_frames;
+ ring->dim.coal_usecs = ec->tx_coalesce_usecs;
+ if (!ec->use_adaptive_tx_coalesce && ring->dim.use_dim) {
+ ring->dim.coal_pkts = 1;
+ ring->dim.coal_usecs = 0;
+ }
+ ring->dim.use_dim = ec->use_adaptive_tx_coalesce;
+ bcm_sysport_set_tx_coalesce(ring);
}
- reg = rdma_readl(priv, RDMA_MBDONE_INTR);
- reg &= ~(RDMA_INTR_THRESH_MASK |
- RDMA_TIMEOUT_MASK << RDMA_TIMEOUT_SHIFT);
- reg |= ec->rx_max_coalesced_frames;
- reg |= DIV_ROUND_UP(ec->rx_coalesce_usecs * 1000, 8192) <<
- RDMA_TIMEOUT_SHIFT;
- rdma_writel(priv, reg, RDMA_MBDONE_INTR);
+ priv->dim.coal_usecs = ec->rx_coalesce_usecs;
+ priv->dim.coal_pkts = ec->rx_max_coalesced_frames;
+
+ if (!ec->use_adaptive_rx_coalesce && priv->dim.use_dim) {
+ priv->dim.coal_pkts = 1;
+ priv->dim.coal_usecs = 0;
+ }
+ priv->dim.use_dim = ec->use_adaptive_rx_coalesce;
+ bcm_sysport_set_rx_coalesce(priv);
return 0;
}
@@ -709,6 +748,7 @@ static unsigned int bcm_sysport_desc_rx(struct bcm_sysport_priv *priv,
struct bcm_sysport_stats64 *stats64 = &priv->stats64;
struct net_device *ndev = priv->netdev;
unsigned int processed = 0, to_process;
+ unsigned int processed_bytes = 0;
struct bcm_sysport_cb *cb;
struct sk_buff *skb;
unsigned int p_index;
@@ -800,6 +840,7 @@ static unsigned int bcm_sysport_desc_rx(struct bcm_sysport_priv *priv,
*/
skb_pull(skb, sizeof(*rsb) + 2);
len -= (sizeof(*rsb) + 2);
+ processed_bytes += len;
/* UniMAC may forward CRC */
if (priv->crc_fwd) {
@@ -824,6 +865,9 @@ static unsigned int bcm_sysport_desc_rx(struct bcm_sysport_priv *priv,
priv->rx_read_ptr = 0;
}
+ priv->dim.packets = processed;
+ priv->dim.bytes = processed_bytes;
+
return processed;
}
@@ -900,6 +944,8 @@ static unsigned int __bcm_sysport_tx_reclaim(struct bcm_sysport_priv *priv,
ring->packets += pkts_compl;
ring->bytes += bytes_compl;
u64_stats_update_end(&priv->syncp);
+ ring->dim.packets = pkts_compl;
+ ring->dim.bytes = bytes_compl;
ring->c_index = c_index;
@@ -945,6 +991,7 @@ static int bcm_sysport_tx_poll(struct napi_struct *napi, int budget)
{
struct bcm_sysport_tx_ring *ring =
container_of(napi, struct bcm_sysport_tx_ring, napi);
+ struct net_dim_sample dim_sample;
unsigned int work_done = 0;
work_done = bcm_sysport_tx_reclaim(ring->priv, ring);
@@ -961,6 +1008,12 @@ static int bcm_sysport_tx_poll(struct napi_struct *napi, int budget)
return 0;
}
+ if (ring->dim.use_dim) {
+ net_dim_sample(ring->dim.event_ctr, ring->dim.packets,
+ ring->dim.bytes, &dim_sample);
+ net_dim(&ring->dim.dim, dim_sample);
+ }
+
return budget;
}
@@ -976,6 +1029,7 @@ static int bcm_sysport_poll(struct napi_struct *napi, int budget)
{
struct bcm_sysport_priv *priv =
container_of(napi, struct bcm_sysport_priv, napi);
+ struct net_dim_sample dim_sample;
unsigned int work_done = 0;
work_done = bcm_sysport_desc_rx(priv, budget);
@@ -998,6 +1052,12 @@ static int bcm_sysport_poll(struct napi_struct *napi, int budget)
intrl2_0_mask_clear(priv, INTRL2_0_RDMA_MBDONE);
}
+ if (priv->dim.use_dim) {
+ net_dim_sample(priv->dim.event_ctr, priv->dim.packets,
+ priv->dim.bytes, &dim_sample);
+ net_dim(&priv->dim.dim, dim_sample);
+ }
+
return work_done;
}
@@ -1016,6 +1076,40 @@ static void bcm_sysport_resume_from_wol(struct bcm_sysport_priv *priv)
netif_dbg(priv, wol, priv->netdev, "resumed from WOL\n");
}
+static void bcm_sysport_dim_work(struct work_struct *work)
+{
+ struct net_dim *dim = container_of(work, struct net_dim, work);
+ struct bcm_sysport_net_dim *ndim =
+ container_of(dim, struct bcm_sysport_net_dim, dim);
+ struct bcm_sysport_priv *priv =
+ container_of(ndim, struct bcm_sysport_priv, dim);
+ struct net_dim_cq_moder cur_profile =
+ net_dim_get_profile(dim->mode, dim->profile_ix);
+
+ priv->dim.coal_usecs = cur_profile.usec;
+ priv->dim.coal_pkts = cur_profile.pkts;
+
+ bcm_sysport_set_rx_coalesce(priv);
+ dim->state = NET_DIM_START_MEASURE;
+}
+
+static void bcm_sysport_dim_tx_work(struct work_struct *work)
+{
+ struct net_dim *dim = container_of(work, struct net_dim, work);
+ struct bcm_sysport_net_dim *ndim =
+ container_of(dim, struct bcm_sysport_net_dim, dim);
+ struct bcm_sysport_tx_ring *ring =
+ container_of(ndim, struct bcm_sysport_tx_ring, dim);
+ struct net_dim_cq_moder cur_profile =
+ net_dim_get_profile(dim->mode, dim->profile_ix);
+
+ ring->dim.coal_usecs = cur_profile.usec;
+ ring->dim.coal_pkts = cur_profile.pkts;
+
+ bcm_sysport_set_tx_coalesce(ring);
+ dim->state = NET_DIM_START_MEASURE;
+}
+
/* RX and misc interrupt routine */
static irqreturn_t bcm_sysport_rx_isr(int irq, void *dev_id)
{
@@ -1034,6 +1128,7 @@ static irqreturn_t bcm_sysport_rx_isr(int irq, void *dev_id)
}
if (priv->irq0_stat & INTRL2_0_RDMA_MBDONE) {
+ priv->dim.event_ctr++;
if (likely(napi_schedule_prep(&priv->napi))) {
/* disable RX interrupts */
intrl2_0_mask_set(priv, INTRL2_0_RDMA_MBDONE);
@@ -1061,6 +1156,7 @@ static irqreturn_t bcm_sysport_rx_isr(int irq, void *dev_id)
continue;
txr = &priv->tx_rings[ring];
+ txr->dim.event_ctr++;
if (likely(napi_schedule_prep(&txr->napi))) {
intrl2_0_mask_set(priv, ring_bit);
@@ -1093,6 +1189,7 @@ static irqreturn_t bcm_sysport_tx_isr(int irq, void *dev_id)
continue;
txr = &priv->tx_rings[ring];
+ txr->dim.event_ctr++;
if (likely(napi_schedule_prep(&txr->napi))) {
intrl2_1_mask_set(priv, BIT(ring));
@@ -1358,6 +1455,16 @@ static void bcm_sysport_adj_link(struct net_device *dev)
phy_print_status(phydev);
}
+static void bcm_sysport_init_dim(struct bcm_sysport_net_dim *dim,
+ void (*cb)(struct work_struct *work))
+{
+ INIT_WORK(&dim->dim.work, cb);
+ dim->dim.mode = NET_DIM_CQ_PERIOD_MODE_START_FROM_EQE;
+ dim->event_ctr = 0;
+ dim->packets = 0;
+ dim->bytes = 0;
+}
+
static int bcm_sysport_init_tx_ring(struct bcm_sysport_priv *priv,
unsigned int index)
{
@@ -1447,6 +1554,7 @@ static int bcm_sysport_init_tx_ring(struct bcm_sysport_priv *priv,
reg |= (1 << index);
tdma_writel(priv, reg, TDMA_TIER1_ARB_0_QUEUE_EN);
+ bcm_sysport_init_dim(&ring->dim, bcm_sysport_dim_tx_work);
napi_enable(&ring->napi);
netif_dbg(priv, hw, priv->netdev,
@@ -1477,6 +1585,7 @@ static void bcm_sysport_fini_tx_ring(struct bcm_sysport_priv *priv,
return;
napi_disable(&ring->napi);
+ cancel_work_sync(&ring->dim.dim.work);
netif_napi_del(&ring->napi);
bcm_sysport_tx_clean(priv, ring);
@@ -1766,6 +1875,7 @@ static void bcm_sysport_netif_start(struct net_device *dev)
struct bcm_sysport_priv *priv = netdev_priv(dev);
/* Enable NAPI */
+ bcm_sysport_init_dim(&priv->dim, bcm_sysport_dim_work);
napi_enable(&priv->napi);
/* Enable RX interrupt and TX ring full interrupt */
@@ -1951,6 +2061,7 @@ static void bcm_sysport_netif_stop(struct net_device *dev)
/* stop all software from updating hardware */
netif_tx_stop_all_queues(dev);
napi_disable(&priv->napi);
+ cancel_work_sync(&priv->dim.dim.work);
phy_stop(dev->phydev);
/* mask all interrupts */
diff --git a/drivers/net/ethernet/broadcom/bcmsysport.h b/drivers/net/ethernet/broadcom/bcmsysport.h
index f5a984c1c986..9f48ad3cc38d 100644
--- a/drivers/net/ethernet/broadcom/bcmsysport.h
+++ b/drivers/net/ethernet/broadcom/bcmsysport.h
@@ -12,6 +12,7 @@
#define __BCM_SYSPORT_H
#include <linux/if_vlan.h>
+#include <linux/net_dim.h>
/* Receive/transmit descriptor format */
#define DESC_ADDR_HI_STATUS_LEN 0x00
@@ -695,6 +696,16 @@ struct bcm_sysport_hw_params {
unsigned int num_rx_desc_words;
};
+struct bcm_sysport_net_dim {
+ u16 use_dim;
+ u16 event_ctr;
+ unsigned long packets;
+ unsigned long bytes;
+ u32 coal_usecs;
+ u32 coal_pkts;
+ struct net_dim dim;
+};
+
/* Software view of the TX ring */
struct bcm_sysport_tx_ring {
spinlock_t lock; /* Ring lock for tx reclaim/xmit */
@@ -712,6 +723,7 @@ struct bcm_sysport_tx_ring {
struct bcm_sysport_priv *priv; /* private context backpointer */
unsigned long packets; /* packets statistics */
unsigned long bytes; /* bytes statistics */
+ struct bcm_sysport_net_dim dim; /* Net DIM context */
unsigned int switch_queue; /* switch port queue number */
unsigned int switch_port; /* switch port queue number */
bool inspect; /* inspect switch port and queue */
@@ -743,6 +755,8 @@ struct bcm_sysport_priv {
unsigned int rx_read_ptr;
unsigned int rx_c_index;
+ struct bcm_sysport_net_dim dim;
+
/* PHY device */
struct device_node *phy_dn;
phy_interface_t phy_interface;
--
2.14.1
^ permalink raw reply related
* [PATCH net-next 0/2] net: broadcom: Adaptive interrupt coalescing
From: Florian Fainelli @ 2018-03-23 1:19 UTC (permalink / raw)
To: netdev
Cc: Florian Fainelli, davem, jaedon.shin, pgynther, opendmb,
michal.chan, gospo, talgi, saeedm
Hi all,
This patch series adds adaptive interrupt coalescing for the Gigabit Ethernet
drivers SYSTEMPORT and GENET.
This really helps lower the interrupt count and system load, as measured by
vmstat for a Gigabit TCP RX session:
SYSTEMPORT:
without:
1 0 0 192188 0 25472 0 0 0 0 122100 38870 1 42 57 0 0
[ ID] Interval Transfer Bandwidth
[ 4] 0.0-10.0 sec 1.03 GBytes 884 Mbits/sec
with:
1 0 0 192288 0 25468 0 0 0 0 58806 44401 0 100 0 0 0
[ 5] 0.0-10.0 sec 1.04 GBytes 888 Mbits/sec
GENET:
without:
1 0 0 1170404 0 25420 0 0 0 0 130785 63402 2 85 12 0 0
[ ID] Interval Transfer Bandwidth
[ 4] 0.0-10.0 sec 1.04 GBytes 888 Mbits/sec
with:
1 0 0 1170560 0 25420 0 0 0 0 50610 48477 0 100 0 0 0
[ 5] 0.0-10.0 sec 1.05 GBytes 899 Mbits/sec
Please look at the implementation and let me know if you see any problems, this
was largely inspired by bnxt_en.
Thank you!
Florian Fainelli (2):
net: systemport: Implement adaptive interrupt coalescing
net: bcmgenet: Add support for adaptive RX coalescing
drivers/net/ethernet/broadcom/bcmsysport.c | 141 ++++++++++++++++++++++---
drivers/net/ethernet/broadcom/bcmsysport.h | 14 +++
drivers/net/ethernet/broadcom/genet/bcmgenet.c | 109 +++++++++++++++----
drivers/net/ethernet/broadcom/genet/bcmgenet.h | 12 +++
4 files changed, 243 insertions(+), 33 deletions(-)
--
2.14.1
^ permalink raw reply
* l2tp stable request
From: Daniel Rosenberg @ 2018-03-23 0:55 UTC (permalink / raw)
To: netdev; +Cc: Greg Kroah-Hartman, stable
f3c66d4e144a0904ea9b95d23ed9f8eb38c11bfb l2tp: prevent creation
of sessions on terminated tunnels
9ee369a405c57613d7c83a3967780c3e30c52ecc l2tp: initialise
session's refcount before making it reachable
dbdbc73b44782e22b3b4b6e8b51e7a3d245f3086 l2tp: fix duplicate
session creation
61b9a047729bb230978178bca6729689d0c50ca2 l2tp: fix race in
l2tp_recv_common()
For v3.18+. It requires some minor backporting.
Without these, I'm seeing a null pointer in l2tp_session_create. These
logs are from a 3.18 kernel, although I was able to hit it on a 4.4
kernel I tested as well.
[ 376.388847] c1 11731 Unable to handle kernel NULL pointer
dereference at virtual address 0000006c
[ 376.388892] c1 11731 pgd = ffffffc093138000
[ 376.388908] [0000006c] *pgd=000000010add3003, *pud=000000010add3003,
*pmd=0000000000000000
[ 376.388955] c1 11731 Internal error: Oops: 96000006 [#1] PREEMPT SMP
[ 376.388987] c1 11731 CPU: 1 PID: 11731 Comm: 0 Tainted: G B W
3.18.31-g3021f2f-00001-gea07e56-dirty #35
[ 376.389005] c1 11731 Hardware name: HTC Corporation. MSM8996pro v1.1
+ PMI8996 Marlin A (DT)
[ 376.389024] c1 11731 task: ffffffc09f582880 ti: ffffffc089ea4000
task.ti: ffffffc089ea4000
[ 376.389062] c1 11731 PC is at l2tp_session_create+0x39c/0x5b8
[ 376.389081] c1 11731 LR is at l2tp_session_create+0x394/0x5b8
[ 376.389097] c1 11731 pc : [<ffffffc00127bbd4>] lr :
[<ffffffc00127bbcc>] pstate: 20000145
[ 376.389112] c1 11731 sp : ffffffc089ea7ca0
[ 376.389127] x29: ffffffc089ea7ca0 x28: ffffffc03982fbf8
[ 376.389154] x27: 0000000000000000 x26: ffffffc03982fca0
[ 376.389180] x25: ffffffc099190ea8 x24: ffffffc03982fca8
[ 376.389205] x23: ffffffc03982fbf0 x22: 0000000000000000
[ 376.389230] x21: ffffffc03982fc98 x20: ffffffc099190e00
[ 376.389254] x19: ffffffc03982fb80 x18: ffffffc001bd00e0
[ 376.389277] x17: 0000000033293c44 x16: 000000006e1d9948
[ 376.389301] x15: 0000000000000000 x14: 000000000000000a
[ 376.389324] x13: ffffffc0b982fc03 x12: 0000000000000000
[ 376.389347] x11: 0000000000000000 x10: ffffffc03982fc0d
[ 376.389370] x9 : 00000000fffffffb x8 : ffffff8807305fb0
[ 376.389393] x7 : fcfcfcfcfcfcfcfc x6 : ffffffc03982fba4
[ 376.389415] x5 : 000000000000ffff x4 : ffffffc0019480db
[ 376.389438] x3 : 1ffffff8132321e9 x2 : dfffff9000000000
[ 376.389461] x1 : 0000000000000000 x0 : 000000000000006c
[ 376.389486] c1 11731
[ 376.389486] c1 11731 PC: 0xffffffc00127bad4:
[ 376.389504] bad4 7900627b 91004b00 97bd0420 7940271b 9100d260
97bd043a 79006a7b 91004300
[ 376.389574] baf4 97bd041a 7940231b 9100ca60 97bd0434 7900667b
91007300 97bd044e b9401f1b
[ 376.389641] bb14 91008260 97bd0469 b900227b 91005301 91006260
b9801f02 97bd05c4 9100a300
[ 376.389708] bb34 97bd0444 b9402b1b 9100b260 97bd045f b9002e7b
91008301 91009260 b9802b02
[ 376.389777] bb54 97bd05ba 97baedb0 9104a278 aa1903e0 97bd0438
b940aa80 7100081f 540009c1
[ 376.389843] bb74 97baeda9 aa1803e0 97bd048b 90ffffe0 91383000
f9009660 97baeda3 b940aa81
[ 376.389910] bb94 aa1303e0 97fffb38 91020262 885f7c40 11000400
88017c40 35ffffa1 9104a282
[ 376.389976] bbb4 885f7c40 11000400 88017c40 35ffffa1 91052280
97bd045b f940a680 9101b000
[ 376.390042] bbd4 885f7c01 11000421 88027c01 35ffffa2 9100629b
aa1b03e0 94028720 52800020
[ 376.390107] bbf4 72b3c6e0 1b007ec0 b9006ba0 f94037a0 d35c7c16
910012c0 8b160e96 f90033a0
[ 376.390174] bc14 8b000e80 97bd0447 f94012d8 aa1703e0 97bd0461
f9003a78 b40000b8 97baed7a
[ 376.390240] bc34 91002300 97bd045c f9000717 97baed76 f90012d7
aa1c03e0 97bd0457 f94033a0
[ 376.390306] bc54 8b000e80 f9003e60 aa1b03e0 94028827 aa1903e0
97bd03f7 b940aa80 7100081f
[ 376.390372] bc74 54000920 97baed68 91048280 97bd042d f9409296
b50001d6 97baed63 e7f001f2
[ 376.390439] bc94 97baed61 aa1503e0 97bd0408 12bfe000 17ffff16
97baed5c aa1803e0 97bd043e
[ 376.390508] bcb4 b0ffffe0 910f2000 17ffffb3 97baed56 d00065e0
b943a814 97ba0a9c 9134a2c0
[ 376.390576] c1 11731
[ 376.390576] c1 11731 LR: 0xffffffc00127bacc:
[ 376.390594] bacc 9100c260 97bd0440 7900627b 91004b00 97bd0420
7940271b 9100d260 97bd043a
[ 376.390662] baec 79006a7b 91004300 97bd041a 7940231b 9100ca60
97bd0434 7900667b 91007300
[ 376.390728] bb0c 97bd044e b9401f1b 91008260 97bd0469 b900227b
91005301 91006260 b9801f02
[ 376.390795] bb2c 97bd05c4 9100a300 97bd0444 b9402b1b 9100b260
97bd045f b9002e7b 91008301
[ 376.390862] bb4c 91009260 b9802b02 97bd05ba 97baedb0 9104a278
aa1903e0 97bd0438 b940aa80
[ 376.390929] bb6c 7100081f 540009c1 97baeda9 aa1803e0 97bd048b
90ffffe0 91383000 f9009660
[ 376.390995] bb8c 97baeda3 b940aa81 aa1303e0 97fffb38 91020262
885f7c40 11000400 88017c40
[ 376.391061] bbac 35ffffa1 9104a282 885f7c40 11000400 88017c40
35ffffa1 91052280 97bd045b
[ 376.391128] bbcc f940a680 9101b000 885f7c01 11000421 88027c01
35ffffa2 9100629b aa1b03e0
[ 376.391195] bbec 94028720 52800020 72b3c6e0 1b007ec0 b9006ba0
f94037a0 d35c7c16 910012c0
[ 376.391262] bc0c 8b160e96 f90033a0 8b000e80 97bd0447 f94012d8
aa1703e0 97bd0461 f9003a78
[ 376.391328] bc2c b40000b8 97baed7a 91002300 97bd045c f9000717
97baed76 f90012d7 aa1c03e0
[ 376.391394] bc4c 97bd0457 f94033a0 8b000e80 f9003e60 aa1b03e0
94028827 aa1903e0 97bd03f7
[ 376.391461] bc6c b940aa80 7100081f 54000920 97baed68 91048280
97bd042d f9409296 b50001d6
[ 376.391528] bc8c 97baed63 e7f001f2 97baed61 aa1503e0 97bd0408
12bfe000 17ffff16 97baed5c
[ 376.391594] bcac aa1803e0 97bd043e b0ffffe0 910f2000 17ffffb3
97baed56 d00065e0 b943a814
[ 376.391663] c1 11731
[ 376.391663] c1 11731 SP: 0xffffffc089ea7ba0:
[ 376.391680] 7ba0 019480db ffffffc0 0000ffff 00000000 3982fba4
ffffffc0 fcfcfcfc fcfcfcfc
[ 376.391747] 7bc0 07305fb0 ffffff88 fffffffb 00000000 3982fc0d
ffffffc0 00000000 00000000
[ 376.391814] 7be0 00000000 00000000 b982fc03 ffffffc0 0000000a
00000000 00000000 00000000
[ 376.391880] 7c00 6e1d9948 00000000 33293c44 00000000 01bd00e0
ffffffc0 3982fb80 ffffffc0
[ 376.391947] 7c20 99190e00 ffffffc0 3982fc98 ffffffc0 00000000
00000000 3982fbf0 ffffffc0
[ 376.392013] 7c40 3982fca8 ffffffc0 99190ea8 ffffffc0 3982fca0
ffffffc0 00000000 00000000
[ 376.392078] 7c60 3982fbf8 ffffffc0 89ea7ca0 ffffffc0 0127bbcc
ffffffc0 89ea7ca0 ffffffc0
[ 376.392144] 7c80 0127bbd4 ffffffc0 20000145 00000000 3982fc98
ffffffc0 00000000 00000000
[ 376.392212] 7ca0 89ea7d10 ffffffc0 0127dc2c ffffffc0 4261c200
ffffffc0 00000000 00000000
[ 376.392278] 7cc0 00000000 00000000 00000000 00000000 00000004
00000000 fffffff4 00000000
[ 376.392344] 7ce0 4261c230 ffffffc0 00000004 00000000 00000002
00000000 4261c212 ffffffc0
[ 376.392410] 7d00 89ea7d10 ffffffc0 00000000 ffffffc0 89ea7e00
ffffffc0 00ffd790 ffffffc0
[ 376.392478] 7d20 2aff8400 ffffffc0 00000026 00000000 3cf07980
ffffffc0 01bd0000 ffffffc0
[ 376.392544] 7d40 0127d9cc ffffffc0 00000015 00000000 00000119
00000000 000000cb 00000000
[ 376.392611] 7d60 01326000 ffffffc0 89ea4000 ffffffc0 01bd0000
ffffffc0 4261c448 ffffffc0
[ 376.392680] 7d80 00000003 00000000 99190e00 ffffffc0 ffffffff
ffffffff 000cfb30 ffffffc0
[ 376.392747] c1 11731
[ 376.392765] c1 11731 Process 0 (pid: 11731, stack limit =
0xffffffc089ea4058)
[ 376.392784] c1 11731 Context switch saved
registers(0xffffffc09f582ec0 to 0xffffffc09f582f28)
[ 376.392804] c1 11731 2ec0: a5f51b00 ffffffc0 9f582880 ffffffc0
89ea4000 ffffffc0 23966c00 ffffffc0
[ 376.392824] c1 11731 2ee0: 7345e780 ffffffc0 01c20000 ffffffc0
89ea7ac0 ffffffc0 019fe400 ffffffc0
[ 376.392842] c1 11731 2f00: 019fe400 ffffffc0 a5f51b00 ffffffc0
89ea7aa0 ffffffc0 89ea7aa0 ffffffc0
[ 376.392857] c1 11731 2f20: 00087574 ffffffc0
[ 376.392870] c1 11731 Call trace:
[ 376.392904] c1 11731 [<ffffffc00127bbd4>]
l2tp_session_create+0x39c/0x5b8
[ 376.392923] c1 11731 [<ffffffc00127dc2c>] pppol2tp_connect+0x260/0x698
[ 376.392952] c1 11731 [<ffffffc000ffd790>] SyS_connect+0xcc/0x144
[ 376.392971] c1 11731 Code: 91052280 97bd045b f940a680 9101b000
(885f7c01)
[ 376.402888] c1 11731 ---[ end trace 7e40566c5e647ab7 ]---
[ 376.446227] c1 11731 Kernel panic - not syncing: Fatal exception
^ permalink raw reply
* [net-next:master 304/314] drivers/net/ethernet/mellanox/mlxsw/spectrum.c:3878:8: error: too few arguments to function 'devlink_resource_register'
From: kbuild test robot @ 2018-03-23 0:47 UTC (permalink / raw)
To: David Ahern; +Cc: kbuild-all, netdev
[-- Attachment #1: Type: text/plain, Size: 18778 bytes --]
tree: https://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next.git master
head: 6686c459e1449a3ee5f3fd313b0a559ace7a700e
commit: 145307460ba9c11489807de7acd3f4c7395f60b7 [304/314] devlink: Remove top_hierarchy arg to devlink_resource_register
config: x86_64-randconfig-s1-03230751 (attached as .config)
compiler: gcc-6 (Debian 6.4.0-9) 6.4.0 20171026
reproduce:
git checkout 145307460ba9c11489807de7acd3f4c7395f60b7
# save the attached .config to linux build tree
make ARCH=x86_64
All error/warnings (new ones prefixed by >>):
drivers/net/ethernet/mellanox/mlxsw/spectrum.c: In function 'mlxsw_sp_resources_register':
>> drivers/net/ethernet/mellanox/mlxsw/spectrum.c:3881:6: warning: passing argument 6 of 'devlink_resource_register' makes integer from pointer without a cast [-Wint-conversion]
&kvd_size_params,
^
In file included from drivers/net/ethernet/mellanox/mlxsw/core.h:47:0,
from drivers/net/ethernet/mellanox/mlxsw/spectrum.h:54,
from drivers/net/ethernet/mellanox/mlxsw/spectrum.c:64:
include/net/devlink.h:560:1: note: expected 'u64 {aka long long unsigned int}' but argument is of type 'struct devlink_resource_size_params *'
devlink_resource_register(struct devlink *devlink,
^~~~~~~~~~~~~~~~~~~~~~~~~
>> drivers/net/ethernet/mellanox/mlxsw/spectrum.c:3878:8: error: too few arguments to function 'devlink_resource_register'
err = devlink_resource_register(devlink, MLXSW_SP_RESOURCE_NAME_KVD,
^~~~~~~~~~~~~~~~~~~~~~~~~
In file included from drivers/net/ethernet/mellanox/mlxsw/core.h:47:0,
from drivers/net/ethernet/mellanox/mlxsw/spectrum.h:54,
from drivers/net/ethernet/mellanox/mlxsw/spectrum.c:64:
include/net/devlink.h:560:1: note: declared here
devlink_resource_register(struct devlink *devlink,
^~~~~~~~~~~~~~~~~~~~~~~~~
drivers/net/ethernet/mellanox/mlxsw/spectrum.c:3891:6: warning: passing argument 6 of 'devlink_resource_register' makes integer from pointer without a cast [-Wint-conversion]
&linear_size_params,
^
In file included from drivers/net/ethernet/mellanox/mlxsw/core.h:47:0,
from drivers/net/ethernet/mellanox/mlxsw/spectrum.h:54,
from drivers/net/ethernet/mellanox/mlxsw/spectrum.c:64:
include/net/devlink.h:560:1: note: expected 'u64 {aka long long unsigned int}' but argument is of type 'struct devlink_resource_size_params *'
devlink_resource_register(struct devlink *devlink,
^~~~~~~~~~~~~~~~~~~~~~~~~
>> drivers/net/ethernet/mellanox/mlxsw/spectrum.c:3892:6: error: passing argument 7 of 'devlink_resource_register' from incompatible pointer type [-Werror=incompatible-pointer-types]
&mlxsw_sp_resource_kvd_linear_ops);
^
In file included from drivers/net/ethernet/mellanox/mlxsw/core.h:47:0,
from drivers/net/ethernet/mellanox/mlxsw/spectrum.h:54,
from drivers/net/ethernet/mellanox/mlxsw/spectrum.c:64:
include/net/devlink.h:560:1: note: expected 'const struct devlink_resource_size_params *' but argument is of type 'struct devlink_resource_ops *'
devlink_resource_register(struct devlink *devlink,
^~~~~~~~~~~~~~~~~~~~~~~~~
drivers/net/ethernet/mellanox/mlxsw/spectrum.c:3887:8: error: too few arguments to function 'devlink_resource_register'
err = devlink_resource_register(devlink, MLXSW_SP_RESOURCE_NAME_KVD_LINEAR,
^~~~~~~~~~~~~~~~~~~~~~~~~
In file included from drivers/net/ethernet/mellanox/mlxsw/core.h:47:0,
from drivers/net/ethernet/mellanox/mlxsw/spectrum.h:54,
from drivers/net/ethernet/mellanox/mlxsw/spectrum.c:64:
include/net/devlink.h:560:1: note: declared here
devlink_resource_register(struct devlink *devlink,
^~~~~~~~~~~~~~~~~~~~~~~~~
drivers/net/ethernet/mellanox/mlxsw/spectrum.c:3909:6: warning: passing argument 6 of 'devlink_resource_register' makes integer from pointer without a cast [-Wint-conversion]
&hash_double_size_params,
^
In file included from drivers/net/ethernet/mellanox/mlxsw/core.h:47:0,
from drivers/net/ethernet/mellanox/mlxsw/spectrum.h:54,
from drivers/net/ethernet/mellanox/mlxsw/spectrum.c:64:
include/net/devlink.h:560:1: note: expected 'u64 {aka long long unsigned int}' but argument is of type 'struct devlink_resource_size_params *'
devlink_resource_register(struct devlink *devlink,
^~~~~~~~~~~~~~~~~~~~~~~~~
drivers/net/ethernet/mellanox/mlxsw/spectrum.c:3905:8: error: too few arguments to function 'devlink_resource_register'
err = devlink_resource_register(devlink, MLXSW_SP_RESOURCE_NAME_KVD_HASH_DOUBLE,
^~~~~~~~~~~~~~~~~~~~~~~~~
In file included from drivers/net/ethernet/mellanox/mlxsw/core.h:47:0,
from drivers/net/ethernet/mellanox/mlxsw/spectrum.h:54,
from drivers/net/ethernet/mellanox/mlxsw/spectrum.c:64:
include/net/devlink.h:560:1: note: declared here
devlink_resource_register(struct devlink *devlink,
^~~~~~~~~~~~~~~~~~~~~~~~~
drivers/net/ethernet/mellanox/mlxsw/spectrum.c:3919:6: warning: passing argument 6 of 'devlink_resource_register' makes integer from pointer without a cast [-Wint-conversion]
&hash_single_size_params,
^
In file included from drivers/net/ethernet/mellanox/mlxsw/core.h:47:0,
from drivers/net/ethernet/mellanox/mlxsw/spectrum.h:54,
from drivers/net/ethernet/mellanox/mlxsw/spectrum.c:64:
include/net/devlink.h:560:1: note: expected 'u64 {aka long long unsigned int}' but argument is of type 'struct devlink_resource_size_params *'
devlink_resource_register(struct devlink *devlink,
^~~~~~~~~~~~~~~~~~~~~~~~~
drivers/net/ethernet/mellanox/mlxsw/spectrum.c:3915:8: error: too few arguments to function 'devlink_resource_register'
err = devlink_resource_register(devlink, MLXSW_SP_RESOURCE_NAME_KVD_HASH_SINGLE,
^~~~~~~~~~~~~~~~~~~~~~~~~
In file included from drivers/net/ethernet/mellanox/mlxsw/core.h:47:0,
from drivers/net/ethernet/mellanox/mlxsw/spectrum.h:54,
from drivers/net/ethernet/mellanox/mlxsw/spectrum.c:64:
include/net/devlink.h:560:1: note: declared here
devlink_resource_register(struct devlink *devlink,
^~~~~~~~~~~~~~~~~~~~~~~~~
cc1: some warnings being treated as errors
--
drivers/net/ethernet/mellanox/mlxsw/spectrum_kvdl.c: In function 'mlxsw_sp_kvdl_resources_register':
>> drivers/net/ethernet/mellanox/mlxsw/spectrum_kvdl.c:465:6: warning: passing argument 6 of 'devlink_resource_register' makes integer from pointer without a cast [-Wint-conversion]
&mlxsw_sp_kvdl_single_size_params,
^
In file included from drivers/net/ethernet/mellanox/mlxsw/core.h:47:0,
from drivers/net/ethernet/mellanox/mlxsw/spectrum.h:54,
from drivers/net/ethernet/mellanox/mlxsw/spectrum_kvdl.c:38:
include/net/devlink.h:560:1: note: expected 'u64 {aka long long unsigned int}' but argument is of type 'struct devlink_resource_size_params *'
devlink_resource_register(struct devlink *devlink,
^~~~~~~~~~~~~~~~~~~~~~~~~
>> drivers/net/ethernet/mellanox/mlxsw/spectrum_kvdl.c:466:6: error: passing argument 7 of 'devlink_resource_register' from incompatible pointer type [-Werror=incompatible-pointer-types]
&mlxsw_sp_kvdl_single_ops);
^
In file included from drivers/net/ethernet/mellanox/mlxsw/core.h:47:0,
from drivers/net/ethernet/mellanox/mlxsw/spectrum.h:54,
from drivers/net/ethernet/mellanox/mlxsw/spectrum_kvdl.c:38:
include/net/devlink.h:560:1: note: expected 'const struct devlink_resource_size_params *' but argument is of type 'struct devlink_resource_ops *'
devlink_resource_register(struct devlink *devlink,
^~~~~~~~~~~~~~~~~~~~~~~~~
>> drivers/net/ethernet/mellanox/mlxsw/spectrum_kvdl.c:461:8: error: too few arguments to function 'devlink_resource_register'
err = devlink_resource_register(devlink, MLXSW_SP_RESOURCE_NAME_KVD_LINEAR_SINGLES,
^~~~~~~~~~~~~~~~~~~~~~~~~
In file included from drivers/net/ethernet/mellanox/mlxsw/core.h:47:0,
from drivers/net/ethernet/mellanox/mlxsw/spectrum.h:54,
from drivers/net/ethernet/mellanox/mlxsw/spectrum_kvdl.c:38:
include/net/devlink.h:560:1: note: declared here
devlink_resource_register(struct devlink *devlink,
^~~~~~~~~~~~~~~~~~~~~~~~~
drivers/net/ethernet/mellanox/mlxsw/spectrum_kvdl.c:474:6: warning: passing argument 6 of 'devlink_resource_register' makes integer from pointer without a cast [-Wint-conversion]
&mlxsw_sp_kvdl_chunks_size_params,
^
In file included from drivers/net/ethernet/mellanox/mlxsw/core.h:47:0,
from drivers/net/ethernet/mellanox/mlxsw/spectrum.h:54,
from drivers/net/ethernet/mellanox/mlxsw/spectrum_kvdl.c:38:
include/net/devlink.h:560:1: note: expected 'u64 {aka long long unsigned int}' but argument is of type 'struct devlink_resource_size_params *'
devlink_resource_register(struct devlink *devlink,
^~~~~~~~~~~~~~~~~~~~~~~~~
drivers/net/ethernet/mellanox/mlxsw/spectrum_kvdl.c:475:6: error: passing argument 7 of 'devlink_resource_register' from incompatible pointer type [-Werror=incompatible-pointer-types]
&mlxsw_sp_kvdl_chunks_ops);
^
In file included from drivers/net/ethernet/mellanox/mlxsw/core.h:47:0,
from drivers/net/ethernet/mellanox/mlxsw/spectrum.h:54,
from drivers/net/ethernet/mellanox/mlxsw/spectrum_kvdl.c:38:
include/net/devlink.h:560:1: note: expected 'const struct devlink_resource_size_params *' but argument is of type 'struct devlink_resource_ops *'
devlink_resource_register(struct devlink *devlink,
^~~~~~~~~~~~~~~~~~~~~~~~~
drivers/net/ethernet/mellanox/mlxsw/spectrum_kvdl.c:470:8: error: too few arguments to function 'devlink_resource_register'
err = devlink_resource_register(devlink, MLXSW_SP_RESOURCE_NAME_KVD_LINEAR_CHUNKS,
^~~~~~~~~~~~~~~~~~~~~~~~~
In file included from drivers/net/ethernet/mellanox/mlxsw/core.h:47:0,
from drivers/net/ethernet/mellanox/mlxsw/spectrum.h:54,
from drivers/net/ethernet/mellanox/mlxsw/spectrum_kvdl.c:38:
include/net/devlink.h:560:1: note: declared here
devlink_resource_register(struct devlink *devlink,
^~~~~~~~~~~~~~~~~~~~~~~~~
drivers/net/ethernet/mellanox/mlxsw/spectrum_kvdl.c:483:6: warning: passing argument 6 of 'devlink_resource_register' makes integer from pointer without a cast [-Wint-conversion]
&mlxsw_sp_kvdl_large_chunks_size_params,
^
In file included from drivers/net/ethernet/mellanox/mlxsw/core.h:47:0,
from drivers/net/ethernet/mellanox/mlxsw/spectrum.h:54,
from drivers/net/ethernet/mellanox/mlxsw/spectrum_kvdl.c:38:
include/net/devlink.h:560:1: note: expected 'u64 {aka long long unsigned int}' but argument is of type 'struct devlink_resource_size_params *'
devlink_resource_register(struct devlink *devlink,
^~~~~~~~~~~~~~~~~~~~~~~~~
drivers/net/ethernet/mellanox/mlxsw/spectrum_kvdl.c:484:6: error: passing argument 7 of 'devlink_resource_register' from incompatible pointer type [-Werror=incompatible-pointer-types]
&mlxsw_sp_kvdl_chunks_large_ops);
^
In file included from drivers/net/ethernet/mellanox/mlxsw/core.h:47:0,
from drivers/net/ethernet/mellanox/mlxsw/spectrum.h:54,
from drivers/net/ethernet/mellanox/mlxsw/spectrum_kvdl.c:38:
include/net/devlink.h:560:1: note: expected 'const struct devlink_resource_size_params *' but argument is of type 'struct devlink_resource_ops *'
devlink_resource_register(struct devlink *devlink,
^~~~~~~~~~~~~~~~~~~~~~~~~
drivers/net/ethernet/mellanox/mlxsw/spectrum_kvdl.c:479:8: error: too few arguments to function 'devlink_resource_register'
err = devlink_resource_register(devlink, MLXSW_SP_RESOURCE_NAME_KVD_LINEAR_LARGE_CHUNKS,
^~~~~~~~~~~~~~~~~~~~~~~~~
In file included from drivers/net/ethernet/mellanox/mlxsw/core.h:47:0,
from drivers/net/ethernet/mellanox/mlxsw/spectrum.h:54,
from drivers/net/ethernet/mellanox/mlxsw/spectrum_kvdl.c:38:
include/net/devlink.h:560:1: note: declared here
devlink_resource_register(struct devlink *devlink,
^~~~~~~~~~~~~~~~~~~~~~~~~
cc1: some warnings being treated as errors
vim +/devlink_resource_register +3878 drivers/net/ethernet/mellanox/mlxsw/spectrum.c
ef3116e54 Arkadi Sharshevsky 2018-01-15 3856
ef3116e54 Arkadi Sharshevsky 2018-01-15 3857 static int mlxsw_sp_resources_register(struct mlxsw_core *mlxsw_core)
ef3116e54 Arkadi Sharshevsky 2018-01-15 3858 {
ef3116e54 Arkadi Sharshevsky 2018-01-15 3859 struct devlink *devlink = priv_to_devlink(mlxsw_core);
77d270967 Jiri Pirko 2018-02-28 3860 struct devlink_resource_size_params hash_single_size_params;
77d270967 Jiri Pirko 2018-02-28 3861 struct devlink_resource_size_params hash_double_size_params;
77d270967 Jiri Pirko 2018-02-28 3862 struct devlink_resource_size_params linear_size_params;
77d270967 Jiri Pirko 2018-02-28 3863 struct devlink_resource_size_params kvd_size_params;
ef3116e54 Arkadi Sharshevsky 2018-01-15 3864 u32 kvd_size, single_size, double_size, linear_size;
ef3116e54 Arkadi Sharshevsky 2018-01-15 3865 const struct mlxsw_config_profile *profile;
ef3116e54 Arkadi Sharshevsky 2018-01-15 3866 int err;
ef3116e54 Arkadi Sharshevsky 2018-01-15 3867
ef3116e54 Arkadi Sharshevsky 2018-01-15 3868 profile = &mlxsw_sp_config_profile;
ef3116e54 Arkadi Sharshevsky 2018-01-15 3869 if (!MLXSW_CORE_RES_VALID(mlxsw_core, KVD_SIZE))
ef3116e54 Arkadi Sharshevsky 2018-01-15 3870 return -EIO;
ef3116e54 Arkadi Sharshevsky 2018-01-15 3871
77d270967 Jiri Pirko 2018-02-28 3872 mlxsw_sp_resource_size_params_prepare(mlxsw_core, &kvd_size_params,
77d270967 Jiri Pirko 2018-02-28 3873 &linear_size_params,
77d270967 Jiri Pirko 2018-02-28 3874 &hash_double_size_params,
77d270967 Jiri Pirko 2018-02-28 3875 &hash_single_size_params);
77d270967 Jiri Pirko 2018-02-28 3876
ef3116e54 Arkadi Sharshevsky 2018-01-15 3877 kvd_size = MLXSW_CORE_RES_GET(mlxsw_core, KVD_SIZE);
ef3116e54 Arkadi Sharshevsky 2018-01-15 @3878 err = devlink_resource_register(devlink, MLXSW_SP_RESOURCE_NAME_KVD,
145307460 David Ahern 2018-03-20 3879 kvd_size, MLXSW_SP_RESOURCE_KVD,
ef3116e54 Arkadi Sharshevsky 2018-01-15 3880 DEVLINK_RESOURCE_ID_PARENT_TOP,
77d270967 Jiri Pirko 2018-02-28 @3881 &kvd_size_params,
4f4bbf7c4 Arkadi Sharshevsky 2018-02-20 3882 NULL);
ef3116e54 Arkadi Sharshevsky 2018-01-15 3883 if (err)
ef3116e54 Arkadi Sharshevsky 2018-01-15 3884 return err;
ef3116e54 Arkadi Sharshevsky 2018-01-15 3885
ef3116e54 Arkadi Sharshevsky 2018-01-15 3886 linear_size = profile->kvd_linear_size;
ef3116e54 Arkadi Sharshevsky 2018-01-15 3887 err = devlink_resource_register(devlink, MLXSW_SP_RESOURCE_NAME_KVD_LINEAR,
145307460 David Ahern 2018-03-20 3888 linear_size,
ef3116e54 Arkadi Sharshevsky 2018-01-15 3889 MLXSW_SP_RESOURCE_KVD_LINEAR,
ef3116e54 Arkadi Sharshevsky 2018-01-15 3890 MLXSW_SP_RESOURCE_KVD,
77d270967 Jiri Pirko 2018-02-28 @3891 &linear_size_params,
ef3116e54 Arkadi Sharshevsky 2018-01-15 @3892 &mlxsw_sp_resource_kvd_linear_ops);
ef3116e54 Arkadi Sharshevsky 2018-01-15 3893 if (err)
ef3116e54 Arkadi Sharshevsky 2018-01-15 3894 return err;
ef3116e54 Arkadi Sharshevsky 2018-01-15 3895
51d3c08e3 Arkadi Sharshevsky 2018-02-20 3896 err = mlxsw_sp_kvdl_resources_register(devlink);
51d3c08e3 Arkadi Sharshevsky 2018-02-20 3897 if (err)
51d3c08e3 Arkadi Sharshevsky 2018-02-20 3898 return err;
51d3c08e3 Arkadi Sharshevsky 2018-02-20 3899
ef3116e54 Arkadi Sharshevsky 2018-01-15 3900 double_size = kvd_size - linear_size;
ef3116e54 Arkadi Sharshevsky 2018-01-15 3901 double_size *= profile->kvd_hash_double_parts;
ef3116e54 Arkadi Sharshevsky 2018-01-15 3902 double_size /= profile->kvd_hash_double_parts +
ef3116e54 Arkadi Sharshevsky 2018-01-15 3903 profile->kvd_hash_single_parts;
ef3116e54 Arkadi Sharshevsky 2018-01-15 3904 double_size = rounddown(double_size, profile->kvd_hash_granularity);
ef3116e54 Arkadi Sharshevsky 2018-01-15 3905 err = devlink_resource_register(devlink, MLXSW_SP_RESOURCE_NAME_KVD_HASH_DOUBLE,
145307460 David Ahern 2018-03-20 3906 double_size,
ef3116e54 Arkadi Sharshevsky 2018-01-15 3907 MLXSW_SP_RESOURCE_KVD_HASH_DOUBLE,
ef3116e54 Arkadi Sharshevsky 2018-01-15 3908 MLXSW_SP_RESOURCE_KVD,
77d270967 Jiri Pirko 2018-02-28 3909 &hash_double_size_params,
4f4bbf7c4 Arkadi Sharshevsky 2018-02-20 3910 NULL);
ef3116e54 Arkadi Sharshevsky 2018-01-15 3911 if (err)
ef3116e54 Arkadi Sharshevsky 2018-01-15 3912 return err;
ef3116e54 Arkadi Sharshevsky 2018-01-15 3913
ef3116e54 Arkadi Sharshevsky 2018-01-15 3914 single_size = kvd_size - double_size - linear_size;
ef3116e54 Arkadi Sharshevsky 2018-01-15 3915 err = devlink_resource_register(devlink, MLXSW_SP_RESOURCE_NAME_KVD_HASH_SINGLE,
145307460 David Ahern 2018-03-20 3916 single_size,
ef3116e54 Arkadi Sharshevsky 2018-01-15 3917 MLXSW_SP_RESOURCE_KVD_HASH_SINGLE,
ef3116e54 Arkadi Sharshevsky 2018-01-15 3918 MLXSW_SP_RESOURCE_KVD,
77d270967 Jiri Pirko 2018-02-28 3919 &hash_single_size_params,
4f4bbf7c4 Arkadi Sharshevsky 2018-02-20 3920 NULL);
ef3116e54 Arkadi Sharshevsky 2018-01-15 3921 if (err)
ef3116e54 Arkadi Sharshevsky 2018-01-15 3922 return err;
ef3116e54 Arkadi Sharshevsky 2018-01-15 3923
ef3116e54 Arkadi Sharshevsky 2018-01-15 3924 return 0;
ef3116e54 Arkadi Sharshevsky 2018-01-15 3925 }
ef3116e54 Arkadi Sharshevsky 2018-01-15 3926
:::::: The code at line 3878 was first introduced by commit
:::::: ef3116e5403ecca1653eb5cb8fbd09e239855055 mlxsw: spectrum: Register KVD resources with devlink
:::::: TO: Arkadi Sharshevsky <arkadis@mellanox.com>
:::::: CC: David S. Miller <davem@davemloft.net>
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 28898 bytes --]
^ permalink raw reply
* [PATCH v4 bpf-next 10/10] selftests/bpf: test for bpf_get_stackid() from raw tracepoints
From: Alexei Starovoitov @ 2018-03-23 0:39 UTC (permalink / raw)
To: davem; +Cc: daniel, torvalds, peterz, rostedt, netdev, kernel-team, linux-api
In-Reply-To: <20180323003907.3113756-1-ast@fb.com>
From: Alexei Starovoitov <ast@kernel.org>
similar to traditional traceopint test add bpf_get_stackid() test
from raw tracepoints
and reduce verbosity of existing stackmap test
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
---
tools/testing/selftests/bpf/test_progs.c | 91 ++++++++++++++++++++++++--------
1 file changed, 70 insertions(+), 21 deletions(-)
diff --git a/tools/testing/selftests/bpf/test_progs.c b/tools/testing/selftests/bpf/test_progs.c
index e9df48b306df..faadbe233966 100644
--- a/tools/testing/selftests/bpf/test_progs.c
+++ b/tools/testing/selftests/bpf/test_progs.c
@@ -877,7 +877,7 @@ static void test_stacktrace_map()
err = bpf_prog_load(file, BPF_PROG_TYPE_TRACEPOINT, &obj, &prog_fd);
if (CHECK(err, "prog_load", "err %d errno %d\n", err, errno))
- goto out;
+ return;
/* Get the ID for the sched/sched_switch tracepoint */
snprintf(buf, sizeof(buf),
@@ -888,8 +888,7 @@ static void test_stacktrace_map()
bytes = read(efd, buf, sizeof(buf));
close(efd);
- if (CHECK(bytes <= 0 || bytes >= sizeof(buf),
- "read", "bytes %d errno %d\n", bytes, errno))
+ if (bytes <= 0 || bytes >= sizeof(buf))
goto close_prog;
/* Open the perf event and attach bpf progrram */
@@ -906,29 +905,24 @@ static void test_stacktrace_map()
goto close_prog;
err = ioctl(pmu_fd, PERF_EVENT_IOC_ENABLE, 0);
- if (CHECK(err, "perf_event_ioc_enable", "err %d errno %d\n",
- err, errno))
- goto close_pmu;
+ if (err)
+ goto disable_pmu;
err = ioctl(pmu_fd, PERF_EVENT_IOC_SET_BPF, prog_fd);
- if (CHECK(err, "perf_event_ioc_set_bpf", "err %d errno %d\n",
- err, errno))
+ if (err)
goto disable_pmu;
/* find map fds */
control_map_fd = bpf_find_map(__func__, obj, "control_map");
- if (CHECK(control_map_fd < 0, "bpf_find_map control_map",
- "err %d errno %d\n", err, errno))
+ if (control_map_fd < 0)
goto disable_pmu;
stackid_hmap_fd = bpf_find_map(__func__, obj, "stackid_hmap");
- if (CHECK(stackid_hmap_fd < 0, "bpf_find_map stackid_hmap",
- "err %d errno %d\n", err, errno))
+ if (stackid_hmap_fd < 0)
goto disable_pmu;
stackmap_fd = bpf_find_map(__func__, obj, "stackmap");
- if (CHECK(stackmap_fd < 0, "bpf_find_map stackmap", "err %d errno %d\n",
- err, errno))
+ if (stackmap_fd < 0)
goto disable_pmu;
/* give some time for bpf program run */
@@ -945,24 +939,78 @@ static void test_stacktrace_map()
err = compare_map_keys(stackid_hmap_fd, stackmap_fd);
if (CHECK(err, "compare_map_keys stackid_hmap vs. stackmap",
"err %d errno %d\n", err, errno))
- goto disable_pmu;
+ goto disable_pmu_noerr;
err = compare_map_keys(stackmap_fd, stackid_hmap_fd);
if (CHECK(err, "compare_map_keys stackmap vs. stackid_hmap",
"err %d errno %d\n", err, errno))
- ; /* fall through */
+ goto disable_pmu_noerr;
+ goto disable_pmu_noerr;
disable_pmu:
+ error_cnt++;
+disable_pmu_noerr:
ioctl(pmu_fd, PERF_EVENT_IOC_DISABLE);
-
-close_pmu:
close(pmu_fd);
-
close_prog:
bpf_object__close(obj);
+}
-out:
- return;
+static void test_stacktrace_map_raw_tp()
+{
+ int control_map_fd, stackid_hmap_fd, stackmap_fd;
+ const char *file = "./test_stacktrace_map.o";
+ int efd, err, prog_fd;
+ __u32 key, val, duration = 0;
+ struct bpf_object *obj;
+
+ err = bpf_prog_load(file, BPF_PROG_TYPE_RAW_TRACEPOINT, &obj, &prog_fd);
+ if (CHECK(err, "prog_load raw tp", "err %d errno %d\n", err, errno))
+ return;
+
+ efd = bpf_raw_tracepoint_open("sched_switch", prog_fd);
+ if (CHECK(efd < 0, "raw_tp_open", "err %d errno %d\n", efd, errno))
+ goto close_prog;
+
+ /* find map fds */
+ control_map_fd = bpf_find_map(__func__, obj, "control_map");
+ if (control_map_fd < 0)
+ goto close_prog;
+
+ stackid_hmap_fd = bpf_find_map(__func__, obj, "stackid_hmap");
+ if (stackid_hmap_fd < 0)
+ goto close_prog;
+
+ stackmap_fd = bpf_find_map(__func__, obj, "stackmap");
+ if (stackmap_fd < 0)
+ goto close_prog;
+
+ /* give some time for bpf program run */
+ sleep(1);
+
+ /* disable stack trace collection */
+ key = 0;
+ val = 1;
+ bpf_map_update_elem(control_map_fd, &key, &val, 0);
+
+ /* for every element in stackid_hmap, we can find a corresponding one
+ * in stackmap, and vise versa.
+ */
+ err = compare_map_keys(stackid_hmap_fd, stackmap_fd);
+ if (CHECK(err, "compare_map_keys stackid_hmap vs. stackmap",
+ "err %d errno %d\n", err, errno))
+ goto close_prog;
+
+ err = compare_map_keys(stackmap_fd, stackid_hmap_fd);
+ if (CHECK(err, "compare_map_keys stackmap vs. stackid_hmap",
+ "err %d errno %d\n", err, errno))
+ goto close_prog;
+
+ goto close_prog_noerr;
+close_prog:
+ error_cnt++;
+close_prog_noerr:
+ bpf_object__close(obj);
}
static int extract_build_id(char *build_id, size_t size)
@@ -1138,6 +1186,7 @@ int main(void)
test_tp_attach_query();
test_stacktrace_map();
test_stacktrace_build_id();
+ test_stacktrace_map_raw_tp();
printf("Summary: %d PASSED, %d FAILED\n", pass_cnt, error_cnt);
return error_cnt ? EXIT_FAILURE : EXIT_SUCCESS;
--
2.9.5
^ permalink raw reply related
* [PATCH v4 bpf-next 06/10] tracepoint: compute num_args at build time
From: Alexei Starovoitov @ 2018-03-23 0:39 UTC (permalink / raw)
To: davem; +Cc: daniel, torvalds, peterz, rostedt, netdev, kernel-team, linux-api
In-Reply-To: <20180323003907.3113756-1-ast@fb.com>
From: Alexei Starovoitov <ast@kernel.org>
add fancy macro to compute number of arguments passed into tracepoint
at compile time and store it as part of 'struct tracepoint'.
The number is necessary to check safety of bpf program access that
is coming in subsequent patch.
for_each_tracepoint_range() api has no users inside the kernel.
Make it more useful with ability to stop for_each() loop depending
via callback return value.
In such form it's used in subsequent patch.
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
---
include/linux/tracepoint-defs.h | 1 +
include/linux/tracepoint.h | 28 +++++++++++++++++++---------
include/trace/define_trace.h | 14 +++++++-------
kernel/tracepoint.c | 27 ++++++++++++++++-----------
4 files changed, 43 insertions(+), 27 deletions(-)
diff --git a/include/linux/tracepoint-defs.h b/include/linux/tracepoint-defs.h
index 64ed7064f1fa..39a283c61c51 100644
--- a/include/linux/tracepoint-defs.h
+++ b/include/linux/tracepoint-defs.h
@@ -33,6 +33,7 @@ struct tracepoint {
int (*regfunc)(void);
void (*unregfunc)(void);
struct tracepoint_func __rcu *funcs;
+ u32 num_args;
};
#endif
diff --git a/include/linux/tracepoint.h b/include/linux/tracepoint.h
index c94f466d57ef..2194e7c31484 100644
--- a/include/linux/tracepoint.h
+++ b/include/linux/tracepoint.h
@@ -40,9 +40,19 @@ tracepoint_probe_register_prio(struct tracepoint *tp, void *probe, void *data,
int prio);
extern int
tracepoint_probe_unregister(struct tracepoint *tp, void *probe, void *data);
-extern void
-for_each_kernel_tracepoint(void (*fct)(struct tracepoint *tp, void *priv),
- void *priv);
+
+#ifdef CONFIG_TRACEPOINTS
+void *
+for_each_kernel_tracepoint(void *(*fct)(struct tracepoint *tp, void *priv),
+ void *priv);
+#else
+static inline void *
+for_each_kernel_tracepoint(void *(*fct)(struct tracepoint *tp, void *priv),
+ void *priv)
+{
+ return NULL;
+}
+#endif
#ifdef CONFIG_MODULES
struct tp_module {
@@ -230,18 +240,18 @@ extern void syscall_unregfunc(void);
* structures, so we create an array of pointers that will be used for iteration
* on the tracepoints.
*/
-#define DEFINE_TRACE_FN(name, reg, unreg) \
+#define DEFINE_TRACE_FN(name, reg, unreg, num_args) \
static const char __tpstrtab_##name[] \
__attribute__((section("__tracepoints_strings"))) = #name; \
struct tracepoint __tracepoint_##name \
__attribute__((section("__tracepoints"))) = \
- { __tpstrtab_##name, STATIC_KEY_INIT_FALSE, reg, unreg, NULL };\
+ { __tpstrtab_##name, STATIC_KEY_INIT_FALSE, reg, unreg, NULL, num_args };\
static struct tracepoint * const __tracepoint_ptr_##name __used \
__attribute__((section("__tracepoints_ptrs"))) = \
&__tracepoint_##name;
-#define DEFINE_TRACE(name) \
- DEFINE_TRACE_FN(name, NULL, NULL);
+#define DEFINE_TRACE(name, num_args) \
+ DEFINE_TRACE_FN(name, NULL, NULL, num_args);
#define EXPORT_TRACEPOINT_SYMBOL_GPL(name) \
EXPORT_SYMBOL_GPL(__tracepoint_##name)
@@ -275,8 +285,8 @@ extern void syscall_unregfunc(void);
return false; \
}
-#define DEFINE_TRACE_FN(name, reg, unreg)
-#define DEFINE_TRACE(name)
+#define DEFINE_TRACE_FN(name, reg, unreg, num_args)
+#define DEFINE_TRACE(name, num_args)
#define EXPORT_TRACEPOINT_SYMBOL_GPL(name)
#define EXPORT_TRACEPOINT_SYMBOL(name)
diff --git a/include/trace/define_trace.h b/include/trace/define_trace.h
index d9e3d4aa3f6e..96b22ace9ae7 100644
--- a/include/trace/define_trace.h
+++ b/include/trace/define_trace.h
@@ -25,7 +25,7 @@
#undef TRACE_EVENT
#define TRACE_EVENT(name, proto, args, tstruct, assign, print) \
- DEFINE_TRACE(name)
+ DEFINE_TRACE(name, COUNT_ARGS(args))
#undef TRACE_EVENT_CONDITION
#define TRACE_EVENT_CONDITION(name, proto, args, cond, tstruct, assign, print) \
@@ -39,24 +39,24 @@
#undef TRACE_EVENT_FN
#define TRACE_EVENT_FN(name, proto, args, tstruct, \
assign, print, reg, unreg) \
- DEFINE_TRACE_FN(name, reg, unreg)
+ DEFINE_TRACE_FN(name, reg, unreg, COUNT_ARGS(args))
#undef TRACE_EVENT_FN_COND
#define TRACE_EVENT_FN_COND(name, proto, args, cond, tstruct, \
assign, print, reg, unreg) \
- DEFINE_TRACE_FN(name, reg, unreg)
+ DEFINE_TRACE_FN(name, reg, unreg, COUNT_ARGS(args))
#undef DEFINE_EVENT
#define DEFINE_EVENT(template, name, proto, args) \
- DEFINE_TRACE(name)
+ DEFINE_TRACE(name, COUNT_ARGS(args))
#undef DEFINE_EVENT_FN
#define DEFINE_EVENT_FN(template, name, proto, args, reg, unreg) \
- DEFINE_TRACE_FN(name, reg, unreg)
+ DEFINE_TRACE_FN(name, reg, unreg, COUNT_ARGS(args))
#undef DEFINE_EVENT_PRINT
#define DEFINE_EVENT_PRINT(template, name, proto, args, print) \
- DEFINE_TRACE(name)
+ DEFINE_TRACE(name, COUNT_ARGS(args))
#undef DEFINE_EVENT_CONDITION
#define DEFINE_EVENT_CONDITION(template, name, proto, args, cond) \
@@ -64,7 +64,7 @@
#undef DECLARE_TRACE
#define DECLARE_TRACE(name, proto, args) \
- DEFINE_TRACE(name)
+ DEFINE_TRACE(name, COUNT_ARGS(args))
#undef TRACE_INCLUDE
#undef __TRACE_INCLUDE
diff --git a/kernel/tracepoint.c b/kernel/tracepoint.c
index 671b13457387..3f2dc5738c2b 100644
--- a/kernel/tracepoint.c
+++ b/kernel/tracepoint.c
@@ -502,17 +502,22 @@ static __init int init_tracepoints(void)
__initcall(init_tracepoints);
#endif /* CONFIG_MODULES */
-static void for_each_tracepoint_range(struct tracepoint * const *begin,
- struct tracepoint * const *end,
- void (*fct)(struct tracepoint *tp, void *priv),
- void *priv)
+static void *for_each_tracepoint_range(struct tracepoint * const *begin,
+ struct tracepoint * const *end,
+ void *(*fct)(struct tracepoint *tp, void *priv),
+ void *priv)
{
struct tracepoint * const *iter;
+ void *ret;
if (!begin)
- return;
- for (iter = begin; iter < end; iter++)
- fct(*iter, priv);
+ return NULL;
+ for (iter = begin; iter < end; iter++) {
+ ret = fct(*iter, priv);
+ if (ret)
+ return ret;
+ }
+ return NULL;
}
/**
@@ -520,11 +525,11 @@ static void for_each_tracepoint_range(struct tracepoint * const *begin,
* @fct: callback
* @priv: private data
*/
-void for_each_kernel_tracepoint(void (*fct)(struct tracepoint *tp, void *priv),
- void *priv)
+void *for_each_kernel_tracepoint(void *(*fct)(struct tracepoint *tp, void *priv),
+ void *priv)
{
- for_each_tracepoint_range(__start___tracepoints_ptrs,
- __stop___tracepoints_ptrs, fct, priv);
+ return for_each_tracepoint_range(__start___tracepoints_ptrs,
+ __stop___tracepoints_ptrs, fct, priv);
}
EXPORT_SYMBOL_GPL(for_each_kernel_tracepoint);
--
2.9.5
^ permalink raw reply related
* [PATCH v4 bpf-next 01/10] treewide: remove large struct-pass-by-value from tracepoint arguments
From: Alexei Starovoitov @ 2018-03-23 0:38 UTC (permalink / raw)
To: davem; +Cc: daniel, torvalds, peterz, rostedt, netdev, kernel-team, linux-api
In-Reply-To: <20180323003907.3113756-1-ast@fb.com>
From: Alexei Starovoitov <ast@kernel.org>
- fix trace_hfi1_ctxt_info() to pass large struct by reference instead of by value
- convert 'type array[]' tracepoint arguments into 'type *array',
since compiler will warn that sizeof('type array[]') == sizeof('type *array')
and later should be used instead
The CAST_TO_U64 macro in the later patch will enforce that tracepoint
arguments can only be integers, pointers, or less than 8 byte structures.
Larger structures should be passed by reference.
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
---
drivers/infiniband/hw/hfi1/file_ops.c | 2 +-
drivers/infiniband/hw/hfi1/trace_ctxts.h | 12 ++++++------
include/trace/events/f2fs.h | 2 +-
net/wireless/trace.h | 2 +-
sound/firewire/amdtp-stream-trace.h | 2 +-
5 files changed, 10 insertions(+), 10 deletions(-)
diff --git a/drivers/infiniband/hw/hfi1/file_ops.c b/drivers/infiniband/hw/hfi1/file_ops.c
index 41fafebe3b0d..da4aa1a95b11 100644
--- a/drivers/infiniband/hw/hfi1/file_ops.c
+++ b/drivers/infiniband/hw/hfi1/file_ops.c
@@ -1153,7 +1153,7 @@ static int get_ctxt_info(struct hfi1_filedata *fd, unsigned long arg, u32 len)
cinfo.sdma_ring_size = fd->cq->nentries;
cinfo.rcvegr_size = uctxt->egrbufs.rcvtid_size;
- trace_hfi1_ctxt_info(uctxt->dd, uctxt->ctxt, fd->subctxt, cinfo);
+ trace_hfi1_ctxt_info(uctxt->dd, uctxt->ctxt, fd->subctxt, &cinfo);
if (copy_to_user((void __user *)arg, &cinfo, len))
return -EFAULT;
diff --git a/drivers/infiniband/hw/hfi1/trace_ctxts.h b/drivers/infiniband/hw/hfi1/trace_ctxts.h
index 4eb4cc798035..e00c8a7d559c 100644
--- a/drivers/infiniband/hw/hfi1/trace_ctxts.h
+++ b/drivers/infiniband/hw/hfi1/trace_ctxts.h
@@ -106,7 +106,7 @@ TRACE_EVENT(hfi1_uctxtdata,
TRACE_EVENT(hfi1_ctxt_info,
TP_PROTO(struct hfi1_devdata *dd, unsigned int ctxt,
unsigned int subctxt,
- struct hfi1_ctxt_info cinfo),
+ struct hfi1_ctxt_info *cinfo),
TP_ARGS(dd, ctxt, subctxt, cinfo),
TP_STRUCT__entry(DD_DEV_ENTRY(dd)
__field(unsigned int, ctxt)
@@ -120,11 +120,11 @@ TRACE_EVENT(hfi1_ctxt_info,
TP_fast_assign(DD_DEV_ASSIGN(dd);
__entry->ctxt = ctxt;
__entry->subctxt = subctxt;
- __entry->egrtids = cinfo.egrtids;
- __entry->rcvhdrq_cnt = cinfo.rcvhdrq_cnt;
- __entry->rcvhdrq_size = cinfo.rcvhdrq_entsize;
- __entry->sdma_ring_size = cinfo.sdma_ring_size;
- __entry->rcvegr_size = cinfo.rcvegr_size;
+ __entry->egrtids = cinfo->egrtids;
+ __entry->rcvhdrq_cnt = cinfo->rcvhdrq_cnt;
+ __entry->rcvhdrq_size = cinfo->rcvhdrq_entsize;
+ __entry->sdma_ring_size = cinfo->sdma_ring_size;
+ __entry->rcvegr_size = cinfo->rcvegr_size;
),
TP_printk("[%s] ctxt %u:%u " CINFO_FMT,
__get_str(dev),
diff --git a/include/trace/events/f2fs.h b/include/trace/events/f2fs.h
index 06c87f9f720c..795698925d20 100644
--- a/include/trace/events/f2fs.h
+++ b/include/trace/events/f2fs.h
@@ -491,7 +491,7 @@ DEFINE_EVENT(f2fs__truncate_node, f2fs_truncate_node,
TRACE_EVENT(f2fs_truncate_partial_nodes,
- TP_PROTO(struct inode *inode, nid_t nid[], int depth, int err),
+ TP_PROTO(struct inode *inode, nid_t *nid, int depth, int err),
TP_ARGS(inode, nid, depth, err),
diff --git a/net/wireless/trace.h b/net/wireless/trace.h
index 5152938b358d..018c81fa72fb 100644
--- a/net/wireless/trace.h
+++ b/net/wireless/trace.h
@@ -3137,7 +3137,7 @@ TRACE_EVENT(rdev_start_radar_detection,
TRACE_EVENT(rdev_set_mcast_rate,
TP_PROTO(struct wiphy *wiphy, struct net_device *netdev,
- int mcast_rate[NUM_NL80211_BANDS]),
+ int *mcast_rate),
TP_ARGS(wiphy, netdev, mcast_rate),
TP_STRUCT__entry(
WIPHY_ENTRY
diff --git a/sound/firewire/amdtp-stream-trace.h b/sound/firewire/amdtp-stream-trace.h
index ea0d486652c8..54cdd4ffa9ce 100644
--- a/sound/firewire/amdtp-stream-trace.h
+++ b/sound/firewire/amdtp-stream-trace.h
@@ -14,7 +14,7 @@
#include <linux/tracepoint.h>
TRACE_EVENT(in_packet,
- TP_PROTO(const struct amdtp_stream *s, u32 cycles, u32 cip_header[2], unsigned int payload_length, unsigned int index),
+ TP_PROTO(const struct amdtp_stream *s, u32 cycles, u32 *cip_header, unsigned int payload_length, unsigned int index),
TP_ARGS(s, cycles, cip_header, payload_length, index),
TP_STRUCT__entry(
__field(unsigned int, second)
--
2.9.5
^ permalink raw reply related
* [PATCH v4 bpf-next 00/10] bpf, tracing: introduce bpf raw tracepoints
From: Alexei Starovoitov @ 2018-03-23 0:38 UTC (permalink / raw)
To: davem; +Cc: daniel, torvalds, peterz, rostedt, netdev, kernel-team, linux-api
v3->v4:
- adopted Linus's CAST_TO_U64 macro to cast any integer, pointer, or small
struct to u64. That nicely reduced the size of patch 1
v2->v3:
- with Linus's suggestion introduced generic COUNT_ARGS and CONCATENATE macros
(or rather moved them from apparmor)
that cleaned up patches 6 and 7
- added patch 4 to refactor trace_iwlwifi_dev_ucode_error() from 17 args to 4
Now any tracepoint with >12 args will have build error
v1->v2:
- simplified api by combing bpf_raw_tp_open(name) + bpf_attach(prog_fd) into
bpf_raw_tp_open(name, prog_fd) as suggested by Daniel.
That simplifies bpf_detach as well which is now simple close() of fd.
- fixed memory leak in error path which was spotted by Daniel.
- fixed bpf_get_stackid(), bpf_perf_event_output() called from raw tracepoints
- added more tests
- fixed allyesconfig build caught by buildbot
v1:
This patch set is a different way to address the pressing need to access
task_struct pointers in sched tracepoints from bpf programs.
The first approach simply added these pointers to sched tracepoints:
https://lkml.org/lkml/2017/12/14/753
which Peter nacked.
Few options were discussed and eventually the discussion converged on
doing bpf specific tracepoint_probe_register() probe functions.
Details here:
https://lkml.org/lkml/2017/12/20/929
Patch 1 is kernel wide cleanup of pass-struct-by-value into
pass-struct-by-reference into tracepoints.
Patches 2 and 3 are minor cleanups to address allyesconfig build
Patch 4 refactor trace_iwlwifi_dev_ucode_error from 17 to 4 args
Patch 5 introduces COUNT_ARGS macro
Patch 6 minor prep work to expose number of arguments passed
into tracepoints.
Patch 7 introduces BPF_RAW_TRACEPOINT api.
the auto-cleanup and multiple concurrent users are must have
features of tracing api. For bpf raw tracepoints it looks like:
// load bpf prog with BPF_PROG_TYPE_RAW_TRACEPOINT type
prog_fd = bpf_prog_load(...);
// receive anon_inode fd for given bpf_raw_tracepoint
// and attach bpf program to it
raw_tp_fd = bpf_raw_tracepoint_open("xdp_exception", prog_fd);
Ctrl-C of tracing daemon or cmdline tool will automatically
detach bpf program, unload it and unregister tracepoint probe.
More details in patch 7.
Patch 8 - trivial support in libbpf
Patches 9, 10 - user space tests
samples/bpf/test_overhead performance on 1 cpu:
tracepoint base kprobe+bpf tracepoint+bpf raw_tracepoint+bpf
task_rename 1.1M 769K 947K 1.0M
urandom_read 789K 697K 750K 755K
Alexei Starovoitov (10):
treewide: remove large struct-pass-by-value from tracepoint arguments
net/mediatek: disambiguate mt76 vs mt7601u trace events
net/mac802154: disambiguate mac80215 vs mac802154 trace events
net/wireless/iwlwifi: fix iwlwifi_dev_ucode_error tracepoint
macro: introduce COUNT_ARGS() macro
tracepoint: compute num_args at build time
bpf: introduce BPF_RAW_TRACEPOINT
libbpf: add bpf_raw_tracepoint_open helper
samples/bpf: raw tracepoint test
selftests/bpf: test for bpf_get_stackid() from raw tracepoints
drivers/infiniband/hw/hfi1/file_ops.c | 2 +-
drivers/infiniband/hw/hfi1/trace_ctxts.h | 12 +-
drivers/net/wireless/intel/iwlwifi/dvm/main.c | 7 +-
.../wireless/intel/iwlwifi/iwl-devtrace-iwlwifi.h | 39 ++-
drivers/net/wireless/intel/iwlwifi/iwl-devtrace.c | 1 +
drivers/net/wireless/intel/iwlwifi/mvm/utils.c | 7 +-
drivers/net/wireless/mediatek/mt7601u/trace.h | 6 +-
include/linux/bpf_types.h | 1 +
include/linux/kernel.h | 7 +
include/linux/trace_events.h | 37 +++
include/linux/tracepoint-defs.h | 1 +
include/linux/tracepoint.h | 28 ++-
include/trace/bpf_probe.h | 87 +++++++
include/trace/define_trace.h | 15 +-
include/trace/events/f2fs.h | 2 +-
include/uapi/linux/bpf.h | 11 +
kernel/bpf/syscall.c | 87 +++++++
kernel/trace/bpf_trace.c | 270 +++++++++++++++++++++
kernel/tracepoint.c | 27 ++-
net/mac802154/trace.h | 8 +-
net/wireless/trace.h | 2 +-
samples/bpf/Makefile | 1 +
samples/bpf/bpf_load.c | 14 ++
samples/bpf/test_overhead_raw_tp_kern.c | 17 ++
samples/bpf/test_overhead_user.c | 12 +
security/apparmor/include/path.h | 7 +-
sound/firewire/amdtp-stream-trace.h | 2 +-
tools/include/uapi/linux/bpf.h | 11 +
tools/lib/bpf/bpf.c | 11 +
tools/lib/bpf/bpf.h | 1 +
tools/testing/selftests/bpf/test_progs.c | 91 +++++--
31 files changed, 720 insertions(+), 104 deletions(-)
create mode 100644 include/trace/bpf_probe.h
create mode 100644 samples/bpf/test_overhead_raw_tp_kern.c
--
2.9.5
^ permalink raw reply
* [PATCH v4 bpf-next 08/10] libbpf: add bpf_raw_tracepoint_open helper
From: Alexei Starovoitov @ 2018-03-23 0:39 UTC (permalink / raw)
To: davem; +Cc: daniel, torvalds, peterz, rostedt, netdev, kernel-team, linux-api
In-Reply-To: <20180323003907.3113756-1-ast@fb.com>
From: Alexei Starovoitov <ast@kernel.org>
add bpf_raw_tracepoint_open(const char *name, int prog_fd) api to libbpf
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
---
tools/include/uapi/linux/bpf.h | 11 +++++++++++
tools/lib/bpf/bpf.c | 11 +++++++++++
tools/lib/bpf/bpf.h | 1 +
3 files changed, 23 insertions(+)
diff --git a/tools/include/uapi/linux/bpf.h b/tools/include/uapi/linux/bpf.h
index d245c41213ac..58060bec999d 100644
--- a/tools/include/uapi/linux/bpf.h
+++ b/tools/include/uapi/linux/bpf.h
@@ -94,6 +94,7 @@ enum bpf_cmd {
BPF_MAP_GET_FD_BY_ID,
BPF_OBJ_GET_INFO_BY_FD,
BPF_PROG_QUERY,
+ BPF_RAW_TRACEPOINT_OPEN,
};
enum bpf_map_type {
@@ -134,6 +135,7 @@ enum bpf_prog_type {
BPF_PROG_TYPE_SK_SKB,
BPF_PROG_TYPE_CGROUP_DEVICE,
BPF_PROG_TYPE_SK_MSG,
+ BPF_PROG_TYPE_RAW_TRACEPOINT,
};
enum bpf_attach_type {
@@ -344,6 +346,11 @@ union bpf_attr {
__aligned_u64 prog_ids;
__u32 prog_cnt;
} query;
+
+ struct {
+ __u64 name;
+ __u32 prog_fd;
+ } raw_tracepoint;
} __attribute__((aligned(8)));
/* BPF helper function descriptions:
@@ -1151,4 +1158,8 @@ struct bpf_cgroup_dev_ctx {
__u32 minor;
};
+struct bpf_raw_tracepoint_args {
+ __u64 args[0];
+};
+
#endif /* _UAPI__LINUX_BPF_H__ */
diff --git a/tools/lib/bpf/bpf.c b/tools/lib/bpf/bpf.c
index 592a58a2b681..e0500055f1a6 100644
--- a/tools/lib/bpf/bpf.c
+++ b/tools/lib/bpf/bpf.c
@@ -428,6 +428,17 @@ int bpf_obj_get_info_by_fd(int prog_fd, void *info, __u32 *info_len)
return err;
}
+int bpf_raw_tracepoint_open(const char *name, int prog_fd)
+{
+ union bpf_attr attr;
+
+ bzero(&attr, sizeof(attr));
+ attr.raw_tracepoint.name = ptr_to_u64(name);
+ attr.raw_tracepoint.prog_fd = prog_fd;
+
+ return sys_bpf(BPF_RAW_TRACEPOINT_OPEN, &attr, sizeof(attr));
+}
+
int bpf_set_link_xdp_fd(int ifindex, int fd, __u32 flags)
{
struct sockaddr_nl sa;
diff --git a/tools/lib/bpf/bpf.h b/tools/lib/bpf/bpf.h
index 8d18fb73d7fb..ee59342c6f42 100644
--- a/tools/lib/bpf/bpf.h
+++ b/tools/lib/bpf/bpf.h
@@ -79,4 +79,5 @@ int bpf_map_get_fd_by_id(__u32 id);
int bpf_obj_get_info_by_fd(int prog_fd, void *info, __u32 *info_len);
int bpf_prog_query(int target_fd, enum bpf_attach_type type, __u32 query_flags,
__u32 *attach_flags, __u32 *prog_ids, __u32 *prog_cnt);
+int bpf_raw_tracepoint_open(const char *name, int prog_fd);
#endif
--
2.9.5
^ permalink raw reply related
* [PATCH v4 bpf-next 05/10] macro: introduce COUNT_ARGS() macro
From: Alexei Starovoitov @ 2018-03-23 0:39 UTC (permalink / raw)
To: davem; +Cc: daniel, torvalds, peterz, rostedt, netdev, kernel-team, linux-api
In-Reply-To: <20180323003907.3113756-1-ast@fb.com>
From: Alexei Starovoitov <ast@kernel.org>
move COUNT_ARGS() macro from apparmor to generic header and extend it
to count till twelve.
COUNT() was an alternative name for this logic, but it's used for
different purpose in many other places.
Similarly for CONCATENATE() macro.
Suggested-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
---
include/linux/kernel.h | 7 +++++++
security/apparmor/include/path.h | 7 +------
2 files changed, 8 insertions(+), 6 deletions(-)
diff --git a/include/linux/kernel.h b/include/linux/kernel.h
index 3fd291503576..293fa0677fba 100644
--- a/include/linux/kernel.h
+++ b/include/linux/kernel.h
@@ -919,6 +919,13 @@ static inline void ftrace_dump(enum ftrace_dump_mode oops_dump_mode) { }
#define swap(a, b) \
do { typeof(a) __tmp = (a); (a) = (b); (b) = __tmp; } while (0)
+/* This counts to 12. Any more, it will return 13th argument. */
+#define __COUNT_ARGS(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _n, X...) _n
+#define COUNT_ARGS(X...) __COUNT_ARGS(, ##X, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)
+
+#define __CONCAT(a, b) a ## b
+#define CONCATENATE(a, b) __CONCAT(a, b)
+
/**
* container_of - cast a member of a structure out to the containing structure
* @ptr: the pointer to the member.
diff --git a/security/apparmor/include/path.h b/security/apparmor/include/path.h
index 05fb3305671e..e042b994f2b8 100644
--- a/security/apparmor/include/path.h
+++ b/security/apparmor/include/path.h
@@ -43,15 +43,10 @@ struct aa_buffers {
DECLARE_PER_CPU(struct aa_buffers, aa_buffers);
-#define COUNT_ARGS(X...) COUNT_ARGS_HELPER(, ##X, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)
-#define COUNT_ARGS_HELPER(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, n, X...) n
-#define CONCAT(X, Y) X ## Y
-#define CONCAT_AFTER(X, Y) CONCAT(X, Y)
-
#define ASSIGN(FN, X, N) ((X) = FN(N))
#define EVAL1(FN, X) ASSIGN(FN, X, 0) /*X = FN(0)*/
#define EVAL2(FN, X, Y...) do { ASSIGN(FN, X, 1); EVAL1(FN, Y); } while (0)
-#define EVAL(FN, X...) CONCAT_AFTER(EVAL, COUNT_ARGS(X))(FN, X)
+#define EVAL(FN, X...) CONCATENATE(EVAL, COUNT_ARGS(X))(FN, X)
#define for_each_cpu_buffer(I) for ((I) = 0; (I) < MAX_PATH_BUFFERS; (I)++)
--
2.9.5
^ 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