* Re: net: gcc-6.0 warning fixes
From: David Miller @ 2016-03-14 17:10 UTC (permalink / raw)
To: arnd; +Cc: netdev
In-Reply-To: <1457965120-3155420-1-git-send-email-arnd@arndb.de>
From: Arnd Bergmann <arnd@arndb.de>
Date: Mon, 14 Mar 2016 15:18:33 +0100
> I've just installed gcc-6.0 to see what kinds of new warnings
> we get. It turns out that it's actually really useful once I
> disabled -Wunused-const-variable, and all of the warnings it
> found in network drivers seem valid.
>
> Sorry for the bad timing in the merge window, but I figured
> it would be better to send the fixes as I found the bugs
> rather than waiting for the next cycle. The first three
> look appropriate for stable backports.
>
> The other two only fix a gcc warning about incorrect whitespace,
> probably not worth backporting those.
Series applied, and patches 1, 2, and 3 queued up for -stable.
Thanks.
^ permalink raw reply
* Re: [PATCH 3/3] net: mediatek: check device_reset return code
From: David Miller @ 2016-03-14 17:06 UTC (permalink / raw)
To: arnd
Cc: nbd, blogic, matthias.bgg, netdev, linux-arm-kernel,
linux-mediatek, linux-kernel
In-Reply-To: <1457964435-2945038-3-git-send-email-arnd@arndb.de>
From: Arnd Bergmann <arnd@arndb.de>
Date: Mon, 14 Mar 2016 15:07:12 +0100
> The device_reset() function may fail, so we have to check
> its return value, e.g. to make deferred probing work correctly.
> gcc warns about it because of the warn_unused_result attribute:
>
> drivers/net/ethernet/mediatek/mtk_eth_soc.c: In function 'mtk_probe':
> drivers/net/ethernet/mediatek/mtk_eth_soc.c:1679:2: error: ignoring return value of 'device_reset', declared with attribute warn_unused_result [-Werror=unused-result]
>
> This adds the trivial error check to propagate the return value
> to the generic platform device probe code.
>
> Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Applied.
^ permalink raw reply
* Re: [PATCH 2/3] net: mediatek: remove incorrect dma_mask assignment
From: David Miller @ 2016-03-14 17:06 UTC (permalink / raw)
To: arnd
Cc: nbd, blogic, matthias.bgg, netdev, linux-arm-kernel,
linux-mediatek, linux-kernel
In-Reply-To: <1457964435-2945038-2-git-send-email-arnd@arndb.de>
From: Arnd Bergmann <arnd@arndb.de>
Date: Mon, 14 Mar 2016 15:07:11 +0100
> Device drivers should not mess with the DMA mask directly,
> but instead call dma_set_mask() etc if needed.
>
> In case of the mtk_eth_soc driver, the mask already gets set
> correctly when the device is created, and setting it again
> is against the documented API.
>
> This removes the incorrect setting.
>
> Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Applied.
^ permalink raw reply
* Re: [PATCH 1/3] net: mediatek: use dma_addr_t correctly
From: David Miller @ 2016-03-14 17:06 UTC (permalink / raw)
To: arnd
Cc: nbd, blogic, matthias.bgg, netdev, linux-arm-kernel,
linux-mediatek, linux-kernel
In-Reply-To: <1457964435-2945038-1-git-send-email-arnd@arndb.de>
From: Arnd Bergmann <arnd@arndb.de>
Date: Mon, 14 Mar 2016 15:07:10 +0100
> dma_alloc_coherent() expects a dma_addr_t pointer as its argument,
> not an 'unsigned int', and gcc correctly warns about broken
> code in the mtk_init_fq_dma function:
>
> drivers/net/ethernet/mediatek/mtk_eth_soc.c: In function 'mtk_init_fq_dma':
> drivers/net/ethernet/mediatek/mtk_eth_soc.c:463:13: error: passing argument 3 of 'dma_alloc_coherent' from incompatible pointer type [-Werror=incompatible-pointer-types]
>
> This changes the type of the local variable to dma_addr_t.
>
> Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Applied.
^ permalink raw reply
* [PATCH 1/5] ethtool: move option parsing related codes into function
From: kan.liang @ 2016-03-14 9:30 UTC (permalink / raw)
To: bwh; +Cc: davem, nicolas.dichtel, ben, jesse.brandeburg, andi, netdev,
Kan Liang
From: Kan Liang <kan.liang@intel.com>
Move option parsing code into find_option function.
No behavior changes.
Signed-off-by: Kan Liang <kan.liang@intel.com>
---
ethtool.c | 49 +++++++++++++++++++++++++++++++------------------
1 file changed, 31 insertions(+), 18 deletions(-)
diff --git a/ethtool.c b/ethtool.c
index 0cd0d4f..bd0583c 100644
--- a/ethtool.c
+++ b/ethtool.c
@@ -4223,6 +4223,29 @@ static int show_usage(struct cmd_context *ctx)
return 0;
}
+static int find_option(int argc, char **argp)
+{
+ const char *opt;
+ size_t len;
+ int k;
+
+ for (k = 0; args[k].opts; k++) {
+ opt = args[k].opts;
+ for (;;) {
+ len = strcspn(opt, "|");
+ if (strncmp(*argp, opt, len) == 0 &&
+ (*argp)[len] == 0)
+ return k;
+
+ if (opt[len] == 0)
+ break;
+ opt += len + 1;
+ }
+ }
+
+ return -1;
+}
+
int main(int argc, char **argp)
{
int (*func)(struct cmd_context *);
@@ -4240,24 +4263,14 @@ int main(int argc, char **argp)
*/
if (argc == 0)
exit_bad_args();
- for (k = 0; args[k].opts; k++) {
- const char *opt;
- size_t len;
- opt = args[k].opts;
- for (;;) {
- len = strcspn(opt, "|");
- if (strncmp(*argp, opt, len) == 0 &&
- (*argp)[len] == 0) {
- argp++;
- argc--;
- func = args[k].func;
- want_device = args[k].want_device;
- goto opt_found;
- }
- if (opt[len] == 0)
- break;
- opt += len + 1;
- }
+
+ k = find_option(argc, argp);
+ if (k > 0) {
+ argp++;
+ argc--;
+ func = args[k].func;
+ want_device = args[k].want_device;
+ goto opt_found;
}
if ((*argp)[0] == '-')
exit_bad_args();
--
2.5.0
^ permalink raw reply related
* [PATCH 5/5] ethtool: support per queue sub command --coalesce
From: kan.liang @ 2016-03-14 9:30 UTC (permalink / raw)
To: bwh; +Cc: davem, nicolas.dichtel, ben, jesse.brandeburg, andi, netdev,
Kan Liang
In-Reply-To: <1457947807-4804-1-git-send-email-kan.liang@intel.com>
From: Kan Liang <kan.liang@intel.com>
This patch uses a similar way as do_scoalesce to set coalesce per queue.
It reads the current settings, change them, and write them back to the
kernel for each masked queue.
Example:
$ sudo ./ethtool --set-perqueue-command eth5 queue_mask 0x1 --coalesce
rx-usecs 10 tx-usecs 5
$ sudo ./ethtool --set-perqueue-command eth5 queue_mask 0x1
--show-coalesce
Queue: 0
Adaptive RX: on TX: on
stats-block-usecs: 0
sample-interval: 0
pkt-rate-low: 0
pkt-rate-high: 0
rx-usecs: 10
rx-frames: 0
rx-usecs-irq: 0
rx-frames-irq: 256
tx-usecs: 5
tx-frames: 0
tx-usecs-irq: 0
tx-frames-irq: 256
rx-usecs-low: 0
rx-frame-low: 0
tx-usecs-low: 0
tx-frame-low: 0
rx-usecs-high: 0
rx-frame-high: 0
tx-usecs-high: 0
tx-frame-high: 0
Signed-off-by: Kan Liang <kan.liang@intel.com>
---
ethtool.8.in | 2 +-
ethtool.c | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
2 files changed, 58 insertions(+), 2 deletions(-)
diff --git a/ethtool.8.in b/ethtool.8.in
index 210ec8c..0e42180 100644
--- a/ethtool.8.in
+++ b/ethtool.8.in
@@ -937,7 +937,7 @@ Sets the specific queues which the sub command is applied to.
If queue_mask is not set, the sub command will be applied to all queues.
.TP
.B sub_command
-Sets the sub command. The supported sub commands include --show-coalesce.
+Sets the sub command. The supported sub commands include --show-coalesce and --coalesce.
.RE
.SH BUGS
Not supported (in part or whole) on all network drivers.
diff --git a/ethtool.c b/ethtool.c
index a966bf8..55ba26c 100644
--- a/ethtool.c
+++ b/ethtool.c
@@ -4222,7 +4222,7 @@ static const struct option {
" [ tx-lpi on|off ]\n"
" [ tx-timer %d ]\n"},
{ "--set-perqueue-command", 1, do_perqueue, "Set per queue command. "
- "The supported sub commands include --show-coalesce",
+ "The supported sub commands include --show-coalesce, --coalesce",
" [queue_mask %x] SUB_COMMAND\n"},
{ "-h|--help", 0, show_usage, "Show this help" },
{ "--version", 0, do_version, "Show version number" },
@@ -4348,6 +4348,52 @@ get_per_queue_coalesce(struct cmd_context *ctx,
return per_queue_opt;
}
+static void __set_per_queue_coalesce(int queue)
+{
+ int changed = 0;
+
+ do_generic_set(cmdline_coalesce, ARRAY_SIZE(cmdline_coalesce),
+ &changed);
+
+ if (!changed)
+ fprintf(stderr, "Queue %d, no coalesce parameters changed\n", queue);
+}
+
+static void set_per_queue_coalesce(struct cmd_context *ctx,
+ struct ethtool_per_queue_op *per_queue_opt)
+{
+ __u32 *queue_mask = per_queue_opt->queue_mask;
+ char *addr = (char *)per_queue_opt + sizeof(*per_queue_opt);
+ int gcoalesce_changed = 0;
+ int i;
+
+ parse_generic_cmdline(ctx, &gcoalesce_changed,
+ cmdline_coalesce, ARRAY_SIZE(cmdline_coalesce));
+
+ for (i = 0; i < __KERNEL_DIV_ROUND_UP(MAX_NUM_QUEUE, 32); i++) {
+ int queue = i * 32;
+ __u32 mask = queue_mask[i];
+
+ while (mask > 0) {
+ if (mask & 0x1) {
+ memcpy(&s_ecoal, addr, sizeof(struct ethtool_coalesce));
+ __set_per_queue_coalesce(queue);
+ memcpy(addr, &s_ecoal, sizeof(struct ethtool_coalesce));
+ addr += sizeof(struct ethtool_coalesce);
+ }
+ mask = mask >> 1;
+ queue++;
+ }
+ }
+
+ per_queue_opt->cmd = ETHTOOL_PERQUEUE;
+ per_queue_opt->sub_command = ETHTOOL_SCOALESCE;
+
+ if (send_ioctl(ctx, per_queue_opt))
+ perror("Cannot set device per queue parameters");
+
+}
+
static int do_perqueue(struct cmd_context *ctx)
{
struct ethtool_per_queue_op *per_queue_opt;
@@ -4397,6 +4443,16 @@ static int do_perqueue(struct cmd_context *ctx)
}
dump_per_queue_coalesce(per_queue_opt, queue_mask);
free(per_queue_opt);
+ } else if (strstr(args[i].opts, "--coalesce") != NULL) {
+ ctx->argc--;
+ ctx->argp++;
+ per_queue_opt = get_per_queue_coalesce(ctx, queue_mask, n_queues);
+ if (per_queue_opt == NULL) {
+ perror("Cannot get device per queue parameters");
+ return -EFAULT;
+ }
+ set_per_queue_coalesce(ctx, per_queue_opt);
+ free(per_queue_opt);
} else {
perror("The subcommand is not supported yet");
return -EOPNOTSUPP;
--
2.5.0
^ permalink raw reply related
* [PATCH 4/5] ethtool: support per queue sub command --show-coalesce
From: kan.liang @ 2016-03-14 9:30 UTC (permalink / raw)
To: bwh; +Cc: davem, nicolas.dichtel, ben, jesse.brandeburg, andi, netdev,
Kan Liang
In-Reply-To: <1457947807-4804-1-git-send-email-kan.liang@intel.com>
From: Kan Liang <kan.liang@intel.com>
Get all masked queues' coalesce from kernel and dump them one by one.
Example:
$ sudo ./ethtool --set-perqueue-command eth5 queue_mask 0x11
--show-coalesce
Queue: 0
Adaptive RX: off TX: off
stats-block-usecs: 0
sample-interval: 0
pkt-rate-low: 0
pkt-rate-high: 0
rx-usecs: 222
rx-frames: 0
rx-usecs-irq: 0
rx-frames-irq: 256
tx-usecs: 222
tx-frames: 0
tx-usecs-irq: 0
tx-frames-irq: 256
rx-usecs-low: 0
rx-frame-low: 0
tx-usecs-low: 0
tx-frame-low: 0
rx-usecs-high: 0
rx-frame-high: 0
tx-usecs-high: 0
tx-frame-high: 0
Queue: 4
Adaptive RX: off TX: off
stats-block-usecs: 0
sample-interval: 0
pkt-rate-low: 0
pkt-rate-high: 0
rx-usecs: 222
rx-frames: 0
rx-usecs-irq: 0
rx-frames-irq: 256
tx-usecs: 222
tx-frames: 0
tx-usecs-irq: 0
tx-frames-irq: 256
rx-usecs-low: 0
rx-frame-low: 0
tx-usecs-low: 0
tx-frame-low: 0
rx-usecs-high: 0
rx-frame-high: 0
tx-usecs-high: 0
tx-frame-high: 0
Signed-off-by: Kan Liang <kan.liang@intel.com>
---
ethtool.8.in | 2 +-
ethtool.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
2 files changed, 61 insertions(+), 3 deletions(-)
diff --git a/ethtool.8.in b/ethtool.8.in
index 26d01cb..210ec8c 100644
--- a/ethtool.8.in
+++ b/ethtool.8.in
@@ -937,7 +937,7 @@ Sets the specific queues which the sub command is applied to.
If queue_mask is not set, the sub command will be applied to all queues.
.TP
.B sub_command
-Sets the sub command.
+Sets the sub command. The supported sub commands include --show-coalesce.
.RE
.SH BUGS
Not supported (in part or whole) on all network drivers.
diff --git a/ethtool.c b/ethtool.c
index ba741f0..a966bf8 100644
--- a/ethtool.c
+++ b/ethtool.c
@@ -1219,6 +1219,29 @@ static int dump_coalesce(const struct ethtool_coalesce *ecoal)
return 0;
}
+void dump_per_queue_coalesce(struct ethtool_per_queue_op *per_queue_opt,
+ __u32 *queue_mask)
+{
+ char *addr;
+ int i;
+
+ addr = (char *)per_queue_opt + sizeof(*per_queue_opt);
+ for (i = 0; i < __KERNEL_DIV_ROUND_UP(MAX_NUM_QUEUE, 32); i++) {
+ int queue = i * 32;
+ __u32 mask = queue_mask[i];
+
+ while (mask > 0) {
+ if (mask & 0x1) {
+ fprintf(stdout, "Queue: %d\n", queue);
+ dump_coalesce((struct ethtool_coalesce *)addr);
+ addr += sizeof(struct ethtool_coalesce);
+ }
+ mask = mask >> 1;
+ queue++;
+ }
+ }
+}
+
struct feature_state {
u32 off_flags;
struct ethtool_gfeatures features;
@@ -4198,7 +4221,8 @@ static const struct option {
" [ advertise %x ]\n"
" [ tx-lpi on|off ]\n"
" [ tx-timer %d ]\n"},
- { "--set-perqueue-command", 1, do_perqueue, "Set per queue command",
+ { "--set-perqueue-command", 1, do_perqueue, "Set per queue command. "
+ "The supported sub commands include --show-coalesce",
" [queue_mask %x] SUB_COMMAND\n"},
{ "-h|--help", 0, show_usage, "Show this help" },
{ "--version", 0, do_version, "Show version number" },
@@ -4302,8 +4326,31 @@ static int find_max_num_queues(struct cmd_context *ctx)
return MAX(MAX(echannels.rx_count, echannels.tx_count), echannels.combined_count);
}
+static struct ethtool_per_queue_op *
+get_per_queue_coalesce(struct cmd_context *ctx,
+ __u32 *queue_mask, int n_queues)
+{
+ struct ethtool_per_queue_op *per_queue_opt;
+
+ per_queue_opt = malloc(sizeof(*per_queue_opt) + n_queues * sizeof(struct ethtool_coalesce));
+ if (!per_queue_opt)
+ return NULL;
+
+ memcpy(per_queue_opt->queue_mask, queue_mask, __KERNEL_DIV_ROUND_UP(MAX_NUM_QUEUE, 32) * sizeof(__u32));
+ per_queue_opt->cmd = ETHTOOL_PERQUEUE;
+ per_queue_opt->sub_command = ETHTOOL_GCOALESCE;
+ if (send_ioctl(ctx, per_queue_opt)) {
+ free(per_queue_opt);
+ perror("Cannot get device per queue parameters");
+ return NULL;
+ }
+
+ return per_queue_opt;
+}
+
static int do_perqueue(struct cmd_context *ctx)
{
+ struct ethtool_per_queue_op *per_queue_opt;
__u32 queue_mask[__KERNEL_DIV_ROUND_UP(MAX_NUM_QUEUE, 32)] = {0};
int i, n_queues = 0;
@@ -4342,7 +4389,18 @@ static int do_perqueue(struct cmd_context *ctx)
if (i < 0)
exit_bad_args();
- /* no sub_command support yet */
+ if (strstr(args[i].opts, "--show-coalesce") != NULL) {
+ per_queue_opt = get_per_queue_coalesce(ctx, queue_mask, n_queues);
+ if (per_queue_opt == NULL) {
+ perror("Cannot get device per queue parameters");
+ return -EFAULT;
+ }
+ dump_per_queue_coalesce(per_queue_opt, queue_mask);
+ free(per_queue_opt);
+ } else {
+ perror("The subcommand is not supported yet");
+ return -EOPNOTSUPP;
+ }
return 0;
}
--
2.5.0
^ permalink raw reply related
* [PATCH 3/5] ethtool: introduce new ioctl for per queue setting
From: kan.liang @ 2016-03-14 9:30 UTC (permalink / raw)
To: bwh; +Cc: davem, nicolas.dichtel, ben, jesse.brandeburg, andi, netdev,
Kan Liang
In-Reply-To: <1457947807-4804-1-git-send-email-kan.liang@intel.com>
From: Kan Liang <kan.liang@intel.com>
Introduce a new ioctl for per queue parameters setting.
Users can apply commands to specific queues by setting SUB_COMMAND and
queue_mask as following command.
ethtool --set-perqueue-command DEVNAME [queue_mask %x] SUB_COMMAND
If queue_mask is not set, the SUB_COMMAND will be applied to all queues.
The following patches will enable SUB_COMMANDs for per queue setting.
Signed-off-by: Kan Liang <kan.liang@intel.com>
---
ethtool.8.in | 19 ++++++++++++
ethtool.c | 100 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 119 insertions(+)
diff --git a/ethtool.8.in b/ethtool.8.in
index 009711d..26d01cb 100644
--- a/ethtool.8.in
+++ b/ethtool.8.in
@@ -339,6 +339,13 @@ ethtool \- query or control network driver and hardware settings
.B2 tx-lpi on off
.BN tx-timer
.BN advertise
+.HP
+.B ethtool \-\-set\-perqueue\-command
+.I devname
+.RB [ queue_mask
+.IR %x ]
+.I sub_command
+.RB ...
.
.\" Adjust lines (i.e. full justification) and hyphenate.
.ad
@@ -920,6 +927,18 @@ Values are as for
Sets the amount of time the device should stay in idle mode prior to asserting
its Tx LPI (in microseconds). This has meaning only when Tx LPI is enabled.
.RE
+.TP
+.B \-\-set\-perqueue\-command
+Sets sub command to specific queues.
+.RS 4
+.TP
+.B queue_mask %x
+Sets the specific queues which the sub command is applied to.
+If queue_mask is not set, the sub command will be applied to all queues.
+.TP
+.B sub_command
+Sets the sub command.
+.RE
.SH BUGS
Not supported (in part or whole) on all network drivers.
.SH AUTHOR
diff --git a/ethtool.c b/ethtool.c
index 86724a2..ba741f0 100644
--- a/ethtool.c
+++ b/ethtool.c
@@ -4037,6 +4037,8 @@ static int do_seee(struct cmd_context *ctx)
return 0;
}
+static int do_perqueue(struct cmd_context *ctx);
+
#ifndef TEST_ETHTOOL
int send_ioctl(struct cmd_context *ctx, void *cmd)
{
@@ -4196,6 +4198,8 @@ static const struct option {
" [ advertise %x ]\n"
" [ tx-lpi on|off ]\n"
" [ tx-timer %d ]\n"},
+ { "--set-perqueue-command", 1, do_perqueue, "Set per queue command",
+ " [queue_mask %x] SUB_COMMAND\n"},
{ "-h|--help", 0, show_usage, "Show this help" },
{ "--version", 0, do_version, "Show version number" },
{}
@@ -4247,6 +4251,102 @@ static int find_option(int argc, char **argp)
return -1;
}
+static int set_queue_mask(u32 *queue_mask, char *str)
+{
+ int len = strlen(str);
+ int index = __KERNEL_DIV_ROUND_UP(len * 4, 32);
+ char tmp[9];
+ char *end = str + len;
+ int i, num;
+ __u32 mask;
+ int n_queues = 0;
+
+ if (len > MAX_NUM_QUEUE)
+ return -EINVAL;
+
+ for (i = 0; i < index; i++) {
+ num = end - str;
+
+ if (num >= 8) {
+ end -= 8;
+ num = 8;
+ } else {
+ end = str;
+ }
+ strncpy(tmp, end, num);
+ tmp[num] = '\0';
+
+ queue_mask[i] = strtoul(tmp, NULL, 16);
+
+ mask = queue_mask[i];
+ while (mask > 0) {
+ if (mask & 0x1)
+ n_queues++;
+ mask = mask >> 1;
+ }
+ }
+
+ return n_queues;
+}
+
+#define MAX(x, y) (x > y ? x : y)
+
+static int find_max_num_queues(struct cmd_context *ctx)
+{
+ struct ethtool_channels echannels;
+
+ echannels.cmd = ETHTOOL_GCHANNELS;
+ if (send_ioctl(ctx, &echannels))
+ return -1;
+
+ return MAX(MAX(echannels.rx_count, echannels.tx_count), echannels.combined_count);
+}
+
+static int do_perqueue(struct cmd_context *ctx)
+{
+ __u32 queue_mask[__KERNEL_DIV_ROUND_UP(MAX_NUM_QUEUE, 32)] = {0};
+ int i, n_queues = 0;
+
+ if (ctx->argc == 0)
+ exit_bad_args();
+
+ /*
+ * The sub commands will be applied to
+ * all queues if no queue_mask set
+ */
+ if (strncmp(*ctx->argp, "queue_mask", 10)) {
+ n_queues = find_max_num_queues(ctx);
+ if (n_queues < 0) {
+ perror("Cannot get number of queues");
+ return -EFAULT;
+ }
+ for (i = 0; i < n_queues / 32; i++)
+ queue_mask[i] = ~0;
+ queue_mask[i] = (1 << (n_queues - i * 32)) - 1;
+ fprintf(stdout, "The sub commands will be applied"
+ " to all %d queues\n", n_queues);
+ } else {
+ ctx->argc--;
+ ctx->argp++;
+ n_queues = set_queue_mask(queue_mask, *ctx->argp);
+ if (n_queues < 0) {
+ perror("Invalid queue mask");
+ return n_queues;
+ }
+ ctx->argc--;
+ ctx->argp++;
+
+ }
+
+ i = find_option(ctx->argc, ctx->argp);
+ if (i < 0)
+ exit_bad_args();
+
+ /* no sub_command support yet */
+
+ return 0;
+}
+
int main(int argc, char **argp)
{
int (*func)(struct cmd_context *);
--
2.5.0
^ permalink raw reply related
* [PATCH 2/5] ethtool: move cmdline_coalesce out of do_scoalesce
From: kan.liang @ 2016-03-14 9:30 UTC (permalink / raw)
To: bwh; +Cc: davem, nicolas.dichtel, ben, jesse.brandeburg, andi, netdev,
Kan Liang
In-Reply-To: <1457947807-4804-1-git-send-email-kan.liang@intel.com>
From: Kan Liang <kan.liang@intel.com>
Moving cmdline_coalesce out of do_scoalesce, so it can be shared with
other functions.
No behavior change.
Signed-off-by: Kan Liang <kan.liang@intel.com>
---
ethtool.c | 147 +++++++++++++++++++++++++++++++-------------------------------
1 file changed, 74 insertions(+), 73 deletions(-)
diff --git a/ethtool.c b/ethtool.c
index bd0583c..86724a2 100644
--- a/ethtool.c
+++ b/ethtool.c
@@ -1883,85 +1883,86 @@ static int do_gcoalesce(struct cmd_context *ctx)
return 0;
}
+static struct ethtool_coalesce s_ecoal;
+static s32 coal_stats_wanted = -1;
+static int coal_adaptive_rx_wanted = -1;
+static int coal_adaptive_tx_wanted = -1;
+static s32 coal_sample_rate_wanted = -1;
+static s32 coal_pkt_rate_low_wanted = -1;
+static s32 coal_pkt_rate_high_wanted = -1;
+static s32 coal_rx_usec_wanted = -1;
+static s32 coal_rx_frames_wanted = -1;
+static s32 coal_rx_usec_irq_wanted = -1;
+static s32 coal_rx_frames_irq_wanted = -1;
+static s32 coal_tx_usec_wanted = -1;
+static s32 coal_tx_frames_wanted = -1;
+static s32 coal_tx_usec_irq_wanted = -1;
+static s32 coal_tx_frames_irq_wanted = -1;
+static s32 coal_rx_usec_low_wanted = -1;
+static s32 coal_rx_frames_low_wanted = -1;
+static s32 coal_tx_usec_low_wanted = -1;
+static s32 coal_tx_frames_low_wanted = -1;
+static s32 coal_rx_usec_high_wanted = -1;
+static s32 coal_rx_frames_high_wanted = -1;
+static s32 coal_tx_usec_high_wanted = -1;
+static s32 coal_tx_frames_high_wanted = -1;
+
+static struct cmdline_info cmdline_coalesce[] = {
+ { "adaptive-rx", CMDL_BOOL, &coal_adaptive_rx_wanted,
+ &s_ecoal.use_adaptive_rx_coalesce },
+ { "adaptive-tx", CMDL_BOOL, &coal_adaptive_tx_wanted,
+ &s_ecoal.use_adaptive_tx_coalesce },
+ { "sample-interval", CMDL_S32, &coal_sample_rate_wanted,
+ &s_ecoal.rate_sample_interval },
+ { "stats-block-usecs", CMDL_S32, &coal_stats_wanted,
+ &s_ecoal.stats_block_coalesce_usecs },
+ { "pkt-rate-low", CMDL_S32, &coal_pkt_rate_low_wanted,
+ &s_ecoal.pkt_rate_low },
+ { "pkt-rate-high", CMDL_S32, &coal_pkt_rate_high_wanted,
+ &s_ecoal.pkt_rate_high },
+ { "rx-usecs", CMDL_S32, &coal_rx_usec_wanted,
+ &s_ecoal.rx_coalesce_usecs },
+ { "rx-frames", CMDL_S32, &coal_rx_frames_wanted,
+ &s_ecoal.rx_max_coalesced_frames },
+ { "rx-usecs-irq", CMDL_S32, &coal_rx_usec_irq_wanted,
+ &s_ecoal.rx_coalesce_usecs_irq },
+ { "rx-frames-irq", CMDL_S32, &coal_rx_frames_irq_wanted,
+ &s_ecoal.rx_max_coalesced_frames_irq },
+ { "tx-usecs", CMDL_S32, &coal_tx_usec_wanted,
+ &s_ecoal.tx_coalesce_usecs },
+ { "tx-frames", CMDL_S32, &coal_tx_frames_wanted,
+ &s_ecoal.tx_max_coalesced_frames },
+ { "tx-usecs-irq", CMDL_S32, &coal_tx_usec_irq_wanted,
+ &s_ecoal.tx_coalesce_usecs_irq },
+ { "tx-frames-irq", CMDL_S32, &coal_tx_frames_irq_wanted,
+ &s_ecoal.tx_max_coalesced_frames_irq },
+ { "rx-usecs-low", CMDL_S32, &coal_rx_usec_low_wanted,
+ &s_ecoal.rx_coalesce_usecs_low },
+ { "rx-frames-low", CMDL_S32, &coal_rx_frames_low_wanted,
+ &s_ecoal.rx_max_coalesced_frames_low },
+ { "tx-usecs-low", CMDL_S32, &coal_tx_usec_low_wanted,
+ &s_ecoal.tx_coalesce_usecs_low },
+ { "tx-frames-low", CMDL_S32, &coal_tx_frames_low_wanted,
+ &s_ecoal.tx_max_coalesced_frames_low },
+ { "rx-usecs-high", CMDL_S32, &coal_rx_usec_high_wanted,
+ &s_ecoal.rx_coalesce_usecs_high },
+ { "rx-frames-high", CMDL_S32, &coal_rx_frames_high_wanted,
+ &s_ecoal.rx_max_coalesced_frames_high },
+ { "tx-usecs-high", CMDL_S32, &coal_tx_usec_high_wanted,
+ &s_ecoal.tx_coalesce_usecs_high },
+ { "tx-frames-high", CMDL_S32, &coal_tx_frames_high_wanted,
+ &s_ecoal.tx_max_coalesced_frames_high },
+};
static int do_scoalesce(struct cmd_context *ctx)
{
- struct ethtool_coalesce ecoal;
int gcoalesce_changed = 0;
- s32 coal_stats_wanted = -1;
- int coal_adaptive_rx_wanted = -1;
- int coal_adaptive_tx_wanted = -1;
- s32 coal_sample_rate_wanted = -1;
- s32 coal_pkt_rate_low_wanted = -1;
- s32 coal_pkt_rate_high_wanted = -1;
- s32 coal_rx_usec_wanted = -1;
- s32 coal_rx_frames_wanted = -1;
- s32 coal_rx_usec_irq_wanted = -1;
- s32 coal_rx_frames_irq_wanted = -1;
- s32 coal_tx_usec_wanted = -1;
- s32 coal_tx_frames_wanted = -1;
- s32 coal_tx_usec_irq_wanted = -1;
- s32 coal_tx_frames_irq_wanted = -1;
- s32 coal_rx_usec_low_wanted = -1;
- s32 coal_rx_frames_low_wanted = -1;
- s32 coal_tx_usec_low_wanted = -1;
- s32 coal_tx_frames_low_wanted = -1;
- s32 coal_rx_usec_high_wanted = -1;
- s32 coal_rx_frames_high_wanted = -1;
- s32 coal_tx_usec_high_wanted = -1;
- s32 coal_tx_frames_high_wanted = -1;
- struct cmdline_info cmdline_coalesce[] = {
- { "adaptive-rx", CMDL_BOOL, &coal_adaptive_rx_wanted,
- &ecoal.use_adaptive_rx_coalesce },
- { "adaptive-tx", CMDL_BOOL, &coal_adaptive_tx_wanted,
- &ecoal.use_adaptive_tx_coalesce },
- { "sample-interval", CMDL_S32, &coal_sample_rate_wanted,
- &ecoal.rate_sample_interval },
- { "stats-block-usecs", CMDL_S32, &coal_stats_wanted,
- &ecoal.stats_block_coalesce_usecs },
- { "pkt-rate-low", CMDL_S32, &coal_pkt_rate_low_wanted,
- &ecoal.pkt_rate_low },
- { "pkt-rate-high", CMDL_S32, &coal_pkt_rate_high_wanted,
- &ecoal.pkt_rate_high },
- { "rx-usecs", CMDL_S32, &coal_rx_usec_wanted,
- &ecoal.rx_coalesce_usecs },
- { "rx-frames", CMDL_S32, &coal_rx_frames_wanted,
- &ecoal.rx_max_coalesced_frames },
- { "rx-usecs-irq", CMDL_S32, &coal_rx_usec_irq_wanted,
- &ecoal.rx_coalesce_usecs_irq },
- { "rx-frames-irq", CMDL_S32, &coal_rx_frames_irq_wanted,
- &ecoal.rx_max_coalesced_frames_irq },
- { "tx-usecs", CMDL_S32, &coal_tx_usec_wanted,
- &ecoal.tx_coalesce_usecs },
- { "tx-frames", CMDL_S32, &coal_tx_frames_wanted,
- &ecoal.tx_max_coalesced_frames },
- { "tx-usecs-irq", CMDL_S32, &coal_tx_usec_irq_wanted,
- &ecoal.tx_coalesce_usecs_irq },
- { "tx-frames-irq", CMDL_S32, &coal_tx_frames_irq_wanted,
- &ecoal.tx_max_coalesced_frames_irq },
- { "rx-usecs-low", CMDL_S32, &coal_rx_usec_low_wanted,
- &ecoal.rx_coalesce_usecs_low },
- { "rx-frames-low", CMDL_S32, &coal_rx_frames_low_wanted,
- &ecoal.rx_max_coalesced_frames_low },
- { "tx-usecs-low", CMDL_S32, &coal_tx_usec_low_wanted,
- &ecoal.tx_coalesce_usecs_low },
- { "tx-frames-low", CMDL_S32, &coal_tx_frames_low_wanted,
- &ecoal.tx_max_coalesced_frames_low },
- { "rx-usecs-high", CMDL_S32, &coal_rx_usec_high_wanted,
- &ecoal.rx_coalesce_usecs_high },
- { "rx-frames-high", CMDL_S32, &coal_rx_frames_high_wanted,
- &ecoal.rx_max_coalesced_frames_high },
- { "tx-usecs-high", CMDL_S32, &coal_tx_usec_high_wanted,
- &ecoal.tx_coalesce_usecs_high },
- { "tx-frames-high", CMDL_S32, &coal_tx_frames_high_wanted,
- &ecoal.tx_max_coalesced_frames_high },
- };
int err, changed = 0;
parse_generic_cmdline(ctx, &gcoalesce_changed,
cmdline_coalesce, ARRAY_SIZE(cmdline_coalesce));
- ecoal.cmd = ETHTOOL_GCOALESCE;
- err = send_ioctl(ctx, &ecoal);
+ s_ecoal.cmd = ETHTOOL_GCOALESCE;
+ err = send_ioctl(ctx, &s_ecoal);
if (err) {
perror("Cannot get device coalesce settings");
return 76;
@@ -1975,8 +1976,8 @@ static int do_scoalesce(struct cmd_context *ctx)
return 80;
}
- ecoal.cmd = ETHTOOL_SCOALESCE;
- err = send_ioctl(ctx, &ecoal);
+ s_ecoal.cmd = ETHTOOL_SCOALESCE;
+ err = send_ioctl(ctx, &s_ecoal);
if (err) {
perror("Cannot set device coalesce parameters");
return 81;
--
2.5.0
^ permalink raw reply related
* Re: [RFC PATCH net-next 0/2] DT MDIO bus of fixed phys
From: Florian Fainelli @ 2016-03-14 16:51 UTC (permalink / raw)
To: Andrew Lunn; +Cc: netdev
In-Reply-To: <20160312001224.GE23969@lunn.ch>
On 11/03/16 16:12, Andrew Lunn wrote:
>>>> Humm, if that's the problem we want to solve, we could introduce a
>>>> helper function which tries to locate the phy using a 'phy-handle'
>>>> property
>>>
>>> I don't follow you. Where do you get a phandle from to use with
>>> phy-handle?
>>
>> >From the caller of the function: the consumer of that phy-handle and/or
>> fixed-link property which is either an Ethernet MAC driver or a DSA's
>> switch port node.
>
> I still don't get it. Lets take a real example. I currently have this
> in one of my dts files:
>
> &fec1 {
> phy-mode = "rmii";
> pinctrl-names = "default";
> pinctrl-0 = <&pinctrl_fec1>;
> status = "okay";
>
> fixed-link {
> speed = <100>;
> full-duplex;
> };
> };
All drivers have this exact same structure:
&fec1 {
phy-handle = <XYZ>;
or
fixed-link {
speed = <100>;
full-duplex;
};
};
In both cases, the argument that this proposed helper function would
take is a struct device_node pointing to &fec1 here. You could therefore
imagine having something along these lines:
struct device_node *of_get_phy_by_phandle(struct device_node *dn, bool
try_fixed_link)
{
struct device_node *phy_dn;
int ret;
phy_dn = of_parse_phandle(dn, "phy-handle", 0);
if (!phy_dn && !try_fixed_link)
return -ENODEV;
if (of_phy_is_fixed_link(dn)) {
ret = of_phy_register_fixed_link(dn);
if (ret)
return PTR_ERR(-ret);
phy_dn = of_node_get(dn);
}
return phy_dn;
}
In fact, we could even remove the "try_fixed_link" argument and just see
if of_phy_is_fixed_link() returns true. Yes, this is not a proper
device_node pointing to the emulated PHY, but without introducing
binding changes, that is probably the best we can do.
I mistakenly used the term 'phandle' when I actually meant 'struct
device_node' reference.
--
Florian
^ permalink raw reply
* RE: [ethtool PATCH v4 10/11] ethtool.c: add support for ETHTOOL_xLINKSETTINGS ioctls
From: David Laight @ 2016-03-14 16:43 UTC (permalink / raw)
To: 'Ben Hutchings', David Decotigny, netdev@vger.kernel.org
Cc: Jeff Garzik, David Miller, Vidya Sagar Ravipati, Joe Perches,
David Decotigny
In-Reply-To: <1457919156.3331.90.camel@decadent.org.uk>
> > + /* ignore optional '0x' prefix */
> > + if ((slen > 2) && (
Unnecessary ().
> > + (0 == memcmp(s, "0x", 2)
> > + || (0 == memcmp(s, "0X", 2))))) {
A-about-F comparisons.
> memcmp() is a really poor tool for comparing strings. You should use
> strncasecmp() here.
Even that is overkill, why not just:
if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X'))
David
^ permalink raw reply
* Re: Backport patch from 4.2 to 3.18
From: Sasha Levin @ 2016-03-14 16:44 UTC (permalink / raw)
To: David S. Miller; +Cc: Andrei Sharaev, stable, netdev@vger.kernel.org, LKML
In-Reply-To: <56D9FD6A.4060107@oracle.com>
On 03/04/2016 04:26 PM, Sasha Levin wrote:
> On 03/04/2016 03:40 PM, Andrei Sharaev wrote:
>> > Hi Sasha,
>> >
>> > Can you backport this patch for "inet-frag-fixes" to linux kernel 3.18 LTS?
>> > http://kernel.suse.com/cgit/kernel/commit/?h=v4.2-rc5&id=64b892ad2326348a5b8314167590d240e3bcc69e
>> >
>> > I get 1-5 kernel panics in month for linux kernels 3.18.24-3.18.26 at my NAT server with big IPv4 traffic (10-15 Gbps).
>> > My kernel panics have similar symptoms:
>>> >> <82>general protection fault: 0000 [#1] SMP
>>> >> <82>Modules linked in: bonding ipt_NETFLOW(O) xt_recent configfs x86_pkg_temp_thermal ixgbe(O)
>>> >> <86>CPU: 13 PID: 29908 Comm: kworker/13:2 Tainted: G IO 3.18.26 #1
>>> >> <86>Hardware name: Intel Corporation S2600WT2/S2600WT2, BIOS SE5C610.86B.01.01.0005.101720141054 10/17/2014
>>> >> <82>Workqueue: events inet_frag_worker
>>> >> <86>task: ffff88046cdba9a0 ti: ffff880454928000 task.ti: ffff880454928000
>>> >> <82>RIP: 0010:[<ffffffff815b91d9>] [<ffffffff815b91d9>] inet_evict_bucket+0x109/0x160
>>> >> <86>RSP: 0018:ffff88045492bd38 EFLAGS: 00010286
>>> >> <86>RAX: ffff880441d0e001 RBX: dead0000001000c0 RCX: 000000018030002e
>>> >> <86>RDX: 000000018030002f RSI: ffff880441d0e000 RDI: dead0000001000c0
>>> >> <86>RBP: ffff88045492bd88 R08: 0000000000000000 R09: ffff88086cc88500
>>> >> <86>R10: ffff88046fdb5c50 R11: ffffea0011074380 R12: 0000000000000002
>>> >> <86>R13: ffffffff81e02200 R14: 0000000000000000 R15: ffff88083f0942a0
>>> >> <86>FS: 0000000000000000(0000) GS:ffff88046fda0000(0000) knlGS:0000000000000000
>>> >> <86>CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
>>> >> <86>CR2: 00007fab8f466000 CR3: 000000085f66d000 CR4: 00000000001407e0
>>> >> <86>Stack:
>>> >> <82> ffffffff81e05a78 ffffffff81e05a70 ffff88046cdba9a0 ffff88083f0942e0
>>> >> <82> ffff88046f808c00 0000000000000079 ffffffff81e02200 ffffffff81e06200
>>> >> <82> 0000000000000388 0000000000000007 ffff88045492bdf8 ffffffff815b928a
>>> >> <86>Call Trace:
>>> >> <82> [<ffffffff815b928a>] inet_frag_worker+0x5a/0x230
>>> >> <82> [<ffffffff8105808d>] process_one_work+0x12d/0x330
>>> >> <82> [<ffffffff8105892b>] worker_thread+0x4b/0x450
>>> >> <82> [<ffffffff810588e0>] ? cancel_delayed_work_sync+0x10/0x10
>>> >> <82> [<ffffffff8105cd34>] kthread+0xc4/0xe0
>>> >> <82> [<ffffffff81060c59>] ? finish_task_switch+0x49/0xc0
>>> >> <82> [<ffffffff8105cc70>] ? kthread_create_on_node+0x170/0x170
>>> >> <82> [<ffffffff81603d88>] ret_from_fork+0x58/0x90
>>> >> <82> [<ffffffff8105cc70>] ? kthread_create_on_node+0x170/0x170
>>> >> <82>Code: f6 0f 85 73 ff ff ff 48 8b 45 b8 80 40 08 01 48 8b 7d c8 48 85 ff 74 23 48 83 ef 40 75 0d eb 1b 66 90 48 83 eb 40 48 89 df 74 10 <48> 8b 5f 40 41 ff 95 70 40 00 00 48 85 db 75 e7 48 83 c4 28 44
>>> >> <22>RIP [<ffffffff815b91d9>] inet_evict_bucket+0x109/0x160
>>> >> <82> RSP <ffff88045492bd38>
>> >
> Hey Andrei,
>
> Thanks for the report.
>
> Usually David Miller (Cc'ed) handles backporting network commits. In this case, I see
> that he has elected not to backport it into 4.1 or 3.18, so I don't want to do it without
> getting an ack from him first.
>
> David, is it ok to backport these commits back to 3.18 (and probably 4.1)?
Ping?
^ permalink raw reply
* RE: [PATCH net-next 1/2] rtnetlink: add new RTM_GETSTATS message to dump link stats
From: Elad Raz @ 2016-03-14 15:11 UTC (permalink / raw)
To: Roopa Prabhu, netdev@vger.kernel.org
Cc: jhs@mojatatu.com, davem@davemloft.net, Jiri Pirko, Ido Schimmel
In-Reply-To: <1457834186-45727-2-git-send-email-roopa@cumulusnetworks.com>
> -----Original Message-----
> From: netdev-owner@vger.kernel.org [mailto:netdev-owner@vger.kernel.org]
> On Behalf Of Roopa Prabhu
> Sent: Sunday, March 13, 2016 3:56 AM
> To: netdev@vger.kernel.org
> Cc: jhs@mojatatu.com; davem@davemloft.net
> Subject: [PATCH net-next 1/2] rtnetlink: add new RTM_GETSTATS message to
> dump link stats
>
> From: Roopa Prabhu <roopa@cumulusnetworks.com>
>
> This patch adds a new RTM_GETSTATS message to query link stats via
> netlink from the kernel. RTM_NEWLINK also dumps stats today, but
> RTM_NEWLINK returns a lot more than just stats and is expensive in some
> cases when frequent polling for stats from userspace is a common
> operation.
>
> RTM_GETSTATS is an attempt to provide a light weight netlink message to
> explicity query only link stats from the kernel on an interface.
> The idea is to also keep it extensible so that new kinds of stats can be
> added to it in the future.
>
> This patch adds the following attribute for NETDEV stats:
> struct nla_policy ifla_stats_policy[IFLA_STATS_MAX + 1] = {
> [IFLA_STATS_LINK64] = { .len = sizeof(struct rtnl_link_stats64)
> }, };
>
> This patch also allows for af family stats (an example af stats for IPV6
> is available with the second patch in the series).
>
> Like any other rtnetlink message, RTM_GETSTATS can be used to get stats
> of a single interface or all interfaces with NLM_F_DUMP.
>
> Future possible new types of stat attributes:
> - IFLA_MPLS_STATS (nested. for mpls/mdev stats)
> - IFLA_EXTENDED_STATS (nested. extended software netdev stats like
> bridge,
> vlan, vxlan etc)
> - IFLA_EXTENDED_HW_STATS (nested. extended hardware stats which are
> available via ethtool today)
>
> This patch also declares a filter mask for all stat attributes.
> User has to provide a mask of stats attributes to query. This will be
> specified in a new hdr 'struct if_stats_msg' for stats messages.
>
> Without any attributes in the filter_mask, no stats will be returned.
>
> This patch has been tested with modified iproute2 ifstat.
>
> Suggested-by: Jamal Hadi Salim <jhs@mojatatu.com>
> Signed-off-by: Roopa Prabhu <roopa@cumulusnetworks.com>
> ---
> include/net/rtnetlink.h | 5 ++
> include/uapi/linux/if_link.h | 19 ++++
> include/uapi/linux/rtnetlink.h | 7 ++
> net/core/rtnetlink.c | 200
> +++++++++++++++++++++++++++++++++++++++++
> 4 files changed, 231 insertions(+)
>
> diff --git a/include/net/rtnetlink.h b/include/net/rtnetlink.h index
> 2f87c1b..fa68158 100644
> --- a/include/net/rtnetlink.h
> +++ b/include/net/rtnetlink.h
> @@ -131,6 +131,11 @@ struct rtnl_af_ops {
> const struct nlattr *attr);
> int (*set_link_af)(struct net_device *dev,
> const struct nlattr *attr);
> + size_t (*get_link_af_stats_size)(const struct
> net_device *dev,
> + u32 filter_mask);
> + int (*fill_link_af_stats)(struct sk_buff *skb,
> + const struct net_device *dev,
> + u32 filter_mask);
> };
>
> void __rtnl_af_unregister(struct rtnl_af_ops *ops); diff --git
> a/include/uapi/linux/if_link.h b/include/uapi/linux/if_link.h index
> 249eef9..0840f3e 100644
> --- a/include/uapi/linux/if_link.h
> +++ b/include/uapi/linux/if_link.h
> @@ -741,4 +741,23 @@ enum {
>
> #define IFLA_HSR_MAX (__IFLA_HSR_MAX - 1)
>
> +/* STATS section */
> +
> +struct if_stats_msg {
> + __u8 family;
> + __u32 ifindex;
> + __u32 filter_mask;
> +};
> +
> +enum {
> + IFLA_STATS_UNSPEC,
> + IFLA_STATS_LINK64,
> + IFLA_STATS_INET6,
> + __IFLA_STATS_MAX,
> +};
> +
> +#define IFLA_STATS_MAX (__IFLA_STATS_MAX - 1)
> +
> +#define IFLA_STATS_FILTER_BIT(ATTR) (1 << (ATTR))
> +
> #endif /* _UAPI_LINUX_IF_LINK_H */
> diff --git a/include/uapi/linux/rtnetlink.h
> b/include/uapi/linux/rtnetlink.h index ca764b5..2bbb300 100644
> --- a/include/uapi/linux/rtnetlink.h
> +++ b/include/uapi/linux/rtnetlink.h
> @@ -139,6 +139,13 @@ enum {
> RTM_GETNSID = 90,
> #define RTM_GETNSID RTM_GETNSID
>
> + RTM_NEWSTATS = 92,
> +#define RTM_NEWSTATS RTM_NEWSTATS
I think that RTM_NEWSTATS and RTM_DELSTATS aren't good names, since user doesn't add/del statistics but only query.
Maybe just stay with RTM_GETSTATS and the message back to user will be RTM_GETSTATS as well?
> + RTM_DELSTATS = 93,
> +#define RTM_DELSTATS RTM_DELSTATS
This is not in used
> + RTM_GETSTATS = 94,
> +#define RTM_GETSTATS RTM_GETSTATS
> +
> __RTM_MAX,
> #define RTM_MAX (((__RTM_MAX + 3) & ~3) - 1)
> };
> diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index
> d2d9e5e..d1e3d17 100644
> --- a/net/core/rtnetlink.c
> +++ b/net/core/rtnetlink.c
> @@ -3410,6 +3410,203 @@ out:
> return err;
> }
>
> +static int rtnl_fill_statsinfo(struct sk_buff *skb, struct net_device
> *dev,
> + int type, u32 pid, u32 seq, u32 change,
> + unsigned int flags, unsigned int filter_mask) {
> + const struct rtnl_link_stats64 *stats;
> + struct rtnl_link_stats64 temp;
> + struct if_stats_msg *ifsm;
> + struct nlmsghdr *nlh;
> + struct rtnl_af_ops *af_ops;
> + struct nlattr *attr;
> +
> + ASSERT_RTNL();
> +
> + nlh = nlmsg_put(skb, pid, seq, type, sizeof(*ifsm), flags);
> + if (!nlh)
> + return -EMSGSIZE;
> +
> + ifsm = nlmsg_data(nlh);
> + ifsm->ifindex = dev->ifindex;
> + ifsm->filter_mask = filter_mask;
> +
> + if (filter_mask & IFLA_STATS_FILTER_BIT(IFLA_STATS_LINK64)) {
> + attr = nla_reserve(skb, IFLA_STATS_LINK64,
> + sizeof(struct rtnl_link_stats64));
> + if (!attr)
> + return -EMSGSIZE;
> +
> + stats = dev_get_stats(dev, &temp);
> +
> + copy_rtnl_link_stats64(nla_data(attr), stats);
> + }
> +
> + list_for_each_entry(af_ops, &rtnl_af_ops, list) {
> + if (af_ops->fill_link_af_stats) {
> + int err;
> +
> + err = af_ops->fill_link_af_stats(skb, dev, filter_mask);
> + if (err < 0)
> + goto nla_put_failure;
> + }
> + }
> +
> + nlmsg_end(skb, nlh);
> +
> + return 0;
> +
> +nla_put_failure:
> + nlmsg_cancel(skb, nlh);
> +
> + return -EMSGSIZE;
> +}
> +
> +static const struct nla_policy ifla_stats_policy[IFLA_STATS_MAX + 1] =
> {
> + [IFLA_STATS_LINK64] = { .len = sizeof(struct rtnl_link_stats64)
> },
> +};
> +
> +static size_t rtnl_link_get_af_stats_size(const struct net_device *dev,
> + u32 filter_mask)
> +{
> + struct rtnl_af_ops *af_ops;
> + size_t size = 0;
> +
> + list_for_each_entry(af_ops, &rtnl_af_ops, list) {
> + if (af_ops->get_link_af_stats_size)
> + size += af_ops->get_link_af_stats_size(dev,
> + filter_mask);
> + }
> +
> + return size;
> +}
> +
> +static noinline size_t if_nlmsg_stats_size(const struct net_device
> *dev,
> + u32 filter_mask)
> +{
> + size_t size = 0;
> +
> + if (filter_mask & IFLA_STATS_FILTER_BIT(IFLA_STATS_LINK64))
> + size += nla_total_size(sizeof(struct rtnl_link_stats64));
> +
> + size += rtnl_link_get_af_stats_size(dev, filter_mask);
> +
> + return size;
> +}
> +
> +static int rtnl_stats_get(struct sk_buff *skb, struct nlmsghdr *nlh) {
> + struct net *net = sock_net(skb->sk);
> + struct if_stats_msg *ifsm;
> + struct net_device *dev = NULL;
> + struct sk_buff *nskb;
> + u32 filter_mask;
> + int err;
> +
> + ifsm = nlmsg_data(nlh);
> + if (ifsm->ifindex > 0)
> + dev = __dev_get_by_index(net, ifsm->ifindex);
> + else
> + return -EINVAL;
> +
> + if (!dev)
> + return -ENODEV;
> +
> + filter_mask = ifsm->filter_mask;
> + if (!filter_mask)
> + return -EINVAL;
> +
> + nskb = nlmsg_new(if_nlmsg_stats_size(dev, filter_mask),
> GFP_KERNEL);
> + if (!nskb)
> + return -ENOBUFS;
> +
> + err = rtnl_fill_statsinfo(nskb, dev, RTM_NEWSTATS,
> + NETLINK_CB(skb).portid, nlh->nlmsg_seq, 0,
> + 0, filter_mask);
> + if (err < 0) {
> + /* -EMSGSIZE implies BUG in if_nlmsg_stats_size */
> + WARN_ON(err == -EMSGSIZE);
> + kfree_skb(nskb);
> + } else {
> + err = rtnl_unicast(nskb, net, NETLINK_CB(skb).portid);
> + }
> +
> + return err;
> +}
> +
> +static u16 rtnl_stats_calcit(struct sk_buff *skb, struct nlmsghdr *nlh)
> +{
> + struct net *net = sock_net(skb->sk);
> + struct net_device *dev;
> + u16 min_ifinfo_dump_size = 0;
> + struct if_stats_msg *ifsm;
> + u32 filter_mask;
> +
> + ifsm = nlmsg_data(nlh);
> + filter_mask = ifsm->filter_mask;
> +
> + /* traverse the list of net devices and compute the minimum
> + * buffer size based upon the filter mask.
> + */
> + list_for_each_entry(dev, &net->dev_base_head, dev_list) {
> + min_ifinfo_dump_size = max_t(u16, min_ifinfo_dump_size,
> + if_nlmsg_stats_size(dev,
> + filter_mask));
> + }
> +
> + return min_ifinfo_dump_size;
> +}
> +
> +static int rtnl_stats_dump(struct sk_buff *skb, struct netlink_callback
> +*cb) {
> + struct net *net = sock_net(skb->sk);
> + struct if_stats_msg *ifsm;
> + int h, s_h;
> + int idx = 0, s_idx;
> + struct net_device *dev;
> + struct hlist_head *head;
> + unsigned int flags = NLM_F_MULTI;
> + u32 filter_mask = 0;
> + int err;
> +
> + s_h = cb->args[0];
> + s_idx = cb->args[1];
> +
> + cb->seq = net->dev_base_seq;
> +
> + ifsm = nlmsg_data(cb->nlh);
> + filter_mask = ifsm->filter_mask;
> +
> + for (h = s_h; h < NETDEV_HASHENTRIES; h++, s_idx = 0) {
> + idx = 0;
> + head = &net->dev_index_head[h];
> + hlist_for_each_entry(dev, head, index_hlist) {
> + if (idx < s_idx)
> + goto cont;
> + err = rtnl_fill_statsinfo(skb, dev, RTM_NEWSTATS,
> + NETLINK_CB(cb->skb).portid,
> + cb->nlh->nlmsg_seq, 0,
> + flags, filter_mask);
> + /* If we ran out of room on the first message,
> + * we're in trouble
> + */
> + WARN_ON((err == -EMSGSIZE) && (skb->len == 0));
> +
> + if (err < 0)
> + goto out;
> +
> + nl_dump_check_consistent(cb, nlmsg_hdr(skb));
> +cont:
> + idx++;
> + }
> + }
> +out:
> + cb->args[1] = idx;
> + cb->args[0] = h;
> +
> + return skb->len;
> +}
> +
> /* Process one rtnetlink message. */
>
> static int rtnetlink_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
> @@ -3559,4 +3756,7 @@ void __init rtnetlink_init(void)
> rtnl_register(PF_BRIDGE, RTM_GETLINK, NULL, rtnl_bridge_getlink,
> NULL);
> rtnl_register(PF_BRIDGE, RTM_DELLINK, rtnl_bridge_dellink, NULL,
> NULL);
> rtnl_register(PF_BRIDGE, RTM_SETLINK, rtnl_bridge_setlink, NULL,
> NULL);
> +
> + rtnl_register(PF_UNSPEC, RTM_GETSTATS, rtnl_stats_get,
> rtnl_stats_dump,
> + rtnl_stats_calcit);
> }
> --
> 1.9.1
^ permalink raw reply
* Re: [PATCH 1/1] net: Fix use after free in the recvmmsg exit path
From: David Miller @ 2016-03-14 16:42 UTC (permalink / raw)
To: acme; +Cc: netdev, linux-kernel, acme, glider, edumazet, kcc, sasha.levin
In-Reply-To: <1457960195-4302-2-git-send-email-acme@kernel.org>
From: Arnaldo Carvalho de Melo <acme@kernel.org>
Date: Mon, 14 Mar 2016 09:56:35 -0300
> From: Arnaldo Carvalho de Melo <acme@redhat.com>
>
> The syzkaller fuzzer hit the following use-after-free:
>
> Call Trace:
> [<ffffffff8175ea0e>] __asan_report_load8_noabort+0x3e/0x40 mm/kasan/report.c:295
> [<ffffffff851cc31a>] __sys_recvmmsg+0x6fa/0x7f0 net/socket.c:2261
> [< inline >] SYSC_recvmmsg net/socket.c:2281
> [<ffffffff851cc57f>] SyS_recvmmsg+0x16f/0x180 net/socket.c:2270
> [<ffffffff86332bb6>] entry_SYSCALL_64_fastpath+0x16/0x7a
> arch/x86/entry/entry_64.S:185
>
> And, as Dmitry rightly assessed, that is because we can drop the
> reference and then touch it when the underlying recvmsg calls return
> some packets and then hit an error, which will make recvmmsg to set
> sock->sk->sk_err, oops, fix it.
>
> Reported-and-Tested-by: Dmitry Vyukov <dvyukov@google.com>
> Cc: Alexander Potapenko <glider@google.com>
> Cc: Eric Dumazet <edumazet@google.com>
> Cc: Kostya Serebryany <kcc@google.com>
> Cc: Sasha Levin <sasha.levin@oracle.com>
> Fixes: a2e2725541fa ("net: Introduce recvmmsg socket syscall")
> http://lkml.kernel.org/r/20160122211644.GC2470@redhat.com
> Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Applied and queued up for -stable, thanks Arnaldo!
^ permalink raw reply
* Re: [PATCH v2 0/2] net: thunderx: Performance enhancement changes
From: David Miller @ 2016-03-14 16:33 UTC (permalink / raw)
To: sunil.kovvuri
Cc: netdev, linux-kernel, linux-arm-kernel, sgoutham, robert.richter
In-Reply-To: <1457953578-7054-1-git-send-email-sunil.kovvuri@gmail.com>
From: sunil.kovvuri@gmail.com
Date: Mon, 14 Mar 2016 16:36:13 +0530
> Below patches attempts to improve performance by reducing
> no of atomic operations while allocating new receive buffers
> and reducing cache misses by adjusting nicvf structure elements.
>
> Changes from v1:
> No changes, resubmitting a fresh as per David's suggestion.
Series applied, thanks.
^ permalink raw reply
* Re: [PATCH][net-next] ipv6: replace write lock with read lock in addrconf_permanent_addr
From: David Miller @ 2016-03-14 16:25 UTC (permalink / raw)
To: roy.qing.li; +Cc: netdev
In-Reply-To: <1457948108-24837-1-git-send-email-roy.qing.li@gmail.com>
From: roy.qing.li@gmail.com
Date: Mon, 14 Mar 2016 17:35:08 +0800
> From: Li RongQing <roy.qing.li@gmail.com>
>
> nothing of idev is changed, so read lock is enough
>
> Signed-off-by: Li RongQing <roy.qing.li@gmail.com>
We need it for the modifications made by fixup_permanent_addr().
^ permalink raw reply
* Re: [PATCH net-next v1] tipc: make sure IPv6 header fits in skb headroom
From: David Miller @ 2016-03-14 16:23 UTC (permalink / raw)
To: richard.alpe; +Cc: netdev, tipc-discussion
In-Reply-To: <1457945032-30547-1-git-send-email-richard.alpe@ericsson.com>
From: Richard Alpe <richard.alpe@ericsson.com>
Date: Mon, 14 Mar 2016 09:43:52 +0100
> Expand headroom further in order to be able to fit the larger IPv6
> header. Prior to this patch this caused a skb under panic for certain
> tipc packets when using IPv6 UDP bearer(s).
>
> Signed-off-by: Richard Alpe <richard.alpe@ericsson.com>
> Acked-by: Jon Maloy <jon.maloy@ericsson.com>
Applied.
^ permalink raw reply
* Re: [PATCH v6 net-next 00/10] API set for HW Buffer management
From: David Miller @ 2016-03-14 16:21 UTC (permalink / raw)
To: gregory.clement
Cc: linux-kernel, netdev, thomas.petazzoni, f.fainelli, jason, andrew,
sebastian.hesselbarth, linux-arm-kernel, alior, nadavh, mw,
simon.guinot, linux, w, timork, dima, nitroshift
In-Reply-To: <1457944745-7634-1-git-send-email-gregory.clement@free-electrons.com>
From: Gregory CLEMENT <gregory.clement@free-electrons.com>
Date: Mon, 14 Mar 2016 09:38:55 +0100
> This is the sixth version of the API set for HW Buffer management (that was
> initially submitted here:
> http://thread.gmane.org/gmane.linux.kernel/2125152).
Series applied, thanks.
^ permalink raw reply
* Re: When will net-next merge with linux-next?
From: gregkh @ 2016-03-14 16:21 UTC (permalink / raw)
To: Dexuan Cui
Cc: David Miller, netdev@vger.kernel.org, KY Srinivasan,
Haiyang Zhang
In-Reply-To: <BLUPR03MB14106249C57CCF66717CC860BF880@BLUPR03MB1410.namprd03.prod.outlook.com>
On Mon, Mar 14, 2016 at 06:09:41AM +0000, Dexuan Cui wrote:
> Hi David,
> I have a pending patch of the hv_sock driver, which should go into the
> kernel through the net-next tree:
> https://lkml.org/lkml/2016/2/14/7
>
> The VMBus side's supporting patches of hv_sock have been in Greg's tree
> and linux-next for more than 1 month, but they haven't been in net-next
> yet, I suppose this is because of the releasing of 4.5.
>
> Now 4.5 is released. Will you merge with Greg's tree or linux-next?
linux-next is a merge of all of the maintainer's trees, and it is
rebased every day, it's impossible to merge that back into a maintainers
tree, sorry.
> I read netdev-FAQ.txt, but still don't have a clear idea about how things
> work in my case.
Try reading Documentation/development-process/ please. Things will get
merged together into Linus's tree over the next 2 weeks as we ask him to
pull our trees.
thanks,
greg k-h
^ permalink raw reply
* Re: [PATCH v3 0/8] arm64: rockchip: Initial GeekBox enablement
From: Giuseppe CAVALLARO @ 2016-03-14 16:20 UTC (permalink / raw)
To: Tomeu Vizoso
Cc: devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, Dinh Nguyen,
Heiko Stübner, netdev-u79uwXL29TY76Z2rM5mHXA, LKML,
Frank Schäfer, open list:ARM/Rockchip SoC...,
Gabriel Fernandez, Fabrice GASNIER, Andreas Färber, LAKML,
Alexandre TORGUE
In-Reply-To: <CAAObsKB-tSCu5KMYk2Zi-oX9zMKEOwwT93sMkiZKiYvtexmHaQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
Hi Tomeu
On 3/14/2016 12:43 PM, Tomeu Vizoso wrote:
> Hi Peppe,
>
> with that patch I don't see any difference at all in my setup.
>
> So to be clear, with these commits on top of next-20160314, I still
> get the hang during boot:
>
> 209afef6f0cd ARM: dts: rockchip: Add mdio node to ethernet node
> 2315acc6cf7f Revert "stmmac: first frame prep at the end of xmit routine"
> b5e08e810c63 stmmac: fix tx prepare for normal desc
> 37c15a31d850 i2c: immediately mark ourselves as registered
> 4342eec3c5a2 Add linux-next specific files for 20160314
>
> [ 27.521026] WARNING: CPU: 1 PID: 0 at net/sched/sch_generic.c:303
> dev_watchdog+0x284/0x288
> [ 27.529460] NETDEV WATCHDOG: eth0 (rk_gmac-dwmac): transmit queue 0 timed out
I do not reproduce the WATCHDOG but i am continuing to look at the code
to understand if normal descriptor management is ok or not. I keep you
informed.
Just an info, did you test with 2315acc6cf7f included? Just to
understand if it is introducing a problem. It works in case of
enhanced descriptors are used instead of.
>
> https://git.collabora.com/cgit/user/tomeu/linux.git/log/?h=broken-eth-on-rock2
thx I will take a look at this
Regards
Peppe
^ permalink raw reply
* Re: pull-request: wireless-drivers-next 2016-03-14
From: David Miller @ 2016-03-14 16:15 UTC (permalink / raw)
To: kvalo; +Cc: linux-wireless, netdev
In-Reply-To: <87y49llatn.fsf@kamboji.qca.qualcomm.com>
From: Kalle Valo <kvalo@codeaurora.org>
Date: Mon, 14 Mar 2016 10:31:48 +0200
> I know I'm late now that merge window was opened yesterday but here's
> one more set of patches I would like to get to 4.6 still. There isn't
> anything controversial so I hope this should be still safe to pull. The
> patches have been in linux-next since Friday and I haven't seen any
> reports about issues. But if you think it's too late just let me know
> and I'll resubmit these for 4.7.
>
> The most notable part here of course is rtl8xxxu with over 100 patches.
> As the driver is new and under heavy development I think they are ok to
> take still. Otherwise there are mostly fixes with an exception of adding
> a new debugfs file to wl18xx.
>
> Please let me know if you have any problems.
Pulled, thanks.
I really like Jes's work and I wish you had integrated it several
months ago, instead of sloshing him needlessly through a non-stop
cycle of very nit-picky issues, just FYI.
^ permalink raw reply
* Re: Generic TSO
From: Alexander Duyck @ 2016-03-14 15:59 UTC (permalink / raw)
To: Edward Cree; +Cc: Tom Herbert, Linux Kernel Network Developers
In-Reply-To: <56E6933E.3050407@solarflare.com>
On Mon, Mar 14, 2016 at 3:32 AM, Edward Cree <ecree@solarflare.com> wrote:
> On 14/03/16 10:26, Edward Cree wrote:
>> On 12/03/16 05:40, Alexander Duyck wrote:
>>> Well that is the thing. Before we can actually start tinkering with
>>> the outer header we probably need to make sure we set the DF bit and
>>> that it would be honored on the outer headers for IPv4. I don't
>>> believe any of the tunnels are currently doing that so repeating the
>>> IP ID would be the worst possible scenario until that is resolved
>>> since VXLAN tunneled frames can be fragmented while TCP frames cannot
>>> so we really shouldn't be repeating IP IDs for the outer headers.
>> So how do we progress with that? I'm presuming it's not as simple as
>> just patching the tunnel drivers to set DF if the inner packet has it,
>> as that could break existing setups. (I've heard that "but they're
>> already broken anyway" is not usually an acceptable argument.) Some
>> sort of configuration option on the tunnel (like we do with udpcsum)?
> ...and immediately I find out it already exists. (I guess I should have
> looked there first!)
> From drivers/net/vxlan.c:2001:
>> else if (info->key.tun_flags & TUNNEL_DONT_FRAGMENT)
>> df = htons(IP_DF);
I'm still not a fan of trying to freeze the outer IP header. I think
it should be the one that should have the IP ID increment while the
inner IP header be the one that is frozen. Maybe that is where we can
differ per device. I would be okay with the outer tunnel headers and
inner IP header being frozen on ixgbe which will be needed in order to
compute outer UDP checksum anyway. Then we could leave it up to the
driver's discretion as to if the outer header has the IP ID that
increments or the inner header.
- Alex
^ permalink raw reply
* [PATCH trivial] netfilter: xt_limit: Spelling s/maxmum/maximum/
From: Geert Uytterhoeven @ 2016-03-14 15:32 UTC (permalink / raw)
To: David S. Miller, Jiri Kosina; +Cc: netdev, linux-kernel, Geert Uytterhoeven
Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
---
net/netfilter/xt_limit.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/net/netfilter/xt_limit.c b/net/netfilter/xt_limit.c
index bef8505965589298..c1a4d5bf25d5bf9f 100644
--- a/net/netfilter/xt_limit.c
+++ b/net/netfilter/xt_limit.c
@@ -47,7 +47,7 @@ static DEFINE_SPINLOCK(limit_lock);
See Alexey's formal explanation in net/sched/sch_tbf.c.
- To get the maxmum range, we multiply by this factor (ie. you get N
+ To get the maximum range, we multiply by this factor (ie. you get N
credits per jiffy). We want to allow a rate as low as 1 per day
(slowest userspace tool allows), which means
CREDITS_PER_JIFFY*HZ*60*60*24 < 2^32. ie. */
--
1.9.1
^ permalink raw reply related
* [PATCH net-next] ixgbe: Avoid unaligned access in ixgbe_atr() for LLC packets
From: Sowmini Varadhan @ 2016-03-14 15:32 UTC (permalink / raw)
To: intel-wired-lan, netdev
Cc: sowmini.varadhan, jeffrey.t.kirsher, jesse.brandeburg,
shannon.nelson, carolyn.wyborny, donald.c.skidmore, bruce.w.allan,
john.ronciak, mitch.a.williams
For LLC based protocols like lldp, stp etc., the ethernet header
is an 802.3 header with a h_proto that is not 0x800, 0x86dd, or
even 0x806. In this world, the skb_network_header() points at
the DSAP/SSAP/.. and is not likely to be NET_IP_ALIGNed in
ixgbe_atr().
With LLC, drivers are not likely to correctly find IPVERSION,
or "6", at hdr.ipv4->version, but will instead just needlessly
trigger an unaligned access. (IPv4/IPv6 over LLC is almost never
implemented).
The unaligned access is thus avoidable: bail out quickly after
examining skb->protocol.
Signed-off-by: Sowmini Varadhan <sowmini.varadhan@oracle.com>
---
drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 5 +++++
1 files changed, 5 insertions(+), 0 deletions(-)
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
index 4d6223d..c3885a8 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
@@ -7602,6 +7602,11 @@ static void ixgbe_atr(struct ixgbe_ring *ring,
#endif /* CONFIG_IXGBE_VXLAN */
}
+ if (skb->protocol != htons(ETH_P_IP) &&
+ skb->protocol != htons(ETH_P_IPV6) &&
+ skb->protocol != htons(ETH_P_ARP))
+ return;
+
/* Currently only IPv4/IPv6 with TCP is supported */
switch (hdr.ipv4->version) {
case IPVERSION:
--
1.7.1
^ permalink raw reply related
* Re: [PATCH -next] bridge: fix potential use-after-free when hook returns QUEUE or STOLEN verdict
From: Zefir Kurtisi @ 2016-03-14 15:28 UTC (permalink / raw)
To: Florian Westphal, netdev; +Cc: stephen, Felix Fietkau
In-Reply-To: <1457777682-24689-1-git-send-email-fw@strlen.de>
On 03/12/2016 11:14 AM, Florian Westphal wrote:
> Zefir Kurtisi reported kernel panic with an openwrt specific patch.
> However, it turns out that mainline has a similar bug waiting to happen.
>
> Once NF_HOOK() returns the skb is in undefined state and must not be
> used. Moreover, the okfn must consume the skb to support async
> processing (NF_QUEUE).
>
> Current okfn in this spot doesn't consume it and caller assumes that
> NF_HOOK return value tells us if skb was freed or not, but thats wrong.
>
> It "works" because no in-tree user registers a NFPROTO_BRIDGE hook at
> LOCAL_IN that returns STOLEN or NF_QUEUE verdicts.
>
> Once we add NF_QUEUE support for nftables bridge this will break --
> NF_QUEUE holds the skb for async processing, caller will erronoulsy
> return RX_HANDLER_PASS and on reinject netfilter will access free'd skb.
>
> Fix this by pushing skb up the stack in the okfn instead.
>
> NB: It also seems dubious to use LOCAL_IN while bypassing PRE_ROUTING
> completely in this case but this is how its been forever so it seems
> preferable to not change this.
>
> Cc: Felix Fietkau <nbd@openwrt.org>
> Cc: Zefir Kurtisi <zefir.kurtisi@neratec.com>
> Signed-off-by: Florian Westphal <fw@strlen.de>
> ---
>
Looks good: applying the same fix-pattern to OpenWRT private patches solved the
oops previously observed.
Thanks for the quick resolution.
Tested-by: Zefir Kurtisi <zefir.kurtisi@neratec.com>
^ permalink raw reply
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox