Commit f78e316f authored by Eric Dumazet's avatar Eric Dumazet Committed by Stephen Hemminger

ip: Support IFLA_TXQLEN in ip link command

Eric Dumazet a écrit :
> We currently use an expensive ioctl() to get device txqueuelen, while
> rtnetlink gave it to us for free. This patch speeds up ip link operation
> when many devices are registered.
>

Here is a 2nd version od this patch, not displaying "qlen 0" useless info

[PATCH iproute2] ip: Support IFLA_TXQLEN in ip link show command

We currently use an expensive ioctl() to get device txqueuelen, while
rtnetlink gave it to us for free. This patch speeds up ip link operation
when many devices are registered.
Signed-off-by: default avatarEric Dumazet <eric.dumazet@gmail.com>
parent 892eba30
...@@ -130,26 +130,31 @@ static void print_operstate(FILE *f, __u8 state) ...@@ -130,26 +130,31 @@ static void print_operstate(FILE *f, __u8 state)
fprintf(f, "state %s ", oper_states[state]); fprintf(f, "state %s ", oper_states[state]);
} }
static void print_queuelen(FILE *f, const char *name) static void print_queuelen(FILE *f, struct rtattr *tb[IFLA_MAX + 1])
{ {
int qlen;
if (tb[IFLA_TXQLEN])
qlen = *(int *)RTA_DATA(tb[IFLA_TXQLEN]);
else {
struct ifreq ifr; struct ifreq ifr;
int s; int s = socket(AF_INET, SOCK_STREAM, 0);
s = socket(AF_INET, SOCK_STREAM, 0);
if (s < 0) if (s < 0)
return; return;
memset(&ifr, 0, sizeof(ifr)); memset(&ifr, 0, sizeof(ifr));
strcpy(ifr.ifr_name, name); strcpy(ifr.ifr_name, (char *)RTA_DATA(tb[IFLA_IFNAME]));
if (ioctl(s, SIOCGIFTXQLEN, &ifr) < 0) { if (ioctl(s, SIOCGIFTXQLEN, &ifr) < 0) {
fprintf(f, "ioctl(SIOCGIFXQLEN) failed: %s\n", strerror(errno)); fprintf(f, "ioctl(SIOCGIFXQLEN) failed: %s\n", strerror(errno));
close(s); close(s);
return; return;
} }
close(s); close(s);
qlen = ifr.ifr_qlen;
if (ifr.ifr_qlen) }
fprintf(f, "qlen %d", ifr.ifr_qlen); if (qlen)
fprintf(f, "qlen %d", qlen);
} }
static void print_linktype(FILE *fp, struct rtattr *tb) static void print_linktype(FILE *fp, struct rtattr *tb)
...@@ -286,7 +291,7 @@ int print_linkinfo(const struct sockaddr_nl *who, ...@@ -286,7 +291,7 @@ int print_linkinfo(const struct sockaddr_nl *who,
print_operstate(fp, *(__u8 *)RTA_DATA(tb[IFLA_OPERSTATE])); print_operstate(fp, *(__u8 *)RTA_DATA(tb[IFLA_OPERSTATE]));
if (filter.showqueue) if (filter.showqueue)
print_queuelen(fp, (char*)RTA_DATA(tb[IFLA_IFNAME])); print_queuelen(fp, tb);
if (!filter.family || filter.family == AF_PACKET) { if (!filter.family || filter.family == AF_PACKET) {
SPRINT_BUF(b1); SPRINT_BUF(b1);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment