Commit 129854f0 authored by Sukadev Bhattiprolu's avatar Sukadev Bhattiprolu Committed by David S. Miller

ibmvnic: Use bitmap for LTB map_ids

In a follow-on patch, we will reuse long term buffers when possible.
When doing so we have to be careful to properly assign map ids. We
can no longer assign them sequentially because a lower map id may be
available and we could wrap at 255 and collide with an in-use map id.

Instead, use a bitmap to track active map ids and to find a free map id.
Don't need to take locks here since the map_id only changes during reset
and at that time only the reset worker thread should be using the adapter.

Noticed this when analyzing an error Dany Madden ran into with the
patch set.
Reported-by: default avatarDany Madden <drt@linux.ibm.com>
Reviewed-by: default avatarRick Lindsley <ricklind@linux.vnet.ibm.com>
Reviewed-by: default avatarDany Madden <drt@linux.ibm.com>
Signed-off-by: default avatarSukadev Bhattiprolu <sukadev@linux.ibm.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 0d1af4fa
...@@ -228,8 +228,9 @@ static int alloc_long_term_buff(struct ibmvnic_adapter *adapter, ...@@ -228,8 +228,9 @@ static int alloc_long_term_buff(struct ibmvnic_adapter *adapter,
dev_err(dev, "Couldn't alloc long term buffer\n"); dev_err(dev, "Couldn't alloc long term buffer\n");
return -ENOMEM; return -ENOMEM;
} }
ltb->map_id = adapter->map_id; ltb->map_id = find_first_zero_bit(adapter->map_ids,
adapter->map_id++; MAX_MAP_ID);
bitmap_set(adapter->map_ids, ltb->map_id, 1);
mutex_lock(&adapter->fw_lock); mutex_lock(&adapter->fw_lock);
adapter->fw_done_rc = 0; adapter->fw_done_rc = 0;
...@@ -284,6 +285,8 @@ static void free_long_term_buff(struct ibmvnic_adapter *adapter, ...@@ -284,6 +285,8 @@ static void free_long_term_buff(struct ibmvnic_adapter *adapter,
dma_free_coherent(dev, ltb->size, ltb->buff, ltb->addr); dma_free_coherent(dev, ltb->size, ltb->buff, ltb->addr);
ltb->buff = NULL; ltb->buff = NULL;
/* mark this map_id free */
bitmap_clear(adapter->map_ids, ltb->map_id, 1);
ltb->map_id = 0; ltb->map_id = 0;
} }
...@@ -1235,8 +1238,6 @@ static int init_resources(struct ibmvnic_adapter *adapter) ...@@ -1235,8 +1238,6 @@ static int init_resources(struct ibmvnic_adapter *adapter)
return rc; return rc;
} }
adapter->map_id = 1;
rc = init_napi(adapter); rc = init_napi(adapter);
if (rc) if (rc)
return rc; return rc;
...@@ -5557,6 +5558,9 @@ static int ibmvnic_probe(struct vio_dev *dev, const struct vio_device_id *id) ...@@ -5557,6 +5558,9 @@ static int ibmvnic_probe(struct vio_dev *dev, const struct vio_device_id *id)
adapter->vdev = dev; adapter->vdev = dev;
adapter->netdev = netdev; adapter->netdev = netdev;
adapter->login_pending = false; adapter->login_pending = false;
memset(&adapter->map_ids, 0, sizeof(adapter->map_ids));
/* map_ids start at 1, so ensure map_id 0 is always "in-use" */
bitmap_set(adapter->map_ids, 0, 1);
ether_addr_copy(adapter->mac_addr, mac_addr_p); ether_addr_copy(adapter->mac_addr, mac_addr_p);
ether_addr_copy(netdev->dev_addr, adapter->mac_addr); ether_addr_copy(netdev->dev_addr, adapter->mac_addr);
......
...@@ -979,7 +979,8 @@ struct ibmvnic_adapter { ...@@ -979,7 +979,8 @@ struct ibmvnic_adapter {
u64 opt_tx_entries_per_subcrq; u64 opt_tx_entries_per_subcrq;
u64 opt_rxba_entries_per_subcrq; u64 opt_rxba_entries_per_subcrq;
__be64 tx_rx_desc_req; __be64 tx_rx_desc_req;
u8 map_id; #define MAX_MAP_ID 255
DECLARE_BITMAP(map_ids, MAX_MAP_ID);
u32 num_active_rx_scrqs; u32 num_active_rx_scrqs;
u32 num_active_rx_pools; u32 num_active_rx_pools;
u32 num_active_rx_napi; u32 num_active_rx_napi;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment