Message ID | 1605748345-32062-10-git-send-email-tlfalcon@linux.ibm.com |
---|---|
State | New |
Headers | show |
Series | ibmvnic: Performance improvements and other updates | expand |
On 2020-11-18 19:12, Thomas Falcon wrote: > From: "Dwip N. Banerjee" <dnbanerg@us.ibm.com> > > Reduce the amount of time spent replenishing RX buffers by > only doing so once available buffers has fallen under a certain > threshold, in this case half of the total number of buffers, or > if the polling loop exits before the packets processed is less > than its budget. > > Signed-off-by: Dwip N. Banerjee <dnbanerg@us.ibm.com> > --- > drivers/net/ethernet/ibm/ibmvnic.c | 5 ++++- > 1 file changed, 4 insertions(+), 1 deletion(-) > > diff --git a/drivers/net/ethernet/ibm/ibmvnic.c > b/drivers/net/ethernet/ibm/ibmvnic.c > index 96df6d8fa277..9fe43ab0496d 100644 > --- a/drivers/net/ethernet/ibm/ibmvnic.c > +++ b/drivers/net/ethernet/ibm/ibmvnic.c > @@ -2537,7 +2537,10 @@ static int ibmvnic_poll(struct napi_struct > *napi, int budget) > frames_processed++; > } > > - if (adapter->state != VNIC_CLOSING) > + if (adapter->state != VNIC_CLOSING && > + ((atomic_read(&adapter->rx_pool[scrq_num].available) < > + adapter->req_rx_add_entries_per_subcrq / 2) || > + frames_processed < budget)) 1/2 seems a simple and good algorithm. Explaining why "frames_process < budget" is necessary in the commit message or source code also helps. > replenish_rx_pool(adapter, &adapter->rx_pool[scrq_num]); > if (frames_processed < budget) { > if (napi_complete_done(napi, frames_processed)) {
On 11/19/20 2:38 PM, ljp wrote: > On 2020-11-19 14:26, Thomas Falcon wrote: >> On 11/19/20 3:43 AM, ljp wrote: >> >>> On 2020-11-18 19:12, Thomas Falcon wrote: >>> >>>> From: "Dwip N. Banerjee" <dnbanerg@us.ibm.com> >>>> >>>> Reduce the amount of time spent replenishing RX buffers by >>>> only doing so once available buffers has fallen under a certain >>>> threshold, in this case half of the total number of buffers, or >>>> if the polling loop exits before the packets processed is less >>>> than its budget. >>>> >>>> Signed-off-by: Dwip N. Banerjee <dnbanerg@us.ibm.com> >>>> --- >>>> drivers/net/ethernet/ibm/ibmvnic.c | 5 ++++- >>>> 1 file changed, 4 insertions(+), 1 deletion(-) >>>> >>>> diff --git a/drivers/net/ethernet/ibm/ibmvnic.c >>>> b/drivers/net/ethernet/ibm/ibmvnic.c >>>> index 96df6d8fa277..9fe43ab0496d 100644 >>>> --- a/drivers/net/ethernet/ibm/ibmvnic.c >>>> +++ b/drivers/net/ethernet/ibm/ibmvnic.c >>>> @@ -2537,7 +2537,10 @@ static int ibmvnic_poll(struct napi_struct >>>> >>>> *napi, int budget) >>>> frames_processed++; >>>> } >>>> >>>> - if (adapter->state != VNIC_CLOSING) >>>> + if (adapter->state != VNIC_CLOSING && >>>> + ((atomic_read(&adapter->rx_pool[scrq_num].available) < >>>> + adapter->req_rx_add_entries_per_subcrq / 2) || >>>> + frames_processed < budget)) >>> >>> 1/2 seems a simple and good algorithm. >>> Explaining why "frames_process < budget" is necessary in the commit >>> message >>> or source code also helps. >> >> Hello, Lijun. The patch author, Dwip Banerjee, suggested the modified >> commit message below: >> >> Reduce the amount of time spent replenishing RX buffers by >> only doing so once available buffers has fallen under a certain >> threshold, in this case half of the total number of buffers, or >> if the polling loop exits before the packets processed is less >> than its budget. Non-exhaustion of NAPI budget implies lower >> incoming packet pressure, allowing the leeway to refill the buffers >> in preparation for any impending burst. > > It looks good to me. > >> >> Would such an update require a v3? > > I assume you ask Jakub, right? > > Yes. There was an issue with my mail client in my earlier response, so I am posting Dwip's modified commit message again below. Reduce the amount of time spent replenishing RX buffers by only doing so once available buffers has fallen under a certain threshold, in this case half of the total number of buffers, or if the polling loop exits before the packets processed is less than its budget. Non-exhaustion of NAPI budget implies lower incoming packet pressure, allowing the leeway to refill the buffers in preparation for any impending burst. >>>> replenish_rx_pool(adapter, &adapter->rx_pool[scrq_num]); >>>> if (frames_processed < budget) { >>>> if (napi_complete_done(napi, frames_processed)) {
diff --git a/drivers/net/ethernet/ibm/ibmvnic.c b/drivers/net/ethernet/ibm/ibmvnic.c index 96df6d8fa277..9fe43ab0496d 100644 --- a/drivers/net/ethernet/ibm/ibmvnic.c +++ b/drivers/net/ethernet/ibm/ibmvnic.c @@ -2537,7 +2537,10 @@ static int ibmvnic_poll(struct napi_struct *napi, int budget) frames_processed++; } - if (adapter->state != VNIC_CLOSING) + if (adapter->state != VNIC_CLOSING && + ((atomic_read(&adapter->rx_pool[scrq_num].available) < + adapter->req_rx_add_entries_per_subcrq / 2) || + frames_processed < budget)) replenish_rx_pool(adapter, &adapter->rx_pool[scrq_num]); if (frames_processed < budget) { if (napi_complete_done(napi, frames_processed)) {