dragonfly.git
5 hours agodrm/linux: Implement some spin_lock_irq* functions master
François Tigeot [Fri, 24 Jun 2016 14:32:20 +0000 (16:32 +0200)]
drm/linux: Implement some spin_lock_irq* functions

They are not just simple spin_lock/spin_unlock() variants but
disable hardware interrupt processing on the current cpu.

Suggested-by: Matt Macy <mmacy@nextbsd.org>
6 hours agosys/vfs/hammer: Remove DEDUP_CACHE_SIZE and wrong comment
Tomohiro Kusumi [Fri, 24 Jun 2016 14:07:45 +0000 (23:07 +0900)]
sys/vfs/hammer: Remove DEDUP_CACHE_SIZE and wrong comment

It is a tunable sysctl since e2ef7a95.

17 hours agonvme: Use high frequency interrupt for CQ processing
Sepherosa Ziehau [Fri, 24 Jun 2016 03:13:16 +0000 (11:13 +0800)]
nvme: Use high frequency interrupt for CQ processing

Suggested-by: dillon@
Reviewed-by: dillon@
17 hours agointr: Allow drivers to register high frequency interrupt.
Sepherosa Ziehau [Fri, 24 Jun 2016 02:53:49 +0000 (10:53 +0800)]
intr: Allow drivers to register high frequency interrupt.

Only unshared interrupts will be considered, e.g. MSI, MSI-X or
unshared line interrupt.

34 hours agoFix a couple of logic issues in contributed code (gcc, mpfr, tre).
Sascha Wildner [Thu, 23 Jun 2016 09:46:10 +0000 (11:46 +0200)]
Fix a couple of logic issues in contributed code (gcc, mpfr, tre).

* The mpfr bug was fixed in mpfr's trunk (r8705).
  Report: (https://sympa.inria.fr/sympa/arc/mpfr/2013-11/msg00009.html)

* The GCC bug was fixed too. This commit applies GCC's 51aab39345ae.

* The TRE bug came in with Apple's code. No idea if there is a simple way
  to report a bug in their libc to them. I've not found any.

36 hours agodrm/linux: Really implement local_irq_disable/enable
François Tigeot [Thu, 23 Jun 2016 07:30:56 +0000 (09:30 +0200)]
drm/linux: Really implement local_irq_disable/enable

Suggested-by: Matt Macy <mmacy@nextbsd.org>
2 days agointr: Force unshareble interrupt setting
Sepherosa Ziehau [Wed, 22 Jun 2016 14:40:32 +0000 (22:40 +0800)]
intr: Force unshareble interrupt setting

2 days agokern: Also detect KVM via the Hypervisor vendor ID signature.
Imre Vadász [Tue, 21 Jun 2016 19:01:25 +0000 (21:01 +0200)]
kern: Also detect KVM via the Hypervisor vendor ID signature.

2 days agoipfw3_nat: kmalloc netmsg from M_LWKTMSG
Bill Yuan [Wed, 22 Jun 2016 19:42:20 +0000 (19:42 +0000)]
ipfw3_nat: kmalloc netmsg from M_LWKTMSG

3 days agopoll.2: Adjust NAME section for ppoll().
Sascha Wildner [Tue, 21 Jun 2016 19:56:07 +0000 (21:56 +0200)]
poll.2: Adjust NAME section for ppoll().

3 days ago<sys/poll.h>: Some namespace cleanup.
Sascha Wildner [Tue, 21 Jun 2016 19:48:08 +0000 (21:48 +0200)]
<sys/poll.h>: Some namespace cleanup.

Include <sys/signal.h> and <sys/time.h> only when necessary.

While here, cleanup whitespace a bit.

3 days agousr.bin/dirname: Accept multiple arguments as basename(1)
zrj [Tue, 21 Jun 2016 17:35:14 +0000 (20:35 +0300)]
usr.bin/dirname: Accept multiple arguments as basename(1)

While there, expand examples section.

3 days agoipfw3: lockless in-kernel NAT
Bill Yuan [Tue, 21 Jun 2016 18:13:10 +0000 (18:13 +0000)]
ipfw3: lockless in-kernel NAT

The libalias is used in kernel space for in-kernel NAT, and its alias_link
entries are stored with LIST. so all the packets which need to be NAT will scan
against the LIST and trying to find the matched alias_link. by seperating the
libalias into context of different CPUs, the lock can be removed. and due to the
nature of NAT, the outgoing and incoming packets are possible to be handled by
different CPUs, to ensure the returning packet can be translated properly, the
newly created alias_link is required to be duplicated and inserted into contexts
of both CPUs.

e.g.
ipfw3 nat 1 config if em0
ipfw3 nat 1 all via em0
ipfw3 nat 1 show state

3 days agohammer2 - stabilization pass
Matthew Dillon [Tue, 21 Jun 2016 07:31:53 +0000 (00:31 -0700)]
hammer2 - stabilization pass

* Fix a shared/exclusive deadlock.  When adding a ref to a shared lock
  that has already been obtained we must make a slightly different call
  than the normal one because the normal one will block on a pending
  exclusive request, causing a deadlock.

* Add a missing BUF_KERNPROC().  Will hopefully fix a lock ownership
  assertion in the kernel that I've been hitting on heavy use.

* Looks like NFS needs to do inode number lookups on softlinks, so
  add inode indexing to the softlink (and the mknod) code instead
  of embedding the softlink in the directory entry.

3 days agohammer2 - Update directory mtime
Matthew Dillon [Tue, 21 Jun 2016 06:05:35 +0000 (23:05 -0700)]
hammer2 - Update directory mtime

* Update directory mtime on nmkdir, nlink, ncreate, nmknod, nsymlink,
  nremove, nrmdir, and nrename.

3 days agohammer2 - Stabilization pass
Matthew Dillon [Tue, 21 Jun 2016 05:25:50 +0000 (22:25 -0700)]
hammer2 - Stabilization pass

* Fix incorrect ip->meta.iparent initializations that were messing up
  NFS.  These fixes are primarily in the hammer2_inode_create() path.
  The 'dip' passed in is not the correct inode to retrieve ip->meta.inum
  from for the new inode's iparent.  Pass a second inode indicating the
  proper parent directory linkage for iparent.

* Remove ip->pip entirely.  Since the actual file/directory inodes are
  no longer heirarchical this field only creates confusion.  The two
  places where we really need it can simply use ip->meta.iparent.

  Also clean-out a considerable amount of code that previously dealt with
  ip->pip linkages and adjustments.

* Do not try to drop data on a 1->0 transition failure, this can race
  increments and cause the data to be improperly dropped.

* Do not try to drop data on lockcnt == 0 unless persist_refs is also 0.
  Fixes several SMP races where chain->data was being lost improperly.

* Cleanup the APIs for recent changes in how inodes work.

* Now passes buildworld test with /usr/src and /usr/obj mounted with NFS
  from a hammer2 volume.

3 days agokernel - Enhance debug.ncvp_debug debugging
Matthew Dillon [Tue, 21 Jun 2016 05:06:53 +0000 (22:06 -0700)]
kernel - Enhance debug.ncvp_debug debugging

* Enhance a debug kprintf for debugging a specific server-side situation
  with NFS.

3 days agomountd - Turn on SO_REUSEADDR
Matthew Dillon [Tue, 21 Jun 2016 05:01:58 +0000 (22:01 -0700)]
mountd - Turn on SO_REUSEADDR

* Turn on SO_REUSEADDR because its kinda silly to not have it on.

* Fixes startup errors if mountd is restarted, or initially fails
  due to /etc/exports issues and is then restarted a little later.

4 days agokernel - Fix typo in ppoll entry in sys/kern/syscalls.master.
Imre Vadász [Mon, 20 Jun 2016 19:30:17 +0000 (21:30 +0200)]
kernel - Fix typo in ppoll entry in sys/kern/syscalls.

4 days agointr: Avoid implicit padding
Sepherosa Ziehau [Mon, 20 Jun 2016 14:23:10 +0000 (22:23 +0800)]
intr: Avoid implicit padding

4 days agoprocfs - Try to workaround issue to fix truss
Matthew Dillon [Sun, 19 Jun 2016 23:56:03 +0000 (16:56 -0700)]
procfs - Try to workaround issue to fix truss

* If PIOCWAIT is called and no process stops are present, silently return
  0 rather then EINVAL.

* Appears to fix the truss issue.

Reported-by: tkusumi
4 days agokernel - Implement PIE (place independent executables)
Matthew Dillon [Sun, 19 Jun 2016 23:31:25 +0000 (16:31 -0700)]
kernel - Implement PIE (place independent executables)

* Implement PIE placement and sysctl.  Currently disabled by default.
  If the sysctl kern.elf64.pie_base_mmap is set to 1, executable code
  will be mapped with a random shift.

* Also support fixed addresses if requested in the ELF header.

Submitted-by: shamaz
Testing-by: shamaz, dillon, with help from marino
4 days agohammer2 - Implement NFS export support
Matthew Dillon [Sun, 19 Jun 2016 23:25:16 +0000 (16:25 -0700)]
hammer2 - Implement NFS export support

* Allow a hammer2 mount to be exported.  Implement required functionality:
  The export structure, fhtovp, vptofh, checkexp, and hammer2_vfs_vget.
  Uses the recent inode indexing changes.

* Also had to write some code to reconstruct the ip->pip linkages using
  iparent.

  Note that if possible I would like to remove the ip->pip stuff now that
  we have iparent, at least for files.  It won't work for hardlinks so...
  but its still in as of this writing.

5 days agohammer2 - Implement hammer2_inode_meta.iparent
Matthew Dillon [Sun, 19 Jun 2016 19:24:32 +0000 (12:24 -0700)]
hammer2 - Implement hammer2_inode_meta.iparent

* Implement the iparent field, which points to the inode number of
  the parent directory.  Remove the comment as this will be used
  by NFS (at least for directory inodes).

5 days agohammer2 - Change XOP feed/collect locking
Matthew Dillon [Sun, 19 Jun 2016 18:59:30 +0000 (11:59 -0700)]
hammer2 - Change XOP feed/collect locking

* Change the way the backend passes chains back to the frontend.  Instead
  of requiring that the chain maintain a shared lock and bumping the lock
  count we use the new data retention feature to pass the chain back
  unlocked.

  This fixes a whole slew of deadlock issues related to multi-node
  synchronization.  Concurrent XOPs could previously obtain and hold
  locks on chains related to different nodes in any order, depending on
  when their related threads were scheduled.  Now that we no longer hold
  a lock in the XOP feed, the potential deadlocks should not be possible.

* Add new hammer2_chain_*() API functions for manipulating the data hold
  count and remove shims that were previously used to deal with the shared
  lock hacks.

* Also fix a chain->flags adjustment that wasn't atomic, fixing a tsleep()
  loop that was not breaking out.

5 days agolibc/_collate_lookup: Fix segfault seen on ISO-8859-5 locales
John Marino [Sun, 19 Jun 2016 07:53:12 +0000 (09:53 +0200)]
libc/_collate_lookup: Fix segfault seen on ISO-8859-5 locales

The fix for the Russian collation issue seemed to have bug in it.
Segfault was discovered by Lauri Tirkkonen of Illumos and confirmed by
Bapt@FreeBSD.org.  Lauri suggested this as a fix, but as of this writing
Bapt hasn't confirmed that this is final solution for FreeBSD.  Due to
personal reasons, I cannot wait for this confirmation longer.  I believe
this fix is better than what is currently in place, even if it is not
the final solution.

5 days agombsnrtowcs/wcsnrtombs: Fix EILSEQ handling
John Marino [Sun, 19 Jun 2016 07:39:34 +0000 (09:39 +0200)]
mbsnrtowcs/wcsnrtombs: Fix EILSEQ handling

Originally reported on FreeBSD (PR 209907) by Roel Standaert, RockinRoel
noticed that DragonFly suffered the same bug.  When the title functions
encounter a character that cannot be converted, they should change the
src pointer to point to the character positioned immediately after the
failed character, but no such change was performed.

YellowRabbit improved on the FreeBSD patch addressing the bug with a
new version that eliminates possible NULL pointer dereferences.

Dragonfly-bug: <https://bugs.dragonflybsd.org/issues/2920>

5 days agokernel - Implement ppoll system call with precise microseconds timeout.
Imre Vadasz [Sat, 12 Dec 2015 20:26:09 +0000 (21:26 +0100)]
kernel - Implement ppoll system call with precise microseconds timeout.

* Implement a maximum timeout of 2000s, because systimer(9) just accepts an
  int timeout in microseconds.

* Add kern.kv_sleep_threshold sysctl variable for tuning the threshold for
  the ppoll sleep duration (in nanoseconds), below which we will
  busy-loop with DELAY instead of using tsleep for waiting.

5 days agohammer2 - Start work on inode indexing - MAJOR CHANGE
Matthew Dillon [Sun, 19 Jun 2016 05:01:00 +0000 (22:01 -0700)]
hammer2 - Start work on inode indexing - MAJOR CHANGE

A major change to how inodes work is required to allow NFS exports to be
supported and also to make mirroring operations optimal.  Both needs are
met by indexing most inodes so they can be looked up by inode number.  I've
tried to avoid having to do this for well over 2 years now but I finally
came to the conclusion that necessary features and efficiencies are
impossible without it.

+ For NFS exports we have to be able to lookup a file by inode number in
  order to be able to translate NFS file handles.

+ Mirroring, Multi-Master, and other Multi-Node operations are extremely
  inefficient when a large file or (even worse) some high-level directory
  is renamed, because the synchronization code cannot be made aware of the
  rename.  The synchronizer winds up making a copy of the file or the
  directory subhierarchy and that can be disaster if it winds up being
  terrabytes.

To solve these problems we treat nearly ALL directory entries as hardlink
targets and place the hardlink target at the root of the PFS.  This puts
nearly all inodes in a readily accessible place indexed by inode number.
This means we can now implement inode number lookups for NFS, and it also
means that the synchronizer does not have to copy anything when a file or
directory is renamed.

* Implement these changes by using an abbreviated version of the hardlink
  target code that we already have.  Get rid of the common-parent-directory
  code (we will use the PFS iroot), and force almost everything to be a
  hardlink.

* device nodes and softlinks are excepted.  These work as they did before,
  created in the directory entry itself and not as a hardlinked inode.
  I might have to make these hardlink targets in the future too but at
  the moment it looks avoidable.

* Unfortunately, this change creates a number of REGRESSIONS:

  (1) There are now two inodes per file instead of one.  The real inode
      indexed in the PFS root, and the hardlink pointer in the directory
      entry.  This eats another 1KB.

  (2) We lose a bunch of sequential layout optimizations (for the moment),
      particularly when stat()ing directory entries.

  (3) Inode creation and deletion ops will unfortunately cause more SMP
      conflicts due to all the inodes being indexed in one place.

6 days agonvme - Remove debugging
Matthew Dillon [Sat, 18 Jun 2016 18:17:24 +0000 (11:17 -0700)]
nvme - Remove debugging

* Remove some debugging output.

6 days agonvme - Fix composite temperature in nvmectl
Matthew Dillon [Sat, 18 Jun 2016 17:27:43 +0000 (10:27 -0700)]
nvme - Fix composite temperature in nvmectl

* Fix composite temperature reporting in nvmectl.  There are two byte
  fields making up a 16-word, not two separate byte fields.  The confusion
  stemmed from the fact that the 16-bit word is not word-aligned (possibly
  the only field in the entire spec that isn't aligned!).

* Add 'errors' directive to dump error logs.

6 days agosleep.9: Make tsleep_interlock(9) example a bit more correct.
Imre Vadász [Sat, 18 Jun 2016 13:38:19 +0000 (15:38 +0200)]
sleep.9: Make tsleep_interlock(9) example a bit more correct.

* After having called tsleep_interlock, we should still pass the flags
  into the tsleep call as well (i.e. using "flags | PINTERLOCKED" for the
  flags parameter, instead of just PINTERLOCKED).

6 days agoSync zoneinfo database with tzdata2016e from ftp://ftp.iana.org/tz/releases
Sascha Wildner [Sat, 18 Jun 2016 13:07:42 +0000 (15:07 +0200)]
Sync zoneinfo database with tzdata2016e from ftp://ftp.iana.org/tz/releases

* Africa/Cairo observes DST in 2016 from July 7 to the end of October.
    Guess October 27 and 24:00 transitions.  (Thanks to Steffen Thorsen.)
    For future years, guess April's last Thursday to October's last
    Thursday except for Ramadan.

* Locations while uninhabited now use '-00', not 'zzz', as a
    placeholder time zone abbreviation.  This is inspired by Internet
    RFC 3339 and is more consistent with numeric time zone
    abbreviations already used elsewhere.  The change affects several
    arctic and antarctic locations, e.g., America/Cambridge_Bay before
    1920 and Antarctica/Troll before 2005.

* Asia/Baku's 1992-09-27 transition from +04 (DST) to +04 (non-DST) was
    at 03:00, not 23:00 the previous day.  (Thanks to Michael Deckers.)

6 days agonvme - Add nvmectl userland utility
Matthew Dillon [Sat, 18 Jun 2016 06:58:49 +0000 (23:58 -0700)]
nvme - Add nvmectl userland utility

* Add nvmectl, a general userland utility that we will use to retrieve
  status and do interesting things to nvme devices.

  Nominally feature the command to allow nvmeX devices to be specified
  at the end, and to apply the command to all nvme devices if none are
  specified.

* Implement 'nvmectl info'.  This command retrieves the SMART info from
  specified controllers and prints it out.

6 days agonvme - Implement ioctl support to retrieve log pages
Matthew Dillon [Sat, 18 Jun 2016 06:57:25 +0000 (23:57 -0700)]
nvme - Implement ioctl support to retrieve log pages

* Implement general ioctl support

* Implement NVMEIOCGETLOG which retrieves a log page.

6 days agonvme - Fail gracefully if chip cannot be enabled
Matthew Dillon [Sat, 18 Jun 2016 02:55:15 +0000 (19:55 -0700)]
nvme - Fail gracefully if chip cannot be enabled

* Fail gracefully rather than lockup if the chip refuses to enable.
  The admin thread is not running yet, so don't wait forever for
  it to 'stop'.

6 days agonvme - Work w/qemu
Matthew Dillon [Fri, 17 Jun 2016 23:59:28 +0000 (16:59 -0700)]
nvme - Work w/qemu

* Work with qemu nvme emulation.  Note that qemu nvme emulation is really
  slow, much much slower than its scsi (aka ahci) emulation.
  A pci_enable_busmaster() was needed.

* Remove manual PCI config to [re]-enable BIOS PCI interrupt.  This was
  pulled from another driver and probably is not needed.

* Fix kldunload()ing when bar4/5 is present.  The wrong resource pointer
  was being specified.

7 days agopathchk(1): Sync with FreeBSD.
Sascha Wildner [Fri, 17 Jun 2016 15:54:31 +0000 (17:54 +0200)]
pathchk(1): Sync with FreeBSD.

Mainly for -P (POSIX wants -P).

Plus a couple of small bug fixes.

8 days agokernel/virtio: Some small stylistic cleanup.
Sascha Wildner [Wed, 15 Jun 2016 17:01:29 +0000 (19:01 +0200)]
kernel/virtio: Some small stylistic cleanup.

8 days agops(1): Add -A option, as specified by POSIX.
Sascha Wildner [Thu, 16 Jun 2016 12:12:46 +0000 (14:12 +0200)]
ps(1): Add -A option, as specified by POSIX.

Still missing: -d, -G and -n.

8 days agohyperv/vmbus: Factor out vmbus_msg_reset()
Sepherosa Ziehau [Thu, 16 Jun 2016 06:16:04 +0000 (14:16 +0800)]
hyperv/vmbus: Factor out vmbus_msg_reset()

8 days agohyperv/vmbus: Make sure that interrupt cputimer can be enabled.
Sepherosa Ziehau [Thu, 16 Jun 2016 05:49:10 +0000 (13:49 +0800)]
hyperv/vmbus: Make sure that interrupt cputimer can be enabled.

Obtained-from: FreeBSD

8 days agoacpica: Interrupt resource lookup failure is fine. Add comment about it.
Sepherosa Ziehau [Wed, 15 Jun 2016 11:19:47 +0000 (19:19 +0800)]
acpica: Interrupt resource lookup failure is fine.  Add comment about it.

8 days agomptable: Reduce log verbosity
Sepherosa Ziehau [Wed, 15 Jun 2016 11:06:09 +0000 (19:06 +0800)]
mptable: Reduce log verbosity

8 days agohyperv/vmbus: Complete vmbus initialization; interrupt cputimer is enabled
Sepherosa Ziehau [Mon, 13 Jun 2016 01:58:01 +0000 (09:58 +0800)]
hyperv/vmbus: Complete vmbus initialization; interrupt cputimer is enabled

Most of the bits are obtained from FreeBSD.  However, The interrupt bits
are reworked:
- Since the vmbus message/event interrupt works in the same fashion as
  MSI-X, we just allocate MSI-X for them, instead of allocating IDT
  vector, rolling vmbus own interrupt vector and turning the interrupt
  handling inside-out.  The standard and generic bus APIs are used to
  allocate and setup per-cpu vmbus interrupt.
- Interrupt cputimer reuses the current per-cpu interrupt timer code.
- AutoEOI is not used, since we reuse the per-cpu interrupt timer IDT
  vector and MSI IDT vector.  After a brief discussion w/ Dexuan Cui,
  I concluded that AutoEOI probably does not provide noticible performance
  improvement but will introduce extra code complexity.  We leave it off
  for now.

Obtained-from: FreeBSD (mostly)

8 days agocputimer: Add per-cpu handler and private data for interrupt cputimer.
Sepherosa Ziehau [Tue, 14 Jun 2016 09:00:01 +0000 (17:00 +0800)]
cputimer: Add per-cpu handler and private data for interrupt cputimer.

9 days agoUpdate the pciconf(8) database.
Sascha Wildner [Wed, 15 Jun 2016 09:47:42 +0000 (11:47 +0200)]
Update the pciconf(8) database.

June 7, 2016 snapshot from http://pciids.sourceforge.net/

9 days agovmbus.4: Fix stupid typo (and installworld).
Sascha Wildner [Wed, 15 Jun 2016 09:45:34 +0000 (11:45 +0200)]
vmbus.4: Fix stupid typo (and installworld).

10 days agoAdd a vmbus(4) manual page (based on FreeBSD's).
Sascha Wildner [Tue, 14 Jun 2016 18:13:42 +0000 (20:13 +0200)]
Add a vmbus(4) manual page (based on FreeBSD's).

10 days agokernel: Add vmbus module to the build.
Sascha Wildner [Tue, 14 Jun 2016 11:51:52 +0000 (13:51 +0200)]
kernel: Add vmbus module to the build.

11 days agoif_iwm - Fix channel list iteration in iwm_mvm_config_umac_scan().
Imre Vadász [Sun, 12 Jun 2016 13:02:57 +0000 (15:02 +0200)]
if_iwm - Fix channel list iteration in iwm_mvm_config_umac_scan().

11 days agodocs - Update tuning.7
Matthew Dillon [Mon, 13 Jun 2016 07:32:32 +0000 (00:32 -0700)]
docs - Update tuning.7

* Do a pass on tuning.7, getting rid of old cruft and putting in newer
  information.

11 days agohyperv: Initial import. It only contains non-intr cputimer.
Sepherosa Ziehau [Mon, 13 Jun 2016 02:22:13 +0000 (10:22 +0800)]
hyperv: Initial import.  It only contains non-intr cputimer.

Obtained-from: FreeBSD

11 days agox86_64/timer: Xtimer is generic enough for per-cpu timer.
Sepherosa Ziehau [Sun, 12 Jun 2016 23:53:38 +0000 (07:53 +0800)]
x86_64/timer: Xtimer is generic enough for per-cpu timer.

11 days agotsc: Log the final TSC frequency
Sepherosa Ziehau [Sun, 12 Jun 2016 17:29:07 +0000 (01:29 +0800)]
tsc: Log the final TSC frequency

11 days agokern: Update virtual machine detection a bit
Sepherosa Ziehau [Sun, 12 Jun 2016 13:22:07 +0000 (21:22 +0800)]
kern: Update virtual machine detection a bit

Obtained-from: FreeBSD (partial)

12 days agoMakefile.usr - Fix typo
Antonio Huete Jimenez [Sat, 11 Jun 2016 22:11:23 +0000 (15:11 -0700)]
Makefile.usr - Fix typo

12 days agohammer2 - Use B_IOISSUED
Matthew Dillon [Sat, 11 Jun 2016 22:12:51 +0000 (15:12 -0700)]
hammer2 - Use B_IOISSUED

* Get rid of the hokey B_IODEBUG use case H2 had before.

* Integrate B_IOISSUED (which used to be B_IODEBUG) into hammer2 properly.

* Remove the dio crc_good_mask hack.  Now that hammer2_chain is more
  persistent we just use the flag in the cached hammer2_chain structure,
  clearing it if we determine that the kernel had to re-issue read I/O
  (at least in the full-block case).

* Has approximately the same performance as the dio crc_good_mask hack had
  and is a bit safer w/regards to chain aliasing to the same physical block.

12 days agokernel - B_IODEBUG -> B_IOISSUED
Matthew Dillon [Sat, 11 Jun 2016 22:10:22 +0000 (15:10 -0700)]
kernel - B_IODEBUG -> B_IOISSUED

* Rename this flag.  It still operates the same way.

  This flag is set by the kernel upon an actual I/O read into a buffer
  cache buffer and may be cleared by the filesystem code to allow the
  filesystem code to detect when re-reads of the block cause another I/O
  or not.  This allows HAMMER1 and HAMMER2 to avoid calculating the check
  code over and over again if it has already been calculated.

12 days agoMakefile.usr - A bit of cleanup
Antonio Huete Jimenez [Sat, 11 Jun 2016 21:47:47 +0000 (14:47 -0700)]
Makefile.usr - A bit of cleanup

- Use targets instead of .if in a few checks.
- Exit on error for better scripting

13 days agoif_iwm - Add and use iwm_phy_db_free(), to plug phy_db memory leak.
Imre Vadász [Sat, 11 Jun 2016 15:54:44 +0000 (17:54 +0200)]
if_iwm - Add and use iwm_phy_db_free(), to plug phy_db memory leak.

* Memory leakage in M_DEVBUF is now at ca. 2KB for each iwm(4) module
  load/unload cycle.

Taken-From: Linux iwlwifi

13 days agoif_iwm - GC unused struct iwm_rx_buf. Two small nitpicks.
Imre Vadász [Sat, 11 Jun 2016 13:21:06 +0000 (15:21 +0200)]
if_iwm - GC unused struct iwm_rx_buf. Two small nitpicks.

13 days agoif_iwm - Use mbuf for large firmware commands, like OpenBSD does.
Imre Vadász [Sat, 11 Jun 2016 11:46:33 +0000 (13:46 +0200)]
if_iwm - Use mbuf for large firmware commands, like OpenBSD does.

* We also need to consider the size of large firmware commands in
  iwm_alloc_tx_ring(), in the dma tag creation, when
  qid == IWM_MVM_CMD_QUEUE.

Inspired-by: OpenBSD and existing code in iwm_rx_addbuf()
13 days agokqueue.2: Improve markup.
Sascha Wildner [Sat, 11 Jun 2016 12:39:57 +0000 (14:39 +0200)]
kqueue.2: Improve markup.

13 days agohammer2 - Fix infinite flush recursion, reduce bulkfree console spam
Matthew Dillon [Sat, 11 Jun 2016 07:53:32 +0000 (00:53 -0700)]
hammer2 - Fix infinite flush recursion, reduce bulkfree console spam

* Fix infinitee flush recursions.  Chains marked HAMMER2_CHAIN_DESTROY
  must be recursed on so they can be deleted by the chain lastdrop code.
  Also add a missing downward propagation.

* Reduce console spam in the bulkfree code reporting the number of inodes
  scanned.

13 days agotest - prt() double va_arg use
Matthew Dillon [Sat, 11 Jun 2016 02:50:13 +0000 (19:50 -0700)]
test - prt() double va_arg use

* ptr() needs to reset its va in prt() on the second use.

13 days agohammer2 - Fix *errorp, instrument strategy errors
Matthew Dillon [Sat, 11 Jun 2016 02:46:08 +0000 (19:46 -0700)]
hammer2 - Fix *errorp, instrument strategy errors

* Instrument strategy call errors

* Instrument a number of errors with console messages

* Pre-zero *errorp in hammer2_write_file_core()

* Set trivial in hammer2_write_file() if lbase at or beyond the file EOF.

* use uiomovebp() to avoid mmap()/read() and mmap()/write() deadlocks.

13 days agokernel - Instrument vnode pager error
Matthew Dillon [Sat, 11 Jun 2016 02:41:21 +0000 (19:41 -0700)]
kernel - Instrument vnode pager error

* Provide more information when reporting vnode pager errors

* Report nvextendbuf() error.  Fix type-o's

13 days agohammer2 - Fix upgrade deadlock
Matthew Dillon [Fri, 10 Jun 2016 18:25:58 +0000 (11:25 -0700)]
hammer2 - Fix upgrade deadlock

* Fix a deadlock which occurs when hammer2_chain_unlock() tries to
  upgrade the 'last' shared lock to exclusive.  This can deadlock if
  another thread obtains the chain shared before we manage to do the
  upgrade.

  Just use a 'try' here.  If it fails it means someone else got a lock
  (of any kind) and we don't have to worry about dropping the chain data.

* Replace hammer2_mtx_upgrade() with hammer2_mtx_upgrade_try().  Remove
  support for a blocking 'upgrade'.  It is no longer needed and it is
  too dangerous to have anyway.

13 days agoif_iwm - Use DragonFly specific convenience functions for bus_dma stuff.
Imre Vadász [Fri, 10 Jun 2016 20:34:17 +0000 (22:34 +0200)]
if_iwm - Use DragonFly specific convenience functions for bus_dma stuff.

* Use bus_dmamap_load_mbuf_defrag() in iwm_tx().

* Use bus_dmamem_coherent() in iwm_dma_contig_alloc().

* Use bus_dmamap_load_mbuf_segment() in iwm_rx_addbuf().

* This means iwm_dma_map_addr() is no longer needed on DragonFly.

* Try to keep around the corresponding/old code for FreeBSD for easier
  syncing of changes to/from FreeBSD.

13 days agoif_iwm - Compare paylen to datasz instead of sizeof(cmd->data).
Imre Vadász [Fri, 10 Jun 2016 20:26:21 +0000 (22:26 +0200)]
if_iwm - Compare paylen to datasz instead of sizeof(cmd->data).

2 weeks agotest - Cleanup some test/debug code
Matthew Dillon [Fri, 10 Jun 2016 18:14:31 +0000 (11:14 -0700)]
test - Cleanup some test/debug code

* Cleanup some test/debug code

2 weeks agohammer2 - Add truncation lock, change dio persistence
Matthew Dillon [Fri, 10 Jun 2016 18:09:29 +0000 (11:09 -0700)]
hammer2 - Add truncation lock, change dio persistence

* Add a truncation lock to interlock between write()'s and ftruncate()
  calls.  This prevents a junk buffer from surviving a ftruncate() if
  it happens to get written concurrently with the ftruncate().

* Change dio persistence.  Do not automatically persist dio's while refs
  are held, this creates problems for ref'd chains held in the
  hammer2_inode_t structure and prevents vfsync() from working properly.

  Add a persist_refs field which we will use later in the XIO code to
  persist a chain's DIO across an unlock/relock sequence, and possibly
  in other places too.

2 weeks agokernel - Try to improve 'Warning: vfsync skipped dirty bufs'... messages
Matthew Dillon [Fri, 10 Jun 2016 18:03:18 +0000 (11:03 -0700)]
kernel - Try to improve 'Warning: vfsync skipped dirty bufs'... messages

* Use BUF_TIMELOCK instead of locking non-blocking if the vfsync()
  encounters a buffer that it cannot lock.

* This should theoretically reduce (hopefully prevent) instances of the
  'vfsync skipped N dirty bufs' warnings on the console which occur under
  heavy filesystem loads.

* Also remove 'Warning buffer ... was recycled' kprintfs.  This debugging
  was originally added to determine if a particular retry path was getting
  hit (it does), and is no longer needed.

2 weeks agosbin/newfs_hammer2: Change error messages to "hammer2"
Tomohiro Kusumi [Fri, 10 Jun 2016 06:52:07 +0000 (15:52 +0900)]
sbin/newfs_hammer2: Change error messages to "hammer2"

2 weeks agosbin/newfs_hammer2: Fix ascii-art of initial image
Tomohiro Kusumi [Fri, 10 Jun 2016 06:26:28 +0000 (15:26 +0900)]
sbin/newfs_hammer2: Fix ascii-art of initial image

2 weeks agosbin/hammer2: Add #include guard
Tomohiro Kusumi [Fri, 10 Jun 2016 05:14:33 +0000 (14:14 +0900)]
sbin/hammer2: Add #include guard

2 weeks agosbin/hammer2: Use volatile sig_atomic_t
Tomohiro Kusumi [Fri, 10 Jun 2016 02:58:05 +0000 (11:58 +0900)]
sbin/hammer2: Use volatile sig_atomic_t

2 weeks agosys/vfs/hammer2: Change u_int{8,16,32,64}_t to uint{8,16,32,64}_t
Tomohiro Kusumi [Fri, 10 Jun 2016 02:41:46 +0000 (11:41 +0900)]
sys/vfs/hammer2: Change u_int{8,16,32,64}_t to uint{8,16,32,64}_t

hammer2 mostly uses uint{8,16,32,64}_t, so fix u_int{8,16,32,64}_t.

2 weeks agonvme - Add kernel dump support
Matthew Dillon [Fri, 10 Jun 2016 05:23:27 +0000 (22:23 -0700)]
nvme - Add kernel dump support

* Add kernel dump support to the nvme driver.

* Issue a FLUSH and chip shutdown sequence after the dump completes.

2 weeks agohammer2 - Cache chain->data and chain->dio until last release.
Matthew Dillon [Fri, 10 Jun 2016 04:24:26 +0000 (21:24 -0700)]
hammer2 - Cache chain->data and chain->dio until last release.

* Instead of releasing the chain data and dio on unlock, leave it
  cached and intact until the last release.  This will allow an upcoming
  change to pass unlocked chain structures betweten threads to work
  efficiently.

* Fix a race condition in the chain->parent linkage test that could cause
  chain->data to be cleared improperly.

2 weeks agoif_iwm - Fix iwm_dma_contig_free(). dma->map is always NULL here.
Imre Vadász [Fri, 10 Jun 2016 00:04:31 +0000 (02:04 +0200)]
if_iwm - Fix iwm_dma_contig_free(). dma->map is always NULL here.

* When bus_dmamem_alloc is used, the bus_dmamap_t is set to NULL, so we
  were never actually freeing any dma memory allocations done via
  iwm_dma_contig_alloc(). So we should check dma->vaddr instead of
  dma->map here.

* This reduces dma memory leakage (as displayed by
  "sysctl vm.dma_free_pages") to 11 pages for each if_iwm module
  load/unload cycle.

2 weeks agohammer2 - Rename hammer2_thread.c to hammer2_admin.c
Matthew Dillon [Fri, 10 Jun 2016 00:25:19 +0000 (17:25 -0700)]
hammer2 - Rename hammer2_thread.c to hammer2_admin.c

* hammer2_thread.c does a lot more than kernel threading support for H2.
  It's does all the XOP administration as well, and that is really more
  its primary function.

2 weeks agohammer2 - Allow chains to be cached
Matthew Dillon [Thu, 9 Jun 2016 23:49:09 +0000 (16:49 -0700)]
hammer2 - Allow chains to be cached

* Cache chain structures on the refs 1->0 transition.  We still drop the
  underlying dio and backing data (future optimizations are possible here
  within the DIO subsystem but we have to be careful when it comes to
  leaving kernel buffer cache buffers locked).

  This allows hammer2 to retain a lot of the infrastructure that gets reused
  across multiple system calls without having to constantly reconstitute it,
  improving performance.

* Fix a few recent chain->flags modifications that weren't atomic.  They
  have to be atomic.

2 weeks agoif_iwm - Free rx ring on detach. Free nvm_sections data after parsing.
Imre Vadász [Thu, 9 Jun 2016 23:25:50 +0000 (01:25 +0200)]
if_iwm - Free rx ring on detach. Free nvm_sections data after parsing.

* Call iwm_free_rx_ring() when detaching.

* Free nvm_sections[i].data allocations after parsing the nvm data.

2 weeks agotest - Pull in Mark Adler's hw iscsi crc32 bundle
Matthew Dillon [Thu, 9 Jun 2016 20:23:53 +0000 (13:23 -0700)]
test - Pull in Mark Adler's hw iscsi crc32 bundle

* Pull his sample code into /usr/src/test/debug so we don't lose track of
  it.

* Implements iscsi crc32 in hardware, uncached streaming memory bandwidth
  is around 13 GBytes/sec.

2 weeks agokernel - Scan more pages in vm_pageout to fix OOM killer
Matthew Dillon [Thu, 9 Jun 2016 18:39:24 +0000 (11:39 -0700)]
kernel - Scan more pages in vm_pageout to fix OOM killer

* The pageout daemon was not being aggressive enough when working under
  the heavy I/O read loads now made possible by nvme.  Certain loads could
  improperly trigger the process killer.

* Instead of trying to calculate the exact number of pages per pageout
  queue to try to free up, which has had numerous edge conditions cause
  problems over the years, change it so we are a lot more generous.  The
  page queues are scanned with an iterator so pulling more pages off each
  one should work just fine.

* Fixes issue with combined tar cf /dev/null /mnt and find /mnt | wc -l
  on a nvme mount with 2.4M files on it + one large 16GB file.

2 weeks agokernel: Save some indent here and there and some small cleanup.
Sascha Wildner [Thu, 9 Jun 2016 18:12:00 +0000 (20:12 +0200)]
kernel: Save some indent here and there and some small cleanup.

All these are related to an inspection of the places where we do:

if (...) {
   ...
   goto blah;
} else {
   ...
}

in which case the 'else' is not needed.

I only changed places where I thought that it improves readability or
is just as readable without the 'else'.

2 weeks agokernel/modnext: Improve the flow a bit regarding setting 'error'.
Sascha Wildner [Thu, 9 Jun 2016 17:30:12 +0000 (19:30 +0200)]
kernel/modnext: Improve the flow a bit regarding setting 'error'.

2 weeks agoRemove am-utils, the Berkeley automounter suite (amd, amq, etc.)
Sascha Wildner [Thu, 9 Jun 2016 16:56:49 +0000 (18:56 +0200)]
Remove am-utils, the Berkeley automounter suite (amd, amq, etc.)

We recently got FreeBSD's autofs(5) which replaces it. FreeBSD
added notes to their am-utils and related manual pages saying
that it is obsolete and advises to use autofs(5) instead.

DragonFly's port of it is almost surely broken and the last time
I heard from someone trying to get it to work was in 2013 and
back then it just hung (in select(), according to my notes).

So I don't think removing instead of trying to fix it will do
any harm.

2 weeks agodrm/i915: Fix hangs on some broadwell machines
François Tigeot [Thu, 9 Jun 2016 08:23:27 +0000 (10:23 +0200)]
drm/i915: Fix hangs on some broadwell machines

This driver failed to correctly initialize on some Broadwell systems,
symptoms being a black screen and an always spinning cpu fan.

2 weeks agoworld - Fix sysctlbyname() errno handling cases
Matthew Dillon [Thu, 9 Jun 2016 06:04:18 +0000 (23:04 -0700)]
world - Fix sysctlbyname() errno handling cases

* A number of routines inherited some bad code from each other,
  The return value from sysctlbyname() was not being tested prior
  to checking errno.  Reformulate.

Reported-by: Stephen Welker stephen.welker@nemostar.com.au
2 weeks agohammer2 - multi-thread read-ahead XOPs
Matthew Dillon [Thu, 9 Jun 2016 05:24:51 +0000 (22:24 -0700)]
hammer2 - multi-thread read-ahead XOPs

* Distribute asynchronous logical buffer read-ahead XOPs to multiple
  worker threads.  XOPs related to a particular inode are usually sent
  to just one worker thread to reduce collision retries.

  This works around the high messaging overhead(s) associated with the
  current XOP architecture by spreading the pain around.  And even though
  the default check code is now xxhash, distributing the checks also helps
  a great deal.  The H2 chain topology actually parallelizes quite well for
  read operations.

  Streaming reads through the filesystem now run at over 1 GByte/sec (they
  capped out at ~340MB/sec before).  The effect on things like 'tar'
  are not quite as pronounced but small-file scan/read performance will
  typically improve by a tiny bit too.

* This change is probably more SSD-friendly than HDD-friendly for streaming
  reads due to out-of-order queueing of the I/O requests.  I ran a quick
  read test on a WD black and it appeared to perform acceptably so for
  now I'm going to run with it.  Adjusting read-ahead scale via
  vfs.hammer2.cluster_enable can be used to find a good value (for now).

* Remove the 'get race' kprintfs.  This case now occurs very often due
  to distributed read-aheads.

* chain->flags must use atomic ops, fix some cases I muffed up in recent
  commits.

2 weeks agohammer2 - Revamp worker thread signaling
Matthew Dillon [Thu, 9 Jun 2016 05:10:49 +0000 (22:10 -0700)]
hammer2 - Revamp worker thread signaling

* Revamp how worker thread signaling works.  Get rid of a number of race
  conditions and use atomic ops.  We no longer need thr->lk.

* Make hammer2_cluster_enable's scaling factor work with cluster_write()
  as well as cluster_read().

2 weeks agohammer2 - Add xxhash to H2 and throw in debug stuff for performance testing.
Matthew Dillon [Wed, 8 Jun 2016 23:06:51 +0000 (16:06 -0700)]
hammer2 - Add xxhash to H2 and throw in debug stuff for performance testing.

* Add the xxhash.  This is a high-speed non-cryptographic hash code
  algorithm.  Sam pointed me at the site, the code is available on
  github and is BSD licensed:

      git://github.com/Cyan4973/xxHash.git

  This hash has good distribution and is very fast.

* Change HAMMER2 to default to using xxhash64 instead of iscsi_crc32().
  xxhash can process data at several GBytes/sec where as even the
  multi-table iscsi_crc32() can only do around 500 MBytes/sec, which
  is too slow for today's modern storage subsystems (NVME can nominally
  do 1.5-2.5 GBytes/sec, and high-end cards can do 5GBytes/sec).

* There are four major paths that eat tons of CPU in H2:

  - The XIO path does a ton of allocation/deallocation and synchronous
    messaging.  This has not yet been fixed.

  - The check code (when it was iscsi_crc32()) slowed everything down.
    This is fixed, the default check code is now xxhash64.

  - The check code was being called over and over again for the same cached
    buffer due to the hammer2_chain_t structure being thrown away.

    Currently a hack involving a mask stored in the underlying DIO is being
    used to indicate that the check code was previously valid.  This is
    strictly temporary.  The actual mask will have to be stored in the
    device buffer cache buffer and a second one in the chain structure.

    The chain structure must be made persistent as well (not yet done).

  - The DEDUP code was also calling iscsi_crc32() redundantly (at least for
    reads).

    The read path has been fixed.  The write path is doable but requires more
    coding (not yet fixed).

  - The logical file cluster_read() in the kernel was not doing any read-ahead
    due to H2 not implementing BMAP, creating long synchronous latencies.

    The kernel code for cluster_read() and cluster_readcb() has been fixed
    to do read-ahead whether a logical BMAP is implemented or not.  H2 will
    now pipeline reads.

Suggested-by: Samuel J. Greear <sjg@thesjg.com> (xxhash)
2 weeks agohammer - Make vfs.hammer.cluster_enable an integer
Matthew Dillon [Wed, 8 Jun 2016 23:02:34 +0000 (16:02 -0700)]
hammer - Make vfs.hammer.cluster_enable an integer

* Instead of being a boolean, make it an integer and use it to control
  how much read-ahead is requested (in 64KB blocks).

* Change cluster_enable from 1 to 2 to roughly match the cluster_read()
  changes committed to the kernel.

* Make hammer_io_indirect_read() use cluster_readcb() instead of breadcb()
  so we get read-ahead on this path.

2 weeks agokernel - Fix some clustering issues
Matthew Dillon [Wed, 8 Jun 2016 22:53:31 +0000 (15:53 -0700)]
kernel - Fix some clustering issues

* Change B_RAM functionality.  We were previously setting B_RAM
  on the last async buffer and doing some cruft to probe ahead.

  Instead, set B_RAM in the middle and use a simple heuristic to
  estimate where to pick-up the read-ahead again.

* Clean-up the read-ahead.  When the caller of cluster_read() asks for
  read-ahead, we do the read-ahead whether or not BMAP says it is
  contiguous.  All a failed BMAP does now is prevent cluster_rbuild()
  from getting called (that is, it doesn't try to gang multiple buffers
  together).

  When thinking about this, the logical buffer cache sequential heuristic
  is telling us that userland is going to read the data, so why stop and
  then have to stall on an I/O read later when userland actually reads
  the data?

* This will improve pipelining for both hammer1 and hammer2.

2 weeks agokqueue.2: Add some info about EVFILT_FS.
Sascha Wildner [Wed, 8 Jun 2016 07:58:03 +0000 (09:58 +0200)]
kqueue.2: Add some info about EVFILT_FS.

2 weeks agonvme - Add interrupt coalescing support
Matthew Dillon [Wed, 8 Jun 2016 05:30:00 +0000 (22:30 -0700)]
nvme - Add interrupt coalescing support

* Add interrupt coalescing support.  However, disable it in the code for
  now by setting its parameters to 0.  I tried minimal parameters (time
  set to 1 which is 100uS and aggregation threshold set to 4) and it
  completely destroyed performance in all my tests on the Intel 750.

  Even in tests where the interrupt rate was less than 10,000/sec, the
  intel controller is clearly implementing a broken algorithm and is
  actually enforcing that 100uS of latency even if the interrupt rate
  has not exceeded the rate.  So even relatively large transfers had
  horrible performance.

  So for now the code is in, but its turned off.

2 weeks agosys/vfs/hammer: Remove sys/vfs/hammer/hammer_freemap.c
Tomohiro Kusumi [Wed, 8 Jun 2016 03:06:40 +0000 (12:06 +0900)]
sys/vfs/hammer: Remove sys/vfs/hammer/hammer_freemap.c

This file does nothing and hasn't done anything since 2008.

> This space reserved for our low-level storage localization manager XXX

The current blockmap code has nothing to do with localization
(which is high-level idea than blockmap), and this probably
won't be implemented in the future as well.