On Wed, Jan 22, 2020 at 02:32:26PM +0000, Wang, Xiao W wrote:
> External Email
> 
> ----------------------------------------------------------------------
> Hi Kalra,
> 
> This patch is more about bug fix on user interrupt, no powering saving tuning.
> The target scenario is, a worker core is dealing with 2 Rx queues, and it go 
> sleep due to no traffic for some time,
> and then the first queue has new traffic arrived, and wakes up this core, so 
> this worker core is busy polling again.
> The issue is that even though the core comes to polling state, the second 
> queue will still send interrupt (if packet flushes in) to host.. This is what 
> the core doesn't need, and unnecessary MSIX messages can cause throughput to 
> degrade.
> 
> Best Regards,
> Xiao
> 

Hi Xiao

Thanks for the explaination, I tested the scenario as explained by you
with and without your patch. I do see a huge difference in no of interrupts
sent by other queues and it is worth avoiding these interrupts as they
have no significance. 

Thanks
Harman

Tested-by: Harman Kalra <hka...@marvell.com>

> > -----Original Message-----
> > From: Harman Kalra <hka...@marvell.com>
> > Sent: Wednesday, January 22, 2020 9:30 PM
> > To: Wang, Xiao W <xiao.w.w...@intel.com>
> > Cc: Hunt, David <david.h...@intel.com>; dev@dpdk.org; sta...@dpdk.org
> > Subject: Re: [dpdk-dev] [PATCH 2/2] l3fwd-power: fix interrupt disable
> > 
> > On Mon, Jan 20, 2020 at 10:06:57PM -0500, Xiao Wang wrote:
> > > Since all related queues' interrupts are turned on before epoll, we need
> > > to turn off all the interrupts after wakeup. This patch fixes the issue
> > > of only turning off the interrupted queues.
> > >
> > > Fixes: b736d64787fc ("examples/l3fwd-power: disable Rx interrupt when
> > waking up")
> > > Cc: sta...@dpdk.org
> > >
> > > Signed-off-by: Xiao Wang <xiao.w.w...@intel.com>
> > > ---
> > >  examples/l3fwd-power/main.c | 13 +++++++------
> > >  1 file changed, 7 insertions(+), 6 deletions(-)
> > >
> > > diff --git a/examples/l3fwd-power/main.c b/examples/l3fwd-power/main.c
> > > index ffcc7ecf4..e9b2cb5b3 100644
> > > --- a/examples/l3fwd-power/main.c
> > > +++ b/examples/l3fwd-power/main.c
> > > @@ -880,9 +880,6 @@ sleep_until_rx_interrupt(int num)
> > >           port_id = ((uintptr_t)data) >> CHAR_BIT;
> > >           queue_id = ((uintptr_t)data) &
> > >                   RTE_LEN2MASK(CHAR_BIT, uint8_t);
> > > -         rte_spinlock_lock(&(locks[port_id]));
> > > -         rte_eth_dev_rx_intr_disable(port_id, queue_id);
> > > -         rte_spinlock_unlock(&(locks[port_id]));
> > >           RTE_LOG(INFO, L3FWD_POWER,
> > >                   "lcore %u is waked up from rx interrupt on"
> > >                   " port %d queue %d\n",
> > > @@ -892,7 +889,7 @@ sleep_until_rx_interrupt(int num)
> > >   return 0;
> > >  }
> > >
> > > -static void turn_on_intr(struct lcore_conf *qconf)
> > > +static void turn_on_off_intr(struct lcore_conf *qconf, bool on)
> > >  {
> > >   int i;
> > >   struct lcore_rx_queue *rx_queue;
> > > @@ -905,7 +902,10 @@ static void turn_on_intr(struct lcore_conf *qconf)
> > >           queue_id = rx_queue->queue_id;
> > >
> > >           rte_spinlock_lock(&(locks[port_id]));
> > > -         rte_eth_dev_rx_intr_enable(port_id, queue_id);
> > > +         if (on)
> > > +                 rte_eth_dev_rx_intr_enable(port_id, queue_id);
> > > +         else
> > > +                 rte_eth_dev_rx_intr_disable(port_id, queue_id);
> > 
> > Hi Wang
> > 
> > I tested this patch on octeontx2 platform and have some queries
> > regarding the same:
> > Difference what I observed with this patch is, you are disabling
> > interrupts for all the queues handled by the core which woke up but
> > what is the advantage of doing so?
> > I dont see any difference wrt octeontx2, with and without this patch in
> > term of power saving. Can you please explain what I am missing.
> > 
> > Thanks
> > Harman
> > 
> > >           rte_spinlock_unlock(&(locks[port_id]));
> > >   }
> > >  }
> > > @@ -1340,9 +1340,10 @@ main_loop(__attribute__((unused)) void
> > *dummy)
> > >                   else {
> > >                           /* suspend until rx interrupt triggers */
> > >                           if (intr_en) {
> > > -                                 turn_on_intr(qconf);
> > > +                                 turn_on_off_intr(qconf, 1);
> > >                                   sleep_until_rx_interrupt(
> > >                                           qconf->n_rx_queue);
> > > +                                 turn_on_off_intr(qconf, 0);
> > >                                   /**
> > >                                    * start receiving packets immediately
> > >                                    */
> > > --
> > > 2.15.1
> > >

Reply via email to