RDMA/nldev: Add copy-on-fork attribute to get sys command
authorGal Pressman <galpress@amazon.com>
Sun, 18 Apr 2021 12:10:25 +0000 (15:10 +0300)
committerJason Gunthorpe <jgg@nvidia.com>
Tue, 27 Apr 2021 18:33:20 +0000 (15:33 -0300)
The new attribute indicates that the kernel copies DMA pages on fork,
hence libibverbs' fork support through madvise and MADV_DONTFORK is not
needed.

The introduced attribute is always reported as supported since the kernel
has the patch that added the copy-on-fork behavior. This allows the
userspace library to identify older vs newer kernel versions.  Extra care
should be taken when backporting this patch as it relies on the fact that
the copy-on-fork patch is merged, hence no check for support is added.

Don't backport this patch unless you also have the following series:
commit 70e806e4e645 ("mm: Do early cow for pinned pages during fork() for
ptes") and commit 4eae4efa2c29 ("hugetlb: do early cow when page pinned on
src mm").

Fixes: 70e806e4e645 ("mm: Do early cow for pinned pages during fork() for ptes")
Fixes: 4eae4efa2c29 ("hugetlb: do early cow when page pinned on src mm")
Link: https://lore.kernel.org/r/20210418121025.66849-1-galpress@amazon.com
Signed-off-by: Gal Pressman <galpress@amazon.com>
Reviewed-by: Leon Romanovsky <leonro@nvidia.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
drivers/infiniband/core/nldev.c
include/uapi/rdma/rdma_netlink.h

index bd7f675463f68bd9ab40bf9d4a265fd11003be0e..34d0cc1a4147ffb921119865aaff959122d6aa63 100644 (file)
@@ -153,6 +153,7 @@ static const struct nla_policy nldev_policy[RDMA_NLDEV_ATTR_MAX] = {
        [RDMA_NLDEV_ATTR_UVERBS_DRIVER_ID]      = { .type = NLA_U32 },
        [RDMA_NLDEV_NET_NS_FD]                  = { .type = NLA_U32 },
        [RDMA_NLDEV_SYS_ATTR_NETNS_MODE]        = { .type = NLA_U8 },
+       [RDMA_NLDEV_SYS_ATTR_COPY_ON_FORK]      = { .type = NLA_U8 },
 };
 
 static int put_driver_name_print_type(struct sk_buff *msg, const char *name,
@@ -1849,6 +1850,19 @@ static int nldev_sys_get_doit(struct sk_buff *skb, struct nlmsghdr *nlh,
                nlmsg_free(msg);
                return err;
        }
+
+       /*
+        * Copy-on-fork is supported.
+        * See commits:
+        * 70e806e4e645 ("mm: Do early cow for pinned pages during fork() for ptes")
+        * 4eae4efa2c29 ("hugetlb: do early cow when page pinned on src mm")
+        * for more details. Don't backport this without them.
+        *
+        * Return value ignored on purpose, assume copy-on-fork is not
+        * supported in case of failure.
+        */
+       nla_put_u8(msg, RDMA_NLDEV_SYS_ATTR_COPY_ON_FORK, 1);
+
        nlmsg_end(msg, nlh);
        return rdma_nl_unicast(sock_net(skb->sk), msg, NETLINK_CB(skb).portid);
 }
index 2c8d405ec924fde69166fbb233d104725030303f..75a1ae2311d86345bbcc096a26fc98319b9c327f 100644 (file)
@@ -546,6 +546,9 @@ enum rdma_nldev_attr {
 
        RDMA_NLDEV_ATTR_MIN_RANGE,              /* u32 */
        RDMA_NLDEV_ATTR_MAX_RANGE,              /* u32 */
+
+       RDMA_NLDEV_SYS_ATTR_COPY_ON_FORK,       /* u8 */
+
        /*
         * Always the end
         */