[Midnightbsd-cvs] src [12360] trunk/sys/sys: sync with FreeBSD 11-stable

laffer1 at midnightbsd.org laffer1 at midnightbsd.org
Sun Feb 9 13:30:16 EST 2020


Revision: 12360
          http://svnweb.midnightbsd.org/src/?rev=12360
Author:   laffer1
Date:     2020-02-09 13:30:15 -0500 (Sun, 09 Feb 2020)
Log Message:
-----------
sync with FreeBSD 11-stable

Modified Paths:
--------------
    trunk/sys/sys/sf_buf.h
    trunk/sys/sys/sglist.h

Modified: trunk/sys/sys/sf_buf.h
===================================================================
--- trunk/sys/sys/sf_buf.h	2020-02-09 18:28:48 UTC (rev 12359)
+++ trunk/sys/sys/sf_buf.h	2020-02-09 18:30:15 UTC (rev 12360)
@@ -1,5 +1,6 @@
 /* $MidnightBSD$ */
 /*-
+ * Copyright (c) 2014 Gleb Smirnoff <glebius at FreeBSD.org>
  * Copyright (c) 2003-2004 Alan L. Cox <alc at cs.rice.edu>
  * All rights reserved.
  *
@@ -24,13 +25,166 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: stable/10/sys/sys/sf_buf.h 255786 2013-09-22 13:36:52Z glebius $
+ * $FreeBSD: stable/11/sys/sys/sf_buf.h 331722 2018-03-29 02:50:57Z eadler $
  */
 
 #ifndef _SYS_SF_BUF_H_
 #define _SYS_SF_BUF_H_
 
+struct sfstat {				/* sendfile statistics */
+	uint64_t	sf_syscalls;	/* times sendfile was called */
+	uint64_t	sf_noiocnt;	/* times sendfile didn't require I/O */
+	uint64_t	sf_iocnt;	/* times sendfile had to do disk I/O */
+	uint64_t	sf_pages_read;	/* pages read as part of a request */
+	uint64_t	sf_pages_valid;	/* pages were valid for a request */
+	uint64_t	sf_rhpages_requested;	/* readahead pages requested */
+	uint64_t	sf_rhpages_read;	/* readahead pages read */
+	uint64_t	sf_busy;	/* times aborted on a busy page */
+	uint64_t	sf_allocfail;	/* times sfbuf allocation failed */
+	uint64_t	sf_allocwait;	/* times sfbuf allocation had to wait */
+};
+
+#ifdef _KERNEL
+#include <sys/types.h>
+#include <sys/systm.h>
+#include <sys/counter.h>
+#include <vm/vm.h>
+#include <vm/vm_param.h>
+#include <vm/vm_page.h>
+
 /*
+ * Sf_bufs, or sendfile(2) buffers provide a vm_page that is mapped
+ * into kernel address space. Note, that they aren't used only
+ * by sendfile(2)!
+ *
+ * Sf_bufs could be implemented as a feature of vm_page_t, but that
+ * would require growth of the structure. That's why they are implemented
+ * as a separate hash indexed by vm_page address. Implementation lives in
+ * kern/subr_sfbuf.c. Meanwhile, most 64-bit machines have a physical map,
+ * so they don't require this hash at all, thus ignore subr_sfbuf.c.
+ *
+ * Different 32-bit architectures demand different requirements on sf_buf
+ * hash and functions. They request features in machine/vmparam.h, which
+ * enable parts of this file. They can also optionally provide helpers in
+ * machine/sf_buf.h
+ *
+ * Defines are:
+ * SFBUF		This machine requires sf_buf hash.
+ * 			subr_sfbuf.c should be compiled.
+ * SFBUF_CPUSET		This machine can perform SFB_CPUPRIVATE mappings,
+ *			that do no invalidate cache on the rest of CPUs.
+ * SFBUF_NOMD		This machine doesn't have machine/sf_buf.h
+ *
+ * SFBUF_OPTIONAL_DIRECT_MAP	Value of this define is used as boolean
+ *				variable that tells whether machine is
+ *				capable of direct map or not at runtime.
+ * SFBUF_MAP		This machine provides its own sf_buf_map() and
+ *			sf_buf_unmap().
+ * SFBUF_PROCESS_PAGE	This machine provides sf_buf_process_page()
+ *			function.
+ */
+
+#ifdef SFBUF
+#if defined(SMP) && defined(SFBUF_CPUSET)
+#include <sys/_cpuset.h>
+#endif
+#include <sys/queue.h>
+
+struct sf_buf {
+	LIST_ENTRY(sf_buf)	list_entry;	/* list of buffers */
+	TAILQ_ENTRY(sf_buf)	free_entry;	/* list of buffers */
+	vm_page_t		m;		/* currently mapped page */
+	vm_offset_t		kva;		/* va of mapping */
+	int			ref_count;	/* usage of this mapping */
+#if defined(SMP) && defined(SFBUF_CPUSET)
+	cpuset_t		cpumask;	/* where mapping is valid */
+#endif
+};
+#else /* ! SFBUF */
+struct sf_buf;
+#endif /* SFBUF */
+
+#ifndef SFBUF_NOMD
+#include <machine/sf_buf.h>
+#endif
+#ifdef SFBUF_OPTIONAL_DIRECT_MAP
+#include <machine/md_var.h>
+#endif
+
+#ifdef SFBUF
+struct sf_buf *sf_buf_alloc(struct vm_page *, int);
+void sf_buf_free(struct sf_buf *);
+void sf_buf_ref(struct sf_buf *);
+
+static inline vm_offset_t
+sf_buf_kva(struct sf_buf *sf)
+{
+#ifdef SFBUF_OPTIONAL_DIRECT_MAP
+	if (SFBUF_OPTIONAL_DIRECT_MAP)
+		return (SFBUF_PHYS_DMAP(VM_PAGE_TO_PHYS((vm_page_t)sf)));
+#endif
+
+        return (sf->kva);
+}
+
+static inline vm_page_t
+sf_buf_page(struct sf_buf *sf)
+{
+#ifdef SFBUF_OPTIONAL_DIRECT_MAP
+	if (SFBUF_OPTIONAL_DIRECT_MAP)
+		return ((vm_page_t)sf);
+#endif
+
+        return (sf->m);
+}
+
+#ifndef SFBUF_MAP
+#include <vm/pmap.h>
+
+static inline void
+sf_buf_map(struct sf_buf *sf, int flags)
+{
+
+	pmap_qenter(sf->kva, &sf->m, 1);
+}
+
+static inline int
+sf_buf_unmap(struct sf_buf *sf)
+{
+
+	return (0);
+}
+#endif /* SFBUF_MAP */
+
+#if defined(SMP) && defined(SFBUF_CPUSET)
+void sf_buf_shootdown(struct sf_buf *, int);
+#endif
+
+#ifdef SFBUF_PROCESS_PAGE
+boolean_t sf_buf_process_page(vm_page_t, void (*)(struct sf_buf *));
+#endif
+
+#else /* ! SFBUF */
+
+static inline struct sf_buf *
+sf_buf_alloc(struct vm_page *m, int pri)
+{
+
+	return ((struct sf_buf *)m);
+}
+
+static inline void
+sf_buf_free(struct sf_buf *sf)
+{
+}
+
+static inline void
+sf_buf_ref(struct sf_buf *sf)
+{
+}
+#endif /* SFBUF */
+
+/*
  * Options to sf_buf_alloc() are specified through its flags argument.  This
  * argument's value should be the result of a bitwise or'ing of one or more
  * of the following values.
@@ -41,20 +195,6 @@
 #define	SFB_DEFAULT	0
 #define	SFB_NOWAIT	4		/* Return NULL if all bufs are used. */
 
-struct vm_page;
-
-struct sfstat {				/* sendfile statistics */
-	uint64_t	sf_iocnt;	/* times sendfile had to do disk I/O */
-	uint64_t	sf_allocfail;	/* times sfbuf allocation failed */
-	uint64_t	sf_allocwait;	/* times sfbuf allocation had to wait */
-};
-
-#ifdef _KERNEL
-#include <machine/sf_buf.h>
-#include <sys/systm.h>
-#include <sys/counter.h>
-struct mbuf;	/* for sf_buf_mext() */
-
 extern counter_u64_t sfstat[sizeof(struct sfstat) / sizeof(uint64_t)];
 #define	SFSTAT_ADD(name, val)	\
     counter_u64_add(sfstat[offsetof(struct sfstat, name) / sizeof(uint64_t)],\
@@ -61,7 +201,4 @@
 	(val))
 #define	SFSTAT_INC(name)	SFSTAT_ADD(name, 1)
 #endif /* _KERNEL */
-
-int	sf_buf_mext(struct mbuf *mb, void *addr, void *args);
-
 #endif /* !_SYS_SF_BUF_H_ */

Modified: trunk/sys/sys/sglist.h
===================================================================
--- trunk/sys/sys/sglist.h	2020-02-09 18:28:48 UTC (rev 12359)
+++ trunk/sys/sys/sglist.h	2020-02-09 18:30:15 UTC (rev 12360)
@@ -28,7 +28,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: stable/10/sys/sys/sglist.h 260856 2014-01-18 18:36:41Z bryanv $
+ * $FreeBSD: stable/11/sys/sys/sglist.h 345039 2019-03-11 22:48:51Z jhb $
  */
 
 /*
@@ -89,13 +89,18 @@
 int	sglist_append_mbuf(struct sglist *sg, struct mbuf *m0);
 int	sglist_append_phys(struct sglist *sg, vm_paddr_t paddr,
 	    size_t len);
+int	sglist_append_sglist(struct sglist *sg, struct sglist *source,
+	    size_t offset, size_t length);
 int	sglist_append_uio(struct sglist *sg, struct uio *uio);
 int	sglist_append_user(struct sglist *sg, void *buf, size_t len,
 	    struct thread *td);
+int	sglist_append_vmpages(struct sglist *sg, vm_page_t *m, size_t pgoff,
+	    size_t len);
 struct sglist *sglist_build(void *buf, size_t len, int mflags);
 struct sglist *sglist_clone(struct sglist *sg, int mflags);
 int	sglist_consume_uio(struct sglist *sg, struct uio *uio, size_t resid);
 int	sglist_count(void *buf, size_t len);
+int	sglist_count_vmpages(vm_page_t *m, size_t pgoff, size_t len);
 void	sglist_free(struct sglist *sg);
 int	sglist_join(struct sglist *first, struct sglist *second);
 size_t	sglist_length(struct sglist *sg);



More information about the Midnightbsd-cvs mailing list