Open MPI v6.1.x series
======================

This file contains all the NEWS updates for the Open MPI v6.1.x
series, in reverse chronological order.

Open MPI version v6.1.0
--------------------------
:Date: ...fill me in...

- Fixed wrong answers from one-sided (RMA) operations on a window
  allocated with ``MPI_Win_allocate`` when the target is a process on the
  same node but the operation is carried out by the underlying transport
  rather than with CPU atomics.  In that case ``osc/rdma`` described the
  target's memory with an address taken from the calling process's own
  mapping of the shared segment, while pairing it with the memory
  registration of a different process, so the transport could read or
  write the wrong location.  ``MPI_Win_shared_query`` on such a window
  continues to report an address that is valid in the calling process.

- One-sided (RMA) windows on networks without hardware atomics --
  ``btl/tcp``, for example -- are dramatically faster when more than one
  MPI process shares a node.  The ``osc/rdma`` component now applies its
  shared state optimization whenever the underlying transport guarantees
  that CPU atomics and transport atomics are atomic with respect to each
  other, which includes the emulated atomics used on such networks.
  Previously the optimization was disabled for these transports, so
  every window-state atomic issued by a process was routed to another
  process on the same node and executed as a network round trip.

- Nonblocking file I/O no longer loses data when the operating system's
  asynchronous I/O queue fills, which on macOS it readily does: the
  ``posix`` ``fbtl`` component sized its batch of concurrent ``aio_write``
  calls from ``sysconf(_SC_AIO_MAX)``, which there reports the
  machine-wide ``kern.aiomax`` (90 by default) rather than the
  ``kern.aioprocmax`` a single process is held to (16).  The component
  now bounds the batch by the per-process limit, defers requests the
  queue will not accept instead of discarding them, and reaps the
  operations it has posted before releasing their control blocks -- an
  unreaped operation used to cost the process a queue slot permanently,
  so one refusal disabled nonblocking file I/O for the rest of its life.
  The new ``fbtl_posix_max_aio_reqs`` MCA parameter overrides the limit.
  A nonblocking operation the ``fbtl`` cannot post is now reported as
  ``MPI_ERR_IO``; previously ``MPI_File_iwrite_all`` and ``MPI_Wait``
  both returned ``MPI_SUCCESS`` for a write that never reached the file.

- Reporting an error for a failed nonblocking file operation no longer
  crashes the process.  ``MPI_Wait`` and ``MPI_Test`` reach a file's
  error handler through the request, and a nonblocking file request did
  not record which file it came from, so invoking the error handler
  dereferenced a null pointer.

- ``MPI_Info_set`` now accepts a zero-length (empty) value string.  It
  previously raised ``MPI_ERR_INFO_VALUE`` for an empty value, but
  MPI-5.0 chapter 10 only limits the *maximum* length of an info
  value, and gives the empty string a defined meaning for the
  ``mpi_memory_alloc_kinds`` info key.  Empty *keys* remain invalid.

- Partitioned communication fixes:

  - ``MPI_Parrived`` now returns ``flag = true`` for a null request
    (``MPI_REQUEST_NULL``) and for an inactive request, as required by
    MPI-5.0 section 4.2.2.  It previously raised ``MPI_ERR_REQUEST`` for
    a null request and returned ``flag = false`` for a partitioned
    receive request that had never been started.

  - ``MPI_Psend_init`` and ``MPI_Precv_init`` now accept
    ``MPI_PROC_NULL`` as the peer rank, per MPI-5.0 section 3.10.  Such
    a request completes as soon as it is started, ``MPI_Pready`` on it
    has no effect, and ``MPI_Parrived`` reports every partition as
    arrived.  Previously, ``MPI_PROC_NULL`` was passed down as if it
    were a real peer rank, reading outside the communicator's process
    array.

  - Freeing a partitioned communication request that was never started
    no longer leaves its internal setup receive posted.  Such a stale
    receive could consume the setup message of the next partitioned
    operation using the same communicator, peer, and tag, which then
    never completed.

- Implemented ``MPI_Get_hw_resource_info()`` using hwloc. The returned
  info object now reports whether the calling process is restricted to
  individual NUMA nodes, packages, caches, cores, and processing units.
  The reported ``hwloc://`` resource keys can also be used with
  ``MPI_Comm_split_type()`` for hardware- and resource-guided communicator
  creation. Thanks to Musawer Ahmad Saqif for the contribution.

- Renamed the ``--enable-weak-symbols`` configure option to
  ``--enable-weak-aliases``, which more accurately reflects the linker
  feature (weak symbol *aliases*) that Open MPI actually tests for and
  uses.  ``--enable-weak-symbols`` is retained as a deprecated synonym.

- The documentation now publishes machine-readable, LLM-friendly
  artifacts for the public MPI APIs alongside the human-facing HTML and
  man pages: a JSONL API catalog, aggregate and per-interface Markdown
  corpora, per-symbol Markdown pages, curated examples, an interface
  guide, an ``ompi_info`` runtime-introspection guide (how to query an
  installed Open MPI for its version, configuration, components, and
  run-time MCA parameters), and a manifest, all indexed from
  ``llms.txt``. See the "LLM-friendly documentation artifacts" page in
  the developer documentation.

- Added support for the MPI-5.0 standard ABI (Application Binary Interface)
  as defined in Chapter 20 of the MPI-5.0 specification. This includes the
  creation of a new ``libmpi_abi.so`` library and the ``mpicc_abi`` wrapper
  compiler for building C applications against the MPI-5 ABI. Note that
  Fortran ABI support is not yet included.
