Skip to contentSkip to conversation

IB/usnic: Add Cisco VIC low-level hardware driver

PATCH New Dan Carpenter 2 participants 2 messages Dec 11, 2013 – Jan 20, 2014 1 message not in the archive

Subsystems (3)
lore
Share & tools
lore
#0 lore raw

Hello Upinder Malhi,

The patch b1819c455542: "IB/usnic: Add Cisco VIC low-level hardware driver" from Sep 10, 2013, leads to the following Smatch warning:

drivers/infiniband/hw/usnic/usnic_uiom.c:560 usnic_uiom_get_dev_list()
error: scheduling with locks held: 'spin_lock:lock'

drivers/infiniband/hw/usnic/usnic_uiom.c
553 struct device **usnic_uiom_get_dev_list(struct usnic_uiom_pd *pd) 554 {

   555          struct usnic_uiom_dev *uiom_dev;
   556          struct device **devs;
   557          int i = 0;
   558  
   559          spin_lock(&pd->lock);
   560          devs = kzalloc(sizeof(*devs)*(pd->dev_cnt + 1), GFP_KERNEL);
                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

You can't do blocking allocations with a spin_lock held.

   561          if (!devs) {
   562                  devs = ERR_PTR(-ENOMEM);
   563                  goto out;
   564          }

regards,
dan carpenter

--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html

A message that is not in the archive (sent off-list or not yet received): [email protected]

#2 lore raw

PATCH 1/1 IB/usnic: use GFP_ATOMIC under spinlock

This is called from qp_grp_and_vf_bind() and we are holding the "vf->lock" so the allocation can't sleep.

Fixes e3cf00d0a87f ('IB/usnic: Add Cisco VIC low-level hardware driver')
drivers/infiniband/hw/usnic/usnic_uiom.c +1 -1
index ae6934c0d05a..16755cdab2c0 100644
@@ -498,7 +498,7 @@ int usnic_uiom_attach_dev_to_pd(struct usnic_uiom_pd *pd, struct device *dev)
 	struct usnic_uiom_dev *uiom_dev;
 	int err;
 
-	uiom_dev = kzalloc(sizeof(*uiom_dev), GFP_KERNEL);
+	uiom_dev = kzalloc(sizeof(*uiom_dev), GFP_ATOMIC);
 	if (!uiom_dev)
 		return -ENOMEM;
 	uiom_dev->dev = dev;