Hello community,
here is the log from the commit of package rdma-core for openSUSE:Factory checked in at 2019-11-28 10:12:44
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/rdma-core (Old)
and /work/SRC/openSUSE:Factory/.rdma-core.new.26869 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "rdma-core"
Thu Nov 28 10:12:44 2019 rev:35 rq:750978 version:26.1
Changes:
--------
--- /work/SRC/openSUSE:Factory/rdma-core/rdma-core.changes 2019-11-15 22:31:56.220082268 +0100
+++ /work/SRC/openSUSE:Factory/.rdma-core.new.26869/rdma-core.changes 2019-11-28 10:13:19.571636683 +0100
@@ -1,0 +2,7 @@
+Mon Nov 25 15:59:01 UTC 2019 - Nicolas Morey-Chaisemartin
+
+- Update to rdma-core v26.1 (jsc#SLE-8388, jsc#SLE-8394, jsc#SLE-8463, jsc#SLE-8399,
+ jsc#SLE-8254, jsc#SLE-9840, jsc#SLE-9763, jsc#SLE-9925, jsc#SLE-9846, jsc#SLE-9913,
+ jsc#SLE-9729, jsc#SLE-8666)
+
+-------------------------------------------------------------------
Old:
----
rdma-core-25.1.0.1841d48eec9d.tar.gz
New:
----
rdma-core-26.1.0.9f820de9ca7d.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ rdma-core.spec ++++++
--- /var/tmp/diff_new_pack.RaBYpF/_old 2019-11-28 10:13:20.039636688 +0100
+++ /var/tmp/diff_new_pack.RaBYpF/_new 2019-11-28 10:13:20.043636688 +0100
@@ -1,7 +1,7 @@
#
# spec file for package rdma-core
#
-# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany.
+# Copyright (c) 2019 SUSE LLC
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@@ -21,9 +21,9 @@
%define with_static 0
%define with_pyverbs 1
-%define git_ver .0.1841d48eec9d
+%define git_ver .0.9f820de9ca7d
Name: rdma-core
-Version: 25.1
+Version: 26.1
Release: 0
Summary: RDMA core userspace libraries and daemons
License: GPL-2.0-only OR BSD-2-Clause
@@ -53,7 +53,7 @@
# providers/ipathverbs/ Dual licensed using a BSD license with an extra patent clause
# providers/rxe/ Incorporates code from ipathverbs and contains the patent clause
# providers/hfi1verbs Uses the 3 Clause BSD license
-Url: https://github.com/linux-rdma/rdma-core
+URL: https://github.com/linux-rdma/rdma-core
Source: rdma-core-%{version}%{git_ver}.tar.gz
Source1: baselibs.conf
Source2: post_download.sh
++++++ _service ++++++
--- /var/tmp/diff_new_pack.RaBYpF/_old 2019-11-28 10:13:20.063636689 +0100
+++ /var/tmp/diff_new_pack.RaBYpF/_new 2019-11-28 10:13:20.063636689 +0100
@@ -8,7 +8,7 @@
<param name="versionformat">@PARENT_TAG@.@TAG_OFFSET@.%h</param>
<param name="versionrewrite-pattern">v(.*)</param>
<param name="versionrewrite-replacement">\1</param>
- <param name="revision">1841d48eec9d845daef961ac21795e5493a376ff</param>
+ <param name="revision">9f820de9ca7d6e315be92bc830d354afad3e7960</param>
<param name="extract">suse/rdma-core.spec</param>
</service>
<service name="recompress" mode="disabled">
++++++ prebuilt-pandoc.tgz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pandoc-prebuilt/1f29cba8dff53abad8ec97b9d45e06dd2bef8845 new/pandoc-prebuilt/1f29cba8dff53abad8ec97b9d45e06dd2bef8845
--- old/pandoc-prebuilt/1f29cba8dff53abad8ec97b9d45e06dd2bef8845 2019-09-26 16:11:43.775549954 +0200
+++ new/pandoc-prebuilt/1f29cba8dff53abad8ec97b9d45e06dd2bef8845 1970-01-01 01:00:00.000000000 +0100
@@ -1,451 +0,0 @@
-.\"t
-.\" Automatically generated by Pandoc 2.7.3
-.\"
-.TH "IBV_WR API" "3" "2018-11-27" "libibverbs" "Libibverbs Programmer\[cq]s Manual"
-.hy
-.SH NAME
-.PP
-ibv_wr_abort, ibv_wr_complete, ibv_wr_start - Manage regions allowed to
-post work
-.PP
-ibv_wr_atomic_cmp_swp, ibv_wr_atomic_fetch_add - Post remote atomic
-operation work requests
-.PP
-ibv_wr_bind_mw, ibv_wr_local_inv - Post work requests for memory windows
-.PP
-ibv_wr_rdma_read, ibv_wr_rdma_write, ibv_wr_rdma_write_imm - Post RDMA
-work requests
-.PP
-ibv_wr_send, ibv_wr_send_imm, ibv_wr_send_inv - Post send work requests
-.PP
-ibv_wr_send_tso - Post segmentation offload work requests
-.PP
-ibv_wr_set_inline_data, ibv_wr_set_inline_data_list - Attach inline data
-to the last work request
-.PP
-ibv_wr_set_sge, ibv_wr_set_sge_list - Attach data to the last work
-request
-.PP
-ibv_wr_set_ud_addr - Attach UD addressing info to the last work request
-.PP
-ibv_wr_set_xrc_srqn - Attach an XRC SRQN to the last work request
-.SH SYNOPSIS
-.IP
-.nf
-\f[C]
-#include
-
-void ibv_wr_abort(struct ibv_qp_ex *qp);
-int ibv_wr_complete(struct ibv_qp_ex *qp);
-void ibv_wr_start(struct ibv_qp_ex *qp);
-
-void ibv_wr_atomic_cmp_swp(struct ibv_qp_ex *qp, uint32_t rkey,
- uint64_t remote_addr, uint64_t compare,
- uint64_t swap);
-void ibv_wr_atomic_fetch_add(struct ibv_qp_ex *qp, uint32_t rkey,
- uint64_t remote_addr, uint64_t add);
-
-void ibv_wr_bind_mw(struct ibv_qp_ex *qp, struct ibv_mw *mw, uint32_t rkey,
- const struct ibv_mw_bind_info *bind_info);
-void ibv_wr_local_inv(struct ibv_qp_ex *qp, uint32_t invalidate_rkey);
-
-void ibv_wr_rdma_read(struct ibv_qp_ex *qp, uint32_t rkey,
- uint64_t remote_addr);
-void ibv_wr_rdma_write(struct ibv_qp_ex *qp, uint32_t rkey,
- uint64_t remote_addr);
-void ibv_wr_rdma_write_imm(struct ibv_qp_ex *qp, uint32_t rkey,
- uint64_t remote_addr, __be32 imm_data);
-
-void ibv_wr_send(struct ibv_qp_ex *qp);
-void ibv_wr_send_imm(struct ibv_qp_ex *qp, __be32 imm_data);
-void ibv_wr_send_inv(struct ibv_qp_ex *qp, uint32_t invalidate_rkey);
-void ibv_wr_send_tso(struct ibv_qp_ex *qp, void *hdr, uint16_t hdr_sz,
- uint16_t mss);
-
-void ibv_wr_set_inline_data(struct ibv_qp_ex *qp, void *addr, size_t length);
-void ibv_wr_set_inline_data_list(struct ibv_qp_ex *qp, size_t num_buf,
- const struct ibv_data_buf *buf_list);
-void ibv_wr_set_sge(struct ibv_qp_ex *qp, uint32_t lkey, uint64_t addr,
- uint32_t length);
-void ibv_wr_set_sge_list(struct ibv_qp_ex *qp, size_t num_sge,
- const struct ibv_sge *sg_list);
-
-void ibv_wr_set_ud_addr(struct ibv_qp_ex *qp, struct ibv_ah *ah,
- uint32_t remote_qpn, uint32_t remote_qkey);
-void ibv_wr_set_xrc_srqn(struct ibv_qp_ex *qp, uint32_t remote_srqn);
-\f[R]
-.fi
-.SH DESCRIPTION
-.PP
-The verbs work request API (ibv_wr_*) allows efficient posting of work
-to a send queue using function calls instead of the struct based
-\f[I]ibv_post_send()\f[R] scheme.
-This approach is designed to minimize CPU branching and locking during
-the posting process.
-.PP
-This API is intended to be used to access additional functionality
-beyond what is provided by \f[I]ibv_post_send()\f[R].
-.PP
-WRs batches of \f[I]ibv_post_send()\f[R] and this API WRs batches can
-interleave together just if they are not posted within the critical
-region of each other.
-(A critical region in this API formed by \f[I]ibv_wr_start()\f[R] and
-\f[I]ibv_wr_complete()\f[R]/\f[I]ibv_wr_abort()\f[R])
-.SH USAGE
-.PP
-To use these APIs the QP must be created using ibv_create_qp_ex() which
-allows setting the \f[B]IBV_QP_INIT_ATTR_SEND_OPS_FLAGS\f[R] in
-\f[I]comp_mask\f[R].
-The \f[I]send_ops_flags\f[R] should be set to the OR of the work request
-types that will be posted to the QP.
-.PP
-If the QP does not support all the requested work request types then QP
-creation will fail.
-.PP
-Posting work requests to the QP is done within the critical region
-formed by \f[I]ibv_wr_start()\f[R] and
-\f[I]ibv_wr_complete()\f[R]/\f[I]ibv_wr_abort()\f[R] (see CONCURRENCY
-below).
-.PP
-Each work request is created by calling a WR builder function (see the
-table column WR builder below) to start creating the work request,
-followed by allowed/required setter functions described below.
-.PP
-The WR builder and setter combination can be called multiple times to
-efficiently post multiple work requests within a single critical region.
-.PP
-Each WR builder will use the \f[I]wr_id\f[R] member of \f[I]struct
-ibv_qp_ex\f[R] to set the value to be returned in the completion.
-Some operations will also use the \f[I]wr_flags\f[R] member to influence
-operation (see Flags below).
-These values should be set before invoking the WR builder function.
-.PP
-For example a simple send could be formed as follows:
-.IP
-.nf
-\f[C]
-qpx->wr_id = 1;
-ibv_wr_send(qpx);
-ibv_wr_set_sge(qpx, lkey, &data, sizeof(data));
-\f[R]
-.fi
-.PP
-The section WORK REQUESTS describes the various WR builders and setters
-in details.
-.PP
-Posting work is completed by calling \f[I]ibv_wr_complete()\f[R] or
-\f[I]ibv_wr_abort()\f[R].
-No work is executed to the queue until \f[I]ibv_wr_complete()\f[R]
-returns success.
-\f[I]ibv_wr_abort()\f[R] will discard all work prepared since
-\f[I]ibv_wr_start()\f[R].
-.SH WORK REQUESTS
-.PP
-Many of the operations match the opcodes available for
-\f[I]ibv_post_send()\f[R].
-Each operation has a WR builder function, a list of allowed setters, and
-a flag bit to request the operation with \f[I]send_ops_flags\f[R] in
-\f[I]struct ibv_qp_init_attr_ex\f[R] (see the EXAMPLE below).
-.PP
-.TS
-tab(@);
-l l l l.
-T{
-Operation
-T}@T{
-WR builder
-T}@T{
-QP Type Supported
-T}@T{
-setters
-T}
-_
-T{
-ATOMIC_CMP_AND_SWP
-T}@T{
-ibv_wr_atomic_cmp_swp()
-T}@T{
-RC, XRC_SEND
-T}@T{
-DATA, QP
-T}
-T{
-ATOMIC_FETCH_AND_ADD
-T}@T{
-ibv_wr_atomic_fetch_add()
-T}@T{
-RC, XRC_SEND
-T}@T{
-DATA, QP
-T}
-T{
-BIND_MW
-T}@T{
-ibv_wr_bind_mw()
-T}@T{
-UC, RC, XRC_SEND
-T}@T{
-NONE
-T}
-T{
-LOCAL_INV
-T}@T{
-ibv_wr_local_inv()
-T}@T{
-UC, RC, XRC_SEND
-T}@T{
-NONE
-T}
-T{
-RDMA_READ
-T}@T{
-ibv_wr_rdma_read()
-T}@T{
-RC, XRC_SEND
-T}@T{
-DATA, QP
-T}
-T{
-RDMA_WRITE
-T}@T{
-ibv_wr_rdma_write()
-T}@T{
-UC, RC, XRC_SEND
-T}@T{
-DATA, QP
-T}
-T{
-RDMA_WRITE_WITH_IMM
-T}@T{
-ibv_wr_rdma_write_imm()
-T}@T{
-UC, RC, XRC_SEND
-T}@T{
-DATA, QP
-T}
-T{
-SEND
-T}@T{
-ibv_wr_send()
-T}@T{
-UD, UC, RC, XRC_SEND, RAW_PACKET
-T}@T{
-DATA, QP
-T}
-T{
-SEND_WITH_IMM
-T}@T{
-ibv_wr_send_imm()
-T}@T{
-UD, UC, RC, SRC SEND
-T}@T{
-DATA, QP
-T}
-T{
-SEND_WITH_INV
-T}@T{
-ibv_wr_send_inv()
-T}@T{
-UC, RC, XRC_SEND
-T}@T{
-DATA, QP
-T}
-T{
-TSO
-T}@T{
-ibv_wr_send_tso()
-T}@T{
-UD, RAW_PACKET
-T}@T{
-DATA, QP
-T}
-.TE
-.SS Atomic operations
-.PP
-Atomic operations are only atomic so long as all writes to memory go
-only through the same RDMA hardware.
-It is not atomic with writes performed by the CPU, or by other RDMA
-hardware in the system.
-.TP
-.B \f[I]ibv_wr_atomic_cmp_swp()\f[R]
-If the remote 64 bit memory location specified by \f[I]rkey\f[R] and
-\f[I]remote_addr\f[R] equals \f[I]compare\f[R] then set it to
-\f[I]swap\f[R].
-.TP
-.B \f[I]ibv_wr_atomic_fetch_add()\f[R]
-Add \f[I]add\f[R] to the 64 bit memory location specified \f[I]rkey\f[R]
-and \f[I]remote_addr\f[R].
-.SS Memory Windows
-.PP
-Memory window type 2 operations (See man page for ibv_alloc_mw).
-.TP
-.B \f[I]ibv_wr_bind_mw()\f[R]
-Bind a MW type 2 specified by \f[B]mw\f[R], set a new \f[B]rkey\f[R] and
-set its properties by \f[B]bind_info\f[R].
-.TP
-.B \f[I]ibv_wr_local_inv()\f[R]
-Invalidate a MW type 2 which is associated with \f[B]rkey\f[R].
-.SS RDMA
-.TP
-.B \f[I]ibv_wr_rdma_read()\f[R]
-Read from the remote memory location specified \f[I]rkey\f[R] and
-\f[I]remote_addr\f[R].
-The number of bytes to read, and the local location to store the data,
-is determined by the DATA buffers set after this call.
-.TP
-.B \f[I]ibv_wr_rdma_write()\f[R], \f[I]ibv_wr_rdma_write_imm()\f[R]
-Write to the remote memory location specified \f[I]rkey\f[R] and
-\f[I]remote_addr\f[R].
-The number of bytes to read, and the local location to get the data, is
-determined by the DATA buffers set after this call.
-.RS
-.PP
-The _imm version causes the remote side to get a
-IBV_WC_RECV_RDMA_WITH_IMM containing the 32 bits of immediate data.
-.RE
-.SS Message Send
-.TP
-.B \f[I]ibv_wr_send()\f[R], \f[I]ibv_wr_send_imm()\f[R]
-Send a message.
-The number of bytes to send, and the local location to get the data, is
-determined by the DATA buffers set after this call.
-.RS
-.PP
-The _imm version causes the remote side to get a
-IBV_WC_RECV_RDMA_WITH_IMM containing the 32 bits of immediate data.
-.RE
-.TP
-.B \f[I]ibv_wr_send_inv()\f[R]
-The data transfer is the same as for \f[I]ibv_wr_send()\f[R], however
-the remote side will invalidate the MR specified by
-\f[I]invalidate_rkey\f[R] before delivering a completion.
-.TP
-.B \f[I]ibv_wr_send_tso()\f[R]
-Produce multiple SEND messages using TCP Segmentation Offload.
-The SGE points to a TCP Stream buffer which will be segmented into MSS
-size SENDs.
-The hdr includes the entire network headers up to and including the TCP
-header and is prefixed before each segment.
-.SS QP Specific setters
-.PP
-Certain QP types require each post to be accompanied by additional
-setters, these setters are mandatory for any operation listing a QP
-setter in the above table.
-.TP
-.B \f[I]UD\f[R] QPs
-\f[I]ibv_wr_set_ud_addr()\f[R] must be called to set the destination
-address of the work.
-.TP
-.B \f[I]XRC_SEND\f[R] QPs
-\f[I]ibv_wr_set_xrc_srqn()\f[R] must be called to set the destination
-SRQN field.
-.SS DATA transfer setters
-.PP
-For work that requires to transfer data one of the following setters
-should be called once after the WR builder:
-.TP
-.B \f[I]ibv_wr_set_sge()\f[R]
-Transfer data to/from a single buffer given by the lkey, addr and
-length.
-This is equivalent to \f[I]ibv_wr_set_sge_list()\f[R] with a single
-element.
-.TP
-.B \f[I]ibv_wr_set_sge_list()\f[R]
-Transfer data to/from a list of buffers, logically concatenated
-together.
-Each buffer is specified by an element in an array of \f[I]struct
-ibv_sge\f[R].
-.PP
-Inline setters will copy the send data during the setter and allows the
-caller to immediately re-use the buffer.
-This behavior is identical to the IBV_SEND_INLINE flag.
-Generally this copy is done in a way that optimizes SEND latency and is
-suitable for small messages.
-The provider will limit the amount of data it can support in a single
-operation.
-This limit is requested in the \f[I]max_inline_data\f[R] member of
-\f[I]struct ibv_qp_init_attr\f[R].
-Valid only for SEND and RDMA_WRITE.
-.TP
-.B \f[I]ibv_wr_set_inline_data()\f[R]
-Copy send data from a single buffer given by the addr and length.
-This is equivalent to \f[I]ibv_wr_set_inline_data_list()\f[R] with a
-single element.
-.TP
-.B \f[I]ibv_wr_set_inline_data_list()\f[R]
-Copy send data from a list of buffers, logically concatenated together.
-Each buffer is specified by an element in an array of \f[I]struct
-ibv_inl_data\f[R].
-.SS Flags
-.PP
-A bit mask of flags may be specified in \f[I]wr_flags\f[R] to control
-the behavior of the work request.
-.TP
-.B \f[B]IBV_SEND_FENCE\f[R]
-Do not start this work request until prior work has completed.
-.TP
-.B \f[B]IBV_SEND_IP_CSUM\f[R]
-Offload the IPv4 and TCP/UDP checksum calculation
-.TP
-.B \f[B]IBV_SEND_SIGNALED\f[R]
-A completion will be generated in the completion queue for the
-operation.
-.TP
-.B \f[B]IBV_SEND_SOLICTED\f[R]
-Set the solicted bit in the RDMA packet.
-This informs the other side to generate a completion event upon
-receiving the RDMA operation.
-.SH CONCURRENCY
-.PP
-The provider will provide locking to ensure that
-\f[I]ibv_wr_start()\f[R] and \f[I]ibv_wr_complete()/abort()\f[R] form a
-per-QP critical section where no other threads can enter.
-.PP
-If an \f[I]ibv_td\f[R] is provided during QP creation then no locking
-will be performed and it is up to the caller to ensure that only one
-thread can be within the critical region at a time.
-.SH RETURN VALUE
-.PP
-Applications should use this API in a way that does not create failures.
-The individual APIs do not return a failure indication to avoid
-branching.
-.PP
-If a failure is detected during operation, for instance due to an
-invalid argument, then \f[I]ibv_wr_complete()\f[R] will return failure
-and the entire posting will be aborted.
-.SH EXAMPLE
-.IP
-.nf
-\f[C]
-/* create RC QP type and specify the required send opcodes */
-qp_init_attr_ex.qp_type = IBV_QPT_RC;
-qp_init_attr_ex.comp_mask |= IBV_QP_INIT_ATTR_SEND_OPS_FLAGS;
-qp_init_attr_ex.send_ops_flags |= IBV_QP_EX_WITH_RDMA_WRITE;
-qp_init_attr_ex.send_ops_flags |= IBV_QP_EX_WITH_RDMA_WRITE_WITH_IMM;
-
-ibv_qp *qp = ibv_create_qp_ex(ctx, qp_init_attr_ex);
-ibv_qp_ex *qpx = ibv_qp_to_qp_ex(qp);
-
-ibv_wr_start(qpx);
-
-/* create 1st WRITE WR entry */
-qpx->wr_id = my_wr_id_1;
-ibv_wr_rdma_write(qpx, rkey, remote_addr_1);
-ibv_wr_set_sge(qpx, lkey, local_addr_1, length_1);
-
-/* create 2nd WRITE_WITH_IMM WR entry */
-qpx->wr_id = my_wr_id_2;
-qpx->send_flags = IBV_SEND_SIGNALED;
-ibv_wr_rdma_write_imm(qpx, rkey, remote_addr_2, htonl(0x1234));
-ibv_set_wr_sge(qpx, lkey, local_addr_2, length_2);
-
-/* Begin processing WRs */
-ret = ibv_wr_complete(qpx);
-\f[R]
-.fi
-.SH SEE ALSO
-.PP
-\f[B]ibv_post_send\f[R](3), \f[B]ibv_create_qp_ex(3)\f[R].
-.SH AUTHOR
-.PP
-Jason Gunthorpe Guy Levi
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pandoc-prebuilt/42f038a5f87713ae1079c61615b27d0a41336faa new/pandoc-prebuilt/42f038a5f87713ae1079c61615b27d0a41336faa
--- old/pandoc-prebuilt/42f038a5f87713ae1079c61615b27d0a41336faa 1970-01-01 01:00:00.000000000 +0100
+++ new/pandoc-prebuilt/42f038a5f87713ae1079c61615b27d0a41336faa 2019-11-26 10:18:32.983504177 +0100
@@ -0,0 +1,451 @@
+.\"t
+.\" Automatically generated by Pandoc 2.7.3
+.\"
+.TH "IBV_WR API" "3" "2018-11-27" "libibverbs" "Libibverbs Programmer\[cq]s Manual"
+.hy
+.SH NAME
+.PP
+ibv_wr_abort, ibv_wr_complete, ibv_wr_start - Manage regions allowed to
+post work
+.PP
+ibv_wr_atomic_cmp_swp, ibv_wr_atomic_fetch_add - Post remote atomic
+operation work requests
+.PP
+ibv_wr_bind_mw, ibv_wr_local_inv - Post work requests for memory windows
+.PP
+ibv_wr_rdma_read, ibv_wr_rdma_write, ibv_wr_rdma_write_imm - Post RDMA
+work requests
+.PP
+ibv_wr_send, ibv_wr_send_imm, ibv_wr_send_inv - Post send work requests
+.PP
+ibv_wr_send_tso - Post segmentation offload work requests
+.PP
+ibv_wr_set_inline_data, ibv_wr_set_inline_data_list - Attach inline data
+to the last work request
+.PP
+ibv_wr_set_sge, ibv_wr_set_sge_list - Attach data to the last work
+request
+.PP
+ibv_wr_set_ud_addr - Attach UD addressing info to the last work request
+.PP
+ibv_wr_set_xrc_srqn - Attach an XRC SRQN to the last work request
+.SH SYNOPSIS
+.IP
+.nf
+\f[C]
+#include
+
+void ibv_wr_abort(struct ibv_qp_ex *qp);
+int ibv_wr_complete(struct ibv_qp_ex *qp);
+void ibv_wr_start(struct ibv_qp_ex *qp);
+
+void ibv_wr_atomic_cmp_swp(struct ibv_qp_ex *qp, uint32_t rkey,
+ uint64_t remote_addr, uint64_t compare,
+ uint64_t swap);
+void ibv_wr_atomic_fetch_add(struct ibv_qp_ex *qp, uint32_t rkey,
+ uint64_t remote_addr, uint64_t add);
+
+void ibv_wr_bind_mw(struct ibv_qp_ex *qp, struct ibv_mw *mw, uint32_t rkey,
+ const struct ibv_mw_bind_info *bind_info);
+void ibv_wr_local_inv(struct ibv_qp_ex *qp, uint32_t invalidate_rkey);
+
+void ibv_wr_rdma_read(struct ibv_qp_ex *qp, uint32_t rkey,
+ uint64_t remote_addr);
+void ibv_wr_rdma_write(struct ibv_qp_ex *qp, uint32_t rkey,
+ uint64_t remote_addr);
+void ibv_wr_rdma_write_imm(struct ibv_qp_ex *qp, uint32_t rkey,
+ uint64_t remote_addr, __be32 imm_data);
+
+void ibv_wr_send(struct ibv_qp_ex *qp);
+void ibv_wr_send_imm(struct ibv_qp_ex *qp, __be32 imm_data);
+void ibv_wr_send_inv(struct ibv_qp_ex *qp, uint32_t invalidate_rkey);
+void ibv_wr_send_tso(struct ibv_qp_ex *qp, void *hdr, uint16_t hdr_sz,
+ uint16_t mss);
+
+void ibv_wr_set_inline_data(struct ibv_qp_ex *qp, void *addr, size_t length);
+void ibv_wr_set_inline_data_list(struct ibv_qp_ex *qp, size_t num_buf,
+ const struct ibv_data_buf *buf_list);
+void ibv_wr_set_sge(struct ibv_qp_ex *qp, uint32_t lkey, uint64_t addr,
+ uint32_t length);
+void ibv_wr_set_sge_list(struct ibv_qp_ex *qp, size_t num_sge,
+ const struct ibv_sge *sg_list);
+
+void ibv_wr_set_ud_addr(struct ibv_qp_ex *qp, struct ibv_ah *ah,
+ uint32_t remote_qpn, uint32_t remote_qkey);
+void ibv_wr_set_xrc_srqn(struct ibv_qp_ex *qp, uint32_t remote_srqn);
+\f[R]
+.fi
+.SH DESCRIPTION
+.PP
+The verbs work request API (ibv_wr_*) allows efficient posting of work
+to a send queue using function calls instead of the struct based
+\f[I]ibv_post_send()\f[R] scheme.
+This approach is designed to minimize CPU branching and locking during
+the posting process.
+.PP
+This API is intended to be used to access additional functionality
+beyond what is provided by \f[I]ibv_post_send()\f[R].
+.PP
+WRs batches of \f[I]ibv_post_send()\f[R] and this API WRs batches can
+interleave together just if they are not posted within the critical
+region of each other.
+(A critical region in this API formed by \f[I]ibv_wr_start()\f[R] and
+\f[I]ibv_wr_complete()\f[R]/\f[I]ibv_wr_abort()\f[R])
+.SH USAGE
+.PP
+To use these APIs the QP must be created using ibv_create_qp_ex() which
+allows setting the \f[B]IBV_QP_INIT_ATTR_SEND_OPS_FLAGS\f[R] in
+\f[I]comp_mask\f[R].
+The \f[I]send_ops_flags\f[R] should be set to the OR of the work request
+types that will be posted to the QP.
+.PP
+If the QP does not support all the requested work request types then QP
+creation will fail.
+.PP
+Posting work requests to the QP is done within the critical region
+formed by \f[I]ibv_wr_start()\f[R] and
+\f[I]ibv_wr_complete()\f[R]/\f[I]ibv_wr_abort()\f[R] (see CONCURRENCY
+below).
+.PP
+Each work request is created by calling a WR builder function (see the
+table column WR builder below) to start creating the work request,
+followed by allowed/required setter functions described below.
+.PP
+The WR builder and setter combination can be called multiple times to
+efficiently post multiple work requests within a single critical region.
+.PP
+Each WR builder will use the \f[I]wr_id\f[R] member of \f[I]struct
+ibv_qp_ex\f[R] to set the value to be returned in the completion.
+Some operations will also use the \f[I]wr_flags\f[R] member to influence
+operation (see Flags below).
+These values should be set before invoking the WR builder function.
+.PP
+For example a simple send could be formed as follows:
+.IP
+.nf
+\f[C]
+qpx->wr_id = 1;
+ibv_wr_send(qpx);
+ibv_wr_set_sge(qpx, lkey, &data, sizeof(data));
+\f[R]
+.fi
+.PP
+The section WORK REQUESTS describes the various WR builders and setters
+in details.
+.PP
+Posting work is completed by calling \f[I]ibv_wr_complete()\f[R] or
+\f[I]ibv_wr_abort()\f[R].
+No work is executed to the queue until \f[I]ibv_wr_complete()\f[R]
+returns success.
+\f[I]ibv_wr_abort()\f[R] will discard all work prepared since
+\f[I]ibv_wr_start()\f[R].
+.SH WORK REQUESTS
+.PP
+Many of the operations match the opcodes available for
+\f[I]ibv_post_send()\f[R].
+Each operation has a WR builder function, a list of allowed setters, and
+a flag bit to request the operation with \f[I]send_ops_flags\f[R] in
+\f[I]struct ibv_qp_init_attr_ex\f[R] (see the EXAMPLE below).
+.PP
+.TS
+tab(@);
+l l l l.
+T{
+Operation
+T}@T{
+WR builder
+T}@T{
+QP Type Supported
+T}@T{
+setters
+T}
+_
+T{
+ATOMIC_CMP_AND_SWP
+T}@T{
+ibv_wr_atomic_cmp_swp()
+T}@T{
+RC, XRC_SEND
+T}@T{
+DATA, QP
+T}
+T{
+ATOMIC_FETCH_AND_ADD
+T}@T{
+ibv_wr_atomic_fetch_add()
+T}@T{
+RC, XRC_SEND
+T}@T{
+DATA, QP
+T}
+T{
+BIND_MW
+T}@T{
+ibv_wr_bind_mw()
+T}@T{
+UC, RC, XRC_SEND
+T}@T{
+NONE
+T}
+T{
+LOCAL_INV
+T}@T{
+ibv_wr_local_inv()
+T}@T{
+UC, RC, XRC_SEND
+T}@T{
+NONE
+T}
+T{
+RDMA_READ
+T}@T{
+ibv_wr_rdma_read()
+T}@T{
+RC, XRC_SEND
+T}@T{
+DATA, QP
+T}
+T{
+RDMA_WRITE
+T}@T{
+ibv_wr_rdma_write()
+T}@T{
+UC, RC, XRC_SEND
+T}@T{
+DATA, QP
+T}
+T{
+RDMA_WRITE_WITH_IMM
+T}@T{
+ibv_wr_rdma_write_imm()
+T}@T{
+UC, RC, XRC_SEND
+T}@T{
+DATA, QP
+T}
+T{
+SEND
+T}@T{
+ibv_wr_send()
+T}@T{
+UD, UC, RC, XRC_SEND, RAW_PACKET
+T}@T{
+DATA, QP
+T}
+T{
+SEND_WITH_IMM
+T}@T{
+ibv_wr_send_imm()
+T}@T{
+UD, UC, RC, SRC SEND
+T}@T{
+DATA, QP
+T}
+T{
+SEND_WITH_INV
+T}@T{
+ibv_wr_send_inv()
+T}@T{
+UC, RC, XRC_SEND
+T}@T{
+DATA, QP
+T}
+T{
+TSO
+T}@T{
+ibv_wr_send_tso()
+T}@T{
+UD, RAW_PACKET
+T}@T{
+DATA, QP
+T}
+.TE
+.SS Atomic operations
+.PP
+Atomic operations are only atomic so long as all writes to memory go
+only through the same RDMA hardware.
+It is not atomic with writes performed by the CPU, or by other RDMA
+hardware in the system.
+.TP
+.B \f[I]ibv_wr_atomic_cmp_swp()\f[R]
+If the remote 64 bit memory location specified by \f[I]rkey\f[R] and
+\f[I]remote_addr\f[R] equals \f[I]compare\f[R] then set it to
+\f[I]swap\f[R].
+.TP
+.B \f[I]ibv_wr_atomic_fetch_add()\f[R]
+Add \f[I]add\f[R] to the 64 bit memory location specified \f[I]rkey\f[R]
+and \f[I]remote_addr\f[R].
+.SS Memory Windows
+.PP
+Memory window type 2 operations (See man page for ibv_alloc_mw).
+.TP
+.B \f[I]ibv_wr_bind_mw()\f[R]
+Bind a MW type 2 specified by \f[B]mw\f[R], set a new \f[B]rkey\f[R] and
+set its properties by \f[B]bind_info\f[R].
+.TP
+.B \f[I]ibv_wr_local_inv()\f[R]
+Invalidate a MW type 2 which is associated with \f[B]rkey\f[R].
+.SS RDMA
+.TP
+.B \f[I]ibv_wr_rdma_read()\f[R]
+Read from the remote memory location specified \f[I]rkey\f[R] and
+\f[I]remote_addr\f[R].
+The number of bytes to read, and the local location to store the data,
+is determined by the DATA buffers set after this call.
+.TP
+.B \f[I]ibv_wr_rdma_write()\f[R], \f[I]ibv_wr_rdma_write_imm()\f[R]
+Write to the remote memory location specified \f[I]rkey\f[R] and
+\f[I]remote_addr\f[R].
+The number of bytes to read, and the local location to get the data, is
+determined by the DATA buffers set after this call.
+.RS
+.PP
+The _imm version causes the remote side to get a
+IBV_WC_RECV_RDMA_WITH_IMM containing the 32 bits of immediate data.
+.RE
+.SS Message Send
+.TP
+.B \f[I]ibv_wr_send()\f[R], \f[I]ibv_wr_send_imm()\f[R]
+Send a message.
+The number of bytes to send, and the local location to get the data, is
+determined by the DATA buffers set after this call.
+.RS
+.PP
+The _imm version causes the remote side to get a
+IBV_WC_RECV_RDMA_WITH_IMM containing the 32 bits of immediate data.
+.RE
+.TP
+.B \f[I]ibv_wr_send_inv()\f[R]
+The data transfer is the same as for \f[I]ibv_wr_send()\f[R], however
+the remote side will invalidate the MR specified by
+\f[I]invalidate_rkey\f[R] before delivering a completion.
+.TP
+.B \f[I]ibv_wr_send_tso()\f[R]
+Produce multiple SEND messages using TCP Segmentation Offload.
+The SGE points to a TCP Stream buffer which will be segmented into MSS
+size SENDs.
+The hdr includes the entire network headers up to and including the TCP
+header and is prefixed before each segment.
+.SS QP Specific setters
+.PP
+Certain QP types require each post to be accompanied by additional
+setters, these setters are mandatory for any operation listing a QP
+setter in the above table.
+.TP
+.B \f[I]UD\f[R] QPs
+\f[I]ibv_wr_set_ud_addr()\f[R] must be called to set the destination
+address of the work.
+.TP
+.B \f[I]XRC_SEND\f[R] QPs
+\f[I]ibv_wr_set_xrc_srqn()\f[R] must be called to set the destination
+SRQN field.
+.SS DATA transfer setters
+.PP
+For work that requires to transfer data one of the following setters
+should be called once after the WR builder:
+.TP
+.B \f[I]ibv_wr_set_sge()\f[R]
+Transfer data to/from a single buffer given by the lkey, addr and
+length.
+This is equivalent to \f[I]ibv_wr_set_sge_list()\f[R] with a single
+element.
+.TP
+.B \f[I]ibv_wr_set_sge_list()\f[R]
+Transfer data to/from a list of buffers, logically concatenated
+together.
+Each buffer is specified by an element in an array of \f[I]struct
+ibv_sge\f[R].
+.PP
+Inline setters will copy the send data during the setter and allows the
+caller to immediately re-use the buffer.
+This behavior is identical to the IBV_SEND_INLINE flag.
+Generally this copy is done in a way that optimizes SEND latency and is
+suitable for small messages.
+The provider will limit the amount of data it can support in a single
+operation.
+This limit is requested in the \f[I]max_inline_data\f[R] member of
+\f[I]struct ibv_qp_init_attr\f[R].
+Valid only for SEND and RDMA_WRITE.
+.TP
+.B \f[I]ibv_wr_set_inline_data()\f[R]
+Copy send data from a single buffer given by the addr and length.
+This is equivalent to \f[I]ibv_wr_set_inline_data_list()\f[R] with a
+single element.
+.TP
+.B \f[I]ibv_wr_set_inline_data_list()\f[R]
+Copy send data from a list of buffers, logically concatenated together.
+Each buffer is specified by an element in an array of \f[I]struct
+ibv_inl_data\f[R].
+.SS Flags
+.PP
+A bit mask of flags may be specified in \f[I]wr_flags\f[R] to control
+the behavior of the work request.
+.TP
+.B \f[B]IBV_SEND_FENCE\f[R]
+Do not start this work request until prior work has completed.
+.TP
+.B \f[B]IBV_SEND_IP_CSUM\f[R]
+Offload the IPv4 and TCP/UDP checksum calculation
+.TP
+.B \f[B]IBV_SEND_SIGNALED\f[R]
+A completion will be generated in the completion queue for the
+operation.
+.TP
+.B \f[B]IBV_SEND_SOLICTED\f[R]
+Set the solicted bit in the RDMA packet.
+This informs the other side to generate a completion event upon
+receiving the RDMA operation.
+.SH CONCURRENCY
+.PP
+The provider will provide locking to ensure that
+\f[I]ibv_wr_start()\f[R] and \f[I]ibv_wr_complete()/abort()\f[R] form a
+per-QP critical section where no other threads can enter.
+.PP
+If an \f[I]ibv_td\f[R] is provided during QP creation then no locking
+will be performed and it is up to the caller to ensure that only one
+thread can be within the critical region at a time.
+.SH RETURN VALUE
+.PP
+Applications should use this API in a way that does not create failures.
+The individual APIs do not return a failure indication to avoid
+branching.
+.PP
+If a failure is detected during operation, for instance due to an
+invalid argument, then \f[I]ibv_wr_complete()\f[R] will return failure
+and the entire posting will be aborted.
+.SH EXAMPLE
+.IP
+.nf
+\f[C]
+/* create RC QP type and specify the required send opcodes */
+qp_init_attr_ex.qp_type = IBV_QPT_RC;
+qp_init_attr_ex.comp_mask |= IBV_QP_INIT_ATTR_SEND_OPS_FLAGS;
+qp_init_attr_ex.send_ops_flags |= IBV_QP_EX_WITH_RDMA_WRITE;
+qp_init_attr_ex.send_ops_flags |= IBV_QP_EX_WITH_RDMA_WRITE_WITH_IMM;
+
+ibv_qp *qp = ibv_create_qp_ex(ctx, qp_init_attr_ex);
+ibv_qp_ex *qpx = ibv_qp_to_qp_ex(qp);
+
+ibv_wr_start(qpx);
+
+/* create 1st WRITE WR entry */
+qpx->wr_id = my_wr_id_1;
+ibv_wr_rdma_write(qpx, rkey, remote_addr_1);
+ibv_wr_set_sge(qpx, lkey, local_addr_1, length_1);
+
+/* create 2nd WRITE_WITH_IMM WR entry */
+qpx->wr_id = my_wr_id_2;
+qpx->wr_flags = IBV_SEND_SIGNALED;
+ibv_wr_rdma_write_imm(qpx, rkey, remote_addr_2, htonl(0x1234));
+ibv_set_wr_sge(qpx, lkey, local_addr_2, length_2);
+
+/* Begin processing WRs */
+ret = ibv_wr_complete(qpx);
+\f[R]
+.fi
+.SH SEE ALSO
+.PP
+\f[B]ibv_post_send\f[R](3), \f[B]ibv_create_qp_ex(3)\f[R].
+.SH AUTHOR
+.PP
+Jason Gunthorpe Guy Levi
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pandoc-prebuilt/748b4d49f7873d149abf564a84bb58ce0c61461a new/pandoc-prebuilt/748b4d49f7873d149abf564a84bb58ce0c61461a
--- old/pandoc-prebuilt/748b4d49f7873d149abf564a84bb58ce0c61461a 1970-01-01 01:00:00.000000000 +0100
+++ new/pandoc-prebuilt/748b4d49f7873d149abf564a84bb58ce0c61461a 2019-11-26 10:18:38.611546883 +0100
@@ -0,0 +1,99 @@
+.\" Automatically generated by Pandoc 2.7.3
+.\"
+.TH "mlx5dv_create_flow_matcher" "3" "2018-9-19" "mlx5" "mlx5 Programmer\[cq]s Manual"
+.hy
+.SH NAME
+.PP
+mlx5dv_create_flow_matcher - creates a matcher to be used with
+\f[I]mlx5dv_create_flow(3)\f[R]
+.SH SYNOPSIS
+.IP
+.nf
+\f[C]
+#include
+
+struct mlx5dv_flow_matcher *
+mlx5dv_create_flow_matcher(struct ibv_context *context,
+ struct mlx5dv_flow_matcher_attr *attr)
+\f[R]
+.fi
+.SH DESCRIPTION
+.PP
+\f[B]mlx5dv_create_flow_matcher()\f[R] creates a flow matcher (mask) to
+be used with \f[I]mlx5dv_create_flow(3)\f[R].
+.SH ARGUMENTS
+.PP
+Please see \f[I]ibv_open_device(3)\f[R] for \f[I]context\f[R].
+.SS \f[I]attr\f[R]
+.IP
+.nf
+\f[C]
+struct mlx5dv_flow_matcher_attr {
+ enum ibv_flow_attr_type type;
+ uint32_t flags; /* From enum ibv_flow_flags */
+ uint16_t priority;
+ uint8_t match_criteria_enable; /* Device spec format */
+ struct mlx5dv_flow_match_parameters *match_mask;
+ uint64_t comp_mask;
+ enum mlx5dv_flow_table_type ft_type;
+};
+\f[R]
+.fi
+.TP
+.B \f[I]type\f[R]
+Type of matcher to be created: IBV_FLOW_ATTR_NORMAL: Normal rule
+according to specification.
+.TP
+.B \f[I]flags\f[R]
+special flags to control rule: 0: Nothing or zero value means matcher
+will store ingress flow rules.
+IBV_FLOW_ATTR_FLAGS_EGRESS: Specified this matcher will store egress
+flow rules.
+.TP
+.B \f[I]priority\f[R]
+See \f[I]ibv_create_flow(3)\f[R].
+.TP
+.B \f[I]match_criteria_enable\f[R]
+What match criteria is configured in \f[I]match_mask\f[R], passed in
+device spec format.
+.SS \f[I]match_mask\f[R]
+.IP
+.nf
+\f[C]
+struct mlx5dv_flow_match_parameters {
+ size_t match_sz;
+ uint64_t match_buf[]; /* Device spec format */
+};
+\f[R]
+.fi
+.TP
+.B \f[I]match_sz\f[R]
+Size in bytes of \f[I]match_buf\f[R].
+.TP
+.B \f[I]match_buf\f[R]
+Set which mask to be used, passed in device spec format.
+.TP
+.B \f[I]comp_mask\f[R]
+MLX5DV_FLOW_MATCHER_MASK_FT_TYPE for \f[I]ft_type\f[R]
+.SS \f[I]ft_type\f[R]
+.PP
+Specified in which flow table type, the matcher will store the flow
+rules: MLX5DV_FLOW_TABLE_TYPE_NIC_RX: Specified this matcher will store
+ingress flow rules.
+MLX5DV_FLOW_TABLE_TYPE_NIC_TX Specified this matcher will store egress
+flow rules.
+MLX5DV_FLOW_TABLE_TYPE_FDB : Specified this matcher will store FDB
+rules.
+MLX5DV_FLOW_TABLE_TYPE_RDMA_RX: Specified this matcher will store
+ingress RDMA flow rules.
+.SH RETURN VALUE
+.PP
+\f[B]mlx5dv_create_flow_matcher\f[R] returns a pointer to
+\f[I]mlx5dv_flow_matcher\f[R], on error NULL will be returned and errno
+will be set.
+.SH SEE ALSO
+.PP
+\f[I]ibv_open_device(3)\f[R], \f[I]ibv_create_flow(3)\f[R]
+.SH AUTHOR
+.PP
+Mark Bloch
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pandoc-prebuilt/d137b1ee0cb6220d1020f1ea76af2d7742643feb new/pandoc-prebuilt/d137b1ee0cb6220d1020f1ea76af2d7742643feb
--- old/pandoc-prebuilt/d137b1ee0cb6220d1020f1ea76af2d7742643feb 2019-09-26 16:11:43.783550023 +0200
+++ new/pandoc-prebuilt/d137b1ee0cb6220d1020f1ea76af2d7742643feb 1970-01-01 01:00:00.000000000 +0100
@@ -1,97 +0,0 @@
-.\" Automatically generated by Pandoc 2.7.3
-.\"
-.TH "mlx5dv_create_flow_matcher" "3" "2018-9-19" "mlx5" "mlx5 Programmer\[cq]s Manual"
-.hy
-.SH NAME
-.PP
-mlx5dv_create_flow_matcher - creates a matcher to be used with
-\f[I]mlx5dv_create_flow(3)\f[R]
-.SH SYNOPSIS
-.IP
-.nf
-\f[C]
-#include
-
-struct mlx5dv_flow_matcher *
-mlx5dv_create_flow_matcher(struct ibv_context *context,
- struct mlx5dv_flow_matcher_attr *attr)
-\f[R]
-.fi
-.SH DESCRIPTION
-.PP
-\f[B]mlx5dv_create_flow_matcher()\f[R] creates a flow matcher (mask) to
-be used with \f[I]mlx5dv_create_flow(3)\f[R].
-.SH ARGUMENTS
-.PP
-Please see \f[I]ibv_open_device(3)\f[R] for \f[I]context\f[R].
-.SS \f[I]attr\f[R]
-.IP
-.nf
-\f[C]
-struct mlx5dv_flow_matcher_attr {
- enum ibv_flow_attr_type type;
- uint32_t flags; /* From enum ibv_flow_flags */
- uint16_t priority;
- uint8_t match_criteria_enable; /* Device spec format */
- struct mlx5dv_flow_match_parameters *match_mask;
- uint64_t comp_mask;
- enum mlx5dv_flow_table_type ft_type;
-};
-\f[R]
-.fi
-.TP
-.B \f[I]type\f[R]
-Type of matcher to be created: IBV_FLOW_ATTR_NORMAL: Normal rule
-according to specification.
-.TP
-.B \f[I]flags\f[R]
-special flags to control rule: 0: Nothing or zero value means matcher
-will store ingress flow rules.
-IBV_FLOW_ATTR_FLAGS_EGRESS: Specified this matcher will store egress
-flow rules.
-.TP
-.B \f[I]priority\f[R]
-See \f[I]ibv_create_flow(3)\f[R].
-.TP
-.B \f[I]match_criteria_enable\f[R]
-What match criteria is configured in \f[I]match_mask\f[R], passed in
-device spec format.
-.SS \f[I]match_mask\f[R]
-.IP
-.nf
-\f[C]
-struct mlx5dv_flow_match_parameters {
- size_t match_sz;
- uint64_t match_buf[]; /* Device spec format */
-};
-\f[R]
-.fi
-.TP
-.B \f[I]match_sz\f[R]
-Size in bytes of \f[I]match_buf\f[R].
-.TP
-.B \f[I]match_buf\f[R]
-Set which mask to be used, passed in device spec format.
-.TP
-.B \f[I]comp_mask\f[R]
-MLX5DV_FLOW_MATCHER_MASK_FT_TYPE for \f[I]ft_type\f[R]
-.SS \f[I]ft_type\f[R]
-.PP
-Specified in which flow table type, the matcher will store the flow
-rules: MLX5DV_FLOW_TABLE_TYPE_NIC_RX: Specified this matcher will store
-ingress flow rules.
-MLX5DV_FLOW_TABLE_TYPE_NIC_TX Specified this matcher will store egress
-flow rules.
-MLX5DV_FLOW_TABLE_TYPE_FDB : Specified this matcher will store FDB
-rules.
-.SH RETURN VALUE
-.PP
-\f[B]mlx5dv_create_flow_matcher\f[R] returns a pointer to
-\f[I]mlx5dv_flow_matcher\f[R], on error NULL will be returned and errno
-will be set.
-.SH SEE ALSO
-.PP
-\f[I]ibv_open_device(3)\f[R], \f[I]ibv_create_flow(3)\f[R]
-.SH AUTHOR
-.PP
-Mark Bloch
++++++ rdma-core-25.1.0.1841d48eec9d.tar.gz -> rdma-core-26.1.0.9f820de9ca7d.tar.gz ++++++
++++ 85581 lines of diff (skipped)