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.
|
|
|
|
* 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 */
|
Introduce a netisr to deliver kernel-generated routing, avoiding
recursive entering of the socket code from the routing code:
- Modify rt_dispatch() to bundle up the sockaddr family, if any,
associated with a pending mbuf to dispatch to routing sockets, in
an m_tag on the mbuf.
- Allocate NETISR_ROUTE for use by routing sockets.
- Introduce rtsintrq, an ifqueue to be used by the netisr, and
introduce rts_input(), a function to unbundle the tagged sockaddr
and inject the mbuf and address into raw_input(), which previously
occurred in rt_dispatch().
- Introduce rts_init() to initialize rtsintrq, its mutex, and
register the netisr. Perform this at the same point in system
initialization as setup of the domains.
This change introduces asynchrony between the generation of a
pending routing socket message and delivery to sockets for use
by userspace. It avoids socket->routing->rtsock->socket use and
helps to avoid lock order reversals between the routing code and
socket code (in particular, raw socket control blocks), as route
locks are held over calls to rt_dispatch().
Reviewed by: "George V.Neville-Neil" <gnn@neville-neil.com>
Conceptual head nod by: sam
2004-06-09 02:48:23 +00:00
|
|
|
#define NETISR_ROUTE 14 /* routing socket */
|
2003-03-04 23:19:55 +00:00
|
|
|
#define NETISR_AARP 15 /* Appletalk ARP */
|
|
|
|
#define NETISR_ATALK2 16 /* Appletalk phase 2 */
|
|
|
|
#define NETISR_ATALK1 17 /* Appletalk phase 1 */
|
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 */
|
2002-07-27 19:53:02 +00:00
|
|
|
#define NETISR_USB 25 /* USB soft interrupt */
|
2003-03-04 23:19:55 +00:00
|
|
|
#define NETISR_PPP 26 /* PPP soft interrupt */
|
|
|
|
#define NETISR_IPV6 27
|
|
|
|
#define NETISR_NATM 28
|
|
|
|
#define NETISR_ATM 29
|
|
|
|
#define NETISR_NETGRAPH 30
|
|
|
|
#define NETISR_POLLMORE 31 /* polling callback, must be last */
|
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
|
|
|
|
2002-03-19 21:54:18 +00:00
|
|
|
void legacy_setsoftnet(void);
|
2000-10-25 05:19:40 +00:00
|
|
|
|
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
|
|
|
#define schednetisr(anisr) do { \
|
|
|
|
atomic_set_rel_int(&netisr, 1 << (anisr)); \
|
|
|
|
legacy_setsoftnet(); \
|
|
|
|
} while (0)
|
2003-03-04 23:19:55 +00:00
|
|
|
/* used to atomically schedule multiple netisrs */
|
|
|
|
#define schednetisrbits(isrbits) do { \
|
|
|
|
atomic_set_rel_int(&netisr, isrbits); \
|
|
|
|
legacy_setsoftnet(); \
|
|
|
|
} while (0)
|
1995-05-11 00:13:26 +00:00
|
|
|
|
2003-03-04 23:19:55 +00:00
|
|
|
struct ifqueue;
|
|
|
|
struct mbuf;
|
1995-05-11 00:13:26 +00:00
|
|
|
|
2003-03-04 23:19:55 +00:00
|
|
|
typedef void netisr_t (struct mbuf *);
|
|
|
|
|
|
|
|
void netisr_dispatch(int, struct mbuf *);
|
|
|
|
int netisr_queue(int, struct mbuf *);
|
2003-11-08 22:28:40 +00:00
|
|
|
#define NETISR_MPSAFE 0x0001 /* ISR does not need Giant */
|
|
|
|
void netisr_register(int, netisr_t *, struct ifqueue *, int);
|
2003-03-04 23:19:55 +00:00
|
|
|
void netisr_unregister(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
|