From: Haggai Eran <haggaie-VPRAkNaXOzVWk0Htik3J/w@public.gmane.org>
To: Yann Droneaud <ydroneaud-RlY5vtjFyJ3QT0dZR+AlfA@public.gmane.org>,
Jason Gunthorpe
<jgunthorpe-ePGOBjL8dl3ta4EC/59zMFaTQe2KTcn/@public.gmane.org>
Cc: Sagi Grimberg <sagig-VPRAkNaXOzVWk0Htik3J/w@public.gmane.org>,
Shachar Raindel <raindel-VPRAkNaXOzVWk0Htik3J/w@public.gmane.org>,
Eli Cohen <eli-VPRAkNaXOzVWk0Htik3J/w@public.gmane.org>,
Roland Dreier <roland-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>,
"linux-rdma-u79uwXL29TY76Z2rM5mHXA@public.gmane.org"
<linux-rdma-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>,
"linux-api-u79uwXL29TY76Z2rM5mHXA@public.gmane.org"
<linux-api-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>
Subject: Re: [PATCH v1 1/5] IB/uverbs: ex_query_device: answer must not depend on request's comp_mask
Date: Sun, 1 Feb 2015 10:04:14 +0200 [thread overview]
Message-ID: <54CDDDFE.80803@mellanox.com> (raw)
In-Reply-To: <1422568741.3133.247.camel-RlY5vtjFyJ3QT0dZR+AlfA@public.gmane.org>
On 29/01/2015 23:59, Yann Droneaud wrote:
> But I wonder about this part of commit 860f10a799c8:
>
> diff --git a/drivers/infiniband/core/uverbs_cmd.c b/drivers/infiniband/core/uverbs_cmd.c
> index c7a43624c96b..f9326ccda4b5 100644
> --- a/drivers/infiniband/core/uverbs_cmd.c
> +++ b/drivers/infiniband/core/uverbs_cmd.c
> @@ -953,6 +953,18 @@ ssize_t ib_uverbs_reg_mr(struct ib_uverbs_file *file,
> goto err_free;
> }
>
> + if (cmd.access_flags & IB_ACCESS_ON_DEMAND) {
> + struct ib_device_attr attr;
> +
> + ret = ib_query_device(pd->device, &attr);
> + if (ret || !(attr.device_cap_flags &
> + IB_DEVICE_ON_DEMAND_PAGING)) {
> + pr_debug("ODP support not available\n");
> + ret = -EINVAL;
> + goto err_put;
> + }
> + }
> +
>
> AFAICT (1 << 6) bit from struct ib_uverbs_reg_mr access_flags field
> was not enforced to be 0 previously, as ib_check_mr_access() only check
> for some coherency between a subset of the bits (it's not a function
> dedicated to check flags provided by userspace):
>
> include/rdma/ib_verbs.h:
>
> 1094 enum ib_access_flags {
> 1095 IB_ACCESS_LOCAL_WRITE = 1,
> 1096 IB_ACCESS_REMOTE_WRITE = (1<<1),
> 1097 IB_ACCESS_REMOTE_READ = (1<<2),
> 1098 IB_ACCESS_REMOTE_ATOMIC = (1<<3),
> 1099 IB_ACCESS_MW_BIND = (1<<4),
> 1100 IB_ZERO_BASED = (1<<5),
> 1101 IB_ACCESS_ON_DEMAND = (1<<6),
> 1102 };
>
> drivers/infiniband/core/uverbs_cmd.c: ib_uverbs_reg_mr()
>
> 961 ret = ib_check_mr_access(cmd.access_flags);
> 962 if (ret)
> 963 return ret;
>
> include/rdma/ib_verbs.h:
>
> 2643 static inline int ib_check_mr_access(int flags)
> 2644 {
> 2645 /*
> 2646 * Local write permission is required if remote write or
> 2647 * remote atomic permission is also requested.
> 2648 */
> 2649 if (flags & (IB_ACCESS_REMOTE_ATOMIC | IB_ACCESS_REMOTE_WRITE) &&
> 2650 !(flags & IB_ACCESS_LOCAL_WRITE))
> 2651 return -EINVAL;
> 2652
> 2653 return 0;
> 2654 }
>
> drivers/infiniband/core/uverbs_cmd.c: ib_uverbs_reg_mr()
>
> 990 mr = pd->device->reg_user_mr(pd, cmd.start, cmd.length, cmd.hca_va,
> 991 cmd.access_flags, &udata);
>
> reg_user_mr() functions may call ib_umem_get() and pass access_flags to
> it:
>
> drivers/infiniband/core/umem.c: ib_umem_get()
>
> 114 /*
> 115 * We ask for writable memory if any of the following
> 116 * access flags are set. "Local write" and "remote write"
> 117 * obviously require write access. "Remote atomic" can do
> 118 * things like fetch and add, which will modify memory, and
> 119 * "MW bind" can change permissions by binding a window.
> 120 */
> 121 umem->writable = !!(access &
> 122 (IB_ACCESS_LOCAL_WRITE | IB_ACCESS_REMOTE_WRITE |
> 123 IB_ACCESS_REMOTE_ATOMIC | IB_ACCESS_MW_BIND));
> 124
> 125 if (access & IB_ACCESS_ON_DEMAND) {
> 126 ret = ib_umem_odp_get(context, umem);
> 127 if (ret) {
> 128 kfree(umem);
> 129 return ERR_PTR(ret);
> 130 }
> 131 return umem;
> 132 }
>
>
> As you can see only a few bits in access_flags are checked in the end,
> so it may exist a very unlikely possibility that an existing userspace
> program is setting this IB_ACCESS_ON_DEMAND bit without the intention
> of enabling on demand paging as this would be unnoticed by older kernel.
>
> In the other hand, a newer program built with on-demand-paging in mind
> will set the bit, but when run on older kernel, it will be a no-op,
> allowing the program to continue, perhaps thinking on-demand-paging
> is available.
This is why we added a method for userspace to check the kernel
capabilities both when adding the memory windows support and with ODP.
User-space can still send garbage to the kernel, but if it does so
without checking the kernel supports its request, it's user-space's problem.
> That should be avoided as much as possible.
>
> Unfortunately, I think this cannot be fixed as it's was long since
> IB_ZERO_BASED was added by commit 7083e42ee2 ("IB/core: Add "type 2"
> memory windows support").
> Anyway there was no check for IB_ACCESS_REMOTE_READ, nor
> IB_ACCESS_MW_BIND in the uverb layer either.
I think it would be perfectly fine to add a check today that validates
the MR access flags input is known. Because the newer feature require
user-space to check capabilities, I don't think it would matter if we
returned an error on newer kernels that do not support these features.
Haggai
next prev parent reply other threads:[~2015-02-01 8:04 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-01-29 17:59 [PATCH v1 0/5] IB/core: extended query device caps cleanup for v3.19 Yann Droneaud
[not found] ` <cover.1422553023.git.ydroneaud-RlY5vtjFyJ3QT0dZR+AlfA@public.gmane.org>
2015-01-29 17:59 ` [PATCH v1 1/5] IB/uverbs: ex_query_device: answer must not depend on request's comp_mask Yann Droneaud
[not found] ` <24ceb1fc5b2b6563532e5776b1b2320b1ae37543.1422553023.git.ydroneaud-RlY5vtjFyJ3QT0dZR+AlfA@public.gmane.org>
2015-01-29 18:28 ` Jason Gunthorpe
[not found] ` <20150129182800.GH11842-ePGOBjL8dl3ta4EC/59zMFaTQe2KTcn/@public.gmane.org>
2015-01-29 18:43 ` Yann Droneaud
[not found] ` <1422557009.3133.172.camel-RlY5vtjFyJ3QT0dZR+AlfA@public.gmane.org>
2015-01-29 19:18 ` Jason Gunthorpe
[not found] ` <20150129191801.GM11842-ePGOBjL8dl3ta4EC/59zMFaTQe2KTcn/@public.gmane.org>
2015-01-29 20:50 ` Yann Droneaud
[not found] ` <1422564638.3133.198.camel-RlY5vtjFyJ3QT0dZR+AlfA@public.gmane.org>
2015-01-29 21:12 ` Jason Gunthorpe
[not found] ` <20150129211256.GA22099-ePGOBjL8dl3ta4EC/59zMFaTQe2KTcn/@public.gmane.org>
2015-02-05 2:54 ` Weiny, Ira
[not found] ` <2807E5FD2F6FDA4886F6618EAC48510E0CC12C30-8k97q/ur5Z2krb+BlOpmy7fspsVTdybXVpNB7YpNyf8@public.gmane.org>
2015-02-05 8:26 ` Haggai Eran
[not found] ` <54D32933.8080307-VPRAkNaXOzVWk0Htik3J/w@public.gmane.org>
2015-02-07 0:52 ` Weiny, Ira
[not found] ` <2807E5FD2F6FDA4886F6618EAC48510E0CC201F7-8k97q/ur5Z2krb+BlOpmy7fspsVTdybXVpNB7YpNyf8@public.gmane.org>
2015-02-08 7:27 ` Haggai Eran
2015-01-29 20:42 ` Yann Droneaud
2015-01-29 21:59 ` Yann Droneaud
[not found] ` <1422568741.3133.247.camel-RlY5vtjFyJ3QT0dZR+AlfA@public.gmane.org>
2015-01-29 23:17 ` Roland Dreier
[not found] ` <CAG4TOxN4DpTMMsCM-1oe6-w+5xYR4YHdJeL7p2nQpUy9gYCSjA-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2015-01-30 17:26 ` Yann Droneaud
[not found] ` <1422638760.3133.260.camel-RlY5vtjFyJ3QT0dZR+AlfA@public.gmane.org>
2015-01-31 20:09 ` Or Gerlitz
[not found] ` <CAJ3xEMhDtD7MpJ+1Y3z2yMpTrb9C5SaUa94E8xpVLHN4pHe3fw-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2015-03-02 14:08 ` Yann Droneaud
2015-02-01 11:25 ` Haggai Eran
2015-02-01 8:04 ` Haggai Eran [this message]
2015-02-01 7:39 ` Haggai Eran
2015-01-29 17:59 ` [PATCH v1 2/5] IB/uverbs: ex_query_device: check " Yann Droneaud
[not found] ` <335da45738872e446f63db338ca766a34608c90a.1422553023.git.ydroneaud-RlY5vtjFyJ3QT0dZR+AlfA@public.gmane.org>
2015-01-29 18:36 ` Jason Gunthorpe
[not found] ` <20150129183648.GI11842-ePGOBjL8dl3ta4EC/59zMFaTQe2KTcn/@public.gmane.org>
2015-01-29 19:22 ` Yann Droneaud
2015-01-29 20:24 ` Jason Gunthorpe
2015-02-01 8:12 ` Haggai Eran
[not found] ` <54CDDFE4.7030003-VPRAkNaXOzVWk0Htik3J/w@public.gmane.org>
2015-02-01 11:55 ` Yann Droneaud
2015-01-29 18:00 ` [PATCH v1 3/5] IB/uverbs: ex_query_device: answer must depend on response buffer's size Yann Droneaud
[not found] ` <a7b2b5adb3b207ec2a4330067a03ce7e4c2225aa.1422553023.git.ydroneaud-RlY5vtjFyJ3QT0dZR+AlfA@public.gmane.org>
2015-01-29 18:38 ` Jason Gunthorpe
[not found] ` <20150129183839.GJ11842-ePGOBjL8dl3ta4EC/59zMFaTQe2KTcn/@public.gmane.org>
2015-01-29 19:25 ` Yann Droneaud
2015-02-01 8:38 ` Haggai Eran
2015-01-29 18:00 ` [PATCH v1 4/5] IB/uverbs: ex_query_device: no need to clear the whole structure Yann Droneaud
[not found] ` <0b646f62e9272bc962a1ff6ff03ad9523b454dfe.1422553023.git.ydroneaud-RlY5vtjFyJ3QT0dZR+AlfA@public.gmane.org>
2015-01-29 18:39 ` Jason Gunthorpe
2015-02-01 8:45 ` Haggai Eran
2015-01-29 18:00 ` [PATCH v1 5/5] IB/core: ib_copy_to_udata(): don't silently truncate response Yann Droneaud
[not found] ` <c69af8952bf25fdbcdfc527b0636bc3177798b95.1422553023.git.ydroneaud-RlY5vtjFyJ3QT0dZR+AlfA@public.gmane.org>
2015-02-01 8:47 ` Haggai Eran
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=54CDDDFE.80803@mellanox.com \
--to=haggaie-vpraknaxozvwk0htik3j/w@public.gmane.org \
--cc=eli-VPRAkNaXOzVWk0Htik3J/w@public.gmane.org \
--cc=jgunthorpe-ePGOBjL8dl3ta4EC/59zMFaTQe2KTcn/@public.gmane.org \
--cc=linux-api-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=linux-rdma-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=raindel-VPRAkNaXOzVWk0Htik3J/w@public.gmane.org \
--cc=roland-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org \
--cc=sagig-VPRAkNaXOzVWk0Htik3J/w@public.gmane.org \
--cc=ydroneaud-RlY5vtjFyJ3QT0dZR+AlfA@public.gmane.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).