[bug report] net: lan966x: add support for interrupts from analyzer

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hello Horatiu Vultur,

The patch 5ccd66e01cbe: "net: lan966x: add support for interrupts
from analyzer" from Dec 18, 2021, leads to the following Smatch
static checker warning:

	drivers/net/ethernet/microchip/lan966x/lan966x_mac.c:43 lan966x_mac_wait_for_completion()
	warn: sleeping in atomic context

The call tree is:

lan966x_mac_del_entry() <- disables preempt
lan966x_mac_purge_entries() <- disables preempt
-> lan966x_mac_forget()
   -> lan966x_mac_wait_for_completion()

drivers/net/ethernet/microchip/lan966x/lan966x_mac.c
   261        int lan966x_mac_del_entry(struct lan966x *lan966x, const unsigned char *addr,
   262                                  u16 vid)
   263        {
   264                struct lan966x_mac_entry *mac_entry, *tmp;
   265
   266                spin_lock(&lan966x->mac_lock);
                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Take a spin locks

   267                list_for_each_entry_safe(mac_entry, tmp, &lan966x->mac_entries,
   268                                         list) {
   269                        if (mac_entry->vid == vid &&
   270                            ether_addr_equal(addr, mac_entry->mac)) {
   271                                lan966x_mac_forget(lan966x, mac_entry->mac, mac_entry->vid,
                                      ^^^^^^^^^^^^^^^^^^
Calls function which can sleep

   272                                                   ENTRYTYPE_LOCKED);
   273
   274                                list_del(&mac_entry->list);
   275                                kfree(mac_entry);
   276                        }
   277                }
   278                spin_unlock(&lan966x->mac_lock);
   279
   280                return 0;
   281        }
   282
   283        void lan966x_mac_purge_entries(struct lan966x *lan966x)
   284        {
   285                struct lan966x_mac_entry *mac_entry, *tmp;
   286
   287                spin_lock(&lan966x->mac_lock);
   288                list_for_each_entry_safe(mac_entry, tmp, &lan966x->mac_entries,
   289                                         list) {
   290                        lan966x_mac_forget(lan966x, mac_entry->mac, mac_entry->vid,

Same thing

   291                                           ENTRYTYPE_LOCKED);
   292
   293                        list_del(&mac_entry->list);
   294                        kfree(mac_entry);
   295                }
   296                spin_unlock(&lan966x->mac_lock);
   297        }

drivers/net/ethernet/microchip/lan966x/lan966x_mac.c
    39 static int lan966x_mac_wait_for_completion(struct lan966x *lan966x)
    40 {
    41         u32 val;
    42 
--> 43         return readx_poll_timeout(lan966x_mac_get_status,
                      ^^^^^^^^^^^^^^^^^^
sleeps

    44                 lan966x, val,
    45                 (ANA_MACACCESS_MAC_TABLE_CMD_GET(val)) ==
    46                 MACACCESS_CMD_IDLE,
    47                 TABLE_UPDATE_SLEEP_US, TABLE_UPDATE_TIMEOUT_US);
    48 }

regards,
dan carpenter



[Index of Archives]     [Kernel Development]     [Kernel Announce]     [Kernel Newbies]     [Linux Networking Development]     [Share Photos]     [IDE]     [Security]     [Git]     [Netfilter]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Device Mapper]

  Powered by Linux