1994-05-24 10:09:53 +00:00
|
|
|
/*
|
|
|
|
* Copyright (c) 1980, 1986, 1989, 1993
|
|
|
|
* The Regents of the University of California. All rights reserved.
|
|
|
|
*
|
|
|
|
* Redistribution and use in source and binary forms, with or without
|
|
|
|
* modification, are permitted provided that the following conditions
|
|
|
|
* are met:
|
|
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer.
|
|
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
|
|
* documentation and/or other materials provided with the distribution.
|
|
|
|
* 3. All advertising materials mentioning features or use of this software
|
|
|
|
* must display the following acknowledgement:
|
|
|
|
* This product includes software developed by the University of
|
|
|
|
* California, Berkeley and its contributors.
|
|
|
|
* 4. Neither the name of the University nor the names of its contributors
|
|
|
|
* may be used to endorse or promote products derived from this software
|
|
|
|
* without specific prior written permission.
|
|
|
|
*
|
|
|
|
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
|
|
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
|
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
|
|
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
|
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
|
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
|
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
|
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
|
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
|
|
* SUCH DAMAGE.
|
|
|
|
*
|
|
|
|
* @(#)netisr.h 8.1 (Berkeley) 6/10/93
|
1999-08-28 01:08:13 +00:00
|
|
|
* $FreeBSD$
|
1994-05-24 10:09:53 +00:00
|
|
|
*/
|
|
|
|
|
1994-08-21 05:11:48 +00:00
|
|
|
#ifndef _NET_NETISR_H_
|
|
|
|
#define _NET_NETISR_H_
|
|
|
|
|
1994-05-24 10:09:53 +00:00
|
|
|
/*
|
|
|
|
* The networking code runs off software interrupts.
|
|
|
|
*
|
|
|
|
* You can switch into the network by doing splnet() and return by splx().
|
|
|
|
* The software interrupt level for the network is higher than the software
|
|
|
|
* level for the clock (so you can enter the network in routines called
|
|
|
|
* at timeout time).
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Each ``pup-level-1'' input queue has a bit in a ``netisr'' status
|
|
|
|
* word which is used to de-multiplex a single software
|
|
|
|
* interrupt used for scheduling the network code to calls
|
|
|
|
* on the lowest level routine of each protocol.
|
|
|
|
*/
|
Device Polling code for -current.
Non-SMP, i386-only, no polling in the idle loop at the moment.
To use this code you must compile a kernel with
options DEVICE_POLLING
and at runtime enable polling with
sysctl kern.polling.enable=1
The percentage of CPU reserved to userland can be set with
sysctl kern.polling.user_frac=NN (default is 50)
while the remainder is used by polling device drivers and netisr's.
These are the only two variables that you should need to touch. There
are a few more parameters in kern.polling but the default values
are adequate for all purposes. See the code in kern_poll.c for
more details on them.
Polling in the idle loop will be implemented shortly by introducing
a kernel thread which does the job. Until then, the amount of CPU
dedicated to polling will never exceed (100-user_frac).
The equivalent (actually, better) code for -stable is at
http://info.iet.unipi.it/~luigi/polling/
and also supports polling in the idle loop.
NOTE to Alpha developers:
There is really nothing in this code that is i386-specific.
If you move the 2 lines supporting the new option from
sys/conf/{files,options}.i386 to sys/conf/{files,options} I am
pretty sure that this should work on the Alpha as well, just that
I do not have a suitable test box to try it. If someone feels like
trying it, I would appreciate it.
NOTE to other developers:
sure some things could be done better, and as always I am open to
constructive criticism, which a few of you have already given and
I greatly appreciated.
However, before proposing radical architectural changes, please
take some time to possibly try out this code, or at the very least
read the comments in kern_poll.c, especially re. the reason why I
am using a soft netisr and cannot (I believe) replace it with a
simple timeout.
Quick description of files touched by this commit:
sys/conf/files.i386
new file kern/kern_poll.c
sys/conf/options.i386
new option
sys/i386/i386/trap.c
poll in trap (disabled by default)
sys/kern/kern_clock.c
initialization and hardclock hooks.
sys/kern/kern_intr.c
minor swi_net changes
sys/kern/kern_poll.c
the bulk of the code.
sys/net/if.h
new flag
sys/net/if_var.h
declaration for functions used in device drivers.
sys/net/netisr.h
NETISR_POLL
sys/dev/fxp/if_fxp.c
sys/dev/fxp/if_fxpvar.h
sys/pci/if_dc.c
sys/pci/if_dcreg.h
sys/pci/if_sis.c
sys/pci/if_sisreg.h
device driver modifications
2001-12-14 17:56:12 +00:00
|
|
|
#define NETISR_POLL 0 /* polling callback, must be first */
|
1994-05-24 10:09:53 +00:00
|
|
|
#define NETISR_IP 2 /* same as AF_INET */
|
|
|
|
#define NETISR_NS 6 /* same as AF_NS */
|
1999-11-05 14:41:39 +00:00
|
|
|
#define NETISR_ATALK 16 /* same as AF_APPLETALK */
|
1994-05-24 10:09:53 +00:00
|
|
|
#define NETISR_ARP 18 /* same as AF_LINK */
|
1999-11-05 14:41:39 +00:00
|
|
|
#define NETISR_IPX 23 /* same as AF_IPX */
|
Attempt to fix a problem with receiving packets on USB ethernet interfaces.
Packets are received inside USB bulk transfer callbacks, which run at
splusb() (actually splbio()). The packet input queues are meant to be
manipulated at splimp(). However the locking apparently breaks down under
certain circumstances and the input queues can get trampled.
There's a similar problem with if_ppp, which is driven by hardware/tty
interrupts from the serial driver, but which must also manipulate the
packet input queues at splimp(). The fix there is to use a netisr, and
that's the fix I used here. (I can hear you groaning back there. Hush up.)
The usb_ethersubr module maintains a single queue of its own. When a
packet is received in the USB callback routine, it's placed on this
queue with usb_ether_input(). This routine also schedules a soft net
interrupt with schednetisr(). The ISR routine then runs later, at
splnet, outside of the USB callback/interrupt context, and passes the
packet to ether_input(), hopefully in a safe manner.
The reason this is implemented as a separate module is that there are
a limited number of NETISRs that we can use, and snarfing one up for
each driver that needs it is wasteful (there will be three once I get
the CATC driver done). It also reduces code duplication to a certain
small extent. Unfortunately, it also needs to be linked in with the
usb.ko module in order for the USB ethernet drivers to share it.
Also removed some uneeded includes from if_aue.c and if_kue.c
Fix suggested by: peter
Not rejected as a hairbrained idea by: n_hibma
2000-01-10 23:12:54 +00:00
|
|
|
#define NETISR_USB 25 /* USB soft interrupt */
|
1995-10-31 19:07:53 +00:00
|
|
|
#define NETISR_PPP 27 /* PPP soft interrupt */
|
1999-11-05 14:41:39 +00:00
|
|
|
#define NETISR_IPV6 28 /* same as AF_INET6 */
|
1997-05-09 12:19:06 +00:00
|
|
|
#define NETISR_NATM 29 /* same as AF_NATM */
|
2000-10-12 00:03:50 +00:00
|
|
|
#define NETISR_ATM 30 /* same as AF_ATM */
|
1999-10-21 09:06:11 +00:00
|
|
|
#define NETISR_NETGRAPH 31 /* same as AF_NETGRAPH */
|
1994-05-24 10:09:53 +00:00
|
|
|
|
|
|
|
|
|
|
|
#ifndef LOCORE
|
1999-12-29 04:46:21 +00:00
|
|
|
#ifdef _KERNEL
|
2000-02-13 03:32:07 +00:00
|
|
|
|
2000-10-25 05:19:40 +00:00
|
|
|
void legacy_setsoftnet __P((void));
|
|
|
|
|
1995-05-11 00:13:26 +00:00
|
|
|
extern volatile unsigned int netisr; /* scheduling bits for network */
|
2000-12-05 00:36:00 +00:00
|
|
|
extern void (*netisrs[32]) __P((void));
|
|
|
|
#define schednetisr(anisr) do { \
|
|
|
|
atomic_set_rel_int(&netisr, 1 << (anisr)); \
|
|
|
|
legacy_setsoftnet(); \
|
|
|
|
} while (0)
|
1995-05-11 00:13:26 +00:00
|
|
|
|
1997-09-16 11:44:05 +00:00
|
|
|
typedef void netisr_t __P((void));
|
1995-05-11 00:13:26 +00:00
|
|
|
|
1995-10-31 19:07:53 +00:00
|
|
|
int register_netisr __P((int, netisr_t *));
|
2000-02-13 03:32:07 +00:00
|
|
|
int unregister_netisr __P((int));
|
1995-10-31 19:07:53 +00:00
|
|
|
|
1994-05-24 10:09:53 +00:00
|
|
|
#endif
|
|
|
|
#endif
|
1994-08-21 05:11:48 +00:00
|
|
|
|
|
|
|
#endif
|