All of lore.kernel.org
 help / color / mirror / Atom feed
* [bug report] nfp: flower: tunnel neigh support bond offload
@ 2023-01-17 14:18 Dan Carpenter
  0 siblings, 0 replies; only message in thread
From: Dan Carpenter @ 2023-01-17 14:18 UTC (permalink / raw)
  To: yanguo.li; +Cc: oss-drivers, kernel-janitors

Hello Yanguo Li,

The patch abc210952af7: "nfp: flower: tunnel neigh support bond
offload" from Oct 20, 2022, leads to the following Smatch static
checker warning:

	drivers/net/ethernet/netronome/nfp/flower/tunnel_conf.c:518 nfp_tun_write_neigh()
	warn: sleeping in atomic context

drivers/net/ethernet/netronome/nfp/flower/tunnel_conf.c
    453 static void
    454 nfp_tun_write_neigh(struct net_device *netdev, struct nfp_app *app,
    455                     void *flow, struct neighbour *neigh, bool is_ipv6,
    456                     bool override)
    457 {
    458         bool neigh_invalid = !(neigh->nud_state & NUD_VALID) || neigh->dead;
    459         size_t neigh_size = is_ipv6 ? sizeof(struct nfp_tun_neigh_v6) :
    460                             sizeof(struct nfp_tun_neigh_v4);
    461         unsigned long cookie = (unsigned long)neigh;
    462         struct nfp_flower_priv *priv = app->priv;
    463         struct nfp_neigh_entry *nn_entry;
    464         u32 port_id;
    465         u8 mtype;
    466 
    467         port_id = nfp_flower_get_port_id_from_netdev(app, netdev);
    468         if (!port_id)
    469                 return;
    470 
    471         spin_lock_bh(&priv->predt_lock);
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Holding a spin lock.

    472         nn_entry = rhashtable_lookup_fast(&priv->neigh_table, &cookie,
    473                                           neigh_table_params);
    474         if (!nn_entry && !neigh_invalid) {
    475                 struct nfp_tun_neigh_ext *ext;
    476                 struct nfp_tun_neigh_lag *lag;
    477                 struct nfp_tun_neigh *common;
    478 
    479                 nn_entry = kzalloc(sizeof(*nn_entry) + neigh_size,
    480                                    GFP_ATOMIC);
    481                 if (!nn_entry)
    482                         goto err;
    483 
    484                 nn_entry->payload = (char *)&nn_entry[1];
    485                 nn_entry->neigh_cookie = cookie;
    486                 nn_entry->is_ipv6 = is_ipv6;
    487                 nn_entry->flow = NULL;
    488                 if (is_ipv6) {
    489                         struct flowi6 *flowi6 = (struct flowi6 *)flow;
    490                         struct nfp_tun_neigh_v6 *payload;
    491 
    492                         payload = (struct nfp_tun_neigh_v6 *)nn_entry->payload;
    493                         payload->src_ipv6 = flowi6->saddr;
    494                         payload->dst_ipv6 = flowi6->daddr;
    495                         common = &payload->common;
    496                         ext = &payload->ext;
    497                         lag = &payload->lag;
    498                         mtype = NFP_FLOWER_CMSG_TYPE_TUN_NEIGH_V6;
    499                 } else {
    500                         struct flowi4 *flowi4 = (struct flowi4 *)flow;
    501                         struct nfp_tun_neigh_v4 *payload;
    502 
    503                         payload = (struct nfp_tun_neigh_v4 *)nn_entry->payload;
    504                         payload->src_ipv4 = flowi4->saddr;
    505                         payload->dst_ipv4 = flowi4->daddr;
    506                         common = &payload->common;
    507                         ext = &payload->ext;
    508                         lag = &payload->lag;
    509                         mtype = NFP_FLOWER_CMSG_TYPE_TUN_NEIGH;
    510                 }
    511                 ext->host_ctx = cpu_to_be32(U32_MAX);
    512                 ext->vlan_tpid = cpu_to_be16(U16_MAX);
    513                 ext->vlan_tci = cpu_to_be16(U16_MAX);
    514                 ether_addr_copy(common->src_addr, netdev->dev_addr);
    515                 neigh_ha_snapshot(common->dst_addr, neigh, netdev);
    516 
    517                 if ((port_id & NFP_FL_LAG_OUT) == NFP_FL_LAG_OUT)
--> 518                         nfp_flower_lag_get_info_from_netdev(app, netdev, lag);
                                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Calling a sleeping function.  (Takes a mutext).

    519                 common->port_id = cpu_to_be32(port_id);
    520 
    521                 if (rhashtable_insert_fast(&priv->neigh_table,
    522                                            &nn_entry->ht_node,
    523                                            neigh_table_params))
    524                         goto err;
    525 
    526                 nfp_tun_link_predt_entries(app, nn_entry);
    527                 nfp_flower_xmit_tun_conf(app, mtype, neigh_size,
    528                                          nn_entry->payload,
    529                                          GFP_ATOMIC);
    530         } else if (nn_entry && neigh_invalid) {
    531                 if (is_ipv6) {
    532                         struct flowi6 *flowi6 = (struct flowi6 *)flow;
    533                         struct nfp_tun_neigh_v6 *payload;
    534 
    535                         payload = (struct nfp_tun_neigh_v6 *)nn_entry->payload;
    536                         memset(payload, 0, sizeof(struct nfp_tun_neigh_v6));
    537                         payload->dst_ipv6 = flowi6->daddr;
    538                         mtype = NFP_FLOWER_CMSG_TYPE_TUN_NEIGH_V6;
    539                 } else {
    540                         struct flowi4 *flowi4 = (struct flowi4 *)flow;
    541                         struct nfp_tun_neigh_v4 *payload;
    542 
    543                         payload = (struct nfp_tun_neigh_v4 *)nn_entry->payload;
    544                         memset(payload, 0, sizeof(struct nfp_tun_neigh_v4));
    545                         payload->dst_ipv4 = flowi4->daddr;
    546                         mtype = NFP_FLOWER_CMSG_TYPE_TUN_NEIGH;
    547                 }
    548                 /* Trigger ARP to verify invalid neighbour state. */
    549                 neigh_event_send(neigh, NULL);
    550                 rhashtable_remove_fast(&priv->neigh_table,
    551                                        &nn_entry->ht_node,
    552                                        neigh_table_params);
    553 
    554                 nfp_flower_xmit_tun_conf(app, mtype, neigh_size,
    555                                          nn_entry->payload,
    556                                          GFP_ATOMIC);
    557 
    558                 if (nn_entry->flow)
    559                         list_del(&nn_entry->list_head);
    560                 kfree(nn_entry);
    561         } else if (nn_entry && !neigh_invalid) {
    562                 struct nfp_tun_neigh *common;
    563                 u8 dst_addr[ETH_ALEN];
    564                 bool is_mac_change;
    565 
    566                 if (is_ipv6) {
    567                         struct nfp_tun_neigh_v6 *payload;
    568 
    569                         payload = (struct nfp_tun_neigh_v6 *)nn_entry->payload;
    570                         common = &payload->common;
    571                         mtype = NFP_FLOWER_CMSG_TYPE_TUN_NEIGH_V6;
    572                 } else {
    573                         struct nfp_tun_neigh_v4 *payload;
    574 
    575                         payload = (struct nfp_tun_neigh_v4 *)nn_entry->payload;
    576                         common = &payload->common;
    577                         mtype = NFP_FLOWER_CMSG_TYPE_TUN_NEIGH;
    578                 }
    579 
    580                 ether_addr_copy(dst_addr, common->dst_addr);
    581                 neigh_ha_snapshot(common->dst_addr, neigh, netdev);
    582                 is_mac_change = !ether_addr_equal(dst_addr, common->dst_addr);
    583                 if (override || is_mac_change) {
    584                         if (is_mac_change && nn_entry->flow) {
    585                                 list_del(&nn_entry->list_head);
    586                                 nn_entry->flow = NULL;
    587                         }
    588                         nfp_tun_link_predt_entries(app, nn_entry);
    589                         nfp_flower_xmit_tun_conf(app, mtype, neigh_size,
    590                                                  nn_entry->payload,
    591                                                  GFP_ATOMIC);
    592                 }
    593         }
    594 
    595         spin_unlock_bh(&priv->predt_lock);
    596         return;
    597 
    598 err:
    599         kfree(nn_entry);
    600         spin_unlock_bh(&priv->predt_lock);
    601         nfp_flower_cmsg_warn(app, "Neighbour configuration failed.\n");
    602 }

regards,
dan carpenter

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2023-01-17 14:18 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-01-17 14:18 [bug report] nfp: flower: tunnel neigh support bond offload Dan Carpenter

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.