From 2d6644d961e6a35e30798490e65d60a9ea800b2b Mon Sep 17 00:00:00 2001 From: Jayapal Date: Wed, 17 Jul 2013 16:59:32 +0530 Subject: [PATCH] CLOUDSTACK-2433 Enable rps and rfs in virtual router --- .../VirtualRoutingResource.java | 9 +++- .../config/etc/init.d/cloud-early-config | 41 +++++++++++++++++ .../debian/config/opt/cloud/bin/ipassoc.sh | 45 +++++++++++++++++-- .../resource/LibvirtComputingResource.java | 4 +- .../vmware/resource/VmwareResource.java | 4 ++ .../xen/resource/CitrixResourceBase.java | 5 +++ 6 files changed, 102 insertions(+), 6 deletions(-) diff --git a/core/src/com/cloud/agent/resource/virtualnetwork/VirtualRoutingResource.java b/core/src/com/cloud/agent/resource/virtualnetwork/VirtualRoutingResource.java index 32fd72857f1..0b26220f6dc 100755 --- a/core/src/com/cloud/agent/resource/virtualnetwork/VirtualRoutingResource.java +++ b/core/src/com/cloud/agent/resource/virtualnetwork/VirtualRoutingResource.java @@ -531,7 +531,7 @@ public class VirtualRoutingResource implements Manager { for (IpAddressTO ip : ips) { result = assignPublicIpAddress(routerName, routerIp, ip.getPublicIp(), ip.isAdd(), ip.isFirstIP(), ip.isSourceNat(), ip.getVlanId(), ip.getVlanGateway(), ip.getVlanNetmask(), - ip.getVifMacAddress(), 2); + ip.getVifMacAddress(), 2, false); if (result != null) { results[i++] = IpAssocAnswer.errorResult; } else { @@ -1019,7 +1019,7 @@ public class VirtualRoutingResource implements Manager { final String privateIpAddress, final String publicIpAddress, final boolean add, final boolean firstIP, final boolean sourceNat, final String vlanId, final String vlanGateway, - final String vlanNetmask, final String vifMacAddress, int nicNum){ + final String vlanNetmask, final String vifMacAddress, int nicNum, boolean newNic){ String args = ""; if (add) { @@ -1043,6 +1043,11 @@ public class VirtualRoutingResource implements Manager { args +=" -g "; args += vlanGateway; + + if (newNic) { + args += " -n"; + } + return routerProxy("ipassoc.sh", privateIpAddress, args); } diff --git a/patches/systemvm/debian/config/etc/init.d/cloud-early-config b/patches/systemvm/debian/config/etc/init.d/cloud-early-config index 5835c4dde1b..c04ff90dc6a 100755 --- a/patches/systemvm/debian/config/etc/init.d/cloud-early-config +++ b/patches/systemvm/debian/config/etc/init.d/cloud-early-config @@ -366,6 +366,46 @@ disable_hvc() { [ -d /proc/xen ] && sed -i 's/^#vc/vc/' /etc/inittab && telinit q } +enable_rpsrfs() { + local enable=$1 + + if [ $eanble -eq 0] + then + echo 0 > /etc/rpsrfsenable + return 0 + fi + + if [ ! -f /sys/class/net/eth0/queues/rx-0/rps_cpus ] + then + echo "rps is not enabled in the kernel" + echo 0 > /etc/rpsrfsenable + return 0 + fi + + proc=$(cat /proc/cpuinfo | grep "processor" | wc -l) + if [ $proc -le 1 ] + then + echo 0 > /etc/rpsrfsenable + return 0; + fi + + echo 1 > /etc/rpsrfsenable + num=1 + num=$(($num<<$proc)) + num=$(($num-1)); + echo $num; + hex=$(printf "%x\n" $num) + echo $hex; + #enable rps + echo $hex > /sys/class/net/eth0/queues/rx-0/rps_cpus + echo $hex > /sys/class/net/eth2/queues/rx-0/rps_cpus + + #enble rps + echo 256 > /proc/sys/net/core/rps_sock_flow_entries + echo 256 > /sys/class/net/eth0/queues/rx-0/rps_flow_cnt + echo 256 > /sys/class/net/eth2/queues/rx-0/rps_flow_cnt +} + setup_common() { init_interfaces $1 $2 $3 if [ -n "$ETH0_IP" ] @@ -731,6 +771,7 @@ setup_router() { enable_svc cloud 0 disable_rpfilter_domR enable_fwding 1 + enable_rpsrfs 1 chkconfig nfs-common off cp /etc/iptables/iptables-router /etc/iptables/rules.v4 #for old templates diff --git a/patches/systemvm/debian/config/opt/cloud/bin/ipassoc.sh b/patches/systemvm/debian/config/opt/cloud/bin/ipassoc.sh index 9efae26877e..ae2d7e4296c 100755 --- a/patches/systemvm/debian/config/opt/cloud/bin/ipassoc.sh +++ b/patches/systemvm/debian/config/opt/cloud/bin/ipassoc.sh @@ -230,7 +230,7 @@ add_first_ip() { sudo arping -c 1 -I $ethDev -A -U -s $ipNoMask $ipNoMask; sudo arping -c 1 -I $ethDev -A -U -s $ipNoMask $ipNoMask; fi - add_routing $1 + add_routing $1 return 0 } @@ -277,7 +277,7 @@ add_an_ip () { sudo arping -c 1 -I $ethDev -A -U -s $ipNoMask $ipNoMask; sudo arping -c 1 -I $ethDev -A -U -s $ipNoMask $ipNoMask; fi - add_routing $1 + add_routing $1 return $? } @@ -303,11 +303,41 @@ remove_an_ip () { return 0 } +enable_rpsrfs() { + #enable rps and rfs for this new interface + if [ -f /etc/rpsrfsenable ] + then + enable=$(cat /etc/rpsrfsenable) + if [ $enable -eq 1 ] + then + proc=$(cat /proc/cpuinfo | grep "processor" | wc -l) + if [ $proc -le 1 ] + then + return $status; + fi + + num=1 + num=$(($num<<$proc)) + num=$(($num-1)); + echo $num; + hex=$(printf "%x\n" $num) + echo $hex; + #enable rps + echo $hex > /sys/class/net/$ethDev/queues/rx-0/rps_cpus + + #enable rfs + echo 256 > /sys/class/net/$ethDev/queues/rx-0/rps_flow_cnt + + fi + fi +} + #set -x sflag=0 lflag= fflag= cflag= +nflag= op="" is_master=0 @@ -328,7 +358,7 @@ then if_keep_state=1 fi -while getopts 'sfADa:l:c:g:' OPTION +while getopts 'sfADna:l:c:g:' OPTION do case $OPTION in A) Aflag=1 @@ -350,6 +380,8 @@ do g) gflag=1 defaultGwIP="$OPTARG" ;; + n) nflag=1 + ;; ?) usage unlock_exit 2 $lock $locked ;; @@ -370,6 +402,13 @@ then fi +if [ "$Aflag" == "1" ] && [ "$nflag" == "1" ] +then + #enable rps, rfs for the new interface + enable_rpsrfs + + fi + if [ "$fflag" == "1" ] && [ "$Aflag" == "1" ] then add_first_ip $publicIp && diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java index da86612ebcc..571bcc8cd7e 100755 --- a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java +++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java @@ -1922,19 +1922,21 @@ ServerResource { int i = 0; String result = null; int nicNum = 0; + boolean newNic = false; for (IpAddressTO ip : ips) { if (!vlanAllocatedToVM.containsKey(ip.getVlanId())) { /* plug a vif into router */ VifHotPlug(conn, routerName, ip.getVlanId(), ip.getVifMacAddress()); vlanAllocatedToVM.put(ip.getVlanId(), nicPos++); + newNic = true; } nicNum = vlanAllocatedToVM.get(ip.getVlanId()); networkUsage(routerIp, "addVif", "eth" + nicNum); result = _virtRouterResource.assignPublicIpAddress(routerName, routerIp, ip.getPublicIp(), ip.isAdd(), ip.isFirstIP(), ip.isSourceNat(), ip.getVlanId(), ip.getVlanGateway(), - ip.getVlanNetmask(), ip.getVifMacAddress(), nicNum); + ip.getVlanNetmask(), ip.getVifMacAddress(), nicNum, newNic); if (result != null) { results[i++] = IpAssocAnswer.errorResult; diff --git a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java index a45a8ce113b..f0e9e08a1e9 100755 --- a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java +++ b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java @@ -1769,6 +1769,10 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa args += " -g "; args += vlanGateway; + if (addVif) { + args += " -n "; + } + if (s_logger.isDebugEnabled()) { s_logger.debug("Run command on domain router " + privateIpAddress + ", /opt/cloud/bin/ipassoc.sh " + args); } diff --git a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java index d6d05232289..991a890fadd 100644 --- a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java +++ b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java @@ -2366,6 +2366,11 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe args += " -g "; args += vlanGateway; + if (addVif) { + //To indicate this is new interface created + args += " -n"; + } + String result = callHostPlugin(conn, "vmops", "routerProxy", "args", args); if (result == null || result.isEmpty()) {