netvsc: prefetch the first incoming ring element
In interrupt handler, prefetch the first incoming ring element so that it is in cache by the time NAPI poll gets to it. Signed-off-by: Stephen Hemminger <sthemmin@microsoft.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
37b9dfa0d8
commit
43bf99ce00
|
@ -30,6 +30,7 @@
|
||||||
#include <linux/if_ether.h>
|
#include <linux/if_ether.h>
|
||||||
#include <linux/vmalloc.h>
|
#include <linux/vmalloc.h>
|
||||||
#include <linux/rtnetlink.h>
|
#include <linux/rtnetlink.h>
|
||||||
|
#include <linux/prefetch.h>
|
||||||
|
|
||||||
#include <asm/sync_bitops.h>
|
#include <asm/sync_bitops.h>
|
||||||
|
|
||||||
|
@ -1265,10 +1266,15 @@ int netvsc_poll(struct napi_struct *napi, int budget)
|
||||||
void netvsc_channel_cb(void *context)
|
void netvsc_channel_cb(void *context)
|
||||||
{
|
{
|
||||||
struct netvsc_channel *nvchan = context;
|
struct netvsc_channel *nvchan = context;
|
||||||
|
struct vmbus_channel *channel = nvchan->channel;
|
||||||
|
struct hv_ring_buffer_info *rbi = &channel->inbound;
|
||||||
|
|
||||||
|
/* preload first vmpacket descriptor */
|
||||||
|
prefetch(hv_get_ring_buffer(rbi) + rbi->priv_read_index);
|
||||||
|
|
||||||
if (napi_schedule_prep(&nvchan->napi)) {
|
if (napi_schedule_prep(&nvchan->napi)) {
|
||||||
/* disable interupts from host */
|
/* disable interupts from host */
|
||||||
hv_begin_read(&nvchan->channel->inbound);
|
hv_begin_read(rbi);
|
||||||
|
|
||||||
__napi_schedule(&nvchan->napi);
|
__napi_schedule(&nvchan->napi);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue