diff mbox series

[v7,05/12] vhost_net: Add NetClientInfo prepare callback

Message ID 20220804182852.703398-6-eperezma@redhat.com
State New
Headers show
Series NIC vhost-vdpa state restore via Shadow CVQ | expand

Commit Message

Eugenio Perez Martin Aug. 4, 2022, 6:28 p.m. UTC
This is used by the backend to perform actions before the device is
started.

In particular, vdpa net use it to map CVQ buffers to the device, so it
can send control commands using them.

Signed-off-by: Eugenio Pérez <eperezma@redhat.com>
---
 include/net/net.h  | 2 ++
 hw/net/vhost_net.c | 7 +++++++
 2 files changed, 9 insertions(+)

Comments

Jason Wang Aug. 9, 2022, 6:53 a.m. UTC | #1
On Fri, Aug 5, 2022 at 2:29 AM Eugenio Pérez <eperezma@redhat.com> wrote:
>
> This is used by the backend to perform actions before the device is
> started.
>
> In particular, vdpa net use it to map CVQ buffers to the device, so it
> can send control commands using them.
>
> Signed-off-by: Eugenio Pérez <eperezma@redhat.com>
> ---
>  include/net/net.h  | 2 ++
>  hw/net/vhost_net.c | 7 +++++++
>  2 files changed, 9 insertions(+)
>
> diff --git a/include/net/net.h b/include/net/net.h
> index 523136c7ac..3416bb3d46 100644
> --- a/include/net/net.h
> +++ b/include/net/net.h
> @@ -44,6 +44,7 @@ typedef struct NICConf {
>
>  typedef void (NetPoll)(NetClientState *, bool enable);
>  typedef bool (NetCanReceive)(NetClientState *);
> +typedef int (NetPrepare)(NetClientState *);
>  typedef ssize_t (NetReceive)(NetClientState *, const uint8_t *, size_t);
>  typedef ssize_t (NetReceiveIOV)(NetClientState *, const struct iovec *, int);
>  typedef void (NetCleanup) (NetClientState *);
> @@ -71,6 +72,7 @@ typedef struct NetClientInfo {
>      NetReceive *receive_raw;
>      NetReceiveIOV *receive_iov;
>      NetCanReceive *can_receive;
> +    NetPrepare *prepare;

So it looks to me the function is paired with a stop that is
introduced in the following patch.

Maybe we should use "start/stop" instead of "prepare/stop"?

Thanks

>      NetCleanup *cleanup;
>      LinkStatusChanged *link_status_changed;
>      QueryRxFilter *query_rx_filter;
> diff --git a/hw/net/vhost_net.c b/hw/net/vhost_net.c
> index ccac5b7a64..e1150d7532 100644
> --- a/hw/net/vhost_net.c
> +++ b/hw/net/vhost_net.c
> @@ -244,6 +244,13 @@ static int vhost_net_start_one(struct vhost_net *net,
>      struct vhost_vring_file file = { };
>      int r;
>
> +    if (net->nc->info->prepare) {
> +        r = net->nc->info->prepare(net->nc);
> +        if (r < 0) {
> +            return r;
> +        }
> +    }
> +
>      r = vhost_dev_enable_notifiers(&net->dev, dev);
>      if (r < 0) {
>          goto fail_notifiers;
> --
> 2.31.1
>
Eugenio Perez Martin Aug. 9, 2022, 7:34 a.m. UTC | #2
On Tue, Aug 9, 2022 at 8:54 AM Jason Wang <jasowang@redhat.com> wrote:
>
> On Fri, Aug 5, 2022 at 2:29 AM Eugenio Pérez <eperezma@redhat.com> wrote:
> >
> > This is used by the backend to perform actions before the device is
> > started.
> >
> > In particular, vdpa net use it to map CVQ buffers to the device, so it
> > can send control commands using them.
> >
> > Signed-off-by: Eugenio Pérez <eperezma@redhat.com>
> > ---
> >  include/net/net.h  | 2 ++
> >  hw/net/vhost_net.c | 7 +++++++
> >  2 files changed, 9 insertions(+)
> >
> > diff --git a/include/net/net.h b/include/net/net.h
> > index 523136c7ac..3416bb3d46 100644
> > --- a/include/net/net.h
> > +++ b/include/net/net.h
> > @@ -44,6 +44,7 @@ typedef struct NICConf {
> >
> >  typedef void (NetPoll)(NetClientState *, bool enable);
> >  typedef bool (NetCanReceive)(NetClientState *);
> > +typedef int (NetPrepare)(NetClientState *);
> >  typedef ssize_t (NetReceive)(NetClientState *, const uint8_t *, size_t);
> >  typedef ssize_t (NetReceiveIOV)(NetClientState *, const struct iovec *, int);
> >  typedef void (NetCleanup) (NetClientState *);
> > @@ -71,6 +72,7 @@ typedef struct NetClientInfo {
> >      NetReceive *receive_raw;
> >      NetReceiveIOV *receive_iov;
> >      NetCanReceive *can_receive;
> > +    NetPrepare *prepare;
>
> So it looks to me the function is paired with a stop that is
> introduced in the following patch.
>
> Maybe we should use "start/stop" instead of "prepare/stop"?
>

Sure, I can prepare the next series with it.

Thanks!

> Thanks
>
> >      NetCleanup *cleanup;
> >      LinkStatusChanged *link_status_changed;
> >      QueryRxFilter *query_rx_filter;
> > diff --git a/hw/net/vhost_net.c b/hw/net/vhost_net.c
> > index ccac5b7a64..e1150d7532 100644
> > --- a/hw/net/vhost_net.c
> > +++ b/hw/net/vhost_net.c
> > @@ -244,6 +244,13 @@ static int vhost_net_start_one(struct vhost_net *net,
> >      struct vhost_vring_file file = { };
> >      int r;
> >
> > +    if (net->nc->info->prepare) {
> > +        r = net->nc->info->prepare(net->nc);
> > +        if (r < 0) {
> > +            return r;
> > +        }
> > +    }
> > +
> >      r = vhost_dev_enable_notifiers(&net->dev, dev);
> >      if (r < 0) {
> >          goto fail_notifiers;
> > --
> > 2.31.1
> >
>
diff mbox series

Patch

diff --git a/include/net/net.h b/include/net/net.h
index 523136c7ac..3416bb3d46 100644
--- a/include/net/net.h
+++ b/include/net/net.h
@@ -44,6 +44,7 @@  typedef struct NICConf {
 
 typedef void (NetPoll)(NetClientState *, bool enable);
 typedef bool (NetCanReceive)(NetClientState *);
+typedef int (NetPrepare)(NetClientState *);
 typedef ssize_t (NetReceive)(NetClientState *, const uint8_t *, size_t);
 typedef ssize_t (NetReceiveIOV)(NetClientState *, const struct iovec *, int);
 typedef void (NetCleanup) (NetClientState *);
@@ -71,6 +72,7 @@  typedef struct NetClientInfo {
     NetReceive *receive_raw;
     NetReceiveIOV *receive_iov;
     NetCanReceive *can_receive;
+    NetPrepare *prepare;
     NetCleanup *cleanup;
     LinkStatusChanged *link_status_changed;
     QueryRxFilter *query_rx_filter;
diff --git a/hw/net/vhost_net.c b/hw/net/vhost_net.c
index ccac5b7a64..e1150d7532 100644
--- a/hw/net/vhost_net.c
+++ b/hw/net/vhost_net.c
@@ -244,6 +244,13 @@  static int vhost_net_start_one(struct vhost_net *net,
     struct vhost_vring_file file = { };
     int r;
 
+    if (net->nc->info->prepare) {
+        r = net->nc->info->prepare(net->nc);
+        if (r < 0) {
+            return r;
+        }
+    }
+
     r = vhost_dev_enable_notifiers(&net->dev, dev);
     if (r < 0) {
         goto fail_notifiers;