cregit-Linux how code gets into the kernel

Release 4.8 net/netfilter/ipvs/ip_vs_rr.c

/*
 * IPVS:        Round-Robin Scheduling module
 *
 * Authors:     Wensong Zhang <wensong@linuxvirtualserver.org>
 *              Peter Kese <peter.kese@ijs.si>
 *
 *              This program is free software; you can redistribute it and/or
 *              modify it under the terms of the GNU General Public License
 *              as published by the Free Software Foundation; either version
 *              2 of the License, or (at your option) any later version.
 *
 * Fixes/Changes:
 *     Wensong Zhang            :     changed the ip_vs_rr_schedule to return dest
 *     Julian Anastasov         :     fixed the NULL pointer access bug in debugging
 *     Wensong Zhang            :     changed some comestics things for debugging
 *     Wensong Zhang            :     changed for the d-linked destination list
 *     Wensong Zhang            :     added the ip_vs_rr_update_svc
 *     Wensong Zhang            :     added any dest with weight=0 is quiesced
 *
 */


#define KMSG_COMPONENT "IPVS"

#define pr_fmt(fmt) KMSG_COMPONENT ": " fmt

#include <linux/module.h>
#include <linux/kernel.h>

#include <net/ip_vs.h>



static int ip_vs_rr_init_svc(struct ip_vs_service *svc) { svc->sched_data = &svc->destinations; return 0; }

Contributors

PersonTokensPropCommitsCommitProp
wensong zhangwensong zhang23100.00%1100.00%
Total23100.00%1100.00%


static int ip_vs_rr_del_dest(struct ip_vs_service *svc, struct ip_vs_dest *dest) { struct list_head *p; spin_lock_bh(&svc->sched_lock); p = (struct list_head *) svc->sched_data; /* dest is already unlinked, so p->prev is not valid but * p->next is valid, use it to reach previous entry. */ if (p == &dest->n_list) svc->sched_data = p->next->prev; spin_unlock_bh(&svc->sched_lock); return 0; }

Contributors

PersonTokensPropCommitsCommitProp
julian anastasovjulian anastasov5070.42%266.67%
wensong zhangwensong zhang2129.58%133.33%
Total71100.00%3100.00%

/* * Round-Robin Scheduling */
static struct ip_vs_dest * ip_vs_rr_schedule(struct ip_vs_service *svc, const struct sk_buff *skb, struct ip_vs_iphdr *iph) { struct list_head *p; struct ip_vs_dest *dest, *last; int pass = 0; IP_VS_DBG(6, "%s(): Scheduling...\n", __func__); spin_lock_bh(&svc->sched_lock); p = (struct list_head *) svc->sched_data; last = dest = list_entry(p, struct ip_vs_dest, n_list); do { list_for_each_entry_continue_rcu(dest, &svc->destinations, n_list) { if (!(dest->flags & IP_VS_DEST_F_OVERLOAD) && atomic_read(&dest->weight) > 0) /* HIT */ goto out; if (dest == last) goto stop; } pass++; /* Previous dest could be unlinked, do not loop forever. * If we stay at head there is no need for 2nd pass. */ } while (pass < 2 && p != &svc->destinations); stop: spin_unlock_bh(&svc->sched_lock); ip_vs_scheduler_err(svc, "no destination available"); return NULL; out: svc->sched_data = &dest->n_list; spin_unlock_bh(&svc->sched_lock); IP_VS_DBG_BUF(6, "RR: server %s:%u " "activeconns %d refcnt %d weight %d\n", IP_VS_DBG_ADDR(dest->af, &dest->addr), ntohs(dest->port), atomic_read(&dest->activeconns), atomic_read(&dest->refcnt), atomic_read(&dest->weight)); return dest; }

Contributors

PersonTokensPropCommitsCommitProp
wensong zhangwensong zhang16367.36%19.09%
julian anastasovjulian anastasov6125.21%545.45%
julius volzjulius volz72.89%19.09%
patrick schaafpatrick schaaf41.65%19.09%
simon hormansimon horman31.24%19.09%
hannes ederhannes eder31.24%19.09%
stephen hemmingerstephen hemminger10.41%19.09%
Total242100.00%11100.00%

static struct ip_vs_scheduler ip_vs_rr_scheduler = { .name = "rr", /* name */ .refcnt = ATOMIC_INIT(0), .module = THIS_MODULE, .n_list = LIST_HEAD_INIT(ip_vs_rr_scheduler.n_list), .init_service = ip_vs_rr_init_svc, .add_dest = NULL, .del_dest = ip_vs_rr_del_dest, .schedule = ip_vs_rr_schedule, };
static int __init ip_vs_rr_init(void) { return register_ip_vs_scheduler(&ip_vs_rr_scheduler); }

Contributors

PersonTokensPropCommitsCommitProp
wensong zhangwensong zhang16100.00%1100.00%
Total16100.00%1100.00%


static void __exit ip_vs_rr_cleanup(void) { unregister_ip_vs_scheduler(&ip_vs_rr_scheduler); synchronize_rcu(); }

Contributors

PersonTokensPropCommitsCommitProp
wensong zhangwensong zhang1583.33%150.00%
julian anastasovjulian anastasov316.67%150.00%
Total18100.00%2100.00%

module_init(ip_vs_rr_init); module_exit(ip_vs_rr_cleanup); MODULE_LICENSE("GPL");

Overall Contributors

PersonTokensPropCommitsCommitProp
wensong zhangwensong zhang30265.23%16.25%
julian anastasovjulian anastasov12126.13%743.75%
hannes ederhannes eder143.02%212.50%
sven wegenersven wegener102.16%16.25%
julius volzjulius volz71.51%16.25%
patrick schaafpatrick schaaf40.86%16.25%
simon hormansimon horman30.65%16.25%
stephen hemmingerstephen hemminger10.22%16.25%
adrian bunkadrian bunk10.22%16.25%
Total463100.00%16100.00%
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.