]> git.dujemihanovic.xyz Git - linux.git/commitdiff
gve: Add adminq funcs to add/remove a single Rx queue
authorShailend Chand <shailend@google.com>
Wed, 1 May 2024 23:25:42 +0000 (23:25 +0000)
committerDavid S. Miller <davem@davemloft.net>
Sun, 5 May 2024 13:35:34 +0000 (14:35 +0100)
This allows for implementing future ndo hooks that act on a single
queue.

Tested-by: Mina Almasry <almasrymina@google.com>
Reviewed-by: Praveen Kaligineedi <pkaligineedi@google.com>
Reviewed-by: Harshitha Ramamurthy <hramamurthy@google.com>
Signed-off-by: Shailend Chand <shailend@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/google/gve/gve_adminq.c
drivers/net/ethernet/google/gve/gve_adminq.h

index b2b619aa2310bb39a509a17963ba219b42a45f5f..3df8243680d9096a7dd2f9da70d394333dbf673e 100644 (file)
@@ -630,14 +630,15 @@ int gve_adminq_create_tx_queues(struct gve_priv *priv, u32 start_id, u32 num_que
        return gve_adminq_kick_and_wait(priv);
 }
 
-static int gve_adminq_create_rx_queue(struct gve_priv *priv, u32 queue_index)
+static void gve_adminq_get_create_rx_queue_cmd(struct gve_priv *priv,
+                                              union gve_adminq_command *cmd,
+                                              u32 queue_index)
 {
        struct gve_rx_ring *rx = &priv->rx[queue_index];
-       union gve_adminq_command cmd;
 
-       memset(&cmd, 0, sizeof(cmd));
-       cmd.opcode = cpu_to_be32(GVE_ADMINQ_CREATE_RX_QUEUE);
-       cmd.create_rx_queue = (struct gve_adminq_create_rx_queue) {
+       memset(cmd, 0, sizeof(*cmd));
+       cmd->opcode = cpu_to_be32(GVE_ADMINQ_CREATE_RX_QUEUE);
+       cmd->create_rx_queue = (struct gve_adminq_create_rx_queue) {
                .queue_id = cpu_to_be32(queue_index),
                .ntfy_id = cpu_to_be32(rx->ntfy_id),
                .queue_resources_addr = cpu_to_be64(rx->q_resources_bus),
@@ -648,13 +649,13 @@ static int gve_adminq_create_rx_queue(struct gve_priv *priv, u32 queue_index)
                u32 qpl_id = priv->queue_format == GVE_GQI_RDA_FORMAT ?
                        GVE_RAW_ADDRESSING_QPL_ID : rx->data.qpl->id;
 
-               cmd.create_rx_queue.rx_desc_ring_addr =
+               cmd->create_rx_queue.rx_desc_ring_addr =
                        cpu_to_be64(rx->desc.bus),
-               cmd.create_rx_queue.rx_data_ring_addr =
+               cmd->create_rx_queue.rx_data_ring_addr =
                        cpu_to_be64(rx->data.data_bus),
-               cmd.create_rx_queue.index = cpu_to_be32(queue_index);
-               cmd.create_rx_queue.queue_page_list_id = cpu_to_be32(qpl_id);
-               cmd.create_rx_queue.packet_buffer_size = cpu_to_be16(rx->packet_buffer_size);
+               cmd->create_rx_queue.index = cpu_to_be32(queue_index);
+               cmd->create_rx_queue.queue_page_list_id = cpu_to_be32(qpl_id);
+               cmd->create_rx_queue.packet_buffer_size = cpu_to_be16(rx->packet_buffer_size);
        } else {
                u32 qpl_id = 0;
 
@@ -662,25 +663,40 @@ static int gve_adminq_create_rx_queue(struct gve_priv *priv, u32 queue_index)
                        qpl_id = GVE_RAW_ADDRESSING_QPL_ID;
                else
                        qpl_id = rx->dqo.qpl->id;
-               cmd.create_rx_queue.queue_page_list_id = cpu_to_be32(qpl_id);
-               cmd.create_rx_queue.rx_desc_ring_addr =
+               cmd->create_rx_queue.queue_page_list_id = cpu_to_be32(qpl_id);
+               cmd->create_rx_queue.rx_desc_ring_addr =
                        cpu_to_be64(rx->dqo.complq.bus);
-               cmd.create_rx_queue.rx_data_ring_addr =
+               cmd->create_rx_queue.rx_data_ring_addr =
                        cpu_to_be64(rx->dqo.bufq.bus);
-               cmd.create_rx_queue.packet_buffer_size =
+               cmd->create_rx_queue.packet_buffer_size =
                        cpu_to_be16(priv->data_buffer_size_dqo);
-               cmd.create_rx_queue.rx_buff_ring_size =
+               cmd->create_rx_queue.rx_buff_ring_size =
                        cpu_to_be16(priv->rx_desc_cnt);
-               cmd.create_rx_queue.enable_rsc =
+               cmd->create_rx_queue.enable_rsc =
                        !!(priv->dev->features & NETIF_F_LRO);
                if (priv->header_split_enabled)
-                       cmd.create_rx_queue.header_buffer_size =
+                       cmd->create_rx_queue.header_buffer_size =
                                cpu_to_be16(priv->header_buf_size);
        }
+}
+
+static int gve_adminq_create_rx_queue(struct gve_priv *priv, u32 queue_index)
+{
+       union gve_adminq_command cmd;
 
+       gve_adminq_get_create_rx_queue_cmd(priv, &cmd, queue_index);
        return gve_adminq_issue_cmd(priv, &cmd);
 }
 
+/* Unlike gve_adminq_create_rx_queue, this actually rings the doorbell */
+int gve_adminq_create_single_rx_queue(struct gve_priv *priv, u32 queue_index)
+{
+       union gve_adminq_command cmd;
+
+       gve_adminq_get_create_rx_queue_cmd(priv, &cmd, queue_index);
+       return gve_adminq_execute_cmd(priv, &cmd);
+}
+
 int gve_adminq_create_rx_queues(struct gve_priv *priv, u32 num_queues)
 {
        int err;
@@ -727,22 +743,31 @@ int gve_adminq_destroy_tx_queues(struct gve_priv *priv, u32 start_id, u32 num_qu
        return gve_adminq_kick_and_wait(priv);
 }
 
+static void gve_adminq_make_destroy_rx_queue_cmd(union gve_adminq_command *cmd,
+                                                u32 queue_index)
+{
+       memset(cmd, 0, sizeof(*cmd));
+       cmd->opcode = cpu_to_be32(GVE_ADMINQ_DESTROY_RX_QUEUE);
+       cmd->destroy_rx_queue = (struct gve_adminq_destroy_rx_queue) {
+               .queue_id = cpu_to_be32(queue_index),
+       };
+}
+
 static int gve_adminq_destroy_rx_queue(struct gve_priv *priv, u32 queue_index)
 {
        union gve_adminq_command cmd;
-       int err;
 
-       memset(&cmd, 0, sizeof(cmd));
-       cmd.opcode = cpu_to_be32(GVE_ADMINQ_DESTROY_RX_QUEUE);
-       cmd.destroy_rx_queue = (struct gve_adminq_destroy_rx_queue) {
-               .queue_id = cpu_to_be32(queue_index),
-       };
+       gve_adminq_make_destroy_rx_queue_cmd(&cmd, queue_index);
+       return gve_adminq_issue_cmd(priv, &cmd);
+}
 
-       err = gve_adminq_issue_cmd(priv, &cmd);
-       if (err)
-               return err;
+/* Unlike gve_adminq_destroy_rx_queue, this actually rings the doorbell */
+int gve_adminq_destroy_single_rx_queue(struct gve_priv *priv, u32 queue_index)
+{
+       union gve_adminq_command cmd;
 
-       return 0;
+       gve_adminq_make_destroy_rx_queue_cmd(&cmd, queue_index);
+       return gve_adminq_execute_cmd(priv, &cmd);
 }
 
 int gve_adminq_destroy_rx_queues(struct gve_priv *priv, u32 num_queues)
index beedf2353847b1057e0d4aec3450a870217a55be..e64f0dbe744d3dfc7fc0527bd4b2f3d25d998691 100644 (file)
@@ -451,7 +451,9 @@ int gve_adminq_configure_device_resources(struct gve_priv *priv,
 int gve_adminq_deconfigure_device_resources(struct gve_priv *priv);
 int gve_adminq_create_tx_queues(struct gve_priv *priv, u32 start_id, u32 num_queues);
 int gve_adminq_destroy_tx_queues(struct gve_priv *priv, u32 start_id, u32 num_queues);
+int gve_adminq_create_single_rx_queue(struct gve_priv *priv, u32 queue_index);
 int gve_adminq_create_rx_queues(struct gve_priv *priv, u32 num_queues);
+int gve_adminq_destroy_single_rx_queue(struct gve_priv *priv, u32 queue_index);
 int gve_adminq_destroy_rx_queues(struct gve_priv *priv, u32 queue_id);
 int gve_adminq_register_page_list(struct gve_priv *priv,
                                  struct gve_queue_page_list *qpl);