Browse Source

For NS16550 UART, poll stdin less often

On my Mac Mini, calling `poll()` on stdin takes around 10 us, and we
are invoking it every 20 us or so.  Reduce the frequency of polling
by 16x when not actively receiving data, thereby reducing the fraction
of time spent in `poll()` to a trivial amount.
speedup-hacks
Andrew Waterman 3 years ago
parent
commit
2cb5cf5d66
  1. 3
      riscv/devices.h
  2. 10
      riscv/ns16550.cc

3
riscv/devices.h

@ -148,6 +148,9 @@ class ns16550_t : public abstract_device_t {
void update_interrupt(void);
uint8_t rx_byte(void);
void tx_byte(uint8_t val);
int backoff_counter;
static const int MAX_BACKOFF = 16;
};
class mmio_plugin_device_t : public abstract_device_t {

10
riscv/ns16550.cc

@ -71,7 +71,7 @@
ns16550_t::ns16550_t(class bus_t *bus, abstract_interrupt_controller_t *intctrl,
uint32_t interrupt_id, uint32_t reg_shift, uint32_t reg_io_width)
: bus(bus), intctrl(intctrl), interrupt_id(interrupt_id), reg_shift(reg_shift), reg_io_width(reg_io_width)
: bus(bus), intctrl(intctrl), interrupt_id(interrupt_id), reg_shift(reg_shift), reg_io_width(reg_io_width), backoff_counter(0)
{
ier = 0;
iir = UART_IIR_NO_INT;
@ -300,11 +300,19 @@ void ns16550_t::tick(void)
return;
}
if (backoff_counter > 0 && backoff_counter < MAX_BACKOFF) {
backoff_counter++;
return;
}
int rc = canonical_terminal_t::read();
if (rc < 0) {
backoff_counter = 1;
return;
}
backoff_counter = 0;
rx_queue.push((uint8_t)rc);
lsr |= UART_LSR_DR;
update_interrupt();

Loading…
Cancel
Save