Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5ee832db authored by Eric Dumazet's avatar Eric Dumazet Committed by Linus Torvalds
Browse files

[PATCH] rcu: keep rcu callback event counter



This makes call_rcu() keep track of how many events there are on the RCU
list, and cause a reschedule event when the list gets too long.

This helps keep RCU event lists down.

Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent cc675230
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -94,6 +94,7 @@ struct rcu_data {
	long  	       	batch;           /* Batch # for current RCU batch */
	long  	       	batch;           /* Batch # for current RCU batch */
	struct rcu_head *nxtlist;
	struct rcu_head *nxtlist;
	struct rcu_head **nxttail;
	struct rcu_head **nxttail;
	long            count; /* # of queued items */
	struct rcu_head *curlist;
	struct rcu_head *curlist;
	struct rcu_head **curtail;
	struct rcu_head **curtail;
	struct rcu_head *donelist;
	struct rcu_head *donelist;
+11 −0
Original line number Original line Diff line number Diff line
@@ -109,6 +109,10 @@ void fastcall call_rcu(struct rcu_head *head,
	rdp = &__get_cpu_var(rcu_data);
	rdp = &__get_cpu_var(rcu_data);
	*rdp->nxttail = head;
	*rdp->nxttail = head;
	rdp->nxttail = &head->next;
	rdp->nxttail = &head->next;

	if (unlikely(++rdp->count > 10000))
		set_need_resched();

	local_irq_restore(flags);
	local_irq_restore(flags);
}
}


@@ -140,6 +144,12 @@ void fastcall call_rcu_bh(struct rcu_head *head,
	rdp = &__get_cpu_var(rcu_bh_data);
	rdp = &__get_cpu_var(rcu_bh_data);
	*rdp->nxttail = head;
	*rdp->nxttail = head;
	rdp->nxttail = &head->next;
	rdp->nxttail = &head->next;
	rdp->count++;
/*
 *  Should we directly call rcu_do_batch() here ?
 *  if (unlikely(rdp->count > 10000))
 *      rcu_do_batch(rdp);
 */
	local_irq_restore(flags);
	local_irq_restore(flags);
}
}


@@ -157,6 +167,7 @@ static void rcu_do_batch(struct rcu_data *rdp)
		next = rdp->donelist = list->next;
		next = rdp->donelist = list->next;
		list->func(list);
		list->func(list);
		list = next;
		list = next;
		rdp->count--;
		if (++count >= maxbatch)
		if (++count >= maxbatch)
			break;
			break;
	}
	}