All of lore.kernel.org
 help / color / mirror / Atom feed
* [Intel-wired-lan] Tuning the napi_poll function.
@ 2017-09-07 14:56 Kushal Gautam
  2017-09-07 15:52 ` Duyck, Alexander H
  0 siblings, 1 reply; 6+ messages in thread
From: Kushal Gautam @ 2017-09-07 14:56 UTC (permalink / raw)
  To: intel-wired-lan

I have gone through multiple posts (in and outside Stackoverflow) regarding
this topic. Currently, I am working on to modify the i40e-2.0.30 driver for
Intel X710 NIC.

My query is particularly concerned with the NAPI Poll mechanism. I
understand that napi_poll function is triggered when a packet arrives, and
if the amount of work done while receiving the packets exceeds the
allocated budget, NAPI Polling continues; else polling stops.

Based on this information, I modified my driver to keep polling if a
particular signature of data arrives on a particular queue ( using flow
director), e.g. UDP Packets on Port XXX for 10,000 poll cycles. But, I am
trying to eliminate the possibility of interrupts as much as possible.

Thus, here is my main question. Will I be able to schedule the NAPI poll to
be executed at a certain point in time ? Like, I want NAPI poll to be
executed every 500 ms and may be last for 20ms. For instance, I will be
expecting my packet at time *T ms*, while I might start the polling at
time *(T-10)
ms* and stop polling at *(T + 10) ms*. This may, I might be able to reduce
the usage of interrupts. Right now, I have been resetting the interrupts
every 10,000 poll cycles.

Any explanation or reference on this would be really helpful.


Regards,
Kushal.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osuosl.org/pipermail/intel-wired-lan/attachments/20170907/8698f32f/attachment.html>

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [Intel-wired-lan] Tuning the napi_poll function.
  2017-09-07 14:56 [Intel-wired-lan] Tuning the napi_poll function Kushal Gautam
@ 2017-09-07 15:52 ` Duyck, Alexander H
  2017-09-10 18:07   ` Kushal Gautam
  0 siblings, 1 reply; 6+ messages in thread
From: Duyck, Alexander H @ 2017-09-07 15:52 UTC (permalink / raw)
  To: intel-wired-lan

On Thu, 2017-09-07 at 16:56 +0200, Kushal Gautam wrote:

I have gone through multiple posts (in and outside Stackoverflow) regarding this topic. Currently, I am working on to modify the i40e-2.0.30 driver for Intel X710 NIC.

My query is particularly concerned with the NAPI Poll mechanism. I understand that napi_poll function is triggered when a packet arrives, and if the amount of work done while receiving the packets exceeds the allocated budget, NAPI Polling continues; else polling stops.

Based on this information, I modified my driver to keep polling if a particular signature of data arrives on a particular queue ( using flow director), e.g. UDP Packets on Port XXX for 10,000 poll cycles. But, I am trying to eliminate the possibility of interrupts as much as possible.

Have you looked at busy polling at all? If you have a socket application listening for those packets it might be able to use busy polling to keep NAPI going by having the application itself poll for the packets instead of relying on an interrupt to initiate polling.

One caveat with the X710 though is that it will need to have interrupts enabled while busy polling is running in order to trigger descriptor flushes when there are 3 or fewer descriptors (or packets assuming frame size <= 1514) that need to be written back to memory from the device. We are investigating to see if there is a way to optimize this behavior to avoid unnecessary re-enabling of the interrupts, but we don't have any ETA on when we might have patches to do that available.


Thus, here is my main question. Will I be able to schedule the NAPI poll to be executed at a certain point in time ? Like, I want NAPI poll to be executed every 500 ms and may be last for 20ms. For instance, I will be expecting my packet at time T ms, while I might start the polling at time (T-10) ms and stop polling at (T + 10) ms. This may, I might be able to reduce the usage of interrupts. Right now, I have been resetting the interrupts every 10,000 poll cycles.

Any explanation or reference on this would be really helpful.

As far as having NAPI execute every 500ms probably the easiest way to do that would be to just drop the use of the device interrupts and instead setup a timer and have the timer schedule NAPI for the queue from the timer interrupt.

Other than the i40e driver in the kernel you might also want to look at the i40e code for the DPDK driver@http://www.dpdk.org/browse/dpdk-stable/tree/drivers/net/i40e. The reason I suggest that is that DPDK can use a poll mode driver similar to what you have described in order to allow a userspace process to poll for packets on the device. You may be able to review that code to get a better idea of how to implement your own poll mode driver.



Regards,
Kushal.

Thanks.

- Alex
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osuosl.org/pipermail/intel-wired-lan/attachments/20170907/d3104d7b/attachment-0001.html>

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [Intel-wired-lan] Tuning the napi_poll function.
  2017-09-07 15:52 ` Duyck, Alexander H
