X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;ds=sidebyside;f=kernel%2Flinux%2Fkni%2Fkni_misc.c;h=ec7019004296c2836d6a3ba6a493a6cd055d23af;hb=f1b2991c3c0f480fe8e9f6c5c640a1d913b76bed;hp=cda71bde08e1ba934030501b9b39418778962fec;hpb=e73831dc6c26441bfa910d65aab486043f432b12;p=dpdk.git diff --git a/kernel/linux/kni/kni_misc.c b/kernel/linux/kni/kni_misc.c index cda71bde08..ec70190042 100644 --- a/kernel/linux/kni/kni_misc.c +++ b/kernel/linux/kni/kni_misc.c @@ -39,7 +39,15 @@ static uint32_t multiple_kthread_on; /* Default carrier state for created KNI network interfaces */ static char *carrier; -uint32_t dflt_carrier; +uint32_t kni_dflt_carrier; + +/* Request processing support for bifurcated drivers. */ +static char *enable_bifurcated; +uint32_t bifurcated_support; + +/* KNI thread scheduling interval */ +static long min_scheduling_interval = 100; /* us */ +static long max_scheduling_interval = 200; /* us */ #define KNI_DEV_IN_USE_BIT_NUM 0 /* Bit number for device in use */ @@ -128,11 +136,8 @@ kni_thread_single(void *data) } } up_read(&knet->kni_list_lock); -#ifdef RTE_KNI_PREEMPT_DEFAULT /* reschedule out for a while */ - schedule_timeout_interruptible( - usecs_to_jiffies(KNI_KTHREAD_RESCHEDULE_INTERVAL)); -#endif + usleep_range(min_scheduling_interval, max_scheduling_interval); } return 0; @@ -149,10 +154,7 @@ kni_thread_multiple(void *param) kni_net_rx(dev); kni_net_poll_resp(dev); } -#ifdef RTE_KNI_PREEMPT_DEFAULT - schedule_timeout_interruptible( - usecs_to_jiffies(KNI_KTHREAD_RESCHEDULE_INTERVAL)); -#endif + usleep_range(min_scheduling_interval, max_scheduling_interval); } return 0; @@ -399,11 +401,8 @@ kni_ioctl_create(struct net *net, uint32_t ioctl_num, if (is_valid_ether_addr(dev_info.mac_addr)) memcpy(net_dev->dev_addr, dev_info.mac_addr, ETH_ALEN); else - /* - * Generate random mac address. eth_random_addr() is the - * newer version of generating mac address in kernel. - */ - random_ether_addr(net_dev->dev_addr); + /* Generate random MAC address. */ + eth_random_addr(net_dev->dev_addr); if (dev_info.mtu) net_dev->mtu = dev_info.mtu; @@ -481,10 +480,10 @@ kni_ioctl_release(struct net *net, uint32_t ioctl_num, return ret; } -static int -kni_ioctl(struct inode *inode, uint32_t ioctl_num, unsigned long ioctl_param) +static long +kni_ioctl(struct file *file, unsigned int ioctl_num, unsigned long ioctl_param) { - int ret = -EINVAL; + long ret = -EINVAL; struct net *net = current->nsproxy->net_ns; pr_debug("IOCTL num=0x%0x param=0x%0lx\n", ioctl_num, ioctl_param); @@ -510,8 +509,8 @@ kni_ioctl(struct inode *inode, uint32_t ioctl_num, unsigned long ioctl_param) return ret; } -static int -kni_compat_ioctl(struct inode *inode, uint32_t ioctl_num, +static long +kni_compat_ioctl(struct file *file, unsigned int ioctl_num, unsigned long ioctl_param) { /* 32 bits app on 64 bits OS to be supported later */ @@ -524,8 +523,8 @@ static const struct file_operations kni_fops = { .owner = THIS_MODULE, .open = kni_open, .release = kni_release, - .unlocked_ioctl = (void *)kni_ioctl, - .compat_ioctl = (void *)kni_compat_ioctl, + .unlocked_ioctl = kni_ioctl, + .compat_ioctl = kni_compat_ioctl, }; static struct miscdevice kni_misc = { @@ -554,14 +553,30 @@ static int __init kni_parse_carrier_state(void) { if (!carrier) { - dflt_carrier = 0; + kni_dflt_carrier = 0; return 0; } if (strcmp(carrier, "off") == 0) - dflt_carrier = 0; + kni_dflt_carrier = 0; else if (strcmp(carrier, "on") == 0) - dflt_carrier = 1; + kni_dflt_carrier = 1; + else + return -1; + + return 0; +} + +static int __init +kni_parse_bifurcated_support(void) +{ + if (!enable_bifurcated) { + bifurcated_support = 0; + return 0; + } + + if (strcmp(enable_bifurcated, "on") == 0) + bifurcated_support = 1; else return -1; @@ -588,11 +603,26 @@ kni_init(void) return -EINVAL; } - if (dflt_carrier == 0) + if (kni_dflt_carrier == 0) pr_debug("Default carrier state set to off.\n"); else pr_debug("Default carrier state set to on.\n"); + if (kni_parse_bifurcated_support() < 0) { + pr_err("Invalid parameter for bifurcated support\n"); + return -EINVAL; + } + if (bifurcated_support == 1) + pr_debug("bifurcated support is enabled.\n"); + + if (min_scheduling_interval < 0 || max_scheduling_interval < 0 || + min_scheduling_interval > KNI_KTHREAD_MAX_RESCHEDULE_INTERVAL || + max_scheduling_interval > KNI_KTHREAD_MAX_RESCHEDULE_INTERVAL || + min_scheduling_interval >= max_scheduling_interval) { + pr_err("Invalid parameters for scheduling interval\n"); + return -EINVAL; + } + #ifdef HAVE_SIMPLIFIED_PERNET_OPERATIONS rc = register_pernet_subsys(&kni_net_ops); #else @@ -659,3 +689,22 @@ MODULE_PARM_DESC(carrier, "\t\ton Interfaces will be created with carrier state set to on.\n" "\t\t" ); + +module_param(enable_bifurcated, charp, 0644); +MODULE_PARM_DESC(enable_bifurcated, +"Enable request processing support for bifurcated drivers, " +"which means releasing rtnl_lock before calling userspace callback and " +"supporting async requests (default=off):\n" +"\t\ton Enable request processing support for bifurcated drivers.\n" +"\t\t" +); + +module_param(min_scheduling_interval, long, 0644); +MODULE_PARM_DESC(min_scheduling_interval, +"KNI thread min scheduling interval (default=100 microseconds)" +); + +module_param(max_scheduling_interval, long, 0644); +MODULE_PARM_DESC(max_scheduling_interval, +"KNI thread max scheduling interval (default=200 microseconds)" +);