diff options
Diffstat (limited to 'sys/dev/gve/gve_adminq.c')
| -rw-r--r-- | sys/dev/gve/gve_adminq.c | 47 |
1 files changed, 37 insertions, 10 deletions
diff --git a/sys/dev/gve/gve_adminq.c b/sys/dev/gve/gve_adminq.c index 9b59570a2af4..43952308098b 100644 --- a/sys/dev/gve/gve_adminq.c +++ b/sys/dev/gve/gve_adminq.c @@ -214,6 +214,9 @@ gve_process_device_options(struct gve_priv *priv, return (0); } +static int gve_adminq_issue_cmd(struct gve_priv *priv, + struct gve_adminq_command *cmd); +static int gve_adminq_kick_and_wait(struct gve_priv *priv); static int gve_adminq_execute_cmd(struct gve_priv *priv, struct gve_adminq_command *cmd); @@ -225,7 +228,7 @@ gve_adminq_destroy_tx_queue(struct gve_priv *priv, uint32_t id) cmd.opcode = htobe32(GVE_ADMINQ_DESTROY_TX_QUEUE); cmd.destroy_tx_queue.queue_id = htobe32(id); - return (gve_adminq_execute_cmd(priv, &cmd)); + return (gve_adminq_issue_cmd(priv, &cmd)); } static int @@ -236,7 +239,7 @@ gve_adminq_destroy_rx_queue(struct gve_priv *priv, uint32_t id) cmd.opcode = htobe32(GVE_ADMINQ_DESTROY_RX_QUEUE); cmd.destroy_rx_queue.queue_id = htobe32(id); - return (gve_adminq_execute_cmd(priv, &cmd)); + return (gve_adminq_issue_cmd(priv, &cmd)); } int @@ -248,13 +251,18 @@ gve_adminq_destroy_rx_queues(struct gve_priv *priv, uint32_t num_queues) for (i = 0; i < num_queues; i++) { err = gve_adminq_destroy_rx_queue(priv, i); if (err != 0) { - device_printf(priv->dev, "Failed to destroy rxq %d, err: %d\n", + device_printf(priv->dev, "Failed to issue destroy rxq %d, err: %d\n", i, err); + return (err); } } - if (err != 0) + err = gve_adminq_kick_and_wait(priv); + if (err != 0) { + device_printf(priv->dev, "Failed to batch destroy rx queues, err: %d\n", + err); return (err); + } device_printf(priv->dev, "Destroyed %d rx queues\n", num_queues); return (0); @@ -269,13 +277,18 @@ gve_adminq_destroy_tx_queues(struct gve_priv *priv, uint32_t num_queues) for (i = 0; i < num_queues; i++) { err = gve_adminq_destroy_tx_queue(priv, i); if (err != 0) { - device_printf(priv->dev, "Failed to destroy txq %d, err: %d\n", + device_printf(priv->dev, "Failed to issue destroy txq %d, err: %d\n", i, err); + return (err); } } - if (err != 0) + err = gve_adminq_kick_and_wait(priv); + if (err != 0) { + device_printf(priv->dev, "Failed to batch destroy tx queues, err: %d\n", + err); return (err); + } device_printf(priv->dev, "Destroyed %d tx queues\n", num_queues); return (0); @@ -325,7 +338,7 @@ gve_adminq_create_rx_queue(struct gve_priv *priv, uint32_t queue_index) htobe16(priv->rx_buf_size_dqo); } - return (gve_adminq_execute_cmd(priv, &cmd)); + return (gve_adminq_issue_cmd(priv, &cmd)); } int @@ -337,12 +350,19 @@ gve_adminq_create_rx_queues(struct gve_priv *priv, uint32_t num_queues) for (i = 0; i < num_queues; i++) { err = gve_adminq_create_rx_queue(priv, i); if (err != 0) { - device_printf(priv->dev, "Failed to create rxq %d, err: %d\n", + device_printf(priv->dev, "Failed to issue create rxq %d, err: %d\n", i, err); goto abort; } } + err = gve_adminq_kick_and_wait(priv); + if (err != 0) { + device_printf(priv->dev, "Failed to batch create rx queues, err: %d\n", + err); + goto abort; + } + if (bootverbose) device_printf(priv->dev, "Created %d rx queues\n", num_queues); return (0); @@ -381,7 +401,7 @@ gve_adminq_create_tx_queue(struct gve_priv *priv, uint32_t queue_index) cmd.create_tx_queue.tx_comp_ring_size = htobe16(priv->tx_desc_cnt); } - return (gve_adminq_execute_cmd(priv, &cmd)); + return (gve_adminq_issue_cmd(priv, &cmd)); } int @@ -393,12 +413,19 @@ gve_adminq_create_tx_queues(struct gve_priv *priv, uint32_t num_queues) for (i = 0; i < num_queues; i++) { err = gve_adminq_create_tx_queue(priv, i); if (err != 0) { - device_printf(priv->dev, "Failed to create txq %d, err: %d\n", + device_printf(priv->dev, "Failed to issue create txq %d, err: %d\n", i, err); goto abort; } } + err = gve_adminq_kick_and_wait(priv); + if (err != 0) { + device_printf(priv->dev, "Failed to batch create tx queues, err: %d\n", + err); + goto abort; + } + if (bootverbose) device_printf(priv->dev, "Created %d tx queues\n", num_queues); return (0); |
