Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 24 Jul 2017 05:52:10 +0000 (UTC)
From:      Alexander Motin <mav@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-11@freebsd.org
Subject:   svn commit: r321411 - in stable/11: sys/fs/nfsclient sys/fs/smbfs sys/vm usr.sbin/bhyve
Message-ID:  <201707240552.v6O5qAdA022781@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: mav
Date: Mon Jul 24 05:52:10 2017
New Revision: 321411
URL: https://svnweb.freebsd.org/changeset/base/321411

Log:
  MFC r302850: Make PCI interupts allocation static when using bootrom (UEFI).
  
  This makes factual interrupt routing match one shipped with UEFI firmware.
  With old firmware this make legacy interrupts work reliable for functions 0
  of PCI slots 3-6.  Updated UEFI image fixes problem completely.

Modified:
  stable/11/sys/fs/nfsclient/nfs_clbio.c
  stable/11/sys/fs/smbfs/smbfs_io.c
  stable/11/sys/vm/vnode_pager.c
  stable/11/sys/vm/vnode_pager.h
  stable/11/usr.sbin/bhyve/ioapic.c
  stable/11/usr.sbin/bhyve/ioapic.h
  stable/11/usr.sbin/bhyve/pci_emul.c
  stable/11/usr.sbin/bhyve/pci_irq.c
  stable/11/usr.sbin/bhyve/pci_irq.h
Directory Properties:
  stable/11/   (props changed)

Modified: stable/11/sys/fs/nfsclient/nfs_clbio.c
==============================================================================
--- stable/11/sys/fs/nfsclient/nfs_clbio.c	Mon Jul 24 04:38:05 2017	(r321410)
+++ stable/11/sys/fs/nfsclient/nfs_clbio.c	Mon Jul 24 05:52:10 2017	(r321411)
@@ -337,8 +337,10 @@ ncl_putpages(struct vop_putpages_args *ap)
 	    cred);
 	crfree(cred);
 
-	if (error == 0 || !nfs_keep_dirty_on_error)
-		vnode_pager_undirty_pages(pages, rtvals, count - uio.uio_resid);
+	if (error == 0 || !nfs_keep_dirty_on_error) {
+		vnode_pager_undirty_pages(pages, rtvals, count - uio.uio_resid,
+		    np->n_size - offset, npages * PAGE_SIZE);
+	}
 	return (rtvals[0]);
 }
 

Modified: stable/11/sys/fs/smbfs/smbfs_io.c
==============================================================================
--- stable/11/sys/fs/smbfs/smbfs_io.c	Mon Jul 24 04:38:05 2017	(r321410)
+++ stable/11/sys/fs/smbfs/smbfs_io.c	Mon Jul 24 05:52:10 2017	(r321411)
@@ -621,9 +621,11 @@ smbfs_putpages(ap)
 
 	relpbuf(bp, &smbfs_pbuf_freecnt);
 
-	if (!error)
-		vnode_pager_undirty_pages(pages, rtvals, count - uio.uio_resid);
-	return rtvals[0];
+	if (error == 0) {
+		vnode_pager_undirty_pages(pages, rtvals, count - uio.uio_resid,
+		    npages * PAGE_SIZE, npages * PAGE_SIZE);
+	}
+	return (rtvals[0]);
 #endif /* SMBFS_RWGENERIC */
 }
 

Modified: stable/11/sys/vm/vnode_pager.c
==============================================================================
--- stable/11/sys/vm/vnode_pager.c	Mon Jul 24 04:38:05 2017	(r321410)
+++ stable/11/sys/vm/vnode_pager.c	Mon Jul 24 05:52:10 2017	(r321411)
@@ -1277,12 +1277,13 @@ vnode_pager_putpages_ioflags(int pager_flags)
 }
 
 void
-vnode_pager_undirty_pages(vm_page_t *ma, int *rtvals, int written)
+vnode_pager_undirty_pages(vm_page_t *ma, int *rtvals, int written, int eof,
+    int lpos)
 {
 	vm_object_t obj;
-	int i, pos;
+	int i, pos, pos_devb;
 
-	if (written == 0)
+	if (written == 0 && eof >= lpos)
 		return;
 	obj = ma[0]->object;
 	VM_OBJECT_WLOCK(obj);
@@ -1294,6 +1295,20 @@ vnode_pager_undirty_pages(vm_page_t *ma, int *rtvals, 
 			/* Partially written page. */
 			rtvals[i] = VM_PAGER_AGAIN;
 			vm_page_clear_dirty(ma[i], 0, written & PAGE_MASK);
+		}
+	}
+	for (pos = eof, i = OFF_TO_IDX(trunc_page(pos)); pos < lpos; i++) {
+		if (pos != trunc_page(pos)) {
+			pos_devb = roundup2(pos, DEV_BSIZE) & PAGE_MASK;
+			vm_page_clear_dirty(ma[i], pos_devb, PAGE_SIZE -
+			    pos_devb);
+			if (ma[i]->dirty == VM_PAGE_BITS_ALL)
+				rtvals[i] = VM_PAGER_OK;
+			pos = round_page(pos);
+		} else {
+			/* vm_pageout_flush() clears dirty */
+			rtvals[i] = VM_PAGER_BAD;
+			pos += PAGE_SIZE;
 		}
 	}
 	VM_OBJECT_WUNLOCK(obj);

Modified: stable/11/sys/vm/vnode_pager.h
==============================================================================
--- stable/11/sys/vm/vnode_pager.h	Mon Jul 24 04:38:05 2017	(r321410)
+++ stable/11/sys/vm/vnode_pager.h	Mon Jul 24 05:52:10 2017	(r321411)
@@ -50,7 +50,8 @@ int vnode_pager_local_getpages_async(struct vop_getpag
 int vnode_pager_putpages_ioflags(int pager_flags);
 void vnode_pager_release_writecount(vm_object_t object, vm_offset_t start,
     vm_offset_t end);
-void vnode_pager_undirty_pages(vm_page_t *ma, int *rtvals, int written);
+void vnode_pager_undirty_pages(vm_page_t *ma, int *rtvals, int written,
+    int eof, int lpos);
 void vnode_pager_update_writecount(vm_object_t object, vm_offset_t start,
     vm_offset_t end);
 

Modified: stable/11/usr.sbin/bhyve/ioapic.c
==============================================================================
--- stable/11/usr.sbin/bhyve/ioapic.c	Mon Jul 24 04:38:05 2017	(r321410)
+++ stable/11/usr.sbin/bhyve/ioapic.c	Mon Jul 24 05:52:10 2017	(r321411)
@@ -29,11 +29,14 @@
 __FBSDID("$FreeBSD$");
 
 #include <sys/types.h>
+#include <stdio.h>
 
 #include <machine/vmm.h>
 #include <vmmapi.h>
 
 #include "ioapic.h"
+#include "pci_emul.h"
+#include "pci_lpc.h"
 
 /*
  * Assign PCI INTx interrupts to I/O APIC pins in a round-robin
@@ -64,11 +67,15 @@ ioapic_init(struct vmctx *ctx)
 }
 
 int
-ioapic_pci_alloc_irq(void)
+ioapic_pci_alloc_irq(struct pci_devinst *pi)
 {
 	static int last_pin;
 
 	if (pci_pins == 0)
 		return (-1);
+	if (lpc_bootrom()) {
+		/* For external bootrom use fixed mapping. */
+		return (16 + (4 + pi->pi_slot + pi->pi_lintr.pin) % 8);
+	}
 	return (16 + (last_pin++ % pci_pins));
 }

Modified: stable/11/usr.sbin/bhyve/ioapic.h
==============================================================================
--- stable/11/usr.sbin/bhyve/ioapic.h	Mon Jul 24 04:38:05 2017	(r321410)
+++ stable/11/usr.sbin/bhyve/ioapic.h	Mon Jul 24 05:52:10 2017	(r321411)
@@ -30,10 +30,12 @@
 #ifndef _IOAPIC_H_
 #define	_IOAPIC_H_
 
+struct pci_devinst;
+
 /*
  * Allocate a PCI IRQ from the I/O APIC.
  */
 void	ioapic_init(struct vmctx *ctx);
-int	ioapic_pci_alloc_irq(void);
+int	ioapic_pci_alloc_irq(struct pci_devinst *pi);
 
 #endif

Modified: stable/11/usr.sbin/bhyve/pci_emul.c
==============================================================================
--- stable/11/usr.sbin/bhyve/pci_emul.c	Mon Jul 24 04:38:05 2017	(r321410)
+++ stable/11/usr.sbin/bhyve/pci_emul.c	Mon Jul 24 05:52:10 2017	(r321411)
@@ -1504,7 +1504,7 @@ pci_lintr_route(struct pci_devinst *pi)
 	 * is not yet assigned.
 	 */
 	if (ii->ii_ioapic_irq == 0)
-		ii->ii_ioapic_irq = ioapic_pci_alloc_irq();
+		ii->ii_ioapic_irq = ioapic_pci_alloc_irq(pi);
 	assert(ii->ii_ioapic_irq > 0);
 
 	/*
@@ -1512,7 +1512,7 @@ pci_lintr_route(struct pci_devinst *pi)
 	 * not yet assigned.
 	 */
 	if (ii->ii_pirq_pin == 0)
-		ii->ii_pirq_pin = pirq_alloc_pin(pi->pi_vmctx);
+		ii->ii_pirq_pin = pirq_alloc_pin(pi);
 	assert(ii->ii_pirq_pin > 0);
 
 	pi->pi_lintr.ioapic_irq = ii->ii_ioapic_irq;

Modified: stable/11/usr.sbin/bhyve/pci_irq.c
==============================================================================
--- stable/11/usr.sbin/bhyve/pci_irq.c	Mon Jul 24 04:38:05 2017	(r321410)
+++ stable/11/usr.sbin/bhyve/pci_irq.c	Mon Jul 24 05:52:10 2017	(r321411)
@@ -193,19 +193,25 @@ pci_irq_deassert(struct pci_devinst *pi)
 }
 
 int
-pirq_alloc_pin(struct vmctx *ctx)
+pirq_alloc_pin(struct pci_devinst *pi)
 {
+	struct vmctx *ctx = pi->pi_vmctx;
 	int best_count, best_irq, best_pin, irq, pin;
 
 	pirq_cold = 0;
 
-	/* First, find the least-used PIRQ pin. */
-	best_pin = 0;
-	best_count = pirqs[0].use_count;
-	for (pin = 1; pin < nitems(pirqs); pin++) {
-		if (pirqs[pin].use_count < best_count) {
-			best_pin = pin;
-			best_count = pirqs[pin].use_count;
+	if (lpc_bootrom()) {
+		/* For external bootrom use fixed mapping. */
+		best_pin = (4 + pi->pi_slot + pi->pi_lintr.pin) % 8;
+	} else {
+		/* Find the least-used PIRQ pin. */
+		best_pin = 0;
+		best_count = pirqs[0].use_count;
+		for (pin = 1; pin < nitems(pirqs); pin++) {
+			if (pirqs[pin].use_count < best_count) {
+				best_pin = pin;
+				best_count = pirqs[pin].use_count;
+			}
 		}
 	}
 	pirqs[best_pin].use_count++;

Modified: stable/11/usr.sbin/bhyve/pci_irq.h
==============================================================================
--- stable/11/usr.sbin/bhyve/pci_irq.h	Mon Jul 24 04:38:05 2017	(r321410)
+++ stable/11/usr.sbin/bhyve/pci_irq.h	Mon Jul 24 05:52:10 2017	(r321411)
@@ -37,7 +37,7 @@ void	pci_irq_deassert(struct pci_devinst *pi);
 void	pci_irq_init(struct vmctx *ctx);
 void	pci_irq_reserve(int irq);
 void	pci_irq_use(int irq);
-int	pirq_alloc_pin(struct vmctx *ctx);
+int	pirq_alloc_pin(struct pci_devinst *pi);
 int	pirq_irq(int pin);
 uint8_t	pirq_read(int pin);
 void	pirq_write(struct vmctx *ctx, int pin, uint8_t val);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201707240552.v6O5qAdA022781>