@ 2017-09-10 18:07   ` Kushal Gautam
  2017-09-10 18:09     ` Kushal Gautam
  2017-09-11 15:51     ` Alexander Duyck
  0 siblings, 2 replies; 6+ messages in thread
From: Kushal Gautam @ 2017-09-10 18:07 UTC (permalink / raw)
  To: intel-wired-lan

Hi Alex,

Thank you for your response.


> Have you looked at busy polling at all?


Will X710 support busy poll at all? I guess, it has support for Mellanox,
right ? And for the time being, my access is restricted to only one NIC.

Other than the i40e driver in the kernel you might also want to look at the
> i40e code for the DPDK driver


Yes, I had looked at the i40e driver from the Kernel source tree.
Surprisingly, the flow director in that driver package seems to have flaws.
I had posted about this issue in this mailing list well as Intel Community
forum as well. But, there was no particular solution on this problem. Thus,
I switched to i40e-2.0.30.
Regarding DPDK. yes, I looked at it too. Essentially, I did understand the
logic for it (regarding the memory allocation and stuffs), but I could not
understand the polling mode properly, since they have completely revamped
the driver code. May be, for this I should post in the DPDK forum once.

 As far as having NAPI execute every 500ms probably the easiest way to do
> that would be to just drop the use of the device interrupts and instead
> setup a timer and have the timer schedule NAPI for the queue from the timer
> interrupt


Yes, based on your suggestions, for the time being, I have set an HR Timer
for given xx ms time interval. The timer tick handler works fine enough.
But the issue that I am facing right now is to invoke NAPI Poll at every
timer tick handler event. At the interval elapsed event, I have called
napi_schedule(napi);. This simply does not trigger napi poll  I thougth, it
would do that( as I saw similar invocatio in Do I need to take care of
other variables as well ? I tried changing the napi->state as napi->state =
1 ( as it was set to 0). But this stalls the system. A solution to this
issue would give me a preliminary progress to monitor my result.

Any inputs on this would be very helpful.

Thanks,
Kushal.

On Thu, Sep 7, 2017 at 5:52 PM, Duyck, Alexander H <
alexander.h.duyck@intel.com> wrote:

> On Thu, 2017-09-07 at 16:56 +0200, Kushal Gautam wrote:
>
> I have gone through multiple posts (in and outside Stackoverflow)
> regarding this topic. Currently, I am working on to modify the i40e-2.0.30
> driver for Intel X710 NIC.
>
> My query is particularly concerned with the NAPI Poll mechanism. I
> understand that napi_poll function is triggered when a packet arrives, and
> if the amount of work done while receiving the packets exceeds the
> allocated budget, NAPI Polling continues; else polling stops.
>
> Based on this information, I modified my driver to keep polling if a
> particular signature of data arrives on a particular queue ( using flow
> director), e.g. UDP Packets on Port XXX for 10,000 poll cycles. But, I am
> trying to eliminate the possibility of interrupts as much as possible.
>
> Have you looked at busy polling at all? If you have a socket application
> listening for those packets it might be able to use busy polling to keep
> NAPI going by having the application itself poll for the packets instead of
> relying on an interrupt to initiate polling.
>
> One caveat with the X710 though is that it will need to have interrupts
> enabled while busy polling is running in order to trigger descriptor
> flushes when there are 3 or fewer descriptors (or packets assuming frame
> size <= 1514) that need to be written back to memory from the device. We
> are investigating to see if there is a way to optimize this behavior to
> avoid unnecessary re-enabling of the interrupts, but we don't have any ETA
> on when we might have patches to do that available.
>
> Thus, here is my main question. Will I be able to schedule the NAPI poll
> to be executed at a certain point in time ? Like, I want NAPI poll to be
> executed every 500 ms and may be last for 20ms. For instance, I will be
> expecting my packet at time *T ms*, while I might start the polling at
> time *(T-10) ms* and stop polling at *(T + 10) ms*. This may, I might be
> able to reduce the usage of interrupts. Right now, I have been resetting
> the interrupts every 10,000 poll cycles.
>
> Any explanation or reference on this would be really helpful.
>
> As far as having NAPI execute every 500ms probably the easiest way to do
> that would be to just drop the use of the device interrupts and instead
> setup a timer and have the timer schedule NAPI for the queue from the timer
> interrupt.
>
> Other than the i40e driver in the kernel you might also want to look at
> the i40e code for the DPDK driver at http://www.dpdk.org/browse/
> dpdk-stable/tree/drivers/net/i40e. The reason I suggest that is that DPDK
> can use a poll mode driver similar to what you have described in order to
> allow a userspace process to poll for packets on the device. You may be
> able to review that code to get a better idea of how to implement your own
> poll mode driver.
>
>
> Regards,
> Kushal.
>
>
> Thanks.
>
> - Alex
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osuosl.org/pipermail/intel-wired-lan/attachments/20170910/ee2b3d3f/attachment.html>

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [Intel-wired-lan] Tuning the napi_poll function.
  2017-09-10 18:07   ` Kushal Gautam
@ 2017-09-10 18:09     ` Kushal Gautam
  2017-09-11 15:51     ` Alexander Duyck
  1 sibling, 0 replies; 6+ messages in thread
From: Kushal Gautam @ 2017-09-10 18:09 UTC (permalink / raw)
  To: intel-wired-lan

Hi again, sorry for the last paragraph, it was sent by mistake. I was on my
way to complete my sentence.

Yes, based on your suggestions, for the time being, I have set an HR Timer
> for given xx ms time interval. The timer tick handler works fine enough.
> But the issue that I am facing right now is to invoke NAPI Poll at every
> timer tick handler event. At the interval elapsed event, I have called
> napi_schedule(napi);. This simply does not trigger napi poll  I thougth,
> it would do that( as I saw similar invocatio in Do I need to take care of
> other variables as well ? I tried changing the napi->state as napi->state =
> 1 ( as it was set to 0). But this stalls the system. A solution to this
> issue would give me a preliminary progress to monitor my result.


 I thougth, it would do that( as I saw similar invocatio


I saw similar method in i40e_msix_clean_rings(int irq, void *data) function.

Thanks,
Kushal.

On Sun, Sep 10, 2017 at 8:07 PM, Kushal Gautam <kushal.gautam@gmail.com>
wrote:

> Hi Alex,
>
> Thank you for your response.
>
>
>> Have you looked at busy polling at all?
>
>
> Will X710 support busy poll at all? I guess, it has support for Mellanox,
> right ? And for the time being, my access is restricted to only one NIC.
>
> Other than the i40e driver in the kernel you might also want to look at
>> the i40e code for the DPDK driver
>
>
> Yes, I had looked at the i40e driver from the Kernel source tree.
> Surprisingly, the flow director in that driver package seems to have flaws.
> I had posted about this issue in this mailing list well as Intel Community
> forum as well. But, there was no particular solution on this problem. Thus,
> I switched to i40e-2.0.30.
> Regarding DPDK. yes, I looked at it too. Essentially, I did understand the
> logic for it (regarding the memory allocation and stuffs), but I could not
> understand the polling mode properly, since they have completely revamped
> the driver code. May be, for this I should post in the DPDK forum once.
>
>  As far as having NAPI execute every 500ms probably the easiest way to do
>> that would be to just drop the use of the device interrupts and instead
>> setup a timer and have the timer schedule NAPI for the queue from the timer
>> interrupt
>
>
> Yes, based on your suggestions, for the time being, I have set an HR Timer
> for given xx ms time interval. The timer tick handler works fine enough.
> But the issue that I am facing right now is to invoke NAPI Poll at every
> timer tick handler event. At the interval elapsed event, I have called
> napi_schedule(napi);. This simply does not trigger napi poll  I thougth,
> it would do that( as I saw similar invocatio in Do I need to take care of
> other variables as well ? I tried changing the napi->state as napi->state =
> 1 ( as it was set to 0). But this stalls the system. A solution to this
> issue would give me a preliminary progress to monitor my result.
>
> Any inputs on this would be very helpful.
>
> Thanks,
> Kushal.
>
> On Thu, Sep 7, 2017 at 5:52 PM, Duyck, Alexander H <
> alexander.h.duyck at intel.com> wrote:
>
>> On Thu, 2017-09-07 at 16:56 +0200, Kushal Gautam wrote:
>>
>> I have gone through multiple posts (in and outside Stackoverflow)
>> regarding this topic. Currently, I am working on to modify the i40e-2.0.30
>> driver for Intel X710 NIC.
>>
>> My query is particularly concerned with the NAPI Poll mechanism. I
>> understand that napi_poll function is triggered when a packet arrives, and
>> if the amount of work done while receiving the packets exceeds the
>> allocated budget, NAPI Polling continues; else polling stops.
>>
>> Based on this information, I modified my driver to keep polling if a
>> particular signature of data arrives on a particular queue ( using flow
>> director), e.g. UDP Packets on Port XXX for 10,000 poll cycles. But, I am
>> trying to eliminate the possibility of interrupts as much as possible.
>>
>> Have you looked at busy polling at all? If you have a socket application
>> listening for those packets it might be able to use busy polling to keep
>> NAPI going by having the application itself poll for the packets instead of
>> relying on an interrupt to initiate polling.
>>
>> One caveat with the X710 though is that it will need to have interrupts
>> enabled while busy polling is running in order to trigger descriptor
>> flushes when there are 3 or fewer descriptors (or packets assuming frame
>> size <= 1514) that need to be written back to memory from the device. We
>> are investigating to see if there is a way to optimize this behavior to
>> avoid unnecessary re-enabling of the interrupts, but we don't have any ETA
>> on when we might have patches to do that available.
>>
>> Thus, here is my main question. Will I be able to schedule the NAPI poll
>> to be executed at a certain point in time ? Like, I want NAPI poll to be
>> executed every 500 ms and may be last for 20ms. For instance, I will be
>> expecting my packet at time *T ms*, while I might start the polling at
>> time *(T-10) ms* and stop polling at *(T + 10) ms*. This may, I might be
>> able to reduce the usage of interrupts. Right now, I have been resetting
>> the interrupts every 10,000 poll cycles.
>>
>> Any explanation or reference on this would be really helpful.
>>
>> As far as having NAPI execute every 500ms probably the easiest way to do
>> that would be to just drop the use of the device interrupts and instead
>> setup a timer and have the timer schedule NAPI for the queue from the timer
>> interrupt.
>>
>> Other than the i40e driver in the kernel you might also want to look at
>> the i40e code for the DPDK driver at http://www.dpdk.org/browse/dpd
>> k-stable/tree/drivers/net/i40e. The reason I suggest that is that DPDK
>> can use a poll mode driver similar to what you have described in order to
>> allow a userspace process to poll for packets on the device. You may be
>> able to review that code to get a better idea of how to implement your own
>> poll mode driver.
>>
>>
>> Regards,
>> Kushal.
>>
>>
>> Thanks.
>>
>> - Alex
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osuosl.org/pipermail/intel-wired-lan/attachments/20170910/702dffbc/attachment-0001.html>

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [Intel-wired-lan] Tuning the napi_poll function.
  2017-09-10 18:07   ` Kushal Gautam
  2017-09-10 18:09     ` Kushal Gautam
@ 2017-09-11 15:51     ` Alexander Duyck
  2017-09-12 16:11       ` Kushal Gautam
  1 sibling, 1 reply; 6+ messages in thread
From: Alexander Duyck @ 2017-09-11 15:51 UTC (permalink / raw)
  To: intel-wired-lan

On Sun, Sep 10, 2017 at 11:07 AM, Kushal Gautam <kushal.gautam@gmail.com> wrote:
> Hi Alex,
>
> Thank you for your response.
>
>>
>> Have you looked at busy polling at all?
>
>
> Will X710 support busy poll at all? I guess, it has support for Mellanox,
> right ? And for the time being, my access is restricted to only one NIC.

It depends on the kernel version you are working with. Old kernels
will not support it. But anything based on the 4.11 and later kernels
will support it for all devices that support NAPI. See
https://netdevconf.org/2.1/slides/apr6/dumazet-BUSY-POLLING-Netdev-2.1.pdf
for more information.

>> Other than the i40e driver in the kernel you might also want to look at
>> the i40e code for the DPDK driver
>
>
> Yes, I had looked at the i40e driver from the Kernel source tree.
> Surprisingly, the flow director in that driver package seems to have flaws.
> I had posted about this issue in this mailing list well as Intel Community
> forum as well. But, there was no particular solution on this problem. Thus,
> I switched to i40e-2.0.30.

Could you send me a link to the thread in regards to the flow director
flaws? I can't seem to find any reference to it anywhere on this list.

> Regarding DPDK. yes, I looked at it too. Essentially, I did understand the
> logic for it (regarding the memory allocation and stuffs), but I could not
> understand the polling mode properly, since they have completely revamped
> the driver code. May be, for this I should post in the DPDK forum once.

It might be worthwhile. If your application is mostly user space
driven you may be able to do something similar without having to
actually work within the kernel.

>>  As far as having NAPI execute every 500ms probably the easiest way to do
>> that would be to just drop the use of the device interrupts and instead
>> setup a timer and have the timer schedule NAPI for the queue from the timer
>> interrupt
>
>
> Yes, based on your suggestions, for the time being, I have set an HR Timer
> for given xx ms time interval. The timer tick handler works fine enough. But
> the issue that I am facing right now is to invoke NAPI Poll at every timer
> tick handler event. At the interval elapsed event, I have called
> napi_schedule(napi);. This simply does not trigger napi poll  I thougth, it
> would do that( as I saw similar invocatio in Do I need to take care of other
> variables as well ? I tried changing the napi->state as napi->state = 1 ( as
> it was set to 0). But this stalls the system. A solution to this issue would
> give me a preliminary progress to monitor my result.

You are losing me on "napi->state". The value of napi->state is a
bitmask that consists of multiple bits called out via an enumerated
type. The easiest way to find the states might be to look in
include/linux/netdevice.h. Just changing the state itself doesn't do
anything. What happens is when we call napi_schedule(napi) it in turn
will attempt to test for and set the sched bit which should transition
the state value to 1.

You might need to better familiarize yourself with the napi_schedule,
napi_schedule_prep, and __napi_schedule functions before you get too
deep into this. You might then have an easier time getting this
working for you.

Also you should probably make certain you are still following all the
correct steps for enabling the napi polling structure for the
interface as it sounds like there might be a step somewhere that was
missed.

> Any inputs on this would be very helpful.
>
> Thanks,
> Kushal.
>
> On Thu, Sep 7, 2017 at 5:52 PM, Duyck, Alexander H
> <alexander.h.duyck@intel.com> wrote:
>>
>> On Thu, 2017-09-07 at 16:56 +0200, Kushal Gautam wrote:
>>
>> I have gone through multiple posts (in and outside Stackoverflow)
>> regarding this topic. Currently, I am working on to modify the i40e-2.0.30
>> driver for Intel X710 NIC.
>>
>> My query is particularly concerned with the NAPI Poll mechanism. I
>> understand that napi_poll function is triggered when a packet arrives, and
>> if the amount of work done while receiving the packets exceeds the allocated
>> budget, NAPI Polling continues; else polling stops.
>>
>> Based on this information, I modified my driver to keep polling if a
>> particular signature of data arrives on a particular queue ( using flow
>> director), e.g. UDP Packets on Port XXX for 10,000 poll cycles. But, I am
>> trying to eliminate the possibility of interrupts as much as possible.
>>
>> Have you looked at busy polling at all? If you have a socket application
>> listening for those packets it might be able to use busy polling to keep
>> NAPI going by having the application itself poll for the packets instead of
>> relying on an interrupt to initiate polling.
>>
>> One caveat with the X710 though is that it will need to have interrupts
>> enabled while busy polling is running in order to trigger descriptor flushes
>> when there are 3 or fewer descriptors (or packets assuming frame size <=
>> 1514) that need to be written back to memory from the device. We are
>> investigating to see if there is a way to optimize this behavior to avoid
>> unnecessary re-enabling of the interrupts, but we don't have any ETA on when
>> we might have patches to do that available.
>>
>> Thus, here is my main question. Will I be able to schedule the NAPI poll
>> to be executed at a certain point in time ? Like, I want NAPI poll to be
>> executed every 500 ms and may be last for 20ms. For instance, I will be
>> expecting my packet at time T ms, while I might start the polling at time
>> (T-10) ms and stop polling at (T + 10) ms. This may, I might be able to
>> reduce the usage of interrupts. Right now, I have been resetting the
>> interrupts every 10,000 poll cycles.
>>
>> Any explanation or reference on this would be really helpful.
>>
>> As far as having NAPI execute every 500ms probably the easiest way to do
>> that would be to just drop the use of the device interrupts and instead
>> setup a timer and have the timer schedule NAPI for the queue from the timer
>> interrupt.
>>
>> Other than the i40e driver in the kernel you might also want to look at
>> the i40e code for the DPDK driver at
>> http://www.dpdk.org/browse/dpdk-stable/tree/drivers/net/i40e. The reason I
>> suggest that is that DPDK can use a poll mode driver similar to what you
>> have described in order to allow a userspace process to poll for packets on
>> the device. You may be able to review that code to get a better idea of how
>> to implement your own poll mode driver.
>>
>>
>> Regards,
>> Kushal.
>>
>>
>> Thanks.
>>
>> - Alex
>
>
>
> _______________________________________________
> Intel-wired-lan mailing list
> Intel-wired-lan at osuosl.org
> https://lists.osuosl.org/mailman/listinfo/intel-wired-lan
>

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [Intel-wired-lan] Tuning the napi_poll function.
  2017-09-11 15:51     ` Alexander Duyck
@ 2017-09-12 16:11       ` Kushal Gautam
  0 siblings, 0 replies; 6+ messages in thread
From: Kushal Gautam @ 2017-09-12 16:11 UTC (permalink / raw)
  To: intel-wired-lan

>
> It depends on the kernel version you are working with. Old kernels
> will not support it. But anything based on the 4.11 and later kernels
> will support it for all devices that support NAPI. See
> https://netdevconf.org/2.1/slides/apr6/dumazet-BUSY-POLLING-Netdev-2.1.pdf
> for more information.


Thanks for this reference. I checked the supported drivers and the drivers
source code (extracted from the Kernel Source Tree 4.12.12)  as well. Looks
like my NIC/driver doesn't have support for this. The ixgbe does support
busy poll though.

Could you send me a link to the thread in regards to the flow director
> flaws? I can't seem to find any reference to it anywhere on this list.

I checked that again. Looks like my mail was bounced. But,  May be I will
try that after upgrading my Kernel. Let's see. If it does not work again, I
will open the issue again in this mailing list.

It might be worthwhile. If your application is mostly user space
> driven you may be able to do something similar without having to
> actually work within the kernel.

Yeah, the performance of DPDK is promising. But, for the time being I am
not using a userspace application. Rather I am using it via a Kernel
module. But, yes you are right; cracking the concept of the PMD in DPDK
would be useful.

You are losing me on "napi->state". The value of napi->state is a
> bitmask that consists of multiple bits called out via an enumerated
> type. The easiest way to find the states might be to look in
> include/linux/netdevice.h. Just changing the state itself doesn't do
> anything. What happens is when we call napi_schedule(napi) it in turn
> will attempt to test for and set the sched bit which should transition
> the state value to 1.


Yes, after posting this email, I did look into it again. My NAPI poll is
executed periodically with an average periodic interval of 65 rdtsc(s) ( I
am doing my measurements with rdtsc right now). But, the issue that I am
facing right now is; upon the arrival of a packet my NAPI poll is taken
over by the interrupt (which I think should not be the case). I think my
poll scheduling has gone wrong somewhere. I am trying to figure this out
and as per your suggestions, I looked at the Kernel sources too. Things got
clearer.

I have few other confusions, but I will prepare on those things first from
my side and get back to the discussion.

Again, many thanks for your inputs.

Regards,
Kushal.

On Mon, Sep 11, 2017 at 5:51 PM, Alexander Duyck <alexander.duyck@gmail.com>
wrote:

> On Sun, Sep 10, 2017 at 11:07 AM, Kushal Gautam <kushal.gautam@gmail.com>
> wrote:
> > Hi Alex,
> >
> > Thank you for your response.
> >
> >>
> >> Have you looked at busy polling at all?
> >
> >
> > Will X710 support busy poll at all? I guess, it has support for Mellanox,
> > right ? And for the time being, my access is restricted to only one NIC.
>
> It depends on the kernel version you are working with. Old kernels
> will not support it. But anything based on the 4.11 and later kernels
> will support it for all devices that support NAPI. See
> https://netdevconf.org/2.1/slides/apr6/dumazet-BUSY-POLLING-Netdev-2.1.pdf
> for more information.
>
> >> Other than the i40e driver in the kernel you might also want to look at
> >> the i40e code for the DPDK driver
> >
> >
> > Yes, I had looked at the i40e driver from the Kernel source tree.
> > Surprisingly, the flow director in that driver package seems to have
> flaws.
> > I had posted about this issue in this mailing list well as Intel
> Community
> > forum as well. But, there was no particular solution on this problem.
> Thus,
> > I switched to i40e-2.0.30.
>
> Could you send me a link to the thread in regards to the flow director
> flaws? I can't seem to find any reference to it anywhere on this list.
>
> > Regarding DPDK. yes, I looked at it too. Essentially, I did understand
> the
> > logic for it (regarding the memory allocation and stuffs), but I could
> not
> > understand the polling mode properly, since they have completely revamped
> > the driver code. May be, for this I should post in the DPDK forum once.
>
> It might be worthwhile. If your application is mostly user space
> driven you may be able to do something similar without having to
> actually work within the kernel.
>
> >>  As far as having NAPI execute every 500ms probably the easiest way to
> do
> >> that would be to just drop the use of the device interrupts and instead
> >> setup a timer and have the timer schedule NAPI for the queue from the
> timer
> >> interrupt
> >
> >
> > Yes, based on your suggestions, for the time being, I have set an HR
> Timer
> > for given xx ms time interval. The timer tick handler works fine enough.
> But
> > the issue that I am facing right now is to invoke NAPI Poll at every
> timer
> > tick handler event. At the interval elapsed event, I have called
> > napi_schedule(napi);. This simply does not trigger napi poll  I thougth,
> it
> > would do that( as I saw similar invocatio in Do I need to take care of
> other
> > variables as well ? I tried changing the napi->state as napi->state = 1
> ( as
> > it was set to 0). But this stalls the system. A solution to this issue
> would
> > give me a preliminary progress to monitor my result.
>
> You are losing me on "napi->state". The value of napi->state is a
> bitmask that consists of multiple bits called out via an enumerated
> type. The easiest way to find the states might be to look in
> include/linux/netdevice.h. Just changing the state itself doesn't do
> anything. What happens is when we call napi_schedule(napi) it in turn
> will attempt to test for and set the sched bit which should transition
> the state value to 1.
>
> You might need to better familiarize yourself with the napi_schedule,
> napi_schedule_prep, and __napi_schedule functions before you get too
> deep into this. You might then have an easier time getting this
> working for you.
>
> Also you should probably make certain you are still following all the
> correct steps for enabling the napi polling structure for the
> interface as it sounds like there might be a step somewhere that was
> missed.
>
> > Any inputs on this would be very helpful.
> >
> > Thanks,
> > Kushal.
> >
> > On Thu, Sep 7, 2017 at 5:52 PM, Duyck, Alexander H
> > <alexander.h.duyck@intel.com> wrote:
> >>
> >> On Thu, 2017-09-07 at 16:56 +0200, Kushal Gautam wrote:
> >>
> >> I have gone through multiple posts (in and outside Stackoverflow)
> >> regarding this topic. Currently, I am working on to modify the
> i40e-2.0.30
> >> driver for Intel X710 NIC.
> >>
> >> My query is particularly concerned with the NAPI Poll mechanism. I
> >> understand that napi_poll function is triggered when a packet arrives,
> and
> >> if the amount of work done while receiving the packets exceeds the
> allocated
> >> budget, NAPI Polling continues; else polling stops.
> >>
> >> Based on this information, I modified my driver to keep polling if a
> >> particular signature of data arrives on a particular queue ( using flow
> >> director), e.g. UDP Packets on Port XXX for 10,000 poll cycles. But, I
> am
> >> trying to eliminate the possibility of interrupts as much as possible.
> >>
> >> Have you looked at busy polling at all? If you have a socket application
> >> listening for those packets it might be able to use busy polling to keep
> >> NAPI going by having the application itself poll for the packets
> instead of
> >> relying on an interrupt to initiate polling.
> >>
> >> One caveat with the X710 though is that it will need to have interrupts
> >> enabled while busy polling is running in order to trigger descriptor
> flushes
> >> when there are 3 or fewer descriptors (or packets assuming frame size <=
> >> 1514) that need to be written back to memory from the device. We are
> >> investigating to see if there is a way to optimize this behavior to
> avoid
> >> unnecessary re-enabling of the interrupts, but we don't have any ETA on
> when
> >> we might have patches to do that available.
> >>
> >> Thus, here is my main question. Will I be able to schedule the NAPI poll
> >> to be executed at a certain point in time ? Like, I want NAPI poll to be
> >> executed every 500 ms and may be last for 20ms. For instance, I will be
> >> expecting my packet at time T ms, while I might start the polling at
> time
> >> (T-10) ms and stop polling at (T + 10) ms. This may, I might be able to
> >> reduce the usage of interrupts. Right now, I have been resetting the
> >> interrupts every 10,000 poll cycles.
> >>
> >> Any explanation or reference on this would be really helpful.
> >>
> >> As far as having NAPI execute every 500ms probably the easiest way to do
> >> that would be to just drop the use of the device interrupts and instead
> >> setup a timer and have the timer schedule NAPI for the queue from the
> timer
> >> interrupt.
> >>
> >> Other than the i40e driver in the kernel you might also want to look at
> >> the i40e code for the DPDK driver at
> >> http://www.dpdk.org/browse/dpdk-stable/tree/drivers/net/i40e. The
> reason I
> >> suggest that is that DPDK can use a poll mode driver similar to what you
> >> have described in order to allow a userspace process to poll for
> packets on
> >> the device. You may be able to review that code to get a better idea of
> how
> >> to implement your own poll mode driver.
> >>
> >>
> >> Regards,
> >> Kushal.
> >>
> >>
> >> Thanks.
> >>
> >> - Alex
> >
> >
> >
> > _______________________________________________
> > Intel-wired-lan mailing list
> > Intel-wired-lan at osuosl.org
> > https://lists.osuosl.org/mailman/listinfo/intel-wired-lan
> >
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osuosl.org/pipermail/intel-wired-lan/attachments/20170912/9aa315ea/attachment.html>

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2017-09-12 16:11 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-09-07 14:56 [Intel-wired-lan] Tuning the napi_poll function Kushal Gautam
2017-09-07 15:52 ` Duyck, Alexander H
2017-09-10 18:07   ` Kushal Gautam
2017-09-10 18:09     ` Kushal Gautam
2017-09-11 15:51     ` Alexander Duyck
2017-09-12 16:11       ` Kushal Gautam

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.