* Re: [PATCH 1/6] bridge: add support to parse multiple vlan info attributes in IFLA_AF_SPEC
From: Scott Feldman @ 2014-12-29 21:40 UTC (permalink / raw)
To: Roopa Prabhu; +Cc: Netdev, shemminger, vyasevic@redhat.com
In-Reply-To: <1419887132-7084-2-git-send-email-roopa@cumulusnetworks.com>
On Mon, Dec 29, 2014 at 1:05 PM, <roopa@cumulusnetworks.com> wrote:
> From: Roopa Prabhu <roopa@cumulusnetworks.com>
>
> This patch changes bridge IFLA_AF_SPEC netlink attribute parser to
> look for more than one IFLA_BRIDGE_VLAN_INFO attribute. This allows
> userspace to pack more than one vlan in the setlink msg.
>
> Signed-off-by: Roopa Prabhu <roopa@cumulusnetworks.com>
> ---
> net/bridge/br_netlink.c | 18 +++++++++---------
> 1 file changed, 9 insertions(+), 9 deletions(-)
>
> diff --git a/net/bridge/br_netlink.c b/net/bridge/br_netlink.c
> index 9f5eb55..75971b1 100644
> --- a/net/bridge/br_netlink.c
> +++ b/net/bridge/br_netlink.c
> @@ -230,18 +230,18 @@ static int br_afspec(struct net_bridge *br,
> struct nlattr *af_spec,
> int cmd)
> {
> - struct nlattr *tb[IFLA_BRIDGE_MAX+1];
> + struct bridge_vlan_info *vinfo;
> int err = 0;
> + struct nlattr *attr;
> + int err = 0;
> + int rem;
> + u16 vid;
>
> - err = nla_parse_nested(tb, IFLA_BRIDGE_MAX, af_spec, ifla_br_policy);
Removing this call orphans ifla_br_policy...should ifla_br_policy be removed?
> - if (err)
> - return err;
> -
> - if (tb[IFLA_BRIDGE_VLAN_INFO]) {
> - struct bridge_vlan_info *vinfo;
> -
> - vinfo = nla_data(tb[IFLA_BRIDGE_VLAN_INFO]);
> + nla_for_each_nested(attr, af_spec, rem) {
> + if (nla_type(attr) != IFLA_BRIDGE_VLAN_INFO)
> + continue;
Need to validate size of attr is sizeof(struct bridge_vlan_info).
>
> + vinfo = nla_data(attr);
> if (!vinfo->vid || vinfo->vid >= VLAN_VID_MASK)
> return -EINVAL;
>
> --
> 1.7.10.4
>
> --
> To unsubscribe from this list: send the line "unsubscribe netdev" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply
* [GIT] Networking
From: David Miller @ 2014-12-29 21:33 UTC (permalink / raw)
To: torvalds; +Cc: akpm, netdev, linux-kernel
1) Fix double SKB free in bluetooth 6lowpan layer, from Jukka
Rissanen.
2) Fix receive checksum handling in enic driver, from Govindarajulu
Varadarajan.
3) Fix NAPI poll list corruption in virtio_net and caif_virtio, from
Herbert Xu. Also, add code to detect drivers that have this
mistake in the future.
4) Fix doorbell endianness handling in mlx4 driver, from Amir Vadai.
5) Don't clobber IP6CB() before xfrm6_policy_check() is called in
TCP input path,f rom Nicolas Dichtel.
6) Fix MPLS action validation in openvswitch, from Pravin B Shelar.
7) Fix double SKB free in vxlan driver, also from Pravin.
8) When we scrub a packet, which happens when we are switching the
context of the packet (namespace, etc.), we should reset the
secmark. From Thomas Graf.
9) ->ndo_gso_check() needs to do more than return true/false, it
also has to allow the driver to clear netdev feature bits in
order for the caller to be able to proceed properly. From
Jesse Gross.
Please pull, thanks a lot!
The following changes since commit d790be3863b28fd22e0781c1a3ddefcbfd5f7086:
Merge tag 'modules-next-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rusty/linux (2014-12-18 20:55:41 -0800)
are available in the git repository at:
git://git.kernel.org/pub/scm/linux/kernel/git/davem/net.git master
for you to fetch changes up to dc97a1a9477f969e34b38ca9d9cd231cb93ebea2:
genetlink: A genl_bind() to an out-of-range multicast group should not WARN(). (2014-12-29 16:31:49 -0500)
----------------------------------------------------------------
Al Viro (3):
Bluetooth: hidp_connection_add() unsafe use of l2cap_pi()
Bluetooth: cmtp: cmtp_add_connection() should verify that it's dealing with l2cap socket
Bluetooth: bnep: bnep_add_connection() should verify that it's dealing with l2cap socket
Amir Vadai (1):
net/mlx4_en: Doorbell is byteswapped in Little Endian archs
Antonio Quartulli (1):
batman-adv: avoid NULL dereferences and fix if check
Appana Durga Kedareswara Rao (1):
net: xilinx: Remove unnecessary temac_property in the driver
Dan Collins (1):
packet: Fixed TPACKET V3 to signal poll when block is closed rather than every packet
Daniel Glöckner (1):
net: s6gmac: remove driver
David S. Miller (6):
Merge branch 'for-upstream' of git://git.kernel.org/.../bluetooth/bluetooth
Merge branch 'openvswitch-net'
Merge tag 'wireless-drivers-for-davem-2014-12-26' of git://git.kernel.org/.../kvalo/wireless-drivers
Merge branch 'for-upstream' of git://git.kernel.org/.../bluetooth/bluetooth
Merge branch 'netlink_multicast'
genetlink: A genl_bind() to an out-of-range multicast group should not WARN().
Eliad Peller (1):
iwlwifi: mvm: clear IN_HW_RESTART flag on stop()
Emmanuel Grumbach (3):
iwlwifi: pcie: re-ACK all interrupts after device reset
iwlwifi: don't double free a pointer if no FW was found
iwlwifi: add new device IDs for 3165
Govindarajulu Varadarajan (1):
enic: fix rx skb checksum
Haiyang Zhang (1):
hyperv: Fix some variable name typos in send-buffer init/revoke
Hariprasad Shenai (1):
cxgb4vf: Fix ethtool get_settings for VF driver
Herbert Xu (6):
virtio_net: Fix napi poll list corruption
caif: Fix napi poll list corruption
net: Move napi polling code out of net_rx_action
net: Detect drivers that reschedule NAPI and exhaust budget
net: Always poll at least one device in net_rx_action
net: Rearrange loop in net_rx_action
Huacai Chen (1):
stmmac: Don't init ptp again when resume from suspend/hibernation
Jason Wang (1):
net: drop the packet when fails to do software segmentation or header check
Jay Vosburgh (1):
net/core: Handle csum for CHECKSUM_COMPLETE VXLAN forwarding
Jesse Gross (1):
net: Generalize ndo_gso_check to ndo_features_check
Jia-Ju Bai (3):
8139too: Fix the lack of pci_disable_device
8139too: Add netif_napi_del in the driver
ne2k-pci: Add pci_disable_device in error handling
Johan Hedberg (1):
Bluetooth: Fix accepting connections when not using mgmt
Johan Hovold (1):
net: phy: micrel: use generic config_init for KSZ8021/KSZ8031
Johannes Berg (6):
netlink: rename netlink_unbind() to netlink_undo_bind()
genetlink: pass only network namespace to genl_has_listeners()
netlink: update listeners directly when removing socket
netlink: call unbind when releasing socket
genetlink: pass multicast bind/unbind to families
netlink/genetlink: pass network namespace to bind/unbind
Jukka Rissanen (1):
Bluetooth: 6lowpan: Do not free skb when packet is dropped
Kalle Valo (1):
Merge tag 'iwlwifi-fixes-for-kalle-2014-12-18' of git://git.kernel.org/.../iwlwifi/iwlwifi-fixes
Li RongQing (1):
sunvnet: fix a memory leak in vnet_handle_offloads
Liad Kaufman (1):
iwlwifi: pcie: limit fw chunk sizes given to fh
Marcel Holtmann (1):
Bluetooth: Fix controller configuration with HCI_QUIRK_INVALID_BDADDR
Mika Westerberg (1):
brcmfmac: Do not crash if platform data is not populated
Nicholas Mc Guire (1):
net: incorrect use of init_completion fixup
Nicolas Dichtel (2):
tcp6: don't move IP6CB before xfrm6_policy_check()
neigh: remove next ptr from struct neigh_table
Paul Bolle (1):
ipw2200: select CFG80211_WEXT
Prashant Sreedharan (1):
tg3: tg3_disable_ints using uninitialized mailbox value to disable interrupts
Pravin B Shelar (6):
mpls: Fix config check for mpls.
mpls: Fix allowed protocols for mpls gso
openvswitch: Fix MPLS action validation.
openvswitch: Fix GSO with multiple MPLS label.
openvswitch: Fix vport_send double free
vxlan: Fix double free of skb.
Rickard Strandqvist (1):
net: ethernet: micrel: ksz884x.c: Remove unused function
Sven Eckelmann (2):
batman-adv: Calculate extra tail size based on queued fragments
batman-adv: Unify fragment size calculation
Thomas Graf (1):
net: Reset secmark when scrubbing packet
Toshiaki Makita (1):
net: Fix stacked vlan offload features computation
Wengang Wang (1):
bonding: change error message to debug message in __bond_release_one()
Wolfram Sang (1):
net: ethernet: stmicro: stmmac: drop owner assignment from platform_drivers
Wu Fengguang (1):
openvswitch: fix odd_ptr_err.cocci warnings
stephen hemminger (1):
in6: fix conflict with glibc
drivers/net/bonding/bond_main.c | 2 +-
drivers/net/caif/caif_virtio.c | 2 -
drivers/net/ethernet/8390/ne2k-pci.c | 6 +-
drivers/net/ethernet/Kconfig | 12 -
drivers/net/ethernet/Makefile | 1 -
drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c | 8 +-
drivers/net/ethernet/broadcom/tg3.c | 34 +--
drivers/net/ethernet/brocade/bna/bnad_debugfs.c | 2 +-
drivers/net/ethernet/chelsio/cxgb4vf/adapter.h | 4 +
drivers/net/ethernet/chelsio/cxgb4vf/cxgb4vf_main.c | 142 ++++++++-
drivers/net/ethernet/chelsio/cxgb4vf/t4vf_common.h | 2 +-
drivers/net/ethernet/chelsio/cxgb4vf/t4vf_hw.c | 54 ++--
drivers/net/ethernet/cisco/enic/enic_main.c | 12 +-
drivers/net/ethernet/emulex/benet/be_main.c | 8 +-
drivers/net/ethernet/mellanox/mlx4/en_netdev.c | 10 +-
drivers/net/ethernet/mellanox/mlx4/en_tx.c | 12 +-
drivers/net/ethernet/micrel/ksz884x.c | 6 -
drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c | 8 +-
drivers/net/ethernet/realtek/8139too.c | 4 +-
drivers/net/ethernet/s6gmac.c | 1058 -----------------------------------------------------------------
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 14 +-
drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c | 1 -
drivers/net/ethernet/sun/sunvnet.c | 1 +
drivers/net/ethernet/xilinx/xilinx_axienet.h | 2 -
drivers/net/ethernet/xilinx/xilinx_axienet_main.c | 4 -
drivers/net/hyperv/hyperv_net.h | 1 +
drivers/net/hyperv/netvsc.c | 15 +-
drivers/net/phy/micrel.c | 18 +-
drivers/net/virtio_net.c | 2 -
drivers/net/vxlan.c | 34 ++-
drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c | 4 +-
drivers/net/wireless/ipw2x00/Kconfig | 3 +-
drivers/net/wireless/iwlwifi/iwl-drv.c | 2 +-
drivers/net/wireless/iwlwifi/iwl-fh.h | 1 +
drivers/net/wireless/iwlwifi/mvm/mac80211.c | 15 +-
drivers/net/wireless/iwlwifi/pcie/drv.c | 4 +
drivers/net/wireless/iwlwifi/pcie/trans.c | 17 +-
include/linux/netdevice.h | 20 +-
include/linux/netlink.h | 4 +-
include/net/genetlink.h | 9 +-
include/net/neighbour.h | 1 -
include/net/vxlan.h | 28 +-
include/uapi/linux/in6.h | 3 +-
include/uapi/linux/libc-compat.h | 3 +
kernel/audit.c | 2 +-
net/batman-adv/fragmentation.c | 4 +-
net/batman-adv/gateway_client.c | 2 +-
net/bluetooth/6lowpan.c | 1 -
net/bluetooth/bnep/core.c | 3 +
net/bluetooth/cmtp/core.c | 3 +
net/bluetooth/hci_event.c | 16 +-
net/bluetooth/hidp/core.c | 3 +-
net/core/dev.c | 175 ++++++-----
net/core/skbuff.c | 1 +
net/ipv4/geneve.c | 6 +-
net/ipv6/tcp_ipv6.c | 45 ++-
net/mpls/mpls_gso.c | 5 +-
net/netfilter/nfnetlink.c | 2 +-
net/netlink/af_netlink.c | 38 ++-
net/netlink/af_netlink.h | 8 +-
net/netlink/genetlink.c | 56 ++++
net/openvswitch/actions.c | 3 +-
net/openvswitch/datapath.c | 3 +-
net/openvswitch/flow_netlink.c | 13 +-
net/openvswitch/vport-geneve.c | 3 +
net/openvswitch/vport-gre.c | 18 +-
net/openvswitch/vport-vxlan.c | 2 +
net/openvswitch/vport.c | 5 +-
net/packet/af_packet.c | 11 +-
69 files changed, 628 insertions(+), 1393 deletions(-)
delete mode 100644 drivers/net/ethernet/s6gmac.c
^ permalink raw reply
* Re: net.git: Call-trace after "Merge branch 'netlink_multicast'"
From: David Miller @ 2014-12-29 21:33 UTC (permalink / raw)
To: sedat.dilek; +Cc: johannes.berg, netdev, fengguang.wu
In-Reply-To: <CA+icZUUO5fkmdevyhutYU6=2vBACN0Nr3WA+DMssfhy5xfsrbQ@mail.gmail.com>
From: Sedat Dilek <sedat.dilek@gmail.com>
Date: Sun, 28 Dec 2014 10:34:51 +0100
> On Sun, Dec 28, 2014 at 8:54 AM, Sedat Dilek <sedat.dilek@gmail.com> wrote:
>> Just a small thing, if you look at this...
>>
>> With gcc-4.9.2 I see this warning in my logs...
>>
>> net/netlink/genetlink.c: In function 'genl_bind':
>> net/netlink/genetlink.c:1018:2: warning: 'err' may be used
>> uninitialized in this function [-Wmaybe-uninitialized]
>>
>
> Attached patch fixes the issue for me.
Ok since the user can request arbitrary multicast groups, we cannot
warn in this situation.
And since initializing 'err' to zero makes the whole 'found'
variable completely unnecessary, we can delete that too.
This is the final patch I am applying, thanks for all of your
help.
====================
[PATCH] genetlink: A genl_bind() to an out-of-range multicast group should not WARN().
Users can request to bind to arbitrary multicast groups, so warning
when the requested group number is out of range is not appropriate.
And with the warning removed, and the 'err' variable properly given
an initial value, we can remove 'found' altogether.
Reported-by: Sedat Dilek <sedat.dilek@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
---
net/netlink/genetlink.c | 7 +------
1 file changed, 1 insertion(+), 6 deletions(-)
diff --git a/net/netlink/genetlink.c b/net/netlink/genetlink.c
index 91566ed..2e11061 100644
--- a/net/netlink/genetlink.c
+++ b/net/netlink/genetlink.c
@@ -985,8 +985,7 @@ static struct genl_multicast_group genl_ctrl_groups[] = {
static int genl_bind(struct net *net, int group)
{
- int i, err;
- bool found = false;
+ int i, err = 0;
down_read(&cb_lock);
for (i = 0; i < GENL_FAM_TAB_SIZE; i++) {
@@ -1003,16 +1002,12 @@ static int genl_bind(struct net *net, int group)
err = f->mcast_bind(net, fam_grp);
else
err = 0;
- found = true;
break;
}
}
}
up_read(&cb_lock);
- if (WARN_ON(!found))
- err = 0;
-
return err;
}
--
1.7.11.7
^ permalink raw reply related
* Re: [PATCH] bonding: move ipoib_header_ops to vmlinux
From: Cong Wang @ 2014-12-29 21:32 UTC (permalink / raw)
To: Wengang Wang; +Cc: netdev, linux-rdma
In-Reply-To: <1416893768-21369-1-git-send-email-wen.gang.wang@oracle.com>
On Mon, Nov 24, 2014 at 9:36 PM, Wengang Wang <wen.gang.wang@oracle.com> wrote:
> When last slave of a bonding master is removed, the bonding then does not work.
> At the time if packet_snd is called against with a master net_device, it calls
> then header_ops->create which points to slave's header_ops. In case the slave
> is ipoib and the module is unloaded, header_ops would point to invalid address.
> Accessing it will cause problem.
> This patch tries to fix this issue by moving ipoib_header_ops to vmlinux to keep
> it valid even when ipoib module is unloaded.
>
I still don't think this is the right way to fix the bug, because
there are other modules which have the same bug, for example,
net/bluetooth/6lowpan.c (unless it can't be enslaved into a bond
of course, I haven't verified). We don't want to move them all
to builtin kernel, do we?
On the other hand, as Jay explained, bonding is probably
the only one which has the problem, why not solve it in bonding?
I mean why do we have to adjust other modules just for bonding?
When its slave device gets removed, some netdev event is sent
to the master, so why not reset the header_ops to ether header ops
up on this event? Something like below (not even compile tested):
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c
index 184c434..aedccae 100644
--- a/drivers/net/bonding/bond_main.c
+++ b/drivers/net/bonding/bond_main.c
@@ -1726,6 +1726,7 @@ static int __bond_release_one(struct net_device *bond_dev,
if (!bond_has_slaves(bond)) {
bond_set_carrier(bond);
eth_hw_addr_random(bond_dev);
+ ether_setup(bond_dev);
}
unblock_netpoll_tx();
It should solve more than just your ipoib case.
Last but not least, since you said you saw the crash in packet_snd(),
it would also be interesting to know why packet_snd() still picks this
bond dev after all its slaves are gone, after all it is not a functional
device without any slave (its carrier is off).
Thanks.
^ permalink raw reply related
* [PATCH 6/6] bridge: add vlan info to bridge setlink and dellink notification messages
From: roopa @ 2014-12-29 21:05 UTC (permalink / raw)
To: netdev, shemminger, vyasevic; +Cc: Roopa Prabhu
From: Roopa Prabhu <roopa@cumulusnetworks.com>
vlan add/deletes are not notified to userspace today. This patch fixes it.
Notifications will contain vlans compressed into ranges whereever applicable.
Signed-off-by: Roopa Prabhu <roopa@cumulusnetworks.com>
---
net/bridge/br_netlink.c | 3 ++-
net/core/rtnetlink.c | 3 ++-
2 files changed, 4 insertions(+), 2 deletions(-)
diff --git a/net/bridge/br_netlink.c b/net/bridge/br_netlink.c
index 16bdd5a..cebfb03 100644
--- a/net/bridge/br_netlink.c
+++ b/net/bridge/br_netlink.c
@@ -303,7 +303,8 @@ void br_ifinfo_notify(int event, struct net_bridge_port *port)
if (skb == NULL)
goto errout;
- err = br_fill_ifinfo(skb, port, 0, 0, event, 0, 0, port->dev);
+ err = br_fill_ifinfo(skb, port, 0, 0, event, 0,
+ RTEXT_FILTER_BRVLAN_COMPRESSED, port->dev);
if (err < 0) {
/* -EMSGSIZE implies BUG in br_nlmsg_size() */
WARN_ON(err == -EMSGSIZE);
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c
index d06107d..dad5fb6 100644
--- a/net/core/rtnetlink.c
+++ b/net/core/rtnetlink.c
@@ -2878,7 +2878,8 @@ static int rtnl_bridge_notify(struct net_device *dev, u16 flags)
if ((!flags || (flags & BRIDGE_FLAGS_MASTER)) &&
br_dev && br_dev->netdev_ops->ndo_bridge_getlink) {
- err = br_dev->netdev_ops->ndo_bridge_getlink(skb, 0, 0, dev, 0);
+ err = br_dev->netdev_ops->ndo_bridge_getlink(skb, 0, 0, dev,
+ RTEXT_FILTER_BRVLAN_COMPRESSED);
if (err < 0)
goto errout;
}
--
1.7.10.4
^ permalink raw reply related
* [PATCH 5/6] bridge: new function to pack vlans using both IFLA_BRIDGE_VLAN_INFO and IFLA_BRIDGE_VLAN_RANGE_INFO
From: roopa @ 2014-12-29 21:05 UTC (permalink / raw)
To: netdev, shemminger, vyasevic; +Cc: Roopa Prabhu, Wilson kok
From: Roopa Prabhu <roopa@cumulusnetworks.com>
This patch adds new function to compress vlans into ranges.
Vlans are compressed into ranges only if the fill request is called with
RTEXT_FILTER_BRVLAN_COMPRESSED in filtermask.
Old vlan packing code is moved to a new function and continues to be
called when filter_mask is RTEXT_FILTER_BRVLAN
Signed-off-by: Wilson kok <wkok@cumulusnetworks.com>
Signed-off-by: Roopa Prabhu <roopa@cumulusnetworks.com>
---
net/bridge/br_netlink.c | 157 +++++++++++++++++++++++++++++++++++++++++------
1 file changed, 137 insertions(+), 20 deletions(-)
diff --git a/net/bridge/br_netlink.c b/net/bridge/br_netlink.c
index 4c47ba0..16bdd5a 100644
--- a/net/bridge/br_netlink.c
+++ b/net/bridge/br_netlink.c
@@ -67,6 +67,133 @@ static int br_port_fill_attrs(struct sk_buff *skb,
return 0;
}
+static int br_fill_ifvlaninfo_bitmap(struct sk_buff *skb,
+ const unsigned long *vlan_bmp, u16 flags)
+{
+ struct bridge_vlan_range_info vinfo_range;
+ struct bridge_vlan_info vinfo;
+ u16 vid, start = 0, end = 0;
+ u16 pvid;
+
+ /* handle the untagged */
+ for_each_set_bit(vid, vlan_bmp, VLAN_N_VID) {
+ if (start == 0) {
+ start = vid;
+ end = vid;
+ }
+ if ((vid - end) > 1) {
+ memset(&vinfo_range, 0, sizeof(vinfo_range));
+ vinfo_range.flags |= flags;
+ vinfo_range.vid = start;
+ vinfo_range.vid_end = end;
+ if (nla_put(skb, IFLA_BRIDGE_VLAN_RANGE_INFO,
+ sizeof(vinfo_range), &vinfo_range))
+ goto nla_put_failure;
+ start = vid;
+ end = vid;
+ } else {
+ end = vid;
+ }
+ }
+
+ if (start != 0 && end != 0) {
+ if (start != end) {
+ memset(&vinfo_range, 0, sizeof(vinfo_range));
+ vinfo_range.flags |= flags;
+ vinfo_range.vid = start;
+ vinfo_range.vid_end = end;
+ if (nla_put(skb, IFLA_BRIDGE_VLAN_RANGE_INFO,
+ sizeof(vinfo_range), &vinfo_range))
+ goto nla_put_failure;
+ } else {
+ memset(&vinfo, 0, sizeof(vinfo));
+ vinfo.flags |= flags;
+ vinfo.vid = start;
+ if (nla_put(skb, IFLA_BRIDGE_VLAN_INFO,
+ sizeof(vinfo), &vinfo))
+ goto nla_put_failure;
+ }
+ }
+
+nla_put_failure:
+ return -EMSGSIZE;
+}
+
+static int br_fill_ifvlaninfo_compressed(struct sk_buff *skb,
+ const struct net_port_vlans *pv)
+{
+ unsigned long vlan_bmp_copy[BR_VLAN_BITMAP_LEN];
+ unsigned long untagged_bmp_copy[BR_VLAN_BITMAP_LEN];
+ struct bridge_vlan_range_info vinfo_range;
+ struct bridge_vlan_info vinfo;
+ u16 pvid;
+
+ memset(vlan_bmp_copy, 0,
+ sizeof(unsigned long) * BR_VLAN_BITMAP_LEN);
+ bitmap_copy(vlan_bmp_copy, pv->vlan_bitmap, VLAN_N_VID);
+
+ memset(untagged_bmp_copy, 0,
+ sizeof(unsigned long) * BR_VLAN_BITMAP_LEN);
+ bitmap_copy(untagged_bmp_copy, pv->untagged_bitmap, VLAN_N_VID);
+
+ /* send the pvid separately first */
+ pvid = br_get_pvid(pv);
+ if (pvid && (pvid != VLAN_N_VID)) {
+ memset(&vinfo, 0, sizeof(vinfo));
+ vinfo.flags |= BRIDGE_VLAN_INFO_PVID;
+ if (test_bit(pvid, untagged_bmp_copy)) {
+ vinfo.flags |= BRIDGE_VLAN_INFO_UNTAGGED;
+ clear_bit(pvid, untagged_bmp_copy);
+ }
+ clear_bit(pvid, vlan_bmp_copy);
+ vinfo.vid = pvid;
+ if (nla_put(skb, IFLA_BRIDGE_VLAN_INFO,
+ sizeof(vinfo), &vinfo))
+ goto nla_put_failure;
+ }
+
+ /* fill untagged vlans */
+ br_fill_ifvlaninfo_bitmap(skb, untagged_bmp_copy,
+ BRIDGE_VLAN_INFO_UNTAGGED);
+ for_each_set_bit(vid, untagged_bmp_copy, VLAN_N_VID)
+ clear_bit(vid, vlan_bmp_copy);
+
+ /* fill tagged vlans */
+ br_fill_ifvlaninfo_bitmap(skb, vlan_bmp_copy, 0);
+
+ return 0;
+
+nla_put_failure:
+ return -EMSGSIZE;
+}
+
+static int br_fill_ifvlaninfo(struct sk_buff *skb,
+ const struct net_port_vlans *pv)
+{
+ struct bridge_vlan_info vinfo;
+ u16 pvid, vid;
+
+ pvid = br_get_pvid(pv);
+ for_each_set_bit(vid, pv->vlan_bitmap, VLAN_N_VID) {
+ vinfo.vid = vid;
+ vinfo.flags = 0;
+ if (vid == pvid)
+ vinfo.flags |= BRIDGE_VLAN_INFO_PVID;
+
+ if (test_bit(vid, pv->untagged_bitmap))
+ vinfo.flags |= BRIDGE_VLAN_INFO_UNTAGGED;
+
+ if (nla_put(skb, IFLA_BRIDGE_VLAN_INFO,
+ sizeof(vinfo), &vinfo))
+ goto nla_put_failure;
+ }
+
+ return 0;
+
+nla_put_failure:
+ return -EMSGSIZE;
+}
+
/*
* Create one netlink message for one interface
* Contains port and master info as well as carrier and bridge state.
@@ -121,12 +248,11 @@ static int br_fill_ifinfo(struct sk_buff *skb,
}
/* Check if the VID information is requested */
- if (filter_mask & RTEXT_FILTER_BRVLAN) {
- struct nlattr *af;
+ if ((filter_mask & RTEXT_FILTER_BRVLAN) ||
+ (filter_mask & RTEXT_FILTER_BRVLAN_COMPRESSED)) {
const struct net_port_vlans *pv;
- struct bridge_vlan_info vinfo;
- u16 vid;
- u16 pvid;
+ struct nlattr *af;
+ int err;
if (port)
pv = nbp_get_vlan_info(port);
@@ -140,21 +266,12 @@ static int br_fill_ifinfo(struct sk_buff *skb,
if (!af)
goto nla_put_failure;
- pvid = br_get_pvid(pv);
- for_each_set_bit(vid, pv->vlan_bitmap, VLAN_N_VID) {
- vinfo.vid = vid;
- vinfo.flags = 0;
- if (vid == pvid)
- vinfo.flags |= BRIDGE_VLAN_INFO_PVID;
-
- if (test_bit(vid, pv->untagged_bitmap))
- vinfo.flags |= BRIDGE_VLAN_INFO_UNTAGGED;
-
- if (nla_put(skb, IFLA_BRIDGE_VLAN_INFO,
- sizeof(vinfo), &vinfo))
- goto nla_put_failure;
- }
-
+ if (filter_mask & RTEXT_FILTER_BRVLAN_COMPRESSED)
+ err = br_fill_ifvlaninfo_compressed(skb, pv);
+ else
+ err = br_fill_ifvlaninfo(skb, pv);
+ if (err)
+ goto nla_put_failure;
nla_nest_end(skb, af);
}
--
1.7.10.4
^ permalink raw reply related
* [PATCH 4/6] rtnetlink: new filter RTEXT_FILTER_BRVLAN_COMPRESSED
From: roopa @ 2014-12-29 21:05 UTC (permalink / raw)
To: netdev, shemminger, vyasevic; +Cc: Roopa Prabhu
From: Roopa Prabhu <roopa@cumulusnetworks.com>
This filter is same as RTEXT_FILTER_BRVLAN except that it tries
to compress the consecutive vlans into ranges.
This helps on systems with large number of configured vlans.
Signed-off-by: Roopa Prabhu <roopa@cumulusnetworks.com>
---
include/uapi/linux/rtnetlink.h | 1 +
1 file changed, 1 insertion(+)
diff --git a/include/uapi/linux/rtnetlink.h b/include/uapi/linux/rtnetlink.h
index 9c9b8b4..d5a5316 100644
--- a/include/uapi/linux/rtnetlink.h
+++ b/include/uapi/linux/rtnetlink.h
@@ -634,6 +634,7 @@ struct tcamsg {
/* New extended info filters for IFLA_EXT_MASK */
#define RTEXT_FILTER_VF (1 << 0)
#define RTEXT_FILTER_BRVLAN (1 << 1)
+#define RTEXT_FILTER_BRVLAN_COMPRESSED (1 << 2)
/* End of information exported to user level */
--
1.7.10.4
^ permalink raw reply related
* [PATCH 2/6] bridge: add new attribute IFLA_BRIDGE_VLAN_RANGE_INFO to represent vlan range
From: roopa @ 2014-12-29 21:05 UTC (permalink / raw)
To: netdev, shemminger, vyasevic; +Cc: Roopa Prabhu, Wilson Kok
From: Roopa Prabhu <roopa@cumulusnetworks.com>
This patch adds new bridge netlink attribute IFLA_BRIDGE_VLAN_RANGE_INFO
to represent vlan range.
Current IFLA_BRIDGE_VLAN_INFO attribute represents a single vlan and
does not scale well when the port has large number of vlans.
IFLA_BRIDGE_VLAN_RANGE_INFO is similar to IFLA_BRIDGE_VLAN_INFO but helps
with packing consecutive vlans in a single attribute. Thus reducing the
size of the netlink msg during adds and also during dumps.
Signed-off-by: Roopa Prabhu <roopa@cumulusnetworks.com>
Signed-off-by: Wilson Kok <wkok@cumulusnetworks.com>
---
include/uapi/linux/if_bridge.h | 7 +++++++
net/bridge/br_netlink.c | 2 ++
2 files changed, 9 insertions(+)
diff --git a/include/uapi/linux/if_bridge.h b/include/uapi/linux/if_bridge.h
index b03ee8f..d41a346 100644
--- a/include/uapi/linux/if_bridge.h
+++ b/include/uapi/linux/if_bridge.h
@@ -118,6 +118,7 @@ enum {
IFLA_BRIDGE_FLAGS,
IFLA_BRIDGE_MODE,
IFLA_BRIDGE_VLAN_INFO,
+ IFLA_BRIDGE_VLAN_RANGE_INFO,
__IFLA_BRIDGE_MAX,
};
#define IFLA_BRIDGE_MAX (__IFLA_BRIDGE_MAX - 1)
@@ -131,6 +132,12 @@ struct bridge_vlan_info {
__u16 vid;
};
+struct bridge_vlan_range_info {
+ __u16 flags;
+ __u16 vid;
+ __u16 vid_end;
+};
+
/* Bridge multicast database attributes
* [MDBA_MDB] = {
* [MDBA_MDB_ENTRY] = {
diff --git a/net/bridge/br_netlink.c b/net/bridge/br_netlink.c
index 75971b1..e7d1fc0 100644
--- a/net/bridge/br_netlink.c
+++ b/net/bridge/br_netlink.c
@@ -223,6 +223,8 @@ static const struct nla_policy ifla_br_policy[IFLA_MAX+1] = {
[IFLA_BRIDGE_MODE] = { .type = NLA_U16 },
[IFLA_BRIDGE_VLAN_INFO] = { .type = NLA_BINARY,
.len = sizeof(struct bridge_vlan_info), },
+ [IFLA_BRIDGE_VLAN_RANGE_INFO] = { .type = NLA_BINARY,
+ .len = sizeof(struct bridge_vlan_range_info), },
};
static int br_afspec(struct net_bridge *br,
--
1.7.10.4
^ permalink raw reply related
* [PATCH 3/6] bridge: modify IFLA_AF_SPEC parser to parse IFLA_BRIDGE_VLAN_RANGE_INFO
From: roopa @ 2014-12-29 21:05 UTC (permalink / raw)
To: netdev, shemminger, vyasevic; +Cc: Roopa Prabhu, Wilson kok
From: Roopa Prabhu <roopa@cumulusnetworks.com>
This patch modifies br_afspec to parse incoming IFLA_BRIDGE_VLAN_RANGE_INFO
Signed-off-by: Wilson kok <wkok@cumulusnetworks.com>
Signed-off-by: Roopa Prabhu <roopa@cumulusnetworks.com>
---
net/bridge/br_netlink.c | 70 +++++++++++++++++++++++++++++++++--------------
1 file changed, 49 insertions(+), 21 deletions(-)
diff --git a/net/bridge/br_netlink.c b/net/bridge/br_netlink.c
index e7d1fc0..4c47ba0 100644
--- a/net/bridge/br_netlink.c
+++ b/net/bridge/br_netlink.c
@@ -227,48 +227,76 @@ static const struct nla_policy ifla_br_policy[IFLA_MAX+1] = {
.len = sizeof(struct bridge_vlan_range_info), },
};
+static int br_afspec_vlan_add(struct net_bridge *br,
+ struct net_bridge_port *p,
+ u16 vid, u16 flags)
+{
+ int err = 0;
+
+ if (p) {
+ err = nbp_vlan_add(p, vid, flags);
+ if (err)
+ return err;
+
+ if (flags & BRIDGE_VLAN_INFO_MASTER)
+ err = br_vlan_add(p->br, vid, flags);
+ } else {
+ err = br_vlan_add(br, vid, flags);
+ }
+
+ return err;
+}
+
+static void br_afspec_vlan_del(struct net_bridge *br,
+ struct net_bridge_port *p,
+ u16 vid, u16 flags)
+{
+ if (p) {
+ nbp_vlan_delete(p, vid);
+ if (flags & BRIDGE_VLAN_INFO_MASTER)
+ br_vlan_delete(p->br, vid);
+ } else {
+ br_vlan_delete(br, vid);
+ }
+}
+
static int br_afspec(struct net_bridge *br,
struct net_bridge_port *p,
struct nlattr *af_spec,
int cmd)
{
- struct bridge_vlan_info *vinfo;
- int err = 0;
+ struct bridge_vlan_range_info *vinfo;
struct nlattr *attr;
int err = 0;
int rem;
u16 vid;
nla_for_each_nested(attr, af_spec, rem) {
- if (nla_type(attr) != IFLA_BRIDGE_VLAN_INFO)
+ if (nla_type(attr) != IFLA_BRIDGE_VLAN_INFO &&
+ nla_type(attr) != IFLA_BRIDGE_VLAN_RANGE_INFO)
continue;
-
vinfo = nla_data(attr);
- if (!vinfo->vid || vinfo->vid >= VLAN_VID_MASK)
+
+ if (nla_type(attr) == IFLA_BRIDGE_VLAN_INFO)
+ vinfo->vid_end = vinfo->vid;
+
+ if (!vinfo->vid || vinfo->vid >= VLAN_VID_MASK ||
+ vinfo->vid_end >= VLAN_VID_MASK ||
+ vinfo->vid > vinfo->vid_end)
return -EINVAL;
switch (cmd) {
case RTM_SETLINK:
- if (p) {
- err = nbp_vlan_add(p, vinfo->vid, vinfo->flags);
+ for (vid = vinfo->vid; vid <= vinfo->vid_end; vid++) {
+ err = br_afspec_vlan_add(br, p, vid,
+ vinfo->flags);
if (err)
break;
-
- if (vinfo->flags & BRIDGE_VLAN_INFO_MASTER)
- err = br_vlan_add(p->br, vinfo->vid,
- vinfo->flags);
- } else
- err = br_vlan_add(br, vinfo->vid, vinfo->flags);
-
+ }
break;
-
case RTM_DELLINK:
- if (p) {
- nbp_vlan_delete(p, vinfo->vid);
- if (vinfo->flags & BRIDGE_VLAN_INFO_MASTER)
- br_vlan_delete(p->br, vinfo->vid);
- } else
- br_vlan_delete(br, vinfo->vid);
+ for (vid = vinfo->vid; vid <= vinfo->vid_end; vid++)
+ br_afspec_vlan_del(br, p, vid, vinfo->flags);
break;
}
}
--
1.7.10.4
^ permalink raw reply related
* [PATCH 1/6] bridge: add support to parse multiple vlan info attributes in IFLA_AF_SPEC
From: roopa @ 2014-12-29 21:05 UTC (permalink / raw)
To: netdev, shemminger, vyasevic; +Cc: Roopa Prabhu
From: Roopa Prabhu <roopa@cumulusnetworks.com>
This patch changes bridge IFLA_AF_SPEC netlink attribute parser to
look for more than one IFLA_BRIDGE_VLAN_INFO attribute. This allows
userspace to pack more than one vlan in the setlink msg.
Signed-off-by: Roopa Prabhu <roopa@cumulusnetworks.com>
---
net/bridge/br_netlink.c | 18 +++++++++---------
1 file changed, 9 insertions(+), 9 deletions(-)
diff --git a/net/bridge/br_netlink.c b/net/bridge/br_netlink.c
index 9f5eb55..75971b1 100644
--- a/net/bridge/br_netlink.c
+++ b/net/bridge/br_netlink.c
@@ -230,18 +230,18 @@ static int br_afspec(struct net_bridge *br,
struct nlattr *af_spec,
int cmd)
{
- struct nlattr *tb[IFLA_BRIDGE_MAX+1];
+ struct bridge_vlan_info *vinfo;
int err = 0;
+ struct nlattr *attr;
+ int err = 0;
+ int rem;
+ u16 vid;
- err = nla_parse_nested(tb, IFLA_BRIDGE_MAX, af_spec, ifla_br_policy);
- if (err)
- return err;
-
- if (tb[IFLA_BRIDGE_VLAN_INFO]) {
- struct bridge_vlan_info *vinfo;
-
- vinfo = nla_data(tb[IFLA_BRIDGE_VLAN_INFO]);
+ nla_for_each_nested(attr, af_spec, rem) {
+ if (nla_type(attr) != IFLA_BRIDGE_VLAN_INFO)
+ continue;
+ vinfo = nla_data(attr);
if (!vinfo->vid || vinfo->vid >= VLAN_VID_MASK)
return -EINVAL;
--
1.7.10.4
^ permalink raw reply related
* [PATCH 0/6] bridge: suport for vlan range and vlan add/del notifications
From: roopa @ 2014-12-29 21:05 UTC (permalink / raw)
To: netdev, shemminger, vyasevic; +Cc: Roopa Prabhu, Wilson Kok
From: Roopa Prabhu <roopa@cumulusnetworks.com>
This series adds new netlink attribute to represent vlan range.
Enables bridge link notify msgs to send vlan information.
Will post corresponding iproute2 patches if these get accepted.
Signed-off-by: Wilson Kok <wkok@cumulusnetworks.com>
Signed-off-by: Roopa Prabhu <roopa@cumulusnetworks.com>
Roopa Prabhu (6):
bridge: add support to parse multiple vlan info attributes in
IFLA_AF_SPEC
bridge: add new attribute IFLA_BRIDGE_VLAN_RANGE_INFO to represent
vlan range
bridge: modify IFLA_AF_SPEC parser to parse
IFLA_BRIDGE_VLAN_RANGE_INFO
rtnetlink: new filter RTEXT_FILTER_BRVLAN_COMPRESSED
bridge: new function to pack vlans using both IFLA_BRIDGE_VLAN_INFO
and IFLA_BRIDGE_VLAN_RANGE_INFO
bridge: add vlan info to bridge setlink and dellink notification
messages
include/uapi/linux/if_bridge.h | 7 ++
include/uapi/linux/rtnetlink.h | 1 +
net/bridge/br_netlink.c | 240 ++++++++++++++++++++++++++++++++--------
net/core/rtnetlink.c | 3 +-
4 files changed, 204 insertions(+), 47 deletions(-)
--
1.7.10.4
^ permalink raw reply
* [PATCH iproute2 v2] bridge/link: add learning_sync policy flag
From: sfeldma @ 2014-12-29 20:20 UTC (permalink / raw)
To: stephen, netdev, jiri, roopa
From: Scott Feldman <sfeldma@gmail.com>
v2:
Resending now that the dust has cleared in 3.18 on "self" vs. hwmode debate for
brport settings. learning_sync is now set/cleared using "self" qualifier on
brport.
v1:
Add 'learned_sync' flag to turn on/off syncing of learned MAC addresses from
offload device to bridge's FDB. Flag is be set/cleared on offload device port
using "self" qualifier:
$ sudo bridge link set dev swp1 learning_sync on self
$ bridge -d link show dev swp1
2: swp1 state UNKNOWN : <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master br0 state forwarding priority 32 cost 2
hairpin off guard off root_block off fastleave off learning off flood off
2: swp1 state UNKNOWN : <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master br0
learning on learning_sync on
Adds new IFLA_BRPORT_LEARNED_SYNCED attribute for IFLA_PROTINFO on the SELF
brport.
Signed-off-by: Scott Feldman <sfeldma@gmail.com>
---
bridge/link.c | 12 ++++++++++++
man/man8/bridge.8 | 6 ++++++
2 files changed, 18 insertions(+)
diff --git a/bridge/link.c b/bridge/link.c
index 3f77aab..c8555f8 100644
--- a/bridge/link.c
+++ b/bridge/link.c
@@ -188,6 +188,9 @@ int print_linkinfo(const struct sockaddr_nl *who,
if (prtb[IFLA_BRPORT_LEARNING])
print_onoff(fp, "learning",
rta_getattr_u8(prtb[IFLA_BRPORT_LEARNING]));
+ if (prtb[IFLA_BRPORT_LEARNING_SYNC])
+ print_onoff(fp, "learning_sync",
+ rta_getattr_u8(prtb[IFLA_BRPORT_LEARNING_SYNC]));
if (prtb[IFLA_BRPORT_UNICAST_FLOOD])
print_onoff(fp, "flood",
rta_getattr_u8(prtb[IFLA_BRPORT_UNICAST_FLOOD]));
@@ -221,6 +224,7 @@ static void usage(void)
fprintf(stderr, " [ fastleave {on | off} ]\n");
fprintf(stderr, " [ root_block {on | off} ]\n");
fprintf(stderr, " [ learning {on | off} ]\n");
+ fprintf(stderr, " [ learning_sync {on | off} ]\n");
fprintf(stderr, " [ flood {on | off} ]\n");
fprintf(stderr, " [ hwmode {vepa | veb} ]\n");
fprintf(stderr, " bridge link show [dev DEV]\n");
@@ -252,6 +256,7 @@ static int brlink_modify(int argc, char **argv)
} req;
char *d = NULL;
__s8 learning = -1;
+ __s8 learning_sync = -1;
__s8 flood = -1;
__s8 hairpin = -1;
__s8 bpdu_guard = -1;
@@ -295,6 +300,10 @@ static int brlink_modify(int argc, char **argv)
NEXT_ARG();
if (!on_off("learning", &learning, *argv))
exit(-1);
+ } else if (strcmp(*argv, "learning_sync") == 0) {
+ NEXT_ARG();
+ if (!on_off("learning_sync", &learning_sync, *argv))
+ exit(-1);
} else if (strcmp(*argv, "flood") == 0) {
NEXT_ARG();
if (!on_off("flood", &flood, *argv))
@@ -359,6 +368,9 @@ static int brlink_modify(int argc, char **argv)
addattr8(&req.n, sizeof(req), IFLA_BRPORT_UNICAST_FLOOD, flood);
if (learning >= 0)
addattr8(&req.n, sizeof(req), IFLA_BRPORT_LEARNING, learning);
+ if (learning_sync >= 0)
+ addattr8(&req.n, sizeof(req), IFLA_BRPORT_LEARNING_SYNC,
+ learning_sync);
if (cost > 0)
addattr32(&req.n, sizeof(req), IFLA_BRPORT_COST, cost);
diff --git a/man/man8/bridge.8 b/man/man8/bridge.8
index cb3fb46..e344db2 100644
--- a/man/man8/bridge.8
+++ b/man/man8/bridge.8
@@ -38,6 +38,7 @@ bridge \- show / manipulate bridge addresses and devices
.BR fastleave " { " on " | " off " } ] [ "
.BR root_block " { " on " | " off " } ] [ "
.BR learning " { " on " | " off " } ] [ "
+.BR learning_sync " { " on " | " off " } ] [ "
.BR flood " { " on " | " off " } ] [ "
.BR hwmode " { " vepa " | " veb " } ] "
@@ -263,6 +264,11 @@ not. If learning if off, the bridge will end up flooding any traffic for which
it has no FDB entry. By default this flag is on.
.TP
+.BR "learning_sync on " or " learning_sync off "
+Controls whether a given port will sync MAC addresses learned on device port to
+bridge FDB.
+
+.TP
.BR "flooding on " or " flooding off "
Controls whether a given port will flood unicast traffic for which there is no FDB entry. By default this flag is on.
--
1.7.10.4
^ permalink raw reply related
* Re: [PATCH] bonding: move ipoib_header_ops to vmlinux
From: David Miller @ 2014-12-29 18:36 UTC (permalink / raw)
To: wen.gang.wang-QHcLZuEGTsvQT0dZR+AlfA
Cc: netdev-u79uwXL29TY76Z2rM5mHXA, linux-rdma-u79uwXL29TY76Z2rM5mHXA
In-Reply-To: <54A0FEA4.1080302-QHcLZuEGTsvQT0dZR+AlfA@public.gmane.org>
From: Wengang <wen.gang.wang-QHcLZuEGTsvQT0dZR+AlfA@public.gmane.org>
Date: Mon, 29 Dec 2014 15:11:32 +0800
> So, what information else do you need?
I need a patch formally (re-)submitted.
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply
* Re: [PATCH] net: flow: Allow actions and matches to be NULL in net_flow_put_flow()
From: John Fastabend @ 2014-12-29 17:56 UTC (permalink / raw)
To: Simon Horman; +Cc: John Fastabend, netdev
In-Reply-To: <1419819602-23290-1-git-send-email-simon.horman@netronome.com>
On 12/28/2014 06:20 PM, Simon Horman wrote:
> This makes the handing of the absence of actions or matches
> symmetric with net_flow_get_flow().
>
> Signed-off-by: Simon Horman <simon.horman@netronome.com>
> ---
Again thanks I actually just hit this with my rocker implementation
so very timely fix. Same story here I'll roll it into the patch and
submit it later today.
.John
--
John Fastabend Intel Corporation
^ permalink raw reply
* Re: [PATCH] net: flow: Guard against accessing non-existent attributes
From: John Fastabend @ 2014-12-29 17:53 UTC (permalink / raw)
To: Simon Horman; +Cc: John Fastabend, netdev
In-Reply-To: <1419819455-19109-1-git-send-email-simon.horman@netronome.com>
On 12/28/2014 06:17 PM, Simon Horman wrote:
> Signed-off-by: Simon Horman <simon.horman@netronome.com>
> ---
> net/core/flow_table.c | 11 +++++++++++
> 1 file changed, 11 insertions(+)
Great thanks. I rolled it into the patches I should hopefully have
ready to submit later today.
By the way I got this working on rocker now so we can test it easier,
I'll post the driver updates as well.
.John
--
John Fastabend Intel Corporation
^ permalink raw reply
* Re: [PATCH net-next] net: stmmac: add BQL support
From: Dave Taht @ 2014-12-29 17:42 UTC (permalink / raw)
To: Beniamino Galvani
Cc: Giuseppe Cavallaro, netdev@vger.kernel.org,
linux-kernel@vger.kernel.org
In-Reply-To: <20141228214059.GA25570@gmail.com>
On Sun, Dec 28, 2014 at 1:48 PM, Beniamino Galvani <b.galvani@gmail.com> wrote:
> On Sun, Dec 28, 2014 at 08:25:40AM -0800, Dave Taht wrote:
>> On Sun, Dec 28, 2014 at 6:57 AM, Beniamino Galvani <b.galvani@gmail.com> wrote:
>> > Add support for Byte Queue Limits to the STMicro MAC driver.
>>
>> Thank you!
>>
>> > Tested on a Amlogic S805 Cortex-A5 board, where the use of BQL
>> > slightly decreases the ping latency from ~10ms to ~3ms when the
>> > 100Mbps link is saturated by TCP streams. No difference is
>> > observed at 1Gbps.
>>
>> I see the plural. With TSQ in place it is hard (without something like
>> the rrul test driving multiple streams) to drive a driver to
>> saturation with small numbers of flows. This was with pfifo_fast, not
>> sch_fq, at 100mbit?
>
> Hi Dave,
>
> yes, this was with pfifo_fast and I used 4 iperf TCP streams. The total
> throughput didn't seem to increase adding more streams.
>>
>> Can this board actually drive a full gigabit in the first place? Until
>> now most of the low end arm boards I have seen only came with
>> a 100mbit mac, and the gig ones lacking offloads seemed to peak
>> out at about 600mbit.
>
> I measured a throughput of 650mbit in rx and 600mbit in tx.
You might want to try the rrul test which tests both directions and
latency at the same time.
In my case I have been trying to find a low-cost chip that could do soft
rate limiting (htb) + fq_codel at up to 300mbit/sec, as that is about
the peak speed
we will be getting from cable modems, and these are horribly overbuffered,
at these speeds too, with 1.2sec of bidirectional latency observed at
120mbit/12mbit.
I'm open to crazy ideas like trying to find a use for the gpu, etc, to
get there.
>
>>
>> Under my christmas tree landed a quad core A5 (odroid-c1), also an
>> xgene and zedboard - both of the latter are a-needing BQL,
>> and I haven't booted the udroid yet. Hopefully it is the
>> same driver you just improved.
>
> I'm using the odroid-c1 too, with this tree based on the recent
> Amlogic mainline work:
>
> https://github.com/bengal/linux/tree/meson8b
Oh, cool, thx!
> Unfortunately at the moment the support for the board is very basic
> (for example, SMP is not working yet) but it's enough to do some NIC
> tests.
Good to know. Have you looked at xmit_more yet?
http://lwn.net/Articles/615238/
> Beniamino
--
Dave Täht
http://www.bufferbloat.net/projects/bloat/wiki/Upcoming_Talks
^ permalink raw reply
* Re: am335x: cpsw: interrupt failure
From: Felipe Balbi @ 2014-12-29 17:13 UTC (permalink / raw)
To: Tony Lindgren
Cc: Felipe Balbi, Yegor Yefremov, netdev, N, Mugunthan V,
linux-omap@vger.kernel.org
In-Reply-To: <20141229165103.GB2411@atomide.com>
[-- Attachment #1: Type: text/plain, Size: 2881 bytes --]
On Mon, Dec 29, 2014 at 08:51:04AM -0800, Tony Lindgren wrote:
> * Felipe Balbi <balbi@ti.com> [141229 07:53]:
> > On Mon, Dec 29, 2014 at 10:33:26AM +0100, Yegor Yefremov wrote:
> > > On Fri, Dec 12, 2014 at 8:19 PM, Yegor Yefremov
> > > <yegorslists@googlemail.com> wrote:
> > > > On Fri, Dec 12, 2014 at 6:32 PM, Felipe Balbi <balbi@ti.com> wrote:
> > > >> Hi,
> > > >>
> > > >> On Fri, Dec 12, 2014 at 01:00:51PM +0100, Yegor Yefremov wrote:
> > > >>> U-Boot version: 2014.07
> > > >>> Kernel config is omap2plus with enabled USB
> > > >>>
> > > >>> # cat /proc/version
> > > >>> Linux version 3.18.0 (user@user-VirtualBox) (gcc version 4.8.3
> > > >>> 20140320 (prerelease) (Sourcery CodeBench Lite 2014.05-29) ) #6 SMP
> > > >>> Mon Dec 8 22:47:43 CET 2014
> > > >>
> > > >> Wasn't GCC 4.8.x total crap for building ARM kernels ? IIRC it was even
> > > >> blacklisted. Can you try with 4.9.x just to make sure ?
> > > >
> > > > Will do.
> > >
> > > Adding linux-omap. Beginning of this discussion:
> > > http://comments.gmane.org/gmane.linux.network/341427
> > >
> > > Quick summary: starting with kernel 3.18 or commit
> > > 55601c9f24670ba926ebdd4d712ac3b177232330 am335x (at least BBB and some
> > > custom boards) stalls at high network load. Reproducible via nuttcp
> > > within some minutes
> > >
> > > nuttcp -S (on BBB)
> > > nuttcp -t -N 4 -T30m 192.168.1.235 (on host)
> > >
> > > As Felipe Balbi suggested, I tried both 4.8.3 and 4.9.2 toolchains,
> > > but both show the same behavior.
> > >
> > > Linux version 3.18.0 (user@user-VirtualBox) (gcc version 4.8.3
> > > 20140320 (prerelease) (Sourcery CodeBench Lite 2014.05-29) ) #6 SMP
> > > Mon Dec 8 22:47:43 CET 2014
> > > Linux version 3.18.1 (user@user-VirtualBox) (gcc version 4.9.2
> > > (Buildroot 2015.02-git-00582-g10b9761) ) #1 SMP Mon Dec 29 09:22:29
> > > CET 2014
> > >
> > > Let me know, if you can reproduce this issue.
> >
> > finally managed to reproduce this, it took quite a bit of effort though.
> > I'll see if I can gether more information about the problem.
>
> Maybe check if the irqnr is 127 (or the last reserved interrupt)
> in irq-omap-intc.c. If so, also print out the previous interrupt.
> It seems the intc uses the last reserved interrupt to signal a
> spurious interrupt for the previous irqnr, so we should probably
> add some handling for that.
>
> If the previous interrupt is a cpsw interrupt, then there's probably
> something wrong with cpsw interrupt handling. Either a missing
> read-back to flush posted write in the cpsw interrupt handler,
> or the EOI registers are written at a wrong time.
yeah, I'll go over it, but I first need to reproduce it again. Just
rebooted to try again and after half an hour, couldn't reproduce it
anymore. Interesting race to end the year :-)
cheers
--
balbi
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 819 bytes --]
^ permalink raw reply
* [PATCH 8/8] ath10k: fix error return code
From: Julia Lawall @ 2014-12-29 17:04 UTC (permalink / raw)
To: Kalle Valo; +Cc: kernel-janitors, ath10k, linux-wireless, netdev, linux-kernel
In-Reply-To: <1419872683-32709-1-git-send-email-Julia.Lawall@lip6.fr>
Return a negative error code on failure.
A simplified version of the semantic match that finds this problem is as
follows: (http://coccinelle.lip6.fr/)
// <smpl>
@@
identifier ret; expression e1,e2;
@@
(
if (\(ret < 0\|ret != 0\))
{ ... return ret; }
|
ret = 0
)
... when != ret = e1
when != &ret
*if(...)
{
... when != ret = e2
when forall
return ret;
}
// </smpl>
Signed-off-by: Julia Lawall <Julia.Lawall@lip6.fr>
---
drivers/net/wireless/ath/ath10k/htt_tx.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/drivers/net/wireless/ath/ath10k/htt_tx.c b/drivers/net/wireless/ath/ath10k/htt_tx.c
index 4bc51d8..2836f4c 100644
--- a/drivers/net/wireless/ath/ath10k/htt_tx.c
+++ b/drivers/net/wireless/ath/ath10k/htt_tx.c
@@ -480,8 +480,10 @@ int ath10k_htt_tx(struct ath10k_htt *htt, struct sk_buff *msdu)
skb_cb->htt.txbuf = dma_pool_alloc(htt->tx_pool, GFP_ATOMIC,
&paddr);
- if (!skb_cb->htt.txbuf)
+ if (!skb_cb->htt.txbuf) {
+ res = -ENOMEM;
goto err_free_msdu_id;
+ }
skb_cb->htt.txbuf_paddr = paddr;
skb_cb->paddr = dma_map_single(dev, msdu->data, msdu->len,
^ permalink raw reply related
* [PATCH 7/8] net: axienet: fix error return code
From: Julia Lawall @ 2014-12-29 17:04 UTC (permalink / raw)
To: Anirudha Sarangi
Cc: kernel-janitors, John Linn, Michal Simek, Sören Brinkmann,
netdev, linux-arm-kernel, linux-kernel
In-Reply-To: <1419872683-32709-1-git-send-email-Julia.Lawall@lip6.fr>
Return a negative error code on failure.
A simplified version of the semantic match that finds this problem is as
follows: (http://coccinelle.lip6.fr/)
// <smpl>
@@
identifier ret; expression e1,e2;
@@
(
if (\(ret < 0\|ret != 0\))
{ ... return ret; }
|
ret = 0
)
... when != ret = e1
when != &ret
*if(...)
{
... when != ret = e2
when forall
return ret;
}
// </smpl>
Signed-off-by: Julia Lawall <Julia.Lawall@lip6.fr>
---
drivers/net/ethernet/xilinx/xilinx_axienet_main.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/drivers/net/ethernet/xilinx/xilinx_axienet_main.c b/drivers/net/ethernet/xilinx/xilinx_axienet_main.c
index 4ea2d4e..6ca4a52 100644
--- a/drivers/net/ethernet/xilinx/xilinx_axienet_main.c
+++ b/drivers/net/ethernet/xilinx/xilinx_axienet_main.c
@@ -1501,6 +1501,7 @@ static int axienet_of_probe(struct platform_device *op)
lp->regs = of_iomap(op->dev.of_node, 0);
if (!lp->regs) {
dev_err(&op->dev, "could not map Axi Ethernet regs.\n");
+ ret = -ENOMEM;
goto nodev;
}
/* Setup checksum offload, but default to off if not specified */
@@ -1567,6 +1568,7 @@ static int axienet_of_probe(struct platform_device *op)
np = of_parse_phandle(op->dev.of_node, "axistream-connected", 0);
if (!np) {
dev_err(&op->dev, "could not find DMA node\n");
+ ret = -ENODEV;
goto err_iounmap;
}
lp->dma_regs = of_iomap(np, 0);
^ permalink raw reply related
* [PATCH 6/8] adm8211: fix error return code
From: Julia Lawall @ 2014-12-29 17:04 UTC (permalink / raw)
To: Kalle Valo; +Cc: kernel-janitors, linux-wireless, netdev, linux-kernel
In-Reply-To: <1419872683-32709-1-git-send-email-Julia.Lawall@lip6.fr>
Return a negative error code on failure.
A simplified version of the semantic match that finds this problem is as
follows: (http://coccinelle.lip6.fr/)
// <smpl>
@@
identifier ret; expression e1,e2;
@@
(
if (\(ret < 0\|ret != 0\))
{ ... return ret; }
|
ret = 0
)
... when != ret = e1
when != &ret
*if(...)
{
... when != ret = e2
when forall
return ret;
}
// </smpl>
Signed-off-by: Julia Lawall <Julia.Lawall@lip6.fr>
---
drivers/net/wireless/adm8211.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/drivers/net/wireless/adm8211.c b/drivers/net/wireless/adm8211.c
index 17fcaab..f07a618 100644
--- a/drivers/net/wireless/adm8211.c
+++ b/drivers/net/wireless/adm8211.c
@@ -1837,6 +1837,7 @@ static int adm8211_probe(struct pci_dev *pdev,
if (!priv->map) {
printk(KERN_ERR "%s (adm8211): Cannot map device memory\n",
pci_name(pdev));
+ err = -ENOMEM;
goto err_free_dev;
}
^ permalink raw reply related
* [PATCH 5/8] net: sun4i-emac: fix error return code
From: Julia Lawall @ 2014-12-29 17:04 UTC (permalink / raw)
To: Maxime Ripard; +Cc: kernel-janitors, netdev, linux-arm-kernel, linux-kernel
In-Reply-To: <1419872683-32709-1-git-send-email-Julia.Lawall@lip6.fr>
Return a negative error code on failure.
A simplified version of the semantic match that finds this problem is as
follows: (http://coccinelle.lip6.fr/)
// <smpl>
@@
identifier ret; expression e1,e2;
@@
(
if (\(ret < 0\|ret != 0\))
{ ... return ret; }
|
ret = 0
)
... when != ret = e1
when != &ret
*if(...)
{
... when != ret = e2
when forall
return ret;
}
// </smpl>
Signed-off-by: Julia Lawall <Julia.Lawall@lip6.fr>
---
drivers/net/ethernet/allwinner/sun4i-emac.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/drivers/net/ethernet/allwinner/sun4i-emac.c b/drivers/net/ethernet/allwinner/sun4i-emac.c
index 1fcd556..cfdf7de 100644
--- a/drivers/net/ethernet/allwinner/sun4i-emac.c
+++ b/drivers/net/ethernet/allwinner/sun4i-emac.c
@@ -850,8 +850,10 @@ static int emac_probe(struct platform_device *pdev)
}
db->clk = devm_clk_get(&pdev->dev, NULL);
- if (IS_ERR(db->clk))
+ if (IS_ERR(db->clk)) {
+ ret = PTR_ERR(db->clk);
goto out;
+ }
clk_prepare_enable(db->clk);
^ permalink raw reply related
* [PATCH 2/8] myri10ge: fix error return code
From: Julia Lawall @ 2014-12-29 17:04 UTC (permalink / raw)
To: Hyong-Youb Kim; +Cc: kernel-janitors, netdev, linux-kernel
In-Reply-To: <1419872683-32709-1-git-send-email-Julia.Lawall@lip6.fr>
Return a negative error code on failure.
A simplified version of the semantic match that finds this problem is as
follows: (http://coccinelle.lip6.fr/)
// <smpl>
@@
identifier ret; expression e1,e2;
@@
(
if (\(ret < 0\|ret != 0\))
{ ... return ret; }
|
ret = 0
)
... when != ret = e1
when != &ret
*if(...)
{
... when != ret = e2
when forall
return ret;
}
// </smpl>
The patch also modifies the test of mgp->cmd to satisfy checkpatch.
Signed-off-by: Julia Lawall <Julia.Lawall@lip6.fr>
---
drivers/net/ethernet/myricom/myri10ge/myri10ge.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/drivers/net/ethernet/myricom/myri10ge/myri10ge.c b/drivers/net/ethernet/myricom/myri10ge/myri10ge.c
index af09905..71af98b 100644
--- a/drivers/net/ethernet/myricom/myri10ge/myri10ge.c
+++ b/drivers/net/ethernet/myricom/myri10ge/myri10ge.c
@@ -4033,8 +4033,10 @@ static int myri10ge_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
(void)pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64));
mgp->cmd = dma_alloc_coherent(&pdev->dev, sizeof(*mgp->cmd),
&mgp->cmd_bus, GFP_KERNEL);
- if (mgp->cmd == NULL)
+ if (!mgp->cmd) {
+ status = -ENOMEM;
goto abort_with_enabled;
+ }
mgp->board_span = pci_resource_len(pdev, 0);
mgp->iomem_base = pci_resource_start(pdev, 0);
^ permalink raw reply related
* [PATCH 1/8] net: Xilinx: fix error return code
From: Julia Lawall @ 2014-12-29 17:04 UTC (permalink / raw)
To: Michal Simek
Cc: kernel-janitors, Sören Brinkmann, netdev, linux-arm-kernel,
linux-kernel
In-Reply-To: <1419872683-32709-1-git-send-email-Julia.Lawall@lip6.fr>
Return a negative error code on failure.
A simplified version of the semantic match that finds this problem is as
follows: (http://coccinelle.lip6.fr/)
// <smpl>
@@
identifier ret; expression e1,e2;
@@
(
if (\(ret < 0\|ret != 0\))
{ ... return ret; }
|
ret = 0
)
... when != ret = e1
when != &ret
*if(...)
{
... when != ret = e2
when forall
return ret;
}
// </smpl>
Signed-off-by: Julia Lawall <Julia.Lawall@lip6.fr>
---
drivers/net/ethernet/xilinx/ll_temac_main.c | 2 ++
drivers/net/ethernet/xilinx/xilinx_emaclite.c | 1 +
2 files changed, 3 insertions(+)
diff --git a/drivers/net/ethernet/xilinx/ll_temac_main.c b/drivers/net/ethernet/xilinx/ll_temac_main.c
index 9c2d91e..dbcbf0c 100644
--- a/drivers/net/ethernet/xilinx/ll_temac_main.c
+++ b/drivers/net/ethernet/xilinx/ll_temac_main.c
@@ -1043,6 +1043,7 @@ static int temac_of_probe(struct platform_device *op)
lp->regs = of_iomap(op->dev.of_node, 0);
if (!lp->regs) {
dev_err(&op->dev, "could not map temac regs.\n");
+ rc = -ENOMEM;
goto nodev;
}
@@ -1062,6 +1063,7 @@ static int temac_of_probe(struct platform_device *op)
np = of_parse_phandle(op->dev.of_node, "llink-connected", 0);
if (!np) {
dev_err(&op->dev, "could not find DMA node\n");
+ rc = -ENODEV;
goto err_iounmap;
}
diff --git a/drivers/net/ethernet/xilinx/xilinx_emaclite.c b/drivers/net/ethernet/xilinx/xilinx_emaclite.c
index 2485879..9d4ce38 100644
--- a/drivers/net/ethernet/xilinx/xilinx_emaclite.c
+++ b/drivers/net/ethernet/xilinx/xilinx_emaclite.c
@@ -1109,6 +1109,7 @@ static int xemaclite_of_probe(struct platform_device *ofdev)
res = platform_get_resource(ofdev, IORESOURCE_IRQ, 0);
if (!res) {
dev_err(dev, "no IRQ found\n");
+ rc = -ENXIO;
goto error;
}
^ permalink raw reply related
* [PATCH 0/8] fix error return code
From: Julia Lawall @ 2014-12-29 17:04 UTC (permalink / raw)
To: linux-arm-kernel
Cc: kernel-janitors, netdev, Sören Brinkmann, linux-kernel,
dri-devel, linux-wireless, ath10k
The complate semantic patch that finds this problem is as follows:
(http://coccinelle.lip6.fr/)
// <smpl>
@ok exists@
identifier f,ret,i;
expression e;
constant c;
@@
// identify a function that returns a negative return value at least once.
f(...) {
... when any
(
return -c@i;
|
ret = -c@i;
... when != ret = e
return ret;
|
if (ret < 0) { ... return ret; }
)
... when any
}
@r exists@
identifier ret,ok.f,fn;
expression e1,e2,e3,e4,e5,e6,x;
statement S,S1;
position p1,p2,p3;
@@
// identify a case where the return variable is set to a non-negative value
// and then returned in error-handling code
f(...) {
... when any
(
if@p1 (\(ret < 0\|ret != 0\))
{ ... return ret; }
|
ret@p1 = 0
)
... when != \(ret = e1\|ret++\|ret--\|ret+=e1\|ret-=e1\)
when != &ret
when any
(
if (<+... ret = e5 ...+>) S1
|
if (<+... &ret ...+>) S1
|
if@p2(<+...x = fn(...)...+>)
{
... when != ret = e6
when forall
return@p3 ret;
}
|
break;
|
x = fn(...)
... when != \(ret = e4\|ret++\|ret--\|ret+=e4\|ret-=e4\)
when != &ret
(
if (<+... ret = e3 ...+>) S
|
if (<+... &ret ...+>) S
|
if@p2(<+...\(x != 0\|x < 0\|x == NULL\|IS_ERR(x)\)...+>)
{
... when != ret = e2
when forall
return@p3 ret;
}
)
)
... when any
}
@printer depends on r@
position p;
identifier ok.f,pr;
constant char [] c;
@@
f(...) { <...pr@p(...,c,...)...> }
@bad0 exists@
identifier r.ret,ok.f,g != {ERR_PTR,IS_ERR};
position p != printer.p;
@@
f(...) { ... when any
g@p(...,ret,...)
... when any
}
@bad depends on !bad0 exists@
position r.p1,r.p2;
statement S1,S2;
identifier r.ret;
expression e1;
@@
// ignore the above if there is some path where the variable is set to
// something else
(
if@p1 (\(ret < 0\|ret != 0\)) S1
|
ret@p1 = 0
)
... when any
\(ret = e1\|ret++\|ret--\|ret+=e1\|ret-=e1\|&ret\)
... when any
if@p2(...) S2
@bad1 depends on !bad0 && !bad exists@
position r.p2;
statement S2;
identifier r.ret;
expression e1;
constant c;
@@
ret = -c
... when != \(ret = e1\|ret++\|ret--\|ret+=e1\|ret-=e1\)
when != &ret
when any
if@p2(...) S2
@bad2 depends on !bad0 && !bad && !bad1 exists@
position r.p1,r.p2;
identifier r.ret;
expression e1;
statement S2;
constant c;
@@
// likewise ignore it if there has been an intervening return
ret@p1 = 0
... when != if (...) { ... ret = e1 ... return ret; }
when != if (...) { ... return -c; }
when any
if@p2(...) S2
@script:python depends on !bad0 && !bad && !bad1 && !bad2@
p1 << r.p1;
p2 << r.p2;
p3 << r.p3;
@@
cocci.print_main("",p1)
cocci.print_secs("",p2)
cocci.print_secs("",p3)
// </smpl>
^ permalink raw reply
* Re: am335x: cpsw: interrupt failure
From: Tony Lindgren @ 2014-12-29 16:51 UTC (permalink / raw)
To: Felipe Balbi
Cc: Yegor Yefremov, netdev, N, Mugunthan V,
linux-omap@vger.kernel.org
In-Reply-To: <20141229155029.GA29379@saruman>
* Felipe Balbi <balbi@ti.com> [141229 07:53]:
> On Mon, Dec 29, 2014 at 10:33:26AM +0100, Yegor Yefremov wrote:
> > On Fri, Dec 12, 2014 at 8:19 PM, Yegor Yefremov
> > <yegorslists@googlemail.com> wrote:
> > > On Fri, Dec 12, 2014 at 6:32 PM, Felipe Balbi <balbi@ti.com> wrote:
> > >> Hi,
> > >>
> > >> On Fri, Dec 12, 2014 at 01:00:51PM +0100, Yegor Yefremov wrote:
> > >>> U-Boot version: 2014.07
> > >>> Kernel config is omap2plus with enabled USB
> > >>>
> > >>> # cat /proc/version
> > >>> Linux version 3.18.0 (user@user-VirtualBox) (gcc version 4.8.3
> > >>> 20140320 (prerelease) (Sourcery CodeBench Lite 2014.05-29) ) #6 SMP
> > >>> Mon Dec 8 22:47:43 CET 2014
> > >>
> > >> Wasn't GCC 4.8.x total crap for building ARM kernels ? IIRC it was even
> > >> blacklisted. Can you try with 4.9.x just to make sure ?
> > >
> > > Will do.
> >
> > Adding linux-omap. Beginning of this discussion:
> > http://comments.gmane.org/gmane.linux.network/341427
> >
> > Quick summary: starting with kernel 3.18 or commit
> > 55601c9f24670ba926ebdd4d712ac3b177232330 am335x (at least BBB and some
> > custom boards) stalls at high network load. Reproducible via nuttcp
> > within some minutes
> >
> > nuttcp -S (on BBB)
> > nuttcp -t -N 4 -T30m 192.168.1.235 (on host)
> >
> > As Felipe Balbi suggested, I tried both 4.8.3 and 4.9.2 toolchains,
> > but both show the same behavior.
> >
> > Linux version 3.18.0 (user@user-VirtualBox) (gcc version 4.8.3
> > 20140320 (prerelease) (Sourcery CodeBench Lite 2014.05-29) ) #6 SMP
> > Mon Dec 8 22:47:43 CET 2014
> > Linux version 3.18.1 (user@user-VirtualBox) (gcc version 4.9.2
> > (Buildroot 2015.02-git-00582-g10b9761) ) #1 SMP Mon Dec 29 09:22:29
> > CET 2014
> >
> > Let me know, if you can reproduce this issue.
>
> finally managed to reproduce this, it took quite a bit of effort though.
> I'll see if I can gether more information about the problem.
Maybe check if the irqnr is 127 (or the last reserved interrupt)
in irq-omap-intc.c. If so, also print out the previous interrupt.
It seems the intc uses the last reserved interrupt to signal a
spurious interrupt for the previous irqnr, so we should probably
add some handling for that.
If the previous interrupt is a cpsw interrupt, then there's probably
something wrong with cpsw interrupt handling. Either a missing
read-back to flush posted write in the cpsw interrupt handler,
or the EOI registers are written at a wrong time.
Regards,
Tony
^ permalink raw reply
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