Skip to content
This repository has been archived by the owner on Sep 28, 2024. It is now read-only.

Commit

Permalink
Merge pull request #1 from seansp/hv_netsvc_use_reciprocal_divide_to_…
Browse files Browse the repository at this point in the history
…speed_up_computing_padding

Hv netsvc use reciprocal divide to speed up computing padding
  • Loading branch information
seansp authored Jan 6, 2018
2 parents fe2278e + f84245c commit c9c9a9e
Show file tree
Hide file tree
Showing 4 changed files with 21 additions and 27 deletions.
6 changes: 3 additions & 3 deletions hv-rhel7.x/hv/hyperv_net.h
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,6 @@ struct hv_netvsc_packet {

struct netvsc_device_info {
unsigned char mac_adr[ETH_ALEN];
int ring_size;
u32 num_chn;
u32 send_sections;
u32 recv_sections;
Expand Down Expand Up @@ -190,6 +189,9 @@ struct rndis_message;
struct netvsc_device;
struct net_device_context;

extern u32 netvsc_ring_bytes;
extern struct reciprocal_value netvsc_ring_reciprocal;

struct netvsc_device *netvsc_device_add(struct hv_device *device,
const struct netvsc_device_info *info);
int netvsc_alloc_recv_comp_ring(struct netvsc_device *net_device, u32 q_idx);
Expand Down Expand Up @@ -810,8 +812,6 @@ struct netvsc_device {

struct rndis_device *extension;

int ring_size;

u32 max_pkt; /* max number of pkt in one send, e.g. 8 */
u32 pkt_align; /* alignment bytes, e.g. 8 */

Expand Down
21 changes: 7 additions & 14 deletions hv-rhel7.x/hv/netvsc.c
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
#include <asm/sync_bitops.h>
#include <linux/rtnetlink.h>
#include <linux/prefetch.h>
#include <linux/reciprocal_div.h>

#include "hyperv_net.h"

Expand Down Expand Up @@ -593,14 +594,10 @@ void netvsc_device_remove(struct hv_device *device)
* Get the percentage of available bytes to write in the ring.
* The return value is in range from 0 to 100.
*/
static inline u32 hv_ringbuf_avail_percent(
struct hv_ring_buffer_info *ring_info)
static u32 hv_ringbuf_avail_percent(const struct hv_ring_buffer_info *ring_info)
{
u32 avail_read, avail_write;

hv_get_ringbuffer_availbytes(ring_info, &avail_read, &avail_write);

return avail_write * 100 / ring_info->ring_datasize;
u32 avail_write = hv_get_bytes_to_write(ring_info);
return reciprocal_divide(avail_write * 100, netvsc_ring_reciprocal);
}

static inline void netvsc_free_send_slot(struct netvsc_device *net_device,
Expand Down Expand Up @@ -1252,7 +1249,6 @@ struct netvsc_device *netvsc_device_add(struct hv_device *device,
const struct netvsc_device_info *device_info)
{
int i, ret = 0;
int ring_size = device_info->ring_size;
struct netvsc_device *net_device;
struct net_device *ndev = hv_get_drvdata(device);
struct net_device_context *net_device_ctx = netdev_priv(ndev);
Expand All @@ -1264,8 +1260,6 @@ struct netvsc_device *netvsc_device_add(struct hv_device *device,
for (i = 0; i < VRSS_SEND_TAB_SIZE; i++)
net_device_ctx->tx_table[i] = 0;

net_device->ring_size = ring_size;

/* Because the device uses NAPI, all the interrupt batching and
* control is done via Net softirq, not the channel handling
*/
Expand All @@ -1292,10 +1286,9 @@ struct netvsc_device *netvsc_device_add(struct hv_device *device,
netvsc_poll, NAPI_POLL_WEIGHT);

/* Open the channel */
ret = vmbus_open(device->channel, ring_size * PAGE_SIZE,
ring_size * PAGE_SIZE, NULL, 0,
netvsc_channel_cb,
net_device->chan_table);
ret = vmbus_open(device->channel, netvsc_ring_bytes,
netvsc_ring_bytes, NULL, 0,
netvsc_channel_cb, net_device->chan_table);

if (ret != 0) {
netif_napi_del(&net_device->chan_table[0].napi);
Expand Down
17 changes: 9 additions & 8 deletions hv-rhel7.x/hv/netvsc_drv.c
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
#include <linux/slab.h>
#include <linux/rtnetlink.h>
#include <linux/netpoll.h>
#include <linux/reciprocal_div.h>

#include <net/arp.h>
#include <net/route.h>
Expand All @@ -51,9 +52,11 @@
#define LINKCHANGE_INT (2 * HZ)
#define VF_TAKEOVER_INT (HZ / 10)

static int ring_size = 128;
module_param(ring_size, int, S_IRUGO);
static unsigned int ring_size = 128;
module_param(ring_size, uint, S_IRUGO);
MODULE_PARM_DESC(ring_size, "Ring buffer size (# of pages)");
unsigned int netvsc_ring_bytes;
struct reciprocal_value netvsc_ring_reciprocal;

static const u32 default_msg = NETIF_MSG_DRV | NETIF_MSG_PROBE |
NETIF_MSG_LINK | NETIF_MSG_IFUP |
Expand Down Expand Up @@ -906,7 +909,6 @@ static int netvsc_set_channels(struct net_device *net,

memset(&device_info, 0, sizeof(device_info));
device_info.num_chn = count;
device_info.ring_size = ring_size;
device_info.send_sections = nvdev->send_section_cnt;
device_info.send_section_size = nvdev->send_section_size;
device_info.recv_sections = nvdev->recv_section_cnt;
Expand Down Expand Up @@ -1023,7 +1025,6 @@ static int netvsc_change_mtu(struct net_device *ndev, int mtu)
rndis_filter_close(nvdev);

memset(&device_info, 0, sizeof(device_info));
device_info.ring_size = ring_size;
device_info.num_chn = nvdev->num_chn;
device_info.send_sections = nvdev->send_section_cnt;
device_info.send_section_size = nvdev->send_section_size;
Expand Down Expand Up @@ -1504,7 +1505,6 @@ static int netvsc_set_ringparam(struct net_device *ndev,

memset(&device_info, 0, sizeof(device_info));
device_info.num_chn = nvdev->num_chn;
device_info.ring_size = ring_size;
device_info.send_sections = new_tx;
device_info.send_section_size = nvdev->send_section_size;
device_info.recv_sections = new_rx;
Expand Down Expand Up @@ -1962,7 +1962,6 @@ static int netvsc_probe(struct hv_device *dev,

/* Notify the netvsc driver of the new device */
memset(&device_info, 0, sizeof(device_info));
device_info.ring_size = ring_size;
device_info.num_chn = VRSS_CHANNEL_DEFAULT;
device_info.send_sections = NETVSC_DEFAULT_TX;
device_info.send_section_size = NETVSC_SEND_SECTION_SIZE;
Expand Down Expand Up @@ -2122,11 +2121,13 @@ static int __init netvsc_drv_init(void)

if (ring_size < RING_SIZE_MIN) {
ring_size = RING_SIZE_MIN;
pr_info("Increased ring_size to %d (min allowed)\n",
pr_info("Increased ring_size to %u (min allowed)\n",
ring_size);
}
ret = vmbus_driver_register(&netvsc_drv);
netvsc_ring_bytes = ring_size * PAGE_SIZE;
netvsc_ring_reciprocal = reciprocal_value(netvsc_ring_bytes);

ret = vmbus_driver_register(&netvsc_drv);
if (ret)
return ret;

Expand Down
4 changes: 2 additions & 2 deletions hv-rhel7.x/hv/rndis_filter.c
Original file line number Diff line number Diff line change
Expand Up @@ -1041,8 +1041,8 @@ static void netvsc_sc_open(struct vmbus_channel *new_sc)
/* Set the channel before opening.*/
nvchan->channel = new_sc;

ret = vmbus_open(new_sc, nvscdev->ring_size * PAGE_SIZE,
nvscdev->ring_size * PAGE_SIZE, NULL, 0,
ret = vmbus_open(new_sc, netvsc_ring_bytes,
netvsc_ring_bytes, NULL, 0,
netvsc_channel_cb, nvchan);

if (ret == 0)
Expand Down

0 comments on commit c9c9a9e

Please sign in to comment.