Message ID | 20240430231420.699177-4-shailend@google.com (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | gve: Implement queue api | expand |
On 2024-05-01 at 04:44:12, Shailend Chand (shailend@google.com) wrote: > +int gve_adminq_destroy_single_rx_queue(struct gve_priv *priv, u32 queue_index) > +{ > + union gve_adminq_command cmd; > + int err; > + > + gve_adminq_make_destroy_rx_queue_cmd(&cmd, queue_index); > + err = gve_adminq_execute_cmd(priv, &cmd); > + if (err) why can't you return err directly ? no need of if statement. > + return err; > + > + return 0; >
Shailend Chand wrote: > 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> > +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); > } > > +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,17 +742,22 @@ 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); > err = gve_adminq_issue_cmd(priv, &cmd); > if (err) > return err; > @@ -745,6 +765,19 @@ static int gve_adminq_destroy_rx_queue(struct gve_priv *priv, u32 queue_index) > return 0; > } > > +int gve_adminq_destroy_single_rx_queue(struct gve_priv *priv, u32 queue_index) > +{ > + union gve_adminq_command cmd; > + int err; > + > + gve_adminq_make_destroy_rx_queue_cmd(&cmd, queue_index); > + err = gve_adminq_execute_cmd(priv, &cmd); > + if (err) > + return err; > + > + return 0; > +} This is identical to gve_adminq_destroy_rx_queue, bar for removing the file scope? Same for gve_adminq_create_rx_queue.
On Wed, May 1, 2024 at 6:50 AM Willem de Bruijn <willemdebruijn.kernel@gmail.com> wrote: > > Shailend Chand wrote: > > 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> > > > +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); > > } > > > > +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,17 +742,22 @@ 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); > > err = gve_adminq_issue_cmd(priv, &cmd); > > if (err) > > return err; > > @@ -745,6 +765,19 @@ static int gve_adminq_destroy_rx_queue(struct gve_priv *priv, u32 queue_index) > > return 0; > > } > > > > +int gve_adminq_destroy_single_rx_queue(struct gve_priv *priv, u32 queue_index) > > +{ > > + union gve_adminq_command cmd; > > + int err; > > + > > + gve_adminq_make_destroy_rx_queue_cmd(&cmd, queue_index); > > + err = gve_adminq_execute_cmd(priv, &cmd); > > + if (err) > > + return err; > > + > > + return 0; > > +} > > This is identical to gve_adminq_destroy_rx_queue, bar for removing the > file scope? > > Same for gve_adminq_create_rx_queue. One doesn't immediately ring the doorbell, added a comment in v2 clarifying this.
Shailend Chand wrote: > On Wed, May 1, 2024 at 6:50 AM Willem de Bruijn > <willemdebruijn.kernel@gmail.com> wrote: > > > > Shailend Chand wrote: > > > 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> > > > > > +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); > > > } > > > > > > +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,17 +742,22 @@ 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); > > > err = gve_adminq_issue_cmd(priv, &cmd); > > > if (err) > > > return err; > > > @@ -745,6 +765,19 @@ static int gve_adminq_destroy_rx_queue(struct gve_priv *priv, u32 queue_index) > > > return 0; > > > } > > > > > > +int gve_adminq_destroy_single_rx_queue(struct gve_priv *priv, u32 queue_index) > > > +{ > > > + union gve_adminq_command cmd; > > > + int err; > > > + > > > + gve_adminq_make_destroy_rx_queue_cmd(&cmd, queue_index); > > > + err = gve_adminq_execute_cmd(priv, &cmd); > > > + if (err) > > > + return err; > > > + > > > + return 0; > > > +} > > > > This is identical to gve_adminq_destroy_rx_queue, bar for removing the > > file scope? > > > > Same for gve_adminq_create_rx_queue. > > One doesn't immediately ring the doorbell, added a comment in v2 > clarifying this. Thanks! I clearly totally missed the issue vs execute distinction.
diff --git a/drivers/net/ethernet/google/gve/gve_adminq.c b/drivers/net/ethernet/google/gve/gve_adminq.c index b2b619aa2310..1b066c92d812 100644 --- a/drivers/net/ethernet/google/gve/gve_adminq.c +++ b/drivers/net/ethernet/google/gve/gve_adminq.c @@ -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,39 @@ 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); } +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,17 +742,22 @@ 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); err = gve_adminq_issue_cmd(priv, &cmd); if (err) return err; @@ -745,6 +765,19 @@ static int gve_adminq_destroy_rx_queue(struct gve_priv *priv, u32 queue_index) return 0; } +int gve_adminq_destroy_single_rx_queue(struct gve_priv *priv, u32 queue_index) +{ + union gve_adminq_command cmd; + int err; + + gve_adminq_make_destroy_rx_queue_cmd(&cmd, queue_index); + err = gve_adminq_execute_cmd(priv, &cmd); + if (err) + return err; + + return 0; +} + int gve_adminq_destroy_rx_queues(struct gve_priv *priv, u32 num_queues) { int err; diff --git a/drivers/net/ethernet/google/gve/gve_adminq.h b/drivers/net/ethernet/google/gve/gve_adminq.h index beedf2353847..e64f0dbe744d 100644 --- a/drivers/net/ethernet/google/gve/gve_adminq.h +++ b/drivers/net/ethernet/google/gve/gve_adminq.h @@ -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);