|
@@ -301,8 +301,10 @@ ip_vs_sched_persist(struct ip_vs_service *svc,
|
|
|
* template is not available.
|
|
|
* return *ignored=0 i.e. ICMP and NF_DROP
|
|
|
*/
|
|
|
+ rcu_read_lock();
|
|
|
dest = svc->scheduler->schedule(svc, skb);
|
|
|
if (!dest) {
|
|
|
+ rcu_read_unlock();
|
|
|
IP_VS_DBG(1, "p-schedule: no dest found.\n");
|
|
|
kfree(param.pe_data);
|
|
|
*ignored = 0;
|
|
@@ -318,6 +320,7 @@ ip_vs_sched_persist(struct ip_vs_service *svc,
|
|
|
* when the template expires */
|
|
|
ct = ip_vs_conn_new(¶m, &dest->addr, dport,
|
|
|
IP_VS_CONN_F_TEMPLATE, dest, skb->mark);
|
|
|
+ rcu_read_unlock();
|
|
|
if (ct == NULL) {
|
|
|
kfree(param.pe_data);
|
|
|
*ignored = -1;
|
|
@@ -446,8 +449,10 @@ ip_vs_schedule(struct ip_vs_service *svc, struct sk_buff *skb,
|
|
|
return NULL;
|
|
|
}
|
|
|
|
|
|
+ rcu_read_lock();
|
|
|
dest = svc->scheduler->schedule(svc, skb);
|
|
|
if (dest == NULL) {
|
|
|
+ rcu_read_unlock();
|
|
|
IP_VS_DBG(1, "Schedule: no dest found.\n");
|
|
|
return NULL;
|
|
|
}
|
|
@@ -468,6 +473,7 @@ ip_vs_schedule(struct ip_vs_service *svc, struct sk_buff *skb,
|
|
|
cp = ip_vs_conn_new(&p, &dest->addr,
|
|
|
dest->port ? dest->port : pptr[1],
|
|
|
flags, dest, skb->mark);
|
|
|
+ rcu_read_unlock();
|
|
|
if (!cp) {
|
|
|
*ignored = -1;
|
|
|
return NULL;
|