X-Git-Url: http://git.archive.openwrt.org/?a=blobdiff_plain;ds=sidebyside;f=system-linux.c;h=a6734a4bed7b39a8680f521d7ae850dc2398a3c6;hb=8b468ec5022834d04b6be1cf45b4fe4f092c692e;hp=21385fc767b971c18fb5e237995e00bd4a5a504d;hpb=3eea8576d48d9b20cc1c6b46f54c7345a39d13aa;p=project%2Fnetifd.git diff --git a/system-linux.c b/system-linux.c index 21385fc..a6734a4 100644 --- a/system-linux.c +++ b/system-linux.c @@ -51,6 +51,7 @@ #include #include #include +#include #include #include @@ -373,7 +374,6 @@ static int system_get_neigh6reachabletime(struct device *dev, char *buf, const s static int cb_rtnl_event(struct nl_msg *msg, void *arg) { struct nlmsghdr *nh = nlmsg_hdr(msg); - struct ifinfomsg *ifi = NLMSG_DATA(nh); struct nlattr *nla[__IFLA_MAX]; int link_state = 0; char buf[10]; @@ -381,7 +381,7 @@ static int cb_rtnl_event(struct nl_msg *msg, void *arg) if (nh->nlmsg_type != RTM_NEWLINK) goto out; - nlmsg_parse(nh, sizeof(*ifi), nla, __IFLA_MAX - 1, NULL); + nlmsg_parse(nh, sizeof(struct ifinfomsg), nla, __IFLA_MAX - 1, NULL); if (!nla[IFLA_IFNAME]) goto out; @@ -798,7 +798,7 @@ int system_bridge_addbr(struct device *bridge, struct bridge_config *cfg) bridge->ifname, cfg->igmp_snoop ? "1" : "0"); system_set_dev_sysctl("/sys/devices/virtual/net/%s/bridge/multicast_querier", - bridge->ifname, cfg->igmp_snoop ? "1" : "0"); + bridge->ifname, cfg->multicast_querier ? "1" : "0"); args[0] = BRCTL_SET_BRIDGE_PRIORITY; args[1] = cfg->priority; @@ -1055,14 +1055,43 @@ system_if_get_settings(struct device *dev, struct device_settings *s) } } +static void +system_if_set_rps_xps_val(const char *path, int val) +{ + char val_buf[8]; + glob_t gl; + int i; + + if (glob(path, 0, NULL, &gl)) + return; + + snprintf(val_buf, sizeof(val_buf), "%x", val); + for (i = 0; i < gl.gl_pathc; i++) + system_set_sysctl(gl.gl_pathv[i], val_buf); +} + +static void +system_if_apply_rps_xps(struct device *dev, struct device_settings *s) +{ + long n_cpus = sysconf(_SC_NPROCESSORS_ONLN); + int val; + + if (n_cpus < 2) + return; + + val = (1 << n_cpus) - 1; + snprintf(dev_buf, sizeof(dev_buf), "/sys/class/net/%s/queues/*/rps_cpus", dev->ifname); + system_if_set_rps_xps_val(dev_buf, s->rps ? val : 0); + + snprintf(dev_buf, sizeof(dev_buf), "/sys/class/net/%s/queues/*/xps_cpus", dev->ifname); + system_if_set_rps_xps_val(dev_buf, s->xps ? val : 0); +} + void system_if_apply_settings(struct device *dev, struct device_settings *s, unsigned int apply_mask) { struct ifreq ifr; - if (!apply_mask) - return; - memset(&ifr, 0, sizeof(ifr)); strncpy(ifr.ifr_name, dev->ifname, sizeof(ifr.ifr_name)); if (s->flags & DEV_OPT_MTU & apply_mask) { @@ -1116,6 +1145,8 @@ system_if_apply_settings(struct device *dev, struct device_settings *s, unsigned snprintf(buf, sizeof(buf), "%d", s->neigh6reachabletime); system_set_neigh6reachabletime(dev, buf); } + + system_if_apply_rps_xps(dev, s); } int system_if_up(struct device *dev)