On Wed, Apr 06, 2011 at 03:55:03PM +0200, Claudio Jeker wrote:
> On Wed, Apr 06, 2011 at 01:22:41PM +0200, Peter Hallin wrote:
> > On 2011-04-05 14:35, Claudio Jeker wrote:
> > > Can you give the following diff a spin and see if that makes the card act
> > > faster. This disables the ppb hotplug interrupt which is shared with the
> > > em2 and em3 interrupts.
> > >
> > > --
> > > :wq Claudio
> >
> > Ok, that did the trick.
> >
> > I made the changes to the 4.8 source and ppb hotplug was disabled.
> >
> > I then tested the dual port cards and got close to 1 Gbit/s but without
> > the high CPU usage (only about 30% intr).
> >
> > So my question now is: Do we need the ppb hotplug? What is it good for?
>
> It is needed for handling hotplug events especially on the expresscard
> slots on modern laptops.
>
> Here is a better version that may get commited if it works for you.
> Currently only amd64 is fixed, we're looking into i386 to do the same
> dance with the interrupt return values.
> So the idea is to establish the interrupt handler for the ppb as last and
> jump out of interrupt processing if the handler returns 1 (HW was the
> source of interrupt). So we should not end up in the slow ppb interrupt
> handler unless it is actually a hotplug interrupt.
Wait. It seems more is needed. Will come back when we have a better
solution.
> --
> :wq Claudio
>
> Index: arch/amd64/amd64/vector.S
> ===================================================================
> RCS file: /cvs/src/sys/arch/amd64/amd64/vector.S,v
> retrieving revision 1.28
> diff -u -p -r1.28 vector.S
> --- arch/amd64/amd64/vector.S 1 Apr 2011 22:51:45 -0000 1.28
> +++ arch/amd64/amd64/vector.S 6 Apr 2011 13:18:45 -0000
> @@ -484,7 +484,9 @@ IDTVEC(intr_##name##num)
> ;\
> call *IH_FUN(%rbx) /* call it */ ;\
> orq %rax,%rax /* should it be counted? */ ;\
> jz 4f ;\
> - incq IH_COUNT(%rbx) ;\
> + incq IH_COUNT(%rbx) /* -1 or 1 */ ;\
> + orq %rax,%rax ;\
> + jns 5f ;\
> 4: movq IH_NEXT(%rbx),%rbx /* next handler in chain */ ;\
> testq %rbx,%rbx ;\
> jnz 6b ;\
> Index: dev/pci/ppb.c
> ===================================================================
> RCS file: /cvs/src/sys/dev/pci/ppb.c,v
> retrieving revision 1.47
> diff -u -p -r1.47 ppb.c
> --- dev/pci/ppb.c 30 Dec 2010 00:58:22 -0000 1.47
> +++ dev/pci/ppb.c 6 Apr 2011 12:50:33 -0000
> @@ -142,7 +142,7 @@ ppbattach(struct device *parent, struct
> pci_intr_handle_t ih;
> pcireg_t busdata, reg, blr;
> char *name;
> - int pin;
> + int pin, has_hotplug = 0;
>
> sc->sc_pc = pc;
> sc->sc_tag = pa->pa_tag;
> @@ -169,21 +169,9 @@ ppbattach(struct device *parent, struct
> /* Check for PCI Express capabilities and setup hotplug support. */
> if (pci_get_capability(pc, pa->pa_tag, PCI_CAP_PCIEXPRESS,
> &sc->sc_cap_off, ®) && (reg & PCI_PCIE_XCAP_SI)) {
> - if (pci_intr_map(pa, &ih) == 0)
> - sc->sc_intrhand = pci_intr_establish(pc, ih, IPL_TTY,
> - ppb_intr, sc, self->dv_xname);
> -
> - if (sc->sc_intrhand) {
> + if (pci_intr_map(pa, &ih) == 0) {
> printf(": %s", pci_intr_string(pc, ih));
> -
> - /* Enable hotplug interrupt. */
> - reg = pci_conf_read(pc, pa->pa_tag,
> - sc->sc_cap_off + PCI_PCIE_SLCSR);
> - reg |= (PCI_PCIE_SLCSR_HPE | PCI_PCIE_SLCSR_PDE);
> - pci_conf_write(pc, pa->pa_tag,
> - sc->sc_cap_off + PCI_PCIE_SLCSR, reg);
> -
> - timeout_set(&sc->sc_to, ppb_hotplug_insert_finish, sc);
> + has_hotplug = 1;
> }
> }
>
> @@ -305,6 +293,22 @@ ppbattach(struct device *parent, struct
> pba.pba_intrtag = pa->pa_intrtag;
>
> sc->sc_psc = config_found(self, &pba, ppbprint);
> +
> + if (has_hotplug) {
> + sc->sc_intrhand = pci_intr_establish(pc, ih, IPL_TTY,
> + ppb_intr, sc, self->dv_xname);
> + if (sc->sc_intrhand) {
> +
> + /* Enable hotplug interrupt. */
> + reg = pci_conf_read(pc, pa->pa_tag,
> + sc->sc_cap_off + PCI_PCIE_SLCSR);
> + reg |= (PCI_PCIE_SLCSR_HPE | PCI_PCIE_SLCSR_PDE);
> + pci_conf_write(pc, pa->pa_tag,
> + sc->sc_cap_off + PCI_PCIE_SLCSR, reg);
> +
> + timeout_set(&sc->sc_to, ppb_hotplug_insert_finish, sc);
> + }
> + }
> }
>
> int
>
--
:wq Claudio