Add support for a netisr polling tunable, which allows run time switching of
device polling rather than having it only be controlled by the compile time option. Summary: Rubicon Communications (Netgate) Reviewers: #network, hiren Reviewed By: #network, hiren Subscribers: hiren Differential Revision: https://reviews.freebsd.org/D2258
This commit is contained in:
parent
a7ec487755
commit
8a7ad10169
@ -126,6 +126,13 @@ static struct rmlock netisr_rmlock;
|
||||
|
||||
static SYSCTL_NODE(_net, OID_AUTO, isr, CTLFLAG_RW, 0, "netisr");
|
||||
|
||||
#ifdef DEVICE_POLLING
|
||||
static int netisr_polling = 0; /* Enable Polling. */
|
||||
TUNABLE_INT("net.isr.polling_enable", &netisr_polling);
|
||||
SYSCTL_INT(_net_isr, OID_AUTO, polling_enable, CTLFLAG_RW,
|
||||
&netisr_polling, 0, "Enable polling");
|
||||
#endif
|
||||
|
||||
/*-
|
||||
* Three global direct dispatch policies are supported:
|
||||
*
|
||||
@ -789,9 +796,11 @@ swi_net(void *arg)
|
||||
nwsp = arg;
|
||||
|
||||
#ifdef DEVICE_POLLING
|
||||
KASSERT(nws_count == 1,
|
||||
("%s: device_polling but nws_count != 1", __func__));
|
||||
netisr_poll();
|
||||
if (netisr_polling) {
|
||||
KASSERT(nws_count == 1,
|
||||
("%s: device_polling but nws_count != 1", __func__));
|
||||
netisr_poll();
|
||||
}
|
||||
#endif
|
||||
#ifdef NETISR_LOCKING
|
||||
NETISR_RLOCK(&tracker);
|
||||
@ -816,7 +825,8 @@ swi_net(void *arg)
|
||||
NETISR_RUNLOCK(&tracker);
|
||||
#endif
|
||||
#ifdef DEVICE_POLLING
|
||||
netisr_pollmore();
|
||||
if (netisr_polling)
|
||||
netisr_pollmore();
|
||||
#endif
|
||||
}
|
||||
|
||||
@ -1071,6 +1081,9 @@ netisr_sched_poll(void)
|
||||
{
|
||||
struct netisr_workstream *nwsp;
|
||||
|
||||
if (!netisr_polling)
|
||||
return;
|
||||
|
||||
nwsp = DPCPU_ID_PTR(nws_array[0], nws);
|
||||
NWS_SIGNAL(nwsp);
|
||||
}
|
||||
@ -1138,7 +1151,7 @@ netisr_init(void *arg)
|
||||
* multiple netisr threads, so for the time being compiling in device
|
||||
* polling disables parallel netisr workers.
|
||||
*/
|
||||
if (netisr_maxthreads != 1 || netisr_bindthreads != 0) {
|
||||
if (netisr_polling && (netisr_maxthreads != 1 || netisr_bindthreads != 0)) {
|
||||
printf("netisr_init: forcing maxthreads to 1 and "
|
||||
"bindthreads to 0 for device polling\n");
|
||||
netisr_maxthreads = 1;
|
||||
|
Loading…
Reference in New Issue
Block a user