[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [UNIKRAFT/LIBLWIP PATCH v3 3/3] lib/lwip: Enable poll only receive
Hi Sharan, looks good to me, thanks! Reviewed-by: Hugo Lefeuvre <hugo.lefeuvre@xxxxxxxxx> On Tue, 2020-07-21 at 17:32 +0200, Sharan Santhanam wrote: > The uknetdev library provides the way to check if interrupts are > supported on a uk_netdev. If the device does not support interrupt > the lwip stack would create a thread to poll the receive queue for > packets. > > Signed-off-by: Sharan Santhanam <sharan.santhanam@xxxxxxxxx> > --- > uknetdev.c | 91 ++++++++++++++++++++++++++++++++++++++++++++++---- > ------------ > 1 file changed, 68 insertions(+), 23 deletions(-) > > diff --git a/uknetdev.c b/uknetdev.c > index fe679e9..e6c9807 100644 > --- a/uknetdev.c > +++ b/uknetdev.c > @@ -64,6 +64,11 @@ > > struct lwip_netdev_data { > uint32_t features; > +#ifdef CONFIG_HAVE_SCHED > + struct uk_thread *poll_thread; /* Thread per device */ > + char *_name; /* Thread name */ > + struct uk_sched *sched; /* Scheduler information */ > +#endif /* CONFIG_HAVE_SCHED */ > }; > > /* > @@ -325,44 +330,84 @@ void uknetdev_poll_all(void) > > #else /* CONFIG_LWIP_NOTHREADS */ > > +static void _poll_netif(void *arg) > +{ > + struct netif *nf = (struct netif *) arg; > + > + while (1) { > + uknetdev_poll(nf); > + uk_sched_yield(); > + } > +} > + > static void uknetdev_updown(struct netif *nf) > { > struct uk_netdev *dev; > int ret; > + struct lwip_netdev_data *lwip_data; > > UK_ASSERT(nf); > dev = netif_to_uknetdev(nf); > UK_ASSERT(dev); > + lwip_data = (struct lwip_netdev_data *)dev->scratch_pad; > > /* Enable and disable interrupts according to netif's > up/down status */ > + > if (nf->flags & NETIF_FLAG_UP) { > - ret = uk_netdev_rxq_intr_enable(dev, 0); > - if (ret < 0) { > - LWIP_DEBUGF(NETIF_DEBUG, > - ("%s: %c%c%u: Failed to enable > rx interrrupt mode on netdev %u\n", > - __func__, nf->name[0], nf- > >name[1], > - nf->num, > uk_netdev_id_get(dev))); > + if (uk_netdev_rxintr_supported(lwip_data->features)) > { > + ret = uk_netdev_rxq_intr_enable(dev, 0); > + if (ret < 0) { > + LWIP_DEBUGF(NETIF_DEBUG, > + ("%s: %c%c%u: Failed > to enable rx interrupt mode on netdev %u\n", > + __func__, nf- > >name[0], > + nf->name[1], > + nf->num, > + uk_netdev_id_get(de > v))); > + } else { > + LWIP_DEBUGF(NETIF_DEBUG, > + ("%s: %c%c%u: Enabled rx > interrupt mode on netdev %u\n", > + __func__, nf- > >name[0], > + nf->name[1], > + nf->num, > + uk_netdev_id_get(de > v))); > + } > + > + if (ret == 1) { > + /* > + * uk_netdev_rxq_intr_enable() told > us that we > + * need to flush the receive queue > before > + * interrupts are enabled. For this > purpose > + * we do an initial poll. > + */ > + uknetdev_poll(nf); > + } > } else { > +#ifdef CONFIG_HAVE_SCHED > LWIP_DEBUGF(NETIF_DEBUG, > - ("%s: %c%c%u: Enabled rx > interrupt mode on netdev %u\n", > - __func__, nf->name[0], nf- > >name[1], > - nf->num, > uk_netdev_id_get(dev))); > - } > - > - if (ret == 1) { > - /* > - * uk_netdev_rxq_intr_enable() told us that > we need to > - * flush the receieve queue before > interrupts are > - * enabled. For this purpose we do an > initial poll. > - */ > - uknetdev_poll(nf); > + ("%s: Poll receive > enabled\n", > + __func__)); > + /* Create a thread */ > + lwip_data->sched = uk_sched_get_default(); > + UK_ASSERT(lwip_data->sched); > + lwip_data->poll_thread = > + uk_sched_thread_create(lwip_data- > >sched, NULL, > + NULL, > _poll_netif, nf); > +#else /* CONFIG_HAVE_SCHED */ > + uk_pr_warn("The netdevice does not support > interrupt. Ensure the netdevice is polled to receive packets"); > +#endif /* CONFIG_HAVE_SCHED */ > } > } else { > - uk_netdev_rxq_intr_disable(dev, 0); > - LWIP_DEBUGF(NETIF_DEBUG, > - ("%s: %c%c%u: Disabled rx interrupts on > netdev %u\n", > - __func__, nf->name[0], nf->name[1], > - nf->num, uk_netdev_id_get(dev))); > + /** > + * TODO: > + * Cleanup the thread on stopping the network > interface. > + */ > + if (uk_netdev_rxintr_supported(lwip_data->features)) > { > + uk_netdev_rxq_intr_disable(dev, 0); > + LWIP_DEBUGF(NETIF_DEBUG, > + ("%s: %c%c%u: Disabled rx > interrupts on netdev %u\n", > + __func__, nf->name[0], nf- > >name[1], > + nf->num, > uk_netdev_id_get(dev))); > + } > > } > }
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |