|
@@ -1205,10 +1205,14 @@ static int igb_alloc_q_vector(struct igb_adapter *adapter,
|
|
|
|
|
|
/* allocate q_vector and rings */
|
|
/* allocate q_vector and rings */
|
|
q_vector = adapter->q_vector[v_idx];
|
|
q_vector = adapter->q_vector[v_idx];
|
|
- if (!q_vector)
|
|
|
|
|
|
+ if (!q_vector) {
|
|
q_vector = kzalloc(size, GFP_KERNEL);
|
|
q_vector = kzalloc(size, GFP_KERNEL);
|
|
- else
|
|
|
|
|
|
+ } else if (size > ksize(q_vector)) {
|
|
|
|
+ kfree_rcu(q_vector, rcu);
|
|
|
|
+ q_vector = kzalloc(size, GFP_KERNEL);
|
|
|
|
+ } else {
|
|
memset(q_vector, 0, size);
|
|
memset(q_vector, 0, size);
|
|
|
|
+ }
|
|
if (!q_vector)
|
|
if (!q_vector)
|
|
return -ENOMEM;
|
|
return -ENOMEM;
|
|
|
|
|
|
@@ -2888,6 +2892,14 @@ static void igb_init_queue_configuration(struct igb_adapter *adapter)
|
|
|
|
|
|
adapter->rss_queues = min_t(u32, max_rss_queues, num_online_cpus());
|
|
adapter->rss_queues = min_t(u32, max_rss_queues, num_online_cpus());
|
|
|
|
|
|
|
|
+ igb_set_flag_queue_pairs(adapter, max_rss_queues);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void igb_set_flag_queue_pairs(struct igb_adapter *adapter,
|
|
|
|
+ const u32 max_rss_queues)
|
|
|
|
+{
|
|
|
|
+ struct e1000_hw *hw = &adapter->hw;
|
|
|
|
+
|
|
/* Determine if we need to pair queues. */
|
|
/* Determine if we need to pair queues. */
|
|
switch (hw->mac.type) {
|
|
switch (hw->mac.type) {
|
|
case e1000_82575:
|
|
case e1000_82575:
|