aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv4
diff options
context:
space:
mode:
authorAlexander Duyck <alexander.h.duyck@redhat.com>2015-01-22 18:51:20 -0500
committerDavid S. Miller <davem@davemloft.net>2015-01-25 17:47:16 -0500
commita80e89d4c650a7c3ab74f0b2d133cc2ce9738994 (patch)
tree7f97ff5e1bd693e43b61eaf75f238a8fbe96e7ea /net/ipv4
parent69fa57b1e42c171599d53486839c3d58f7ed8eec (diff)
fib_trie: Fall back to slen update on inflate/halve failure
This change corrects an issue where if inflate or halve fails we were exiting the resize function without at least updating the slen for the node. To correct this I have moved the update of max_size into the while loop so that it is only decremented on a successful call to either inflate or halve. Signed-off-by: Alexander Duyck <alexander.h.duyck@redhat.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv4')
-rw-r--r--net/ipv4/fib_trie.c10
1 files changed, 5 insertions, 5 deletions
diff --git a/net/ipv4/fib_trie.c b/net/ipv4/fib_trie.c
index 7e9031739f06..80892f565030 100644
--- a/net/ipv4/fib_trie.c
+++ b/net/ipv4/fib_trie.c
@@ -752,7 +752,7 @@ static void resize(struct trie *t, struct tnode *tn)
752{ 752{
753 struct tnode *tp = node_parent(tn), *n = NULL; 753 struct tnode *tp = node_parent(tn), *n = NULL;
754 struct tnode __rcu **cptr; 754 struct tnode __rcu **cptr;
755 int max_work; 755 int max_work = MAX_WORK;
756 756
757 pr_debug("In tnode_resize %p inflate_threshold=%d threshold=%d\n", 757 pr_debug("In tnode_resize %p inflate_threshold=%d threshold=%d\n",
758 tn, inflate_threshold, halve_threshold); 758 tn, inflate_threshold, halve_threshold);
@@ -775,8 +775,7 @@ static void resize(struct trie *t, struct tnode *tn)
775 /* Double as long as the resulting node has a number of 775 /* Double as long as the resulting node has a number of
776 * nonempty nodes that are above the threshold. 776 * nonempty nodes that are above the threshold.
777 */ 777 */
778 max_work = MAX_WORK; 778 while (should_inflate(tp, tn) && max_work) {
779 while (should_inflate(tp, tn) && max_work--) {
780 if (inflate(t, tn)) { 779 if (inflate(t, tn)) {
781#ifdef CONFIG_IP_FIB_TRIE_STATS 780#ifdef CONFIG_IP_FIB_TRIE_STATS
782 this_cpu_inc(t->stats->resize_node_skipped); 781 this_cpu_inc(t->stats->resize_node_skipped);
@@ -784,6 +783,7 @@ static void resize(struct trie *t, struct tnode *tn)
784 break; 783 break;
785 } 784 }
786 785
786 max_work--;
787 tn = rtnl_dereference(*cptr); 787 tn = rtnl_dereference(*cptr);
788 } 788 }
789 789
@@ -794,8 +794,7 @@ static void resize(struct trie *t, struct tnode *tn)
794 /* Halve as long as the number of empty children in this 794 /* Halve as long as the number of empty children in this
795 * node is above threshold. 795 * node is above threshold.
796 */ 796 */
797 max_work = MAX_WORK; 797 while (should_halve(tp, tn) && max_work) {
798 while (should_halve(tp, tn) && max_work--) {
799 if (halve(t, tn)) { 798 if (halve(t, tn)) {
800#ifdef CONFIG_IP_FIB_TRIE_STATS 799#ifdef CONFIG_IP_FIB_TRIE_STATS
801 this_cpu_inc(t->stats->resize_node_skipped); 800 this_cpu_inc(t->stats->resize_node_skipped);
@@ -803,6 +802,7 @@ static void resize(struct trie *t, struct tnode *tn)
803 break; 802 break;
804 } 803 }
805 804
805 max_work--;
806 tn = rtnl_dereference(*cptr); 806 tn = rtnl_dereference(*cptr);
807 } 807 }
808 808