netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [RFC PATCH] xen-netback: making the bandwidth limiter runtime settable
@ 2015-03-13 12:51 Imre Palik
  2015-03-17 11:17 ` Wei Liu
  2015-03-17 11:26 ` Ian Campbell
  0 siblings, 2 replies; 5+ messages in thread
From: Imre Palik @ 2015-03-13 12:51 UTC (permalink / raw)
  To: Ian Campbell, Wei Liu, xen-devel
  Cc: netdev, linux-kernel, Palik, Imre, Anthony Liguori

From: "Palik, Imre" <imrep@amazon.de>

With the current netback, the bandwidth limiter's parameters are only
settable during vif setup time.  This patch register a watch on them, and
thus makes them runtime changeable.

When the watch fires, the timer is reset.  The timer's mutex is used for
fencing the change.

Cc: Anthony Liguori <aliguori@amazon.com>
Signed-off-by: Imre Palik <imrep@amazon.de>
---
 drivers/net/xen-netback/common.h    |    4 ++
 drivers/net/xen-netback/interface.c |    1 +
 drivers/net/xen-netback/netback.c   |    4 +-
 drivers/net/xen-netback/xenbus.c    |   73 +++++++++++++++++++++++++++++++----
 4 files changed, 73 insertions(+), 9 deletions(-)

diff --git a/drivers/net/xen-netback/common.h b/drivers/net/xen-netback/common.h
index 589fa25..8a495b3 100644
--- a/drivers/net/xen-netback/common.h
+++ b/drivers/net/xen-netback/common.h
@@ -238,6 +238,8 @@ struct xenvif {
 	unsigned int num_queues; /* active queues, resource allocated */
 	unsigned int stalled_queues;
 
+	struct xenbus_watch credit_watch;
+
 	spinlock_t lock;
 
 #ifdef CONFIG_DEBUG_FS
@@ -260,6 +262,8 @@ static inline struct xenbus_device *xenvif_to_xenbus_device(struct xenvif *vif)
 	return to_xenbus_device(vif->dev->dev.parent);
 }
 
+void xenvif_tx_credit_callback(unsigned long data);
+
 struct xenvif *xenvif_alloc(struct device *parent,
 			    domid_t domid,
 			    unsigned int handle);
diff --git a/drivers/net/xen-netback/interface.c b/drivers/net/xen-netback/interface.c
index 3aa8648..34d8038 100644
--- a/drivers/net/xen-netback/interface.c
+++ b/drivers/net/xen-netback/interface.c
@@ -463,6 +463,7 @@ int xenvif_init_queue(struct xenvif_queue *queue)
 	queue->credit_bytes = queue->remaining_credit = ~0UL;
 	queue->credit_usec  = 0UL;
 	init_timer(&queue->credit_timeout);
+	queue->credit_timeout.function = xenvif_tx_credit_callback;
 	queue->credit_window_start = get_jiffies_64();
 
 	queue->rx_queue_max = XENVIF_RX_QUEUE_BYTES;
diff --git a/drivers/net/xen-netback/netback.c b/drivers/net/xen-netback/netback.c
index cab9f52..bcc1880 100644
--- a/drivers/net/xen-netback/netback.c
+++ b/drivers/net/xen-netback/netback.c
@@ -641,7 +641,7 @@ static void tx_add_credit(struct xenvif_queue *queue)
 	queue->remaining_credit = min(max_credit, max_burst);
 }
 
-static void tx_credit_callback(unsigned long data)
+void xenvif_tx_credit_callback(unsigned long data)
 {
 	struct xenvif_queue *queue = (struct xenvif_queue *)data;
 	tx_add_credit(queue);
@@ -1170,7 +1170,7 @@ static bool tx_credit_exceeded(struct xenvif_queue *queue, unsigned size)
 		queue->credit_timeout.data     =
 			(unsigned long)queue;
 		queue->credit_timeout.function =
-			tx_credit_callback;
+			xenvif_tx_credit_callback;
 		mod_timer(&queue->credit_timeout,
 			  next_credit);
 		queue->credit_window_start = next_credit;
diff --git a/drivers/net/xen-netback/xenbus.c b/drivers/net/xen-netback/xenbus.c
index 794204e..c6528de 100644
--- a/drivers/net/xen-netback/xenbus.c
+++ b/drivers/net/xen-netback/xenbus.c
@@ -41,6 +41,7 @@ static void connect(struct backend_info *be);
 static int read_xenbus_vif_flags(struct backend_info *be);
 static int backend_create_xenvif(struct backend_info *be);
 static void unregister_hotplug_status_watch(struct backend_info *be);
+static void xen_unregister_watchers(struct xenvif *vif);
 static void set_backend_state(struct backend_info *be,
 			      enum xenbus_state state);
 
@@ -232,6 +233,7 @@ static int netback_remove(struct xenbus_device *dev)
 	unregister_hotplug_status_watch(be);
 	if (be->vif) {
 		kobject_uevent(&dev->dev.kobj, KOBJ_OFFLINE);
+		xen_unregister_watchers(be->vif);
 		xenbus_rm(XBT_NIL, dev->nodename, "hotplug-status");
 		xenvif_free(be->vif);
 		be->vif = NULL;
@@ -430,6 +432,7 @@ static int backend_create_xenvif(struct backend_info *be)
 static void backend_disconnect(struct backend_info *be)
 {
 	if (be->vif) {
+		xen_unregister_watchers(be->vif);
 #ifdef CONFIG_DEBUG_FS
 		xenvif_debugfs_delif(be->vif);
 #endif /* CONFIG_DEBUG_FS */
@@ -594,13 +597,9 @@ static void xen_net_read_rate(struct xenbus_device *dev,
 	unsigned long b, u;
 	char *ratestr;
 
-	/* Default to unlimited bandwidth. */
-	*bytes = ~0UL;
-	*usec = 0;
-
 	ratestr = xenbus_read(XBT_NIL, dev->nodename, "rate", NULL);
 	if (IS_ERR(ratestr))
-		return;
+		goto reset;
 
 	s = ratestr;
 	b = simple_strtoul(s, &e, 10);
@@ -612,15 +611,21 @@ static void xen_net_read_rate(struct xenbus_device *dev,
 	if ((s == e) || (*e != '\0'))
 		goto fail;
 
+	kfree(ratestr);
+
 	*bytes = b;
 	*usec = u;
 
-	kfree(ratestr);
 	return;
 
- fail:
+fail:
 	pr_warn("Failed to parse network rate limit. Traffic unlimited.\n");
 	kfree(ratestr);
+
+reset:
+	/* Default to unlimited bandwidth. */
+	*bytes = ~0UL;
+	*usec = 0;
 }
 
 static int xen_net_read_mac(struct xenbus_device *dev, u8 mac[])
@@ -645,6 +650,59 @@ static int xen_net_read_mac(struct xenbus_device *dev, u8 mac[])
 	return 0;
 }
 
+static void xen_net_rate_changed(struct xenbus_watch *watch,
+				const char **vec, unsigned int len)
+{
+	struct xenvif *vif = container_of(watch, struct xenvif, credit_watch);
+	struct xenbus_device *dev = xenvif_to_xenbus_device(vif);
+	unsigned long   credit_bytes;
+	unsigned long   credit_usec;
+	unsigned int queue_index;
+
+	xen_net_read_rate(dev, &credit_bytes, &credit_usec);
+	for (queue_index = 0; queue_index < vif->num_queues; queue_index++) {
+		struct xenvif_queue *queue = &vif->queues[queue_index];
+
+		queue->credit_bytes = credit_bytes;
+		queue->credit_usec = credit_usec;
+		if (!mod_timer_pending(&queue->credit_timeout, jiffies) &&
+			queue->remaining_credit > queue->credit_bytes) {
+			queue->remaining_credit = queue->credit_bytes;
+		}
+	}
+}
+
+static int xen_register_watchers(struct xenbus_device *dev, struct xenvif *vif)
+{
+	int err = 0;
+	char *node;
+	unsigned maxlen = strlen(dev->nodename) + sizeof("/rate");
+
+	node = kmalloc(maxlen, GFP_KERNEL);
+	if (!node)
+		return -ENOMEM;
+	sprintf(node, "%s/rate", dev->nodename);
+	vif->credit_watch.node = node;
+	vif->credit_watch.callback = xen_net_rate_changed;
+	err = register_xenbus_watch(&vif->credit_watch);
+	if (err) {
+		pr_err("Failed to set watcher %s\n", vif->credit_watch.node);
+		kfree(node);
+		vif->credit_watch.node = 0;
+		vif->credit_watch.callback = 0;
+	}
+	return err;
+}
+
+static void xen_unregister_watchers(struct xenvif *vif)
+{
+	if (vif->credit_watch.node) {
+		unregister_xenbus_watch(&vif->credit_watch);
+		kfree(vif->credit_watch.node);
+		vif->credit_watch.node = NULL;
+	}
+}
+
 static void unregister_hotplug_status_watch(struct backend_info *be)
 {
 	if (be->have_hotplug_status_watch) {
@@ -709,6 +767,7 @@ static void connect(struct backend_info *be)
 	}
 
 	xen_net_read_rate(dev, &credit_bytes, &credit_usec);
+	xen_register_watchers(dev, be->vif);
 	read_xenbus_vif_flags(be);
 
 	/* Use the number of queues requested by the frontend */
-- 
1.7.9.5

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

* Re: [RFC PATCH] xen-netback: making the bandwidth limiter runtime settable
  2015-03-13 12:51 [RFC PATCH] xen-netback: making the bandwidth limiter runtime settable Imre Palik
@ 2015-03-17 11:17 ` Wei Liu
  2015-03-18 16:21   ` Imre Palik
  2015-03-17 11:26 ` Ian Campbell
  1 sibling, 1 reply; 5+ messages in thread
From: Wei Liu @ 2015-03-17 11:17 UTC (permalink / raw)
  To: Imre Palik
  Cc: Ian Campbell, Wei Liu, xen-devel, netdev, linux-kernel,
	Palik, Imre, Anthony Liguori

On Fri, Mar 13, 2015 at 01:51:05PM +0100, Imre Palik wrote:
> From: "Palik, Imre" <imrep@amazon.de>
> 
> With the current netback, the bandwidth limiter's parameters are only
> settable during vif setup time.  This patch register a watch on them, and
> thus makes them runtime changeable.
> 
> When the watch fires, the timer is reset.  The timer's mutex is used for
> fencing the change.
> 

I think this is a valid idea.  Just that this commit message is not
complete. It doesn't describe everything this patch does.

> Cc: Anthony Liguori <aliguori@amazon.com>
> Signed-off-by: Imre Palik <imrep@amazon.de>
> ---
[...]
>  	queue->rx_queue_max = XENVIF_RX_QUEUE_BYTES;
> diff --git a/drivers/net/xen-netback/netback.c b/drivers/net/xen-netback/netback.c
> index cab9f52..bcc1880 100644
> --- a/drivers/net/xen-netback/netback.c
> +++ b/drivers/net/xen-netback/netback.c
> @@ -641,7 +641,7 @@ static void tx_add_credit(struct xenvif_queue *queue)
>  	queue->remaining_credit = min(max_credit, max_burst);
>  }
>  
> -static void tx_credit_callback(unsigned long data)
> +void xenvif_tx_credit_callback(unsigned long data)

Please keep this function static.

And say in the commit message you change tx_credit_callback to a better
name.

>  {
>  	struct xenvif_queue *queue = (struct xenvif_queue *)data;
>  	tx_add_credit(queue);
> @@ -1170,7 +1170,7 @@ static bool tx_credit_exceeded(struct xenvif_queue *queue, unsigned size)
>  		queue->credit_timeout.data     =
>  			(unsigned long)queue;
>  		queue->credit_timeout.function =
> -			tx_credit_callback;
> +			xenvif_tx_credit_callback;
>  		mod_timer(&queue->credit_timeout,
>  			  next_credit);
[...]
> @@ -594,13 +597,9 @@ static void xen_net_read_rate(struct xenbus_device *dev,
>  	unsigned long b, u;
>  	char *ratestr;
>  
> -	/* Default to unlimited bandwidth. */
> -	*bytes = ~0UL;
> -	*usec = 0;
> -
>  	ratestr = xenbus_read(XBT_NIL, dev->nodename, "rate", NULL);
>  	if (IS_ERR(ratestr))
> -		return;
> +		goto reset;
>  
>  	s = ratestr;
>  	b = simple_strtoul(s, &e, 10);
> @@ -612,15 +611,21 @@ static void xen_net_read_rate(struct xenbus_device *dev,
>  	if ((s == e) || (*e != '\0'))
>  		goto fail;
>  
> +	kfree(ratestr);
> +
>  	*bytes = b;
>  	*usec = u;
>  
> -	kfree(ratestr);
>  	return;
>  
> - fail:
> +fail:
>  	pr_warn("Failed to parse network rate limit. Traffic unlimited.\n");
>  	kfree(ratestr);
> +
> +reset:
> +	/* Default to unlimited bandwidth. */
> +	*bytes = ~0UL;
> +	*usec = 0;
>  }
>  

Any reason you modify this function? It is still doing the exact same
thing, right?

>  static int xen_net_read_mac(struct xenbus_device *dev, u8 mac[])
> @@ -645,6 +650,59 @@ static int xen_net_read_mac(struct xenbus_device *dev, u8 mac[])
>  	return 0;
>  }
>  
> +static void xen_net_rate_changed(struct xenbus_watch *watch,
> +				const char **vec, unsigned int len)
> +{
> +	struct xenvif *vif = container_of(watch, struct xenvif, credit_watch);
> +	struct xenbus_device *dev = xenvif_to_xenbus_device(vif);
> +	unsigned long   credit_bytes;
> +	unsigned long   credit_usec;
> +	unsigned int queue_index;
> +
> +	xen_net_read_rate(dev, &credit_bytes, &credit_usec);
> +	for (queue_index = 0; queue_index < vif->num_queues; queue_index++) {
> +		struct xenvif_queue *queue = &vif->queues[queue_index];
> +
> +		queue->credit_bytes = credit_bytes;
> +		queue->credit_usec = credit_usec;
> +		if (!mod_timer_pending(&queue->credit_timeout, jiffies) &&
> +			queue->remaining_credit > queue->credit_bytes) {
> +			queue->remaining_credit = queue->credit_bytes;
> +		}
> +	}
> +}
> +
> +static int xen_register_watchers(struct xenbus_device *dev, struct xenvif *vif)
> +{
> +	int err = 0;
> +	char *node;
> +	unsigned maxlen = strlen(dev->nodename) + sizeof("/rate");
> +
> +	node = kmalloc(maxlen, GFP_KERNEL);
> +	if (!node)
> +		return -ENOMEM;
> +	sprintf(node, "%s/rate", dev->nodename);

Please use snprintf. (Though I can see using sprintf is fine here but I
want the code to be a bit future proof.)

> +	vif->credit_watch.node = node;
> +	vif->credit_watch.callback = xen_net_rate_changed;
> +	err = register_xenbus_watch(&vif->credit_watch);
> +	if (err) {
> +		pr_err("Failed to set watcher %s\n", vif->credit_watch.node);
> +		kfree(node);
> +		vif->credit_watch.node = 0;
> +		vif->credit_watch.callback = 0;

Please use NULL here.

Wei.

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

* Re: [RFC PATCH] xen-netback: making the bandwidth limiter runtime settable
  2015-03-13 12:51 [RFC PATCH] xen-netback: making the bandwidth limiter runtime settable Imre Palik
  2015-03-17 11:17 ` Wei Liu
@ 2015-03-17 11:26 ` Ian Campbell
  1 sibling, 0 replies; 5+ messages in thread
From: Ian Campbell @ 2015-03-17 11:26 UTC (permalink / raw)
  To: Imre Palik
  Cc: Wei Liu, xen-devel, netdev, linux-kernel, Palik, Imre,
	Anthony Liguori

On Fri, 2015-03-13 at 13:51 +0100, Imre Palik wrote:
[...]
> diff --git a/drivers/net/xen-netback/interface.c b/drivers/net/xen-netback/interface.c
> index 3aa8648..34d8038 100644
> --- a/drivers/net/xen-netback/interface.c
> +++ b/drivers/net/xen-netback/interface.c
> @@ -463,6 +463,7 @@ int xenvif_init_queue(struct xenvif_queue *queue)
>  	queue->credit_bytes = queue->remaining_credit = ~0UL;
>  	queue->credit_usec  = 0UL;
>  	init_timer(&queue->credit_timeout);
> +	queue->credit_timeout.function = xenvif_tx_credit_callback;
>  	queue->credit_window_start = get_jiffies_64();
>  
>  	queue->rx_queue_max = XENVIF_RX_QUEUE_BYTES;
> diff --git a/drivers/net/xen-netback/netback.c b/drivers/net/xen-netback/netback.c
> index cab9f52..bcc1880 100644
> --- a/drivers/net/xen-netback/netback.c
> +++ b/drivers/net/xen-netback/netback.c
[...]
> @@ -1170,7 +1170,7 @@ static bool tx_credit_exceeded(struct xenvif_queue *queue, unsigned size)
>  		queue->credit_timeout.data     =
>  			(unsigned long)queue;
>  		queue->credit_timeout.function =
> -			tx_credit_callback;
> +			xenvif_tx_credit_callback;

Are this init and the one in xenvif_init_queue really both needed?

Ian.

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

* Re: [RFC PATCH] xen-netback: making the bandwidth limiter runtime settable
  2015-03-17 11:17 ` Wei Liu
@ 2015-03-18 16:21   ` Imre Palik
  2015-03-18 16:28     ` Wei Liu
  0 siblings, 1 reply; 5+ messages in thread
From: Imre Palik @ 2015-03-18 16:21 UTC (permalink / raw)
  To: Wei Liu
  Cc: Ian Campbell, xen-devel, netdev, linux-kernel, Palik, Imre,
	Anthony Liguori

On 03/17/15 12:17, Wei Liu wrote:
> On Fri, Mar 13, 2015 at 01:51:05PM +0100, Imre Palik wrote:
>> From: "Palik, Imre" <imrep@amazon.de>
>>
>> With the current netback, the bandwidth limiter's parameters are only
>> settable during vif setup time.  This patch register a watch on them, and
>> thus makes them runtime changeable.
>>
>> When the watch fires, the timer is reset.  The timer's mutex is used for
>> fencing the change.
>>
> 
> I think this is a valid idea.  Just that this commit message is not
> complete. It doesn't describe everything this patch does.
> 
>> Cc: Anthony Liguori <aliguori@amazon.com>
>> Signed-off-by: Imre Palik <imrep@amazon.de>
>> ---
> [...]
>>  	queue->rx_queue_max = XENVIF_RX_QUEUE_BYTES;
>> diff --git a/drivers/net/xen-netback/netback.c b/drivers/net/xen-netback/netback.c
>> index cab9f52..bcc1880 100644
>> --- a/drivers/net/xen-netback/netback.c
>> +++ b/drivers/net/xen-netback/netback.c
>> @@ -641,7 +641,7 @@ static void tx_add_credit(struct xenvif_queue *queue)
>>  	queue->remaining_credit = min(max_credit, max_burst);
>>  }
>>  
>> -static void tx_credit_callback(unsigned long data)
>> +void xenvif_tx_credit_callback(unsigned long data)
> 
> Please keep this function static.

The trouble with that, is that now I am initialising credit_timeout.function in
drivers/net/xen-netback/interface.c .

The reason for the change is that mod_timer_pending() hits a BUG() if
the timeout function is not initialised.

> 
> And say in the commit message you change tx_credit_callback to a better
> name.
> 
>>  {
>>  	struct xenvif_queue *queue = (struct xenvif_queue *)data;
>>  	tx_add_credit(queue);
>> @@ -1170,7 +1170,7 @@ static bool tx_credit_exceeded(struct xenvif_queue *queue, unsigned size)
>>  		queue->credit_timeout.data     =
>>  			(unsigned long)queue;
>>  		queue->credit_timeout.function =
>> -			tx_credit_callback;
>> +			xenvif_tx_credit_callback;
>>  		mod_timer(&queue->credit_timeout,
>>  			  next_credit);
> [...]
>> @@ -594,13 +597,9 @@ static void xen_net_read_rate(struct xenbus_device *dev,
>>  	unsigned long b, u;
>>  	char *ratestr;
>>  
>> -	/* Default to unlimited bandwidth. */
>> -	*bytes = ~0UL;
>> -	*usec = 0;
>> -
>>  	ratestr = xenbus_read(XBT_NIL, dev->nodename, "rate", NULL);
>>  	if (IS_ERR(ratestr))
>> -		return;
>> +		goto reset;
>>  
>>  	s = ratestr;
>>  	b = simple_strtoul(s, &e, 10);
>> @@ -612,15 +611,21 @@ static void xen_net_read_rate(struct xenbus_device *dev,
>>  	if ((s == e) || (*e != '\0'))
>>  		goto fail;
>>  
>> +	kfree(ratestr);
>> +
>>  	*bytes = b;
>>  	*usec = u;
>>  
>> -	kfree(ratestr);
>>  	return;
>>  
>> - fail:
>> +fail:
>>  	pr_warn("Failed to parse network rate limit. Traffic unlimited.\n");
>>  	kfree(ratestr);
>> +
>> +reset:
>> +	/* Default to unlimited bandwidth. */
>> +	*bytes = ~0UL;
>> +	*usec = 0;
>>  }
>>  
> 
> Any reason you modify this function? It is still doing the exact same
> thing, right?

These changes made sense before the channel support, but not anymore.
I will roll them back.

> 
>>  static int xen_net_read_mac(struct xenbus_device *dev, u8 mac[])
>> @@ -645,6 +650,59 @@ static int xen_net_read_mac(struct xenbus_device *dev, u8 mac[])
>>  	return 0;
>>  }
>>  
>> +static void xen_net_rate_changed(struct xenbus_watch *watch,
>> +				const char **vec, unsigned int len)
>> +{
>> +	struct xenvif *vif = container_of(watch, struct xenvif, credit_watch);
>> +	struct xenbus_device *dev = xenvif_to_xenbus_device(vif);
>> +	unsigned long   credit_bytes;
>> +	unsigned long   credit_usec;
>> +	unsigned int queue_index;
>> +
>> +	xen_net_read_rate(dev, &credit_bytes, &credit_usec);
>> +	for (queue_index = 0; queue_index < vif->num_queues; queue_index++) {
>> +		struct xenvif_queue *queue = &vif->queues[queue_index];
>> +
>> +		queue->credit_bytes = credit_bytes;
>> +		queue->credit_usec = credit_usec;
>> +		if (!mod_timer_pending(&queue->credit_timeout, jiffies) &&
>> +			queue->remaining_credit > queue->credit_bytes) {
>> +			queue->remaining_credit = queue->credit_bytes;
>> +		}
>> +	}
>> +}
>> +
>> +static int xen_register_watchers(struct xenbus_device *dev, struct xenvif *vif)
>> +{
>> +	int err = 0;
>> +	char *node;
>> +	unsigned maxlen = strlen(dev->nodename) + sizeof("/rate");
>> +
>> +	node = kmalloc(maxlen, GFP_KERNEL);
>> +	if (!node)
>> +		return -ENOMEM;
>> +	sprintf(node, "%s/rate", dev->nodename);
> 
> Please use snprintf. (Though I can see using sprintf is fine here but I
> want the code to be a bit future proof.)
> 
>> +	vif->credit_watch.node = node;
>> +	vif->credit_watch.callback = xen_net_rate_changed;
>> +	err = register_xenbus_watch(&vif->credit_watch);
>> +	if (err) {
>> +		pr_err("Failed to set watcher %s\n", vif->credit_watch.node);
>> +		kfree(node);
>> +		vif->credit_watch.node = 0;
>> +		vif->credit_watch.callback = 0;
> 
> Please use NULL here.
> 
> Wei.
> 

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

* Re: [RFC PATCH] xen-netback: making the bandwidth limiter runtime settable
  2015-03-18 16:21   ` Imre Palik
@ 2015-03-18 16:28     ` Wei Liu
  0 siblings, 0 replies; 5+ messages in thread
From: Wei Liu @ 2015-03-18 16:28 UTC (permalink / raw)
  To: Imre Palik
  Cc: Wei Liu, Ian Campbell, xen-devel, netdev, linux-kernel,
	Palik, Imre, Anthony Liguori

On Wed, Mar 18, 2015 at 05:21:08PM +0100, Imre Palik wrote:
> On 03/17/15 12:17, Wei Liu wrote:
> > On Fri, Mar 13, 2015 at 01:51:05PM +0100, Imre Palik wrote:
> >> From: "Palik, Imre" <imrep@amazon.de>
> >>
> >> With the current netback, the bandwidth limiter's parameters are only
> >> settable during vif setup time.  This patch register a watch on them, and
> >> thus makes them runtime changeable.
> >>
> >> When the watch fires, the timer is reset.  The timer's mutex is used for
> >> fencing the change.
> >>
> > 
> > I think this is a valid idea.  Just that this commit message is not
> > complete. It doesn't describe everything this patch does.
> > 
> >> Cc: Anthony Liguori <aliguori@amazon.com>
> >> Signed-off-by: Imre Palik <imrep@amazon.de>
> >> ---
> > [...]
> >>  	queue->rx_queue_max = XENVIF_RX_QUEUE_BYTES;
> >> diff --git a/drivers/net/xen-netback/netback.c b/drivers/net/xen-netback/netback.c
> >> index cab9f52..bcc1880 100644
> >> --- a/drivers/net/xen-netback/netback.c
> >> +++ b/drivers/net/xen-netback/netback.c
> >> @@ -641,7 +641,7 @@ static void tx_add_credit(struct xenvif_queue *queue)
> >>  	queue->remaining_credit = min(max_credit, max_burst);
> >>  }
> >>  
> >> -static void tx_credit_callback(unsigned long data)
> >> +void xenvif_tx_credit_callback(unsigned long data)
> > 
> > Please keep this function static.
> 
> The trouble with that, is that now I am initialising credit_timeout.function in
> drivers/net/xen-netback/interface.c .
> 

Oh, yes. I misread the hunk of common.h. Sorry about the noise.

Wei.

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

end of thread, other threads:[~2015-03-18 16:28 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-03-13 12:51 [RFC PATCH] xen-netback: making the bandwidth limiter runtime settable Imre Palik
2015-03-17 11:17 ` Wei Liu
2015-03-18 16:21   ` Imre Palik
2015-03-18 16:28     ` Wei Liu
2015-03-17 11:26 ` Ian Campbell

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).