Date: Sat, 7 Mar 2009 05:39:56 +0000 (UTC) From: Kip Macy <kmacy@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r189485 - in user/kmacy/releng_7_net_backport: sbin/route sys/amd64/conf sys/conf sys/kern sys/net sys/netinet sys/netinet6 sys/sys usr.bin/netstat usr.sbin/ndp usr.sbin/ppp usr.sbin/ro... Message-ID: <200903070539.n275du4R040104@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: kmacy Date: Sat Mar 7 05:39:55 2009 New Revision: 189485 URL: http://svn.freebsd.org/changeset/base/189485 Log: Backport HEAD network stack as of r189450 Added: user/kmacy/releng_7_net_backport/sys/kern/kern_rmlock.c user/kmacy/releng_7_net_backport/sys/kern/subr_bufring.c user/kmacy/releng_7_net_backport/sys/net/bpf_buffer.c user/kmacy/releng_7_net_backport/sys/net/bpf_buffer.h user/kmacy/releng_7_net_backport/sys/net/bpf_zerocopy.c user/kmacy/releng_7_net_backport/sys/net/bpf_zerocopy.h user/kmacy/releng_7_net_backport/sys/net/if_llatbl.c user/kmacy/releng_7_net_backport/sys/net/if_llatbl.h user/kmacy/releng_7_net_backport/sys/net/radix_mpath.c user/kmacy/releng_7_net_backport/sys/net/radix_mpath.h user/kmacy/releng_7_net_backport/sys/net/vnet.h user/kmacy/releng_7_net_backport/sys/netinet/accf_dns.c user/kmacy/releng_7_net_backport/sys/netinet/tcp_hostcache.h user/kmacy/releng_7_net_backport/sys/netinet/vinet.h user/kmacy/releng_7_net_backport/sys/netinet6/vinet6.h user/kmacy/releng_7_net_backport/sys/sys/_rmlock.h user/kmacy/releng_7_net_backport/sys/sys/buf_ring.h user/kmacy/releng_7_net_backport/sys/sys/rmlock.h user/kmacy/releng_7_net_backport/sys/sys/vimage.h Modified: user/kmacy/releng_7_net_backport/sbin/route/route.c user/kmacy/releng_7_net_backport/sys/amd64/conf/GENERIC user/kmacy/releng_7_net_backport/sys/conf/files user/kmacy/releng_7_net_backport/sys/conf/options user/kmacy/releng_7_net_backport/sys/kern/kern_mib.c user/kmacy/releng_7_net_backport/sys/kern/kern_uuid.c user/kmacy/releng_7_net_backport/sys/kern/subr_pcpu.c user/kmacy/releng_7_net_backport/sys/kern/vfs_export.c user/kmacy/releng_7_net_backport/sys/net/bpf.c user/kmacy/releng_7_net_backport/sys/net/bpf.h user/kmacy/releng_7_net_backport/sys/net/bpf_filter.c user/kmacy/releng_7_net_backport/sys/net/bpfdesc.h user/kmacy/releng_7_net_backport/sys/net/bridgestp.c user/kmacy/releng_7_net_backport/sys/net/bridgestp.h user/kmacy/releng_7_net_backport/sys/net/bsd_comp.c user/kmacy/releng_7_net_backport/sys/net/ethernet.h user/kmacy/releng_7_net_backport/sys/net/ieee8023ad_lacp.c user/kmacy/releng_7_net_backport/sys/net/if.c user/kmacy/releng_7_net_backport/sys/net/if.h user/kmacy/releng_7_net_backport/sys/net/if_arcsubr.c user/kmacy/releng_7_net_backport/sys/net/if_atmsubr.c user/kmacy/releng_7_net_backport/sys/net/if_bridge.c user/kmacy/releng_7_net_backport/sys/net/if_clone.c user/kmacy/releng_7_net_backport/sys/net/if_clone.h user/kmacy/releng_7_net_backport/sys/net/if_disc.c user/kmacy/releng_7_net_backport/sys/net/if_ef.c user/kmacy/releng_7_net_backport/sys/net/if_enc.c user/kmacy/releng_7_net_backport/sys/net/if_ethersubr.c user/kmacy/releng_7_net_backport/sys/net/if_faith.c user/kmacy/releng_7_net_backport/sys/net/if_fddisubr.c user/kmacy/releng_7_net_backport/sys/net/if_fwsubr.c user/kmacy/releng_7_net_backport/sys/net/if_gif.c user/kmacy/releng_7_net_backport/sys/net/if_gif.h user/kmacy/releng_7_net_backport/sys/net/if_gre.c user/kmacy/releng_7_net_backport/sys/net/if_iso88025subr.c user/kmacy/releng_7_net_backport/sys/net/if_lagg.c user/kmacy/releng_7_net_backport/sys/net/if_loop.c user/kmacy/releng_7_net_backport/sys/net/if_media.h user/kmacy/releng_7_net_backport/sys/net/if_mib.c user/kmacy/releng_7_net_backport/sys/net/if_ppp.c user/kmacy/releng_7_net_backport/sys/net/if_sl.c user/kmacy/releng_7_net_backport/sys/net/if_spppsubr.c user/kmacy/releng_7_net_backport/sys/net/if_stf.c user/kmacy/releng_7_net_backport/sys/net/if_tap.c user/kmacy/releng_7_net_backport/sys/net/if_tun.c user/kmacy/releng_7_net_backport/sys/net/if_var.h user/kmacy/releng_7_net_backport/sys/net/if_vlan.c user/kmacy/releng_7_net_backport/sys/net/netisr.c user/kmacy/releng_7_net_backport/sys/net/netisr.h user/kmacy/releng_7_net_backport/sys/net/pfil.c user/kmacy/releng_7_net_backport/sys/net/pfil.h user/kmacy/releng_7_net_backport/sys/net/ppp_deflate.c user/kmacy/releng_7_net_backport/sys/net/radix.c user/kmacy/releng_7_net_backport/sys/net/radix.h user/kmacy/releng_7_net_backport/sys/net/raw_cb.c user/kmacy/releng_7_net_backport/sys/net/raw_cb.h user/kmacy/releng_7_net_backport/sys/net/raw_usrreq.c user/kmacy/releng_7_net_backport/sys/net/route.c user/kmacy/releng_7_net_backport/sys/net/route.h user/kmacy/releng_7_net_backport/sys/net/rtsock.c user/kmacy/releng_7_net_backport/sys/netinet/icmp6.h user/kmacy/releng_7_net_backport/sys/netinet/icmp_var.h user/kmacy/releng_7_net_backport/sys/netinet/if_atm.c user/kmacy/releng_7_net_backport/sys/netinet/if_ether.c user/kmacy/releng_7_net_backport/sys/netinet/if_ether.h user/kmacy/releng_7_net_backport/sys/netinet/igmp.c user/kmacy/releng_7_net_backport/sys/netinet/igmp.h user/kmacy/releng_7_net_backport/sys/netinet/in.c user/kmacy/releng_7_net_backport/sys/netinet/in.h user/kmacy/releng_7_net_backport/sys/netinet/in_gif.c user/kmacy/releng_7_net_backport/sys/netinet/in_mcast.c user/kmacy/releng_7_net_backport/sys/netinet/in_pcb.c user/kmacy/releng_7_net_backport/sys/netinet/in_pcb.h user/kmacy/releng_7_net_backport/sys/netinet/in_proto.c user/kmacy/releng_7_net_backport/sys/netinet/in_rmx.c user/kmacy/releng_7_net_backport/sys/netinet/in_var.h user/kmacy/releng_7_net_backport/sys/netinet/ip.h user/kmacy/releng_7_net_backport/sys/netinet/ip6.h user/kmacy/releng_7_net_backport/sys/netinet/ip_carp.c user/kmacy/releng_7_net_backport/sys/netinet/ip_divert.c user/kmacy/releng_7_net_backport/sys/netinet/ip_dummynet.c user/kmacy/releng_7_net_backport/sys/netinet/ip_dummynet.h user/kmacy/releng_7_net_backport/sys/netinet/ip_fastfwd.c user/kmacy/releng_7_net_backport/sys/netinet/ip_fw.h user/kmacy/releng_7_net_backport/sys/netinet/ip_fw2.c user/kmacy/releng_7_net_backport/sys/netinet/ip_fw_nat.c user/kmacy/releng_7_net_backport/sys/netinet/ip_fw_pfil.c user/kmacy/releng_7_net_backport/sys/netinet/ip_gre.c user/kmacy/releng_7_net_backport/sys/netinet/ip_icmp.c user/kmacy/releng_7_net_backport/sys/netinet/ip_icmp.h user/kmacy/releng_7_net_backport/sys/netinet/ip_id.c user/kmacy/releng_7_net_backport/sys/netinet/ip_input.c user/kmacy/releng_7_net_backport/sys/netinet/ip_ipsec.c user/kmacy/releng_7_net_backport/sys/netinet/ip_mroute.c user/kmacy/releng_7_net_backport/sys/netinet/ip_options.c user/kmacy/releng_7_net_backport/sys/netinet/ip_options.h user/kmacy/releng_7_net_backport/sys/netinet/ip_output.c user/kmacy/releng_7_net_backport/sys/netinet/ip_var.h user/kmacy/releng_7_net_backport/sys/netinet/raw_ip.c user/kmacy/releng_7_net_backport/sys/netinet/sctp_auth.c user/kmacy/releng_7_net_backport/sys/netinet/sctp_bsd_addr.c user/kmacy/releng_7_net_backport/sys/netinet/sctp_constants.h user/kmacy/releng_7_net_backport/sys/netinet/sctp_crc32.c user/kmacy/releng_7_net_backport/sys/netinet/sctp_crc32.h user/kmacy/releng_7_net_backport/sys/netinet/sctp_header.h user/kmacy/releng_7_net_backport/sys/netinet/sctp_indata.c user/kmacy/releng_7_net_backport/sys/netinet/sctp_input.c user/kmacy/releng_7_net_backport/sys/netinet/sctp_os_bsd.h user/kmacy/releng_7_net_backport/sys/netinet/sctp_output.c user/kmacy/releng_7_net_backport/sys/netinet/sctp_output.h user/kmacy/releng_7_net_backport/sys/netinet/sctp_pcb.c user/kmacy/releng_7_net_backport/sys/netinet/sctp_pcb.h user/kmacy/releng_7_net_backport/sys/netinet/sctp_structs.h user/kmacy/releng_7_net_backport/sys/netinet/sctp_sysctl.c user/kmacy/releng_7_net_backport/sys/netinet/sctp_uio.h user/kmacy/releng_7_net_backport/sys/netinet/sctp_usrreq.c user/kmacy/releng_7_net_backport/sys/netinet/sctputil.c user/kmacy/releng_7_net_backport/sys/netinet/sctputil.h user/kmacy/releng_7_net_backport/sys/netinet/tcp_hostcache.c user/kmacy/releng_7_net_backport/sys/netinet/tcp_input.c user/kmacy/releng_7_net_backport/sys/netinet/tcp_offload.c user/kmacy/releng_7_net_backport/sys/netinet/tcp_offload.h user/kmacy/releng_7_net_backport/sys/netinet/tcp_output.c user/kmacy/releng_7_net_backport/sys/netinet/tcp_reass.c user/kmacy/releng_7_net_backport/sys/netinet/tcp_sack.c user/kmacy/releng_7_net_backport/sys/netinet/tcp_subr.c user/kmacy/releng_7_net_backport/sys/netinet/tcp_syncache.c user/kmacy/releng_7_net_backport/sys/netinet/tcp_syncache.h user/kmacy/releng_7_net_backport/sys/netinet/tcp_timer.c user/kmacy/releng_7_net_backport/sys/netinet/tcp_timewait.c user/kmacy/releng_7_net_backport/sys/netinet/tcp_usrreq.c user/kmacy/releng_7_net_backport/sys/netinet/tcp_var.h user/kmacy/releng_7_net_backport/sys/netinet/toedev.h user/kmacy/releng_7_net_backport/sys/netinet/udp_usrreq.c user/kmacy/releng_7_net_backport/sys/netinet/udp_var.h user/kmacy/releng_7_net_backport/sys/netinet6/dest6.c user/kmacy/releng_7_net_backport/sys/netinet6/frag6.c user/kmacy/releng_7_net_backport/sys/netinet6/icmp6.c user/kmacy/releng_7_net_backport/sys/netinet6/in6.c user/kmacy/releng_7_net_backport/sys/netinet6/in6_gif.c user/kmacy/releng_7_net_backport/sys/netinet6/in6_ifattach.c user/kmacy/releng_7_net_backport/sys/netinet6/in6_pcb.c user/kmacy/releng_7_net_backport/sys/netinet6/in6_pcb.h user/kmacy/releng_7_net_backport/sys/netinet6/in6_proto.c user/kmacy/releng_7_net_backport/sys/netinet6/in6_rmx.c user/kmacy/releng_7_net_backport/sys/netinet6/in6_src.c user/kmacy/releng_7_net_backport/sys/netinet6/in6_var.h user/kmacy/releng_7_net_backport/sys/netinet6/ip6_forward.c user/kmacy/releng_7_net_backport/sys/netinet6/ip6_input.c user/kmacy/releng_7_net_backport/sys/netinet6/ip6_ipsec.c user/kmacy/releng_7_net_backport/sys/netinet6/ip6_mroute.c user/kmacy/releng_7_net_backport/sys/netinet6/ip6_output.c user/kmacy/releng_7_net_backport/sys/netinet6/ip6_var.h user/kmacy/releng_7_net_backport/sys/netinet6/ip6protosw.h user/kmacy/releng_7_net_backport/sys/netinet6/mld6.c user/kmacy/releng_7_net_backport/sys/netinet6/nd6.c user/kmacy/releng_7_net_backport/sys/netinet6/nd6.h user/kmacy/releng_7_net_backport/sys/netinet6/nd6_nbr.c user/kmacy/releng_7_net_backport/sys/netinet6/nd6_rtr.c user/kmacy/releng_7_net_backport/sys/netinet6/raw_ip6.c user/kmacy/releng_7_net_backport/sys/netinet6/raw_ip6.h user/kmacy/releng_7_net_backport/sys/netinet6/route6.c user/kmacy/releng_7_net_backport/sys/netinet6/scope6.c user/kmacy/releng_7_net_backport/sys/netinet6/sctp6_usrreq.c user/kmacy/releng_7_net_backport/sys/netinet6/tcp6_var.h user/kmacy/releng_7_net_backport/sys/netinet6/udp6_usrreq.c user/kmacy/releng_7_net_backport/sys/sys/conf.h user/kmacy/releng_7_net_backport/sys/sys/kernel.h user/kmacy/releng_7_net_backport/sys/sys/mbuf.h user/kmacy/releng_7_net_backport/sys/sys/pcpu.h user/kmacy/releng_7_net_backport/sys/sys/sysctl.h user/kmacy/releng_7_net_backport/usr.bin/netstat/inet6.c user/kmacy/releng_7_net_backport/usr.bin/netstat/route.c user/kmacy/releng_7_net_backport/usr.sbin/ndp/ndp.c user/kmacy/releng_7_net_backport/usr.sbin/ppp/route.c user/kmacy/releng_7_net_backport/usr.sbin/route6d/route6d.c Modified: user/kmacy/releng_7_net_backport/sbin/route/route.c ============================================================================== --- user/kmacy/releng_7_net_backport/sbin/route/route.c Sat Mar 7 03:41:29 2009 (r189484) +++ user/kmacy/releng_7_net_backport/sbin/route/route.c Sat Mar 7 05:39:55 2009 (r189485) @@ -605,9 +605,6 @@ newroute(argc, argv) case K_NOSTATIC: flags &= ~RTF_STATIC; break; - case K_LLINFO: - flags |= RTF_LLINFO; - break; case K_LOCK: locking = 1; break; @@ -632,9 +629,6 @@ newroute(argc, argv) case K_PROXY: proxy = 1; break; - case K_CLONING: - flags |= RTF_CLONING; - break; case K_XRESOLVE: flags |= RTF_XRESOLVE; break; Modified: user/kmacy/releng_7_net_backport/sys/amd64/conf/GENERIC ============================================================================== --- user/kmacy/releng_7_net_backport/sys/amd64/conf/GENERIC Sat Mar 7 03:41:29 2009 (r189484) +++ user/kmacy/releng_7_net_backport/sys/amd64/conf/GENERIC Sat Mar 7 05:39:55 2009 (r189485) @@ -30,7 +30,7 @@ options SCHED_ULE # ULE scheduler options PREEMPTION # Enable kernel thread preemption options INET # InterNETworking options INET6 # IPv6 communications protocols -options SCTP # Stream Control Transmission Protocol +#options SCTP # Stream Control Transmission Protocol options FFS # Berkeley Fast Filesystem options SOFTUPDATES # Enable FFS soft updates support options UFS_ACL # Support for access control lists @@ -306,3 +306,6 @@ device fwe # Ethernet over FireWire (n device fwip # IP over FireWire (RFC 2734,3146) device dcons # Dumb console driver device dcons_crom # Configuration ROM for dcons + +options VIMAGE_GLOBALS + Modified: user/kmacy/releng_7_net_backport/sys/conf/files ============================================================================== --- user/kmacy/releng_7_net_backport/sys/conf/files Sat Mar 7 03:41:29 2009 (r189484) +++ user/kmacy/releng_7_net_backport/sys/conf/files Sat Mar 7 05:39:55 2009 (r189485) @@ -1489,6 +1489,7 @@ kern/subr_acl_posix1e.c standard kern/subr_autoconf.c standard kern/subr_blist.c standard kern/subr_bus.c standard +kern/subr_bufring.c standard kern/subr_clock.c standard kern/subr_devstat.c standard kern/subr_disk.c standard @@ -1513,6 +1514,7 @@ kern/subr_rman.c standard kern/subr_rtc.c optional genclock kern/subr_sbuf.c standard kern/subr_scanf.c standard +kern/kern_rmlock.c standard kern/kern_sdt.c optional kdtrace_hooks kern/subr_sleepqueue.c standard kern/subr_smp.c standard @@ -1611,8 +1613,10 @@ libkern/strtoul.c standard libkern/strtouq.c standard libkern/strvalid.c standard net/bpf.c standard +net/bpf_buffer.c optional bpf net/bpf_jitter.c optional bpf_jitter net/bpf_filter.c optional bpf | netgraph_bpf +net/bpf_zerocopy.c optional bpf net/bridgestp.c optional bridge | if_bridge net/bsd_comp.c optional ppp_bsdcomp net/ieee8023ad_lacp.c optional lagg @@ -1635,6 +1639,7 @@ net/if_gre.c optional gre net/if_iso88025subr.c optional token net/if_lagg.c optional lagg net/if_loop.c optional loop +net/if_llatbl.c standard net/if_media.c standard net/if_mib.c standard net/if_ppp.c optional ppp @@ -1652,6 +1657,7 @@ net/ppp_deflate.c optional ppp_deflate net/ppp_tty.c optional ppp net/pfil.c optional ether | inet net/radix.c standard +net/radix_mpath.c standard net/raw_cb.c standard net/raw_usrreq.c standard net/route.c standard Modified: user/kmacy/releng_7_net_backport/sys/conf/options ============================================================================== --- user/kmacy/releng_7_net_backport/sys/conf/options Sat Mar 7 03:41:29 2009 (r189484) +++ user/kmacy/releng_7_net_backport/sys/conf/options Sat Mar 7 05:39:55 2009 (r189485) @@ -373,6 +373,7 @@ IPSEC opt_ipsec.h IPSEC_DEBUG opt_ipsec.h IPSEC_FILTERTUNNEL opt_ipsec.h IPDIVERT +MBUF_PROFILING DUMMYNET opt_ipdn.h IPFILTER opt_ipfilter.h IPFILTER_LOG opt_ipfilter.h @@ -395,6 +396,7 @@ NETATALK opt_atalk.h PPP_BSDCOMP opt_ppp.h PPP_DEFLATE opt_ppp.h PPP_FILTER opt_ppp.h +RADIX_MPATH opt_mpath.h SLIP_IFF_OPTS opt_slip.h TCPDEBUG TCP_SIGNATURE opt_inet.h @@ -754,3 +756,7 @@ XFS # Interrupt filtering INTR_FILTER opt_global.h + +# Virtualize the network stack +VIMAGE opt_global.h +VIMAGE_GLOBALS opt_global.h Modified: user/kmacy/releng_7_net_backport/sys/kern/kern_mib.c ============================================================================== --- user/kmacy/releng_7_net_backport/sys/kern/kern_mib.c Sat Mar 7 03:41:29 2009 (r189484) +++ user/kmacy/releng_7_net_backport/sys/kern/kern_mib.c Sat Mar 7 05:39:55 2009 (r189485) @@ -208,6 +208,9 @@ SYSCTL_STRING(_hw, HW_MACHINE_ARCH, mach char hostname[MAXHOSTNAMELEN]; +struct mtx hostname_mtx; +MTX_SYSINIT(hostname_mtx, &hostname_mtx, "hostname", MTX_DEF); + static int sysctl_hostname(SYSCTL_HANDLER_ARGS) { Added: user/kmacy/releng_7_net_backport/sys/kern/kern_rmlock.c ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ user/kmacy/releng_7_net_backport/sys/kern/kern_rmlock.c Sat Mar 7 05:39:55 2009 (r189485) @@ -0,0 +1,522 @@ +/*- + * Copyright (c) 2007 Stephan Uphoff <ups@FreeBSD.org> + * 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. Neither the name of the author nor the names of any co-contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. + */ + +/* + * Machine independent bits of reader/writer lock implementation. + */ + +#include <sys/cdefs.h> +__FBSDID("$FreeBSD: head/sys/kern/kern_rmlock.c 182914 2008-09-10 19:13:30Z jhb $"); + +#include "opt_ddb.h" + +#include <sys/param.h> +#include <sys/systm.h> + +#include <sys/kernel.h> +#include <sys/ktr.h> +#include <sys/lock.h> +#include <sys/mutex.h> +#include <sys/proc.h> +#include <sys/rmlock.h> +#include <sys/sched.h> +#include <sys/smp.h> +#include <sys/systm.h> +#include <sys/turnstile.h> +#include <sys/lock_profile.h> +#include <machine/cpu.h> + +#ifdef DDB +#include <ddb/ddb.h> +#endif + +#undef WITNESS_CHECKORDER +#define WITNESS_CHECKORDER(a, b, c, d, e) + +#define RMPF_ONQUEUE 1 +#define RMPF_SIGNAL 2 + +/* + * To support usage of rmlock in CVs and msleep + * yet another list for the priority tracker + * would be needed. + * Using this lock for cv and msleep also does + * not seem very useful + */ + +static __inline void compiler_memory_barrier(void) { + __asm __volatile("":::"memory"); +} +#if 0 +static void assert_rm(struct lock_object *lock, int what); +#endif +static void lock_rm(struct lock_object *lock, int how); +static int unlock_rm(struct lock_object *lock); + +struct lock_class lock_class_rm = { + .lc_name = "rm", + .lc_flags = LC_SLEEPLOCK | LC_RECURSABLE, +#if 0 + .lc_assert = assert_rm, +#endif +#if 0 +#ifdef DDB + .lc_ddb_show = db_show_rwlock, +#endif +#endif + .lc_lock = lock_rm, + .lc_unlock = unlock_rm, +}; + +#if 0 +static void +assert_rm(struct lock_object *lock, int what) +{ + + panic("assert_rm called"); +} +#endif +static void +lock_rm(struct lock_object *lock, int how) { + panic("lock_rm called"); +} + +static int +unlock_rm(struct lock_object *lock) { + panic("unlock_rm called"); +} + +static struct mtx rm_spinlock; + +MTX_SYSINIT(rm_spinlock, &rm_spinlock, "rm_spinlock", MTX_SPIN); + +/* + * Add or remove tracker from per cpu list. + * The per cpu list can be traversed at any time in forward + * direction from an interrupt on the *local* cpu. + */ + +static void inline +rm_tracker_add(struct pcpu *pc, struct rm_priotracker* tracker) { + struct rm_queue* next; + /* Initialize all tracker pointers */ + tracker->rmp_cpuQueue.rmq_prev = &pc->pc_rm_queue; + next = pc->pc_rm_queue.rmq_next; + tracker->rmp_cpuQueue.rmq_next = next; + /* rmq_prev is not used during froward traversal */ + next->rmq_prev = &tracker->rmp_cpuQueue; + /* Update pointer to first element */ + pc->pc_rm_queue.rmq_next = &tracker->rmp_cpuQueue; +} + + +static void inline +rm_tracker_remove(struct pcpu *pc, struct rm_priotracker* tracker) { + struct rm_queue *next, *prev; + next = tracker->rmp_cpuQueue.rmq_next; + prev = tracker->rmp_cpuQueue.rmq_prev; + /* Not used during forward traversal */ + next->rmq_prev = prev; + /* Remove from list */ + prev->rmq_next = next; +} + + + + +static void rm_cleanIPI(void *arg) { + struct pcpu *pc; + struct rmlock* rm = arg; + struct rm_priotracker *tracker; + struct rm_queue* queue; + pc = pcpu_find(curcpu); + + for(queue = pc->pc_rm_queue.rmq_next; + queue != &pc->pc_rm_queue; + queue = queue->rmq_next) { + tracker = (struct rm_priotracker *) queue; + if(tracker->rmp_rmlock == rm && tracker->rmp_flags == 0 ) { + tracker->rmp_flags = RMPF_ONQUEUE; + mtx_lock_spin(&rm_spinlock); + LIST_INSERT_HEAD(&rm->rm_activeReaders,tracker, + rmp_qentry); + mtx_unlock_spin(&rm_spinlock); + } + } + return; +} + + + +void +rm_init(struct rmlock *rm, const char *name, int opts) +{ + rm->rm_noreadtoken = 1; + LIST_INIT(&rm->rm_activeReaders); + mtx_init(&rm->rm_lock, name, "RM_MTX",MTX_NOWITNESS); + lock_init(&rm->lock_object, &lock_class_rm, name, NULL, (opts & LO_RECURSABLE)| LO_WITNESS); + +} + +void +rm_destroy(struct rmlock *rm) +{ + mtx_destroy(&rm->rm_lock); + lock_destroy(&rm->lock_object); +} + +int +rm_wowned(struct rmlock *rm) +{ + + return (mtx_owned(&rm->rm_lock)); +} + +void +rm_sysinit(void *arg) +{ + struct rm_args *args = arg; + rm_init(args->ra_rm, args->ra_desc, args->ra_opts); +} + + +static void +_rm_rlock_hard(struct rmlock *rm, struct rm_priotracker* tracker) +{ + struct pcpu *pc; + struct rm_queue *queue; + struct rm_priotracker* atracker; + + critical_enter(); + pc = pcpu_find(curcpu); + + /* Check if we just need to do a proper critical_exit */ + if (0 == rm->rm_noreadtoken) { + critical_exit(); + return; + } + + /* Remove our tracker from the per cpu list */ + rm_tracker_remove(pc,tracker); + + /* Check to see if the IPI granted us the lock after all */ + if(tracker->rmp_flags) { + /* Just add back tracker - we hold the lock */ + rm_tracker_add(pc,tracker); + critical_exit(); + return; + } + + + + /* + * We allow readers to aquire a lock even if a writer + * is blocked if the lock is recursive and the reader + * already holds the lock + */ + + if ((rm->lock_object.lo_flags & LO_RECURSABLE) != 0) { + /* + * Just grand the lock if this thread already have a tracker + * for this lock on the per cpu queue + */ + + for(queue = pc->pc_rm_queue.rmq_next; + queue != &pc->pc_rm_queue; + queue = queue->rmq_next) { + atracker = (struct rm_priotracker *) queue; + if (( atracker->rmp_rmlock == rm) && + ( atracker->rmp_thread == tracker->rmp_thread )) { + mtx_lock_spin(&rm_spinlock); + LIST_INSERT_HEAD(&rm->rm_activeReaders,tracker, + rmp_qentry); + tracker->rmp_flags = RMPF_ONQUEUE; + mtx_unlock_spin(&rm_spinlock); + rm_tracker_add(pc,tracker); + critical_exit(); + return; + } + } + } + + + sched_unpin(); + critical_exit(); + + mtx_lock(&rm->rm_lock); + rm->rm_noreadtoken = 0; + critical_enter(); + + pc = pcpu_find(curcpu); + rm_tracker_add(pc,tracker); + sched_pin(); + critical_exit(); + + mtx_unlock(&rm->rm_lock); + return; +} + +void +_rm_rlock(struct rmlock *rm, struct rm_priotracker* tracker) +{ + struct thread *td = curthread; + struct pcpu *pc; + + tracker->rmp_flags = 0; + tracker->rmp_thread = td; + tracker->rmp_rmlock = rm; + + td->td_critnest++; /* critical_enter(); */ + + compiler_memory_barrier(); + + pc = cpuid_to_pcpu[td->td_oncpu]; /* pcpu_find(td->td_oncpu); */ + + rm_tracker_add(pc,tracker); + + td->td_pinned++; /* sched_pin(); */ + + compiler_memory_barrier(); + + td->td_critnest--; + + /* + * Fast path to combine two common conditions + * into a single conditional jump + */ + + if (0 == (td->td_owepreempt | rm->rm_noreadtoken)) { + return; + } + + /* We do not have a read token and need to acquire one */ + _rm_rlock_hard(rm,tracker); +} + + +static void +_rm_unlock_hard(struct thread *td,struct rm_priotracker* tracker) +{ + + if (td->td_owepreempt) { + td->td_critnest++; + critical_exit(); + } + + if (!tracker->rmp_flags) { + return; + } + + + mtx_lock_spin(&rm_spinlock); + LIST_REMOVE(tracker,rmp_qentry); + + if (tracker->rmp_flags & RMPF_SIGNAL) { + struct rmlock *rm; + struct turnstile* ts; + + rm = tracker->rmp_rmlock; + + turnstile_chain_lock(&rm->lock_object); + mtx_unlock_spin(&rm_spinlock); + + ts = turnstile_lookup(&rm->lock_object); + + turnstile_signal(ts, TS_EXCLUSIVE_QUEUE); + turnstile_unpend(ts, TS_EXCLUSIVE_LOCK); + turnstile_chain_unlock(&rm->lock_object); + + + } else + mtx_unlock_spin(&rm_spinlock); + +} + +void +_rm_runlock(struct rmlock *rm, struct rm_priotracker* tracker) +{ + struct pcpu *pc; + struct thread *td = tracker->rmp_thread; + + td->td_critnest++; /* critical_enter(); */ + pc = cpuid_to_pcpu[td->td_oncpu]; /* pcpu_find(td->td_oncpu); */ + rm_tracker_remove(pc,tracker); + td->td_critnest--; + td->td_pinned--; /* sched_unpin(); */ + + if (0 == (td->td_owepreempt | tracker->rmp_flags)) + return; + + + _rm_unlock_hard(td,tracker); + + +} + + +void +_rm_wlock(struct rmlock *rm) +{ + struct rm_priotracker *prio; + struct turnstile *ts; + + mtx_lock(&rm->rm_lock); + + if (rm->rm_noreadtoken == 0) { + /* Get all read tokens back */ + + rm->rm_noreadtoken = 1; + + /* + * Assumes rm->rm_noreadtoken update is visible + * on other CPUs before rm_cleanIPI is called + */ +#ifdef SMP + smp_rendezvous(smp_no_rendevous_barrier, + rm_cleanIPI, + smp_no_rendevous_barrier + ,rm); + +#else + rm_cleanIPI(rm); +#endif + + + mtx_lock_spin(&rm_spinlock); + + while((prio = LIST_FIRST(&rm->rm_activeReaders)) != NULL) { + ts = turnstile_trywait(&rm->lock_object); + prio->rmp_flags = RMPF_ONQUEUE | RMPF_SIGNAL; + mtx_unlock_spin(&rm_spinlock); + turnstile_wait(ts,prio->rmp_thread, + TS_EXCLUSIVE_QUEUE); + mtx_lock_spin(&rm_spinlock); + + } + + mtx_unlock_spin(&rm_spinlock); + } + +} + + +void +_rm_wunlock(struct rmlock *rm) +{ + mtx_unlock(&rm->rm_lock); +} + + +#ifdef LOCK_DEBUG + +void _rm_wlock_debug(struct rmlock *rm, const char *file, int line) +{ + + WITNESS_CHECKORDER(&rm->lock_object, LOP_NEWORDER | LOP_EXCLUSIVE, + file, line, NULL); + + _rm_wlock(rm); + + LOCK_LOG_LOCK("RMWLOCK", &rm->lock_object, 0, 0, file, line); + + WITNESS_LOCK(&rm->lock_object, LOP_EXCLUSIVE, file, line); + + curthread->td_locks++; + +} + +void _rm_wunlock_debug(struct rmlock *rm, const char *file, int line) +{ + curthread->td_locks--; + WITNESS_UNLOCK(&rm->lock_object, LOP_EXCLUSIVE, file, line); + LOCK_LOG_LOCK("RMWUNLOCK", &rm->lock_object, 0, 0, file, line); + _rm_wunlock(rm); +} + + +void +_rm_rlock_debug(struct rmlock *rm, struct rm_priotracker *tracker, + const char *file, int line) +{ + + + WITNESS_CHECKORDER(&rm->lock_object, LOP_NEWORDER , file, line, NULL); + + _rm_rlock(rm, tracker); + + LOCK_LOG_LOCK("RMRLOCK", &rm->lock_object, 0, 0, file, line); + + WITNESS_LOCK(&rm->lock_object, 0 , file, line); + + curthread->td_locks++; +} + +void +_rm_runlock_debug(struct rmlock *rm, struct rm_priotracker *tracker, + const char *file, int line) { + curthread->td_locks--; + WITNESS_UNLOCK(&rm->lock_object, 0 , file, line); + LOCK_LOG_LOCK("RMRUNLOCK", &rm->lock_object, 0, 0, file, line); + _rm_runlock(rm, tracker); +} + + + + +#else +/* + * Just strip out file and line arguments if no lock debugging is enabled + * in the kernel - we are called from a kernel module. +*/ + + +void _rm_wlock_debug(struct rmlock *rm, const char *file, int line) +{ + _rm_wlock(rm); +} + +void _rm_wunlock_debug(struct rmlock *rm, const char *file, int line) +{ + _rm_wunlock(rm); +} + +void +_rm_rlock_debug(struct rmlock *rm, struct rm_priotracker *tracker, + const char *file, int line) +{ + _rm_rlock(rm, tracker); +} + +void +_rm_runlock_debug(struct rmlock *rm, struct rm_priotracker *tracker, + const char *file, int line) { + _rm_runlock(rm, tracker); +} + +#endif Modified: user/kmacy/releng_7_net_backport/sys/kern/kern_uuid.c ============================================================================== --- user/kmacy/releng_7_net_backport/sys/kern/kern_uuid.c Sat Mar 7 03:41:29 2009 (r189484) +++ user/kmacy/releng_7_net_backport/sys/kern/kern_uuid.c Sat Mar 7 05:39:55 2009 (r189485) @@ -27,6 +27,8 @@ #include <sys/cdefs.h> __FBSDID("$FreeBSD$"); +#include "opt_route.h" + #include <sys/param.h> #include <sys/endian.h> #include <sys/kernel.h> @@ -37,10 +39,13 @@ __FBSDID("$FreeBSD$"); #include <sys/sysproto.h> #include <sys/systm.h> #include <sys/uuid.h> +#include <sys/vimage.h> #include <net/if.h> #include <net/if_dl.h> #include <net/if_types.h> +#include <net/route.h> +#include <net/vnet.h> /* * See also: @@ -87,13 +92,14 @@ MTX_SYSINIT(uuid_lock, &uuid_mutex, "UUI static void uuid_node(uint16_t *node) { + INIT_VNET_NET(curvnet); struct ifnet *ifp; struct ifaddr *ifa; struct sockaddr_dl *sdl; int i; IFNET_RLOCK(); - TAILQ_FOREACH(ifp, &ifnet, if_link) { + TAILQ_FOREACH(ifp, &V_ifnet, if_link) { /* Walk the address list */ TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) { sdl = (struct sockaddr_dl*)ifa->ifa_addr; Added: user/kmacy/releng_7_net_backport/sys/kern/subr_bufring.c ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ user/kmacy/releng_7_net_backport/sys/kern/subr_bufring.c Sat Mar 7 05:39:55 2009 (r189485) @@ -0,0 +1,68 @@ +/************************************************************************** + * + * Copyright (c) 2007,2008 Kip Macy kmacy@freebsd.org + * 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. The name of Kip Macy nor the names of other + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. + * + * + ***************************************************************************/ +#include <sys/cdefs.h> +__FBSDID("$FreeBSD: head/sys/kern/subr_bufring.c 185162 2008-11-22 05:55:56Z kmacy $"); + + +#include <sys/param.h> +#include <sys/systm.h> +#include <sys/kernel.h> +#include <sys/malloc.h> +#include <sys/ktr.h> +#include <sys/buf_ring.h> + + +struct buf_ring * +buf_ring_alloc(int count, struct malloc_type *type, int flags, struct mtx *lock) +{ + struct buf_ring *br; + + KASSERT(powerof2(count), ("buf ring must be size power of 2")); + + br = malloc(sizeof(struct buf_ring) + count*sizeof(caddr_t), + type, flags|M_ZERO); + if (br == NULL) + return (NULL); +#ifdef DEBUG_BUFRING + br->br_lock = lock; +#endif + br->br_prod_size = br->br_cons_size = count; + br->br_prod_mask = br->br_cons_mask = count-1; + br->br_prod_head = br->br_cons_head = 0; + br->br_prod_tail = br->br_cons_tail = 0; + + return (br); +} + +void +buf_ring_free(struct buf_ring *br, struct malloc_type *type) +{ + free(br, type); +} Modified: user/kmacy/releng_7_net_backport/sys/kern/subr_pcpu.c ============================================================================== --- user/kmacy/releng_7_net_backport/sys/kern/subr_pcpu.c Sat Mar 7 03:41:29 2009 (r189484) +++ user/kmacy/releng_7_net_backport/sys/kern/subr_pcpu.c Sat Mar 7 05:39:55 2009 (r189485) @@ -56,7 +56,7 @@ __FBSDID("$FreeBSD$"); #include <sys/smp.h> #include <ddb/ddb.h> -static struct pcpu *cpuid_to_pcpu[MAXCPU]; +struct pcpu *cpuid_to_pcpu[MAXCPU]; struct cpuhead cpuhead = SLIST_HEAD_INITIALIZER(cpuhead); /* Modified: user/kmacy/releng_7_net_backport/sys/kern/vfs_export.c ============================================================================== --- user/kmacy/releng_7_net_backport/sys/kern/vfs_export.c Sat Mar 7 03:41:29 2009 (r189484) +++ user/kmacy/releng_7_net_backport/sys/kern/vfs_export.c Sat Mar 7 05:39:55 2009 (r189485) @@ -46,6 +46,7 @@ __FBSDID("$FreeBSD$"); #include <sys/mbuf.h> #include <sys/mount.h> #include <sys/mutex.h> +#include <sys/rwlock.h> #include <sys/refcount.h> #include <sys/socket.h> #include <sys/systm.h> @@ -235,6 +236,7 @@ vfs_free_addrlist(struct netexport *nep) if ((rnh = nep->ne_rtable[i])) { RADIX_NODE_HEAD_LOCK(rnh); (*rnh->rnh_walktree) (rnh, vfs_free_netcred, rnh); + RADIX_NODE_HEAD_UNLOCK(rnh); RADIX_NODE_HEAD_DESTROY(rnh); free(rnh, M_RTABLE); nep->ne_rtable[i] = NULL; /* not SMP safe XXX */ Modified: user/kmacy/releng_7_net_backport/sys/net/bpf.c ============================================================================== --- user/kmacy/releng_7_net_backport/sys/net/bpf.c Sat Mar 7 03:41:29 2009 (r189484) +++ user/kmacy/releng_7_net_backport/sys/net/bpf.c Sat Mar 7 05:39:55 2009 (r189485) @@ -32,10 +32,11 @@ * SUCH DAMAGE. * * @(#)bpf.c 8.4 (Berkeley) 1/9/95 - * - * $FreeBSD$ */ +#include <sys/cdefs.h> +__FBSDID("$FreeBSD$"); + #include "opt_bpf.h" #include "opt_mac.h" #include "opt_netgraph.h" @@ -55,6 +56,7 @@ #include <sys/sockio.h> #include <sys/ttycom.h> #include <sys/uio.h> +#include <sys/vimage.h> #include <sys/event.h> #include <sys/file.h> @@ -65,9 +67,11 @@ #include <net/if.h> #include <net/bpf.h> +#include <net/bpf_buffer.h> #ifdef BPF_JITTER #include <net/bpf_jitter.h> #endif +#include <net/bpf_zerocopy.h> #include <net/bpfdesc.h> #include <netinet/in.h> @@ -79,7 +83,7 @@ #include <security/mac/mac_framework.h> -static MALLOC_DEFINE(M_BPF, "BPF", "BPF data"); +MALLOC_DEFINE(M_BPF, "BPF", "BPF data"); #if defined(DEV_BPF) || defined(NETGRAPH_BPF) @@ -95,19 +99,17 @@ static LIST_HEAD(, bpf_if) bpf_iflist; static struct mtx bpf_mtx; /* bpf global lock */ static int bpf_bpfd_cnt; -static void bpf_allocbufs(struct bpf_d *); static void bpf_attachd(struct bpf_d *, struct bpf_if *); static void bpf_detachd(struct bpf_d *); static void bpf_freed(struct bpf_d *); -static void bpf_mcopy(const void *, void *, size_t); static int bpf_movein(struct uio *, int, struct ifnet *, struct mbuf **, struct sockaddr *, int *, struct bpf_insn *); static int bpf_setif(struct bpf_d *, struct ifreq *); static void bpf_timed_out(void *); static __inline void bpf_wakeup(struct bpf_d *); -static void catchpacket(struct bpf_d *, u_char *, u_int, - u_int, void (*)(const void *, void *, size_t), +static void catchpacket(struct bpf_d *, u_char *, u_int, u_int, + void (*)(struct bpf_d *, caddr_t, u_int, void *, u_int), struct timeval *); static void reset_d(struct bpf_d *); static int bpf_setf(struct bpf_d *, struct bpf_program *, u_long cmd); @@ -116,24 +118,19 @@ static int bpf_setdlt(struct bpf_d *, u_ static void filt_bpfdetach(struct knote *); static int filt_bpfread(struct knote *, long); static void bpf_drvinit(void *); -static void bpf_clone(void *, struct ucred *, char *, int, struct cdev **); static int bpf_stats_sysctl(SYSCTL_HANDLER_ARGS); SYSCTL_NODE(_net, OID_AUTO, bpf, CTLFLAG_RW, 0, "bpf sysctl"); -static int bpf_bufsize = 4096; -SYSCTL_INT(_net_bpf, OID_AUTO, bufsize, CTLFLAG_RW, - &bpf_bufsize, 0, "Default bpf buffer size"); -static int bpf_maxbufsize = BPF_MAXBUFSIZE; -SYSCTL_INT(_net_bpf, OID_AUTO, maxbufsize, CTLFLAG_RW, - &bpf_maxbufsize, 0, "Maximum bpf buffer size"); -static int bpf_maxinsns = BPF_MAXINSNS; +int bpf_maxinsns = BPF_MAXINSNS; SYSCTL_INT(_net_bpf, OID_AUTO, maxinsns, CTLFLAG_RW, &bpf_maxinsns, 0, "Maximum bpf program instructions"); +static int bpf_zerocopy_enable = 1; +SYSCTL_INT(_net_bpf, OID_AUTO, zerocopy_enable, CTLFLAG_RW, + &bpf_zerocopy_enable, 0, "Enable new zero-copy BPF buffer sessions"); SYSCTL_NODE(_net_bpf, OID_AUTO, stats, CTLFLAG_RW, bpf_stats_sysctl, "bpf statistics portal"); static d_open_t bpfopen; -static d_close_t bpfclose; static d_read_t bpfread; static d_write_t bpfwrite; static d_ioctl_t bpfioctl; @@ -142,9 +139,7 @@ static d_kqfilter_t bpfkqfilter; static struct cdevsw bpf_cdevsw = { .d_version = D_VERSION, - .d_flags = D_TRACKCLOSE, .d_open = bpfopen, - .d_close = bpfclose, .d_read = bpfread, .d_write = bpfwrite, .d_ioctl = bpfioctl, @@ -156,6 +151,207 @@ static struct cdevsw bpf_cdevsw = { static struct filterops bpfread_filtops = { 1, NULL, filt_bpfdetach, filt_bpfread }; +/* + * Wrapper functions for various buffering methods. If the set of buffer + * modes expands, we will probably want to introduce a switch data structure + * similar to protosw, et. + */ +static void +bpf_append_bytes(struct bpf_d *d, caddr_t buf, u_int offset, void *src, + u_int len) +{ + + BPFD_LOCK_ASSERT(d); + + switch (d->bd_bufmode) { + case BPF_BUFMODE_BUFFER: + return (bpf_buffer_append_bytes(d, buf, offset, src, len)); + + case BPF_BUFMODE_ZBUF: + d->bd_zcopy++; + return (bpf_zerocopy_append_bytes(d, buf, offset, src, len)); + + default: + panic("bpf_buf_append_bytes"); + } +} + +static void +bpf_append_mbuf(struct bpf_d *d, caddr_t buf, u_int offset, void *src, + u_int len) +{ + + BPFD_LOCK_ASSERT(d); + + switch (d->bd_bufmode) { + case BPF_BUFMODE_BUFFER: + return (bpf_buffer_append_mbuf(d, buf, offset, src, len)); + + case BPF_BUFMODE_ZBUF: + d->bd_zcopy++; + return (bpf_zerocopy_append_mbuf(d, buf, offset, src, len)); + + default: + panic("bpf_buf_append_mbuf"); + } +} + +/* + * This function gets called when the free buffer is re-assigned. + */ +static void +bpf_buf_reclaimed(struct bpf_d *d) +{ + + BPFD_LOCK_ASSERT(d); + + switch (d->bd_bufmode) { + case BPF_BUFMODE_BUFFER: + return; + + case BPF_BUFMODE_ZBUF: + bpf_zerocopy_buf_reclaimed(d); + return; + + default: + panic("bpf_buf_reclaimed"); + } +} + +/* + * If the buffer mechanism has a way to decide that a held buffer can be made + * free, then it is exposed via the bpf_canfreebuf() interface. (1) is + * returned if the buffer can be discarded, (0) is returned if it cannot. + */ +static int +bpf_canfreebuf(struct bpf_d *d) +{ + + BPFD_LOCK_ASSERT(d); + + switch (d->bd_bufmode) { + case BPF_BUFMODE_ZBUF: + return (bpf_zerocopy_canfreebuf(d)); + } + return (0); +} + +/* + * Allow the buffer model to indicate that the current store buffer is + * immutable, regardless of the appearance of space. Return (1) if the + * buffer is writable, and (0) if not. + */ +static int +bpf_canwritebuf(struct bpf_d *d) +{ + + BPFD_LOCK_ASSERT(d); + + switch (d->bd_bufmode) { + case BPF_BUFMODE_ZBUF: + return (bpf_zerocopy_canwritebuf(d)); + } + return (1); *** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200903070539.n275du4R040104>