Print this page
PVN_GETPAGE_{SZ,NUM} are misnamed and unnecessarily complicated
There is really no reason to not allow 8 pages all the time. With the
current logic, we get the following:
Assuming 4kB pages (x86):
_SZ = ptob(8) /* 32kB */
_NUM = 8
Assuming 8kB pages (sparc):
_SZ = ptob(8) /* 64kB */
_NUM = 8
We'd have to deal with 16kB base pages in order for the _NUM #define to not
be 8 (it'd be 4 in that case). So, in the spirit of simplicity, let's just
always grab 8 pages as there are no interesting systems with 16kB+ base pages.
Finally, the defines are poorly named.
@@ -76,27 +76,16 @@
#include <sys/zone.h>
#include <sys/shm_impl.h>
/*
* segvn_fault needs a temporary page list array. To avoid calling kmem all
- * the time, it creates a small (PVN_GETPAGE_NUM entry) array and uses it if
- * it can. In the rare case when this page list is not large enough, it
- * goes and gets a large enough array from kmem.
- *
- * This small page list array covers either 8 pages or 64kB worth of pages -
- * whichever is smaller.
+ * the time, it creates a small (FAULT_TMP_PAGES_NUM entry) array and uses
+ * it if it can. In the rare case when this page list is not large enough,
+ * it goes and gets a large enough array from kmem.
*/
-#define PVN_MAX_GETPAGE_SZ 0x10000
-#define PVN_MAX_GETPAGE_NUM 0x8
-
-#if PVN_MAX_GETPAGE_SZ > PVN_MAX_GETPAGE_NUM * PAGESIZE
-#define PVN_GETPAGE_SZ ptob(PVN_MAX_GETPAGE_NUM)
-#define PVN_GETPAGE_NUM PVN_MAX_GETPAGE_NUM
-#else
-#define PVN_GETPAGE_SZ PVN_MAX_GETPAGE_SZ
-#define PVN_GETPAGE_NUM btop(PVN_MAX_GETPAGE_SZ)
-#endif
+#define FAULT_TMP_PAGES_NUM 0x8
+#define FAULT_TMP_PAGES_SZ ptob(FAULT_TMP_PAGES_NUM)
/*
* Private seg op routines.
*/
static int segvn_dup(struct seg *seg, struct seg *newseg);
@@ -4923,11 +4912,11 @@
u_offset_t off;
caddr_t a;
struct vpage *vpage;
uint_t vpprot, prot;
int err;
- page_t *pl[PVN_GETPAGE_NUM + 1];
+ page_t *pl[FAULT_TMP_PAGES_NUM + 1];
size_t plsz, pl_alloc_sz;
size_t page;
ulong_t anon_index;
struct anon_map *amp;
int dogetpage = 0;
@@ -5362,11 +5351,11 @@
if (dogetpage) {
enum seg_rw arw;
struct as *as = seg->s_as;
- if (len > ptob((sizeof (pl) / sizeof (pl[0])) - 1)) {
+ if (len > FAULT_TMP_PAGES_SZ) {
/*
* Page list won't fit in local array,
* allocate one of the needed size.
*/
pl_alloc_sz =
@@ -5390,11 +5379,11 @@
} else {
/*
* Ask VOP_GETPAGE to return adjacent pages
* within the segment.
*/
- plsz = MIN((size_t)PVN_GETPAGE_SZ, (size_t)
+ plsz = MIN((size_t)FAULT_TMP_PAGES_SZ, (size_t)
((seg->s_base + seg->s_size) - addr));
ASSERT((addr + plsz) <=
(seg->s_base + seg->s_size));
}