Skip to content

Commit 8c39f71

Browse files
committed
Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
Pull networking fixes from David Miller: "This is mostly to fix the iwlwifi regression: 1) Flush GRO state properly in iwlwifi driver, from Alexander Lobakin. 2) Validate TIPC link name with properly length macro, from John Rutherford. 3) Fix completion init and device query timeouts in ibmvnic, from Thomas Falcon. 4) Fix SKB size calculation for netlink messages in psample, from Nikolay Aleksandrov. 5) Similar kind of fix for OVS flow dumps, from Paolo Abeni. 6) Handle queue allocation failure unwind properly in gve driver, we could try to release pages we didn't allocate. From Jeroen de Borst. 7) Serialize TX queue SKB list accesses properly in mscc ocelot driver. From Yangbo Lu" * git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net: net: usb: aqc111: Use the correct style for SPDX License Identifier net: phy: Use the correct style for SPDX License Identifier net: wireless: intel: iwlwifi: fix GRO_NORMAL packet stalling net: mscc: ocelot: use skb queue instead of skbs list net: mscc: ocelot: avoid incorrect consuming in skbs list gve: Fix the queue page list allocated pages count net: inet_is_local_reserved_port() port arg should be unsigned short openvswitch: fix flow command message size net: phy: dp83869: Fix return paths to return proper values net: psample: fix skb_over_panic net: usbnet: Fix -Wcast-function-type net: hso: Fix -Wcast-function-type net: port < inet_prot_sock(net) --> inet_port_requires_bind_service(net, port) ibmvnic: Serialize device queries ibmvnic: Bound waits for device queries ibmvnic: Terminate waiting device threads after loss of service ibmvnic: Fix completion structure initialization net-sctp: replace some sock_net(sk) with just 'net' net: Fix a documentation bug wrt. ip_unprivileged_port_start tipc: fix link name length check
2 parents 95f1fa9 + bac139a commit 8c39f71

File tree

25 files changed

+277
-135
lines changed

25 files changed

+277
-135
lines changed

Documentation/networking/ip-sysctl.txt

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -904,8 +904,9 @@ ip_local_port_range - 2 INTEGERS
904904
Defines the local port range that is used by TCP and UDP to
905905
choose the local port. The first number is the first, the
906906
second the last local port number.
907-
If possible, it is better these numbers have different parity.
908-
(one even and one odd values)
907+
If possible, it is better these numbers have different parity
908+
(one even and one odd value).
909+
Must be greater than or equal to ip_unprivileged_port_start.
909910
The default values are 32768 and 60999 respectively.
910911

911912
ip_local_reserved_ports - list of comma separated ranges
@@ -943,8 +944,8 @@ ip_unprivileged_port_start - INTEGER
943944
This is a per-namespace sysctl. It defines the first
944945
unprivileged port in the network namespace. Privileged ports
945946
require root or CAP_NET_BIND_SERVICE in order to bind to them.
946-
To disable all privileged ports, set this to 0. It may not
947-
overlap with the ip_local_reserved_ports range.
947+
To disable all privileged ports, set this to 0. They must not
948+
overlap with the ip_local_port_range.
948949

949950
Default: 1024
950951

drivers/net/ethernet/google/gve/gve_main.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -544,7 +544,7 @@ static int gve_alloc_queue_page_list(struct gve_priv *priv, u32 id,
544544
}
545545

546546
qpl->id = id;
547-
qpl->num_entries = pages;
547+
qpl->num_entries = 0;
548548
qpl->pages = kvzalloc(pages * sizeof(*qpl->pages), GFP_KERNEL);
549549
/* caller handles clean up */
550550
if (!qpl->pages)
@@ -562,6 +562,7 @@ static int gve_alloc_queue_page_list(struct gve_priv *priv, u32 id,
562562
/* caller handles clean up */
563563
if (err)
564564
return -ENOMEM;
565+
qpl->num_entries++;
565566
}
566567
priv->num_registered_pages += pages;
567568

drivers/net/ethernet/ibm/ibmvnic.c

Lines changed: 165 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,40 @@ static long h_reg_sub_crq(unsigned long unit_address, unsigned long token,
159159
return rc;
160160
}
161161

162+
/**
163+
* ibmvnic_wait_for_completion - Check device state and wait for completion
164+
* @adapter: private device data
165+
* @comp_done: completion structure to wait for
166+
* @timeout: time to wait in milliseconds
167+
*
168+
* Wait for a completion signal or until the timeout limit is reached
169+
* while checking that the device is still active.
170+
*/
171+
static int ibmvnic_wait_for_completion(struct ibmvnic_adapter *adapter,
172+
struct completion *comp_done,
173+
unsigned long timeout)
174+
{
175+
struct net_device *netdev;
176+
unsigned long div_timeout;
177+
u8 retry;
178+
179+
netdev = adapter->netdev;
180+
retry = 5;
181+
div_timeout = msecs_to_jiffies(timeout / retry);
182+
while (true) {
183+
if (!adapter->crq.active) {
184+
netdev_err(netdev, "Device down!\n");
185+
return -ENODEV;
186+
}
187+
if (retry--)
188+
break;
189+
if (wait_for_completion_timeout(comp_done, div_timeout))
190+
return 0;
191+
}
192+
netdev_err(netdev, "Operation timed out.\n");
193+
return -ETIMEDOUT;
194+
}
195+
162196
static int alloc_long_term_buff(struct ibmvnic_adapter *adapter,
163197
struct ibmvnic_long_term_buff *ltb, int size)
164198
{
@@ -176,21 +210,35 @@ static int alloc_long_term_buff(struct ibmvnic_adapter *adapter,
176210
ltb->map_id = adapter->map_id;
177211
adapter->map_id++;
178212

179-
init_completion(&adapter->fw_done);
213+
mutex_lock(&adapter->fw_lock);
214+
adapter->fw_done_rc = 0;
215+
reinit_completion(&adapter->fw_done);
180216
rc = send_request_map(adapter, ltb->addr,
181217
ltb->size, ltb->map_id);
182218
if (rc) {
183219
dma_free_coherent(dev, ltb->size, ltb->buff, ltb->addr);
220+
mutex_unlock(&adapter->fw_lock);
221+
return rc;
222+
}
223+
224+
rc = ibmvnic_wait_for_completion(adapter, &adapter->fw_done, 10000);
225+
if (rc) {
226+
dev_err(dev,
227+
"Long term map request aborted or timed out,rc = %d\n",
228+
rc);
229+
dma_free_coherent(dev, ltb->size, ltb->buff, ltb->addr);
230+
mutex_unlock(&adapter->fw_lock);
184231
return rc;
185232
}
186-
wait_for_completion(&adapter->fw_done);
187233

188234
if (adapter->fw_done_rc) {
189235
dev_err(dev, "Couldn't map long term buffer,rc = %d\n",
190236
adapter->fw_done_rc);
191237
dma_free_coherent(dev, ltb->size, ltb->buff, ltb->addr);
238+
mutex_unlock(&adapter->fw_lock);
192239
return -1;
193240
}
241+
mutex_unlock(&adapter->fw_lock);
194242
return 0;
195243
}
196244

@@ -211,22 +259,37 @@ static void free_long_term_buff(struct ibmvnic_adapter *adapter,
211259
static int reset_long_term_buff(struct ibmvnic_adapter *adapter,
212260
struct ibmvnic_long_term_buff *ltb)
213261
{
262+
struct device *dev = &adapter->vdev->dev;
214263
int rc;
215264

216265
memset(ltb->buff, 0, ltb->size);
217266

218-
init_completion(&adapter->fw_done);
267+
mutex_lock(&adapter->fw_lock);
268+
adapter->fw_done_rc = 0;
269+
270+
reinit_completion(&adapter->fw_done);
219271
rc = send_request_map(adapter, ltb->addr, ltb->size, ltb->map_id);
220-
if (rc)
272+
if (rc) {
273+
mutex_unlock(&adapter->fw_lock);
274+
return rc;
275+
}
276+
277+
rc = ibmvnic_wait_for_completion(adapter, &adapter->fw_done, 10000);
278+
if (rc) {
279+
dev_info(dev,
280+
"Reset failed, long term map request timed out or aborted\n");
281+
mutex_unlock(&adapter->fw_lock);
221282
return rc;
222-
wait_for_completion(&adapter->fw_done);
283+
}
223284

224285
if (adapter->fw_done_rc) {
225-
dev_info(&adapter->vdev->dev,
286+
dev_info(dev,
226287
"Reset failed, attempting to free and reallocate buffer\n");
227288
free_long_term_buff(adapter, ltb);
289+
mutex_unlock(&adapter->fw_lock);
228290
return alloc_long_term_buff(adapter, ltb, ltb->size);
229291
}
292+
mutex_unlock(&adapter->fw_lock);
230293
return 0;
231294
}
232295

@@ -943,13 +1006,25 @@ static int ibmvnic_get_vpd(struct ibmvnic_adapter *adapter)
9431006
if (adapter->vpd->buff)
9441007
len = adapter->vpd->len;
9451008

946-
init_completion(&adapter->fw_done);
1009+
mutex_lock(&adapter->fw_lock);
1010+
adapter->fw_done_rc = 0;
1011+
reinit_completion(&adapter->fw_done);
1012+
9471013
crq.get_vpd_size.first = IBMVNIC_CRQ_CMD;
9481014
crq.get_vpd_size.cmd = GET_VPD_SIZE;
9491015
rc = ibmvnic_send_crq(adapter, &crq);
950-
if (rc)
1016+
if (rc) {
1017+
mutex_unlock(&adapter->fw_lock);
9511018
return rc;
952-
wait_for_completion(&adapter->fw_done);
1019+
}
1020+
1021+
rc = ibmvnic_wait_for_completion(adapter, &adapter->fw_done, 10000);
1022+
if (rc) {
1023+
dev_err(dev, "Could not retrieve VPD size, rc = %d\n", rc);
1024+
mutex_unlock(&adapter->fw_lock);
1025+
return rc;
1026+
}
1027+
mutex_unlock(&adapter->fw_lock);
9531028

9541029
if (!adapter->vpd->len)
9551030
return -ENODATA;
@@ -976,7 +1051,10 @@ static int ibmvnic_get_vpd(struct ibmvnic_adapter *adapter)
9761051
return -ENOMEM;
9771052
}
9781053

1054+
mutex_lock(&adapter->fw_lock);
1055+
adapter->fw_done_rc = 0;
9791056
reinit_completion(&adapter->fw_done);
1057+
9801058
crq.get_vpd.first = IBMVNIC_CRQ_CMD;
9811059
crq.get_vpd.cmd = GET_VPD;
9821060
crq.get_vpd.ioba = cpu_to_be32(adapter->vpd->dma_addr);
@@ -985,10 +1063,20 @@ static int ibmvnic_get_vpd(struct ibmvnic_adapter *adapter)
9851063
if (rc) {
9861064
kfree(adapter->vpd->buff);
9871065
adapter->vpd->buff = NULL;
1066+
mutex_unlock(&adapter->fw_lock);
1067+
return rc;
1068+
}
1069+
1070+
rc = ibmvnic_wait_for_completion(adapter, &adapter->fw_done, 10000);
1071+
if (rc) {
1072+
dev_err(dev, "Unable to retrieve VPD, rc = %d\n", rc);
1073+
kfree(adapter->vpd->buff);
1074+
adapter->vpd->buff = NULL;
1075+
mutex_unlock(&adapter->fw_lock);
9881076
return rc;
9891077
}
990-
wait_for_completion(&adapter->fw_done);
9911078

1079+
mutex_unlock(&adapter->fw_lock);
9921080
return 0;
9931081
}
9941082

@@ -1689,20 +1777,25 @@ static int __ibmvnic_set_mac(struct net_device *netdev, u8 *dev_addr)
16891777
crq.change_mac_addr.cmd = CHANGE_MAC_ADDR;
16901778
ether_addr_copy(&crq.change_mac_addr.mac_addr[0], dev_addr);
16911779

1692-
init_completion(&adapter->fw_done);
1780+
mutex_lock(&adapter->fw_lock);
1781+
adapter->fw_done_rc = 0;
1782+
reinit_completion(&adapter->fw_done);
1783+
16931784
rc = ibmvnic_send_crq(adapter, &crq);
16941785
if (rc) {
16951786
rc = -EIO;
1787+
mutex_unlock(&adapter->fw_lock);
16961788
goto err;
16971789
}
16981790

1699-
wait_for_completion(&adapter->fw_done);
1791+
rc = ibmvnic_wait_for_completion(adapter, &adapter->fw_done, 10000);
17001792
/* netdev->dev_addr is changed in handle_change_mac_rsp function */
1701-
if (adapter->fw_done_rc) {
1793+
if (rc || adapter->fw_done_rc) {
17021794
rc = -EIO;
1795+
mutex_unlock(&adapter->fw_lock);
17031796
goto err;
17041797
}
1705-
1798+
mutex_unlock(&adapter->fw_lock);
17061799
return 0;
17071800
err:
17081801
ether_addr_copy(adapter->mac_addr, netdev->dev_addr);
@@ -2316,12 +2409,19 @@ static int wait_for_reset(struct ibmvnic_adapter *adapter)
23162409
adapter->fallback.rx_entries = adapter->req_rx_add_entries_per_subcrq;
23172410
adapter->fallback.tx_entries = adapter->req_tx_entries_per_subcrq;
23182411

2319-
init_completion(&adapter->reset_done);
2412+
reinit_completion(&adapter->reset_done);
23202413
adapter->wait_for_reset = true;
23212414
rc = ibmvnic_reset(adapter, VNIC_RESET_CHANGE_PARAM);
2322-
if (rc)
2323-
return rc;
2324-
wait_for_completion(&adapter->reset_done);
2415+
2416+
if (rc) {
2417+
ret = rc;
2418+
goto out;
2419+
}
2420+
rc = ibmvnic_wait_for_completion(adapter, &adapter->reset_done, 60000);
2421+
if (rc) {
2422+
ret = -ENODEV;
2423+
goto out;
2424+
}
23252425

23262426
ret = 0;
23272427
if (adapter->reset_done_rc) {
@@ -2332,13 +2432,21 @@ static int wait_for_reset(struct ibmvnic_adapter *adapter)
23322432
adapter->desired.rx_entries = adapter->fallback.rx_entries;
23332433
adapter->desired.tx_entries = adapter->fallback.tx_entries;
23342434

2335-
init_completion(&adapter->reset_done);
2435+
reinit_completion(&adapter->reset_done);
23362436
adapter->wait_for_reset = true;
23372437
rc = ibmvnic_reset(adapter, VNIC_RESET_CHANGE_PARAM);
2338-
if (rc)
2339-
return ret;
2340-
wait_for_completion(&adapter->reset_done);
2438+
if (rc) {
2439+
ret = rc;
2440+
goto out;
2441+
}
2442+
rc = ibmvnic_wait_for_completion(adapter, &adapter->reset_done,
2443+
60000);
2444+
if (rc) {
2445+
ret = -ENODEV;
2446+
goto out;
2447+
}
23412448
}
2449+
out:
23422450
adapter->wait_for_reset = false;
23432451

23442452
return ret;
@@ -2603,11 +2711,13 @@ static void ibmvnic_get_ethtool_stats(struct net_device *dev,
26032711
cpu_to_be32(sizeof(struct ibmvnic_statistics));
26042712

26052713
/* Wait for data to be written */
2606-
init_completion(&adapter->stats_done);
2714+
reinit_completion(&adapter->stats_done);
26072715
rc = ibmvnic_send_crq(adapter, &crq);
26082716
if (rc)
26092717
return;
2610-
wait_for_completion(&adapter->stats_done);
2718+
rc = ibmvnic_wait_for_completion(adapter, &adapter->stats_done, 10000);
2719+
if (rc)
2720+
return;
26112721

26122722
for (i = 0; i < ARRAY_SIZE(ibmvnic_stats); i++)
26132723
data[i] = be64_to_cpu(IBMVNIC_GET_STAT(adapter,
@@ -4408,11 +4518,24 @@ static int send_query_phys_parms(struct ibmvnic_adapter *adapter)
44084518
memset(&crq, 0, sizeof(crq));
44094519
crq.query_phys_parms.first = IBMVNIC_CRQ_CMD;
44104520
crq.query_phys_parms.cmd = QUERY_PHYS_PARMS;
4411-
init_completion(&adapter->fw_done);
4521+
4522+
mutex_lock(&adapter->fw_lock);
4523+
adapter->fw_done_rc = 0;
4524+
reinit_completion(&adapter->fw_done);
4525+
44124526
rc = ibmvnic_send_crq(adapter, &crq);
4413-
if (rc)
4527+
if (rc) {
4528+
mutex_unlock(&adapter->fw_lock);
44144529
return rc;
4415-
wait_for_completion(&adapter->fw_done);
4530+
}
4531+
4532+
rc = ibmvnic_wait_for_completion(adapter, &adapter->fw_done, 10000);
4533+
if (rc) {
4534+
mutex_unlock(&adapter->fw_lock);
4535+
return rc;
4536+
}
4537+
4538+
mutex_unlock(&adapter->fw_lock);
44164539
return adapter->fw_done_rc ? -EIO : 0;
44174540
}
44184541

@@ -4505,6 +4628,15 @@ static void ibmvnic_handle_crq(union ibmvnic_crq *crq,
45054628
case IBMVNIC_CRQ_XPORT_EVENT:
45064629
netif_carrier_off(netdev);
45074630
adapter->crq.active = false;
4631+
/* terminate any thread waiting for a response
4632+
* from the device
4633+
*/
4634+
if (!completion_done(&adapter->fw_done)) {
4635+
adapter->fw_done_rc = -EIO;
4636+
complete(&adapter->fw_done);
4637+
}
4638+
if (!completion_done(&adapter->stats_done))
4639+
complete(&adapter->stats_done);
45084640
if (test_bit(0, &adapter->resetting))
45094641
adapter->force_reset_recovery = true;
45104642
if (gen_crq->cmd == IBMVNIC_PARTITION_MIGRATED) {
@@ -4959,7 +5091,11 @@ static int ibmvnic_probe(struct vio_dev *dev, const struct vio_device_id *id)
49595091
__ibmvnic_delayed_reset);
49605092
INIT_LIST_HEAD(&adapter->rwi_list);
49615093
spin_lock_init(&adapter->rwi_lock);
5094+
mutex_init(&adapter->fw_lock);
49625095
init_completion(&adapter->init_done);
5096+
init_completion(&adapter->fw_done);
5097+
init_completion(&adapter->reset_done);
5098+
init_completion(&adapter->stats_done);
49635099
clear_bit(0, &adapter->resetting);
49645100

49655101
do {
@@ -5017,6 +5153,7 @@ static int ibmvnic_probe(struct vio_dev *dev, const struct vio_device_id *id)
50175153
ibmvnic_init_fail:
50185154
release_sub_crqs(adapter, 1);
50195155
release_crq_queue(adapter);
5156+
mutex_destroy(&adapter->fw_lock);
50205157
free_netdev(netdev);
50215158

50225159
return rc;
@@ -5041,6 +5178,7 @@ static int ibmvnic_remove(struct vio_dev *dev)
50415178
adapter->state = VNIC_REMOVED;
50425179

50435180
rtnl_unlock();
5181+
mutex_destroy(&adapter->fw_lock);
50445182
device_remove_file(&dev->dev, &dev_attr_failover);
50455183
free_netdev(netdev);
50465184
dev_set_drvdata(&dev->dev, NULL);

drivers/net/ethernet/ibm/ibmvnic.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1026,6 +1026,8 @@ struct ibmvnic_adapter {
10261026
int init_done_rc;
10271027

10281028
struct completion fw_done;
1029+
/* Used for serialization of device commands */
1030+
struct mutex fw_lock;
10291031
int fw_done_rc;
10301032

10311033
struct completion reset_done;

0 commit comments

Comments
 (0)