mbox series

[v3,0/9] Do not allow set-partition immediate mode

Message ID 20220324011126.1144504-1-alison.schofield@intel.com
Headers show
Series Do not allow set-partition immediate mode | expand

Message

Alison Schofield March 24, 2022, 1:11 a.m. UTC
From: Alison Schofield <alison.schofield@intel.com>

Blocking immediate mode in set-partition info triggered a
refactoring of the send path of userspace mailbox commands.

The v1 to address the issue was a single patch [1] that inserted
a new immediate mode check in the send path where the payload was
available for examining. That was not in a validation function.

The v2 patchset [2] added refactoring of the send path so that
validation work can all spawn from cxl_validate_cmd_from_user().

Here, v3 offers a finer level of refactoring:

Patches 1-7: Refactor existing code so that all validation work
	can spawn from cxl_validate_cmd_from_user().

	The movement intends to cleanly rip the work of building a
	mailbox command away from handle_mailbox_command_from_user()
	and give it to cxl_validate_cmd_from_user().

Patch 8: Blocks the immediate mode of the set-partition command.
Patch 9: Removes CXL_PMEM exclusive commands restriction.

[1] https://lore.kernel.org/linux-cxl/20220103202100.784194-1-alison.schofield@intel.com/
[2] https://lore.kernel.org/linux-cxl/a4daafc4b537a0b1a673c55300da7747784c4573.1645817416.git.alison.schofield@intel.com/

Changes in v3:
- Split up the 'Centralize the validation...' patch into 6 pieces.
Patch: cxl/mbox: Move cxl_mem_command construction to helper funcs
- Safely initialize the cxl_mem_command structs. (Dan)
- Remove unneeded memcpy (Dan)
Patch: cxl/mbox: Block immediate mode in SET_PARTITION_INFO command
- No Changes
Patch: cxl/pmem: Remove CXL SET_PARTITION_INFO from exclusive_cmds list
- No Changes

Changes in v2:
- Refactor the send path of userspace mbox cmds. (Dan, Ben)
- Patch 3 commit log - update the need to block. (Dan)
- Return -EBUSY (not -EINVAL), when blocking immediate mode. (Ben)
- Remove unneeded cast of void (payload_in). (dan)
- s/u64/__le64 in struct cxl_mbox_set_partition_info. (Dan)

Alison Schofield (9):
  cxl/mbox: Move cxl_mem_command construction to helper funcs
  cxl/mbox: Move raw command warning to raw command validation
  cxl/mbox: Move build of user mailbox cmd to a helper function
  cxl/mbox: Construct a users cxl_mbox_cmd in the validation path
  cxl/mbox: Remove dependency on cxl_mem_command for a debug msg
  cxl/mbox: Make handle_mailbox_cmd_from_user() use a mbox param
  cxl/mbox: Move cxl_mem_command param to a local variable
  cxl/mbox: Block immediate mode in SET_PARTITION_INFO command
  cxl/pmem: Remove CXL SET_PARTITION_INFO from exclusive_cmds list

 drivers/cxl/core/mbox.c | 311 +++++++++++++++++++++++++---------------
 drivers/cxl/cxlmem.h    |   7 +
 drivers/cxl/pmem.c      |   1 -
 3 files changed, 200 insertions(+), 119 deletions(-)


base-commit: 9b688fc651b9d2b633e8d959454670aba1c39162

Comments

Jonathan Cameron March 25, 2022, 10:34 a.m. UTC | #1
On Wed, 23 Mar 2022 18:11:17 -0700
alison.schofield@intel.com wrote:

> From: Alison Schofield <alison.schofield@intel.com>
> 
> Blocking immediate mode in set-partition info triggered a
> refactoring of the send path of userspace mailbox commands.
> 
> The v1 to address the issue was a single patch [1] that inserted
> a new immediate mode check in the send path where the payload was
> available for examining. That was not in a validation function.
> 
> The v2 patchset [2] added refactoring of the send path so that
> validation work can all spawn from cxl_validate_cmd_from_user().
> 
> Here, v3 offers a finer level of refactoring:
> 
> Patches 1-7: Refactor existing code so that all validation work
> 	can spawn from cxl_validate_cmd_from_user().
> 
> 	The movement intends to cleanly rip the work of building a
> 	mailbox command away from handle_mailbox_command_from_user()
> 	and give it to cxl_validate_cmd_from_user().

This makes me wonder a bit if
cxl_validate_cmd_from_user() is an appropriate name given
it now does more than validation?

> 
> Patch 8: Blocks the immediate mode of the set-partition command.
> Patch 9: Removes CXL_PMEM exclusive commands restriction.
> 
> [1] https://lore.kernel.org/linux-cxl/20220103202100.784194-1-alison.schofield@intel.com/
> [2] https://lore.kernel.org/linux-cxl/a4daafc4b537a0b1a673c55300da7747784c4573.1645817416.git.alison.schofield@intel.com/
> 
> Changes in v3:
> - Split up the 'Centralize the validation...' patch into 6 pieces.
> Patch: cxl/mbox: Move cxl_mem_command construction to helper funcs
> - Safely initialize the cxl_mem_command structs. (Dan)
> - Remove unneeded memcpy (Dan)
> Patch: cxl/mbox: Block immediate mode in SET_PARTITION_INFO command
> - No Changes
> Patch: cxl/pmem: Remove CXL SET_PARTITION_INFO from exclusive_cmds list
> - No Changes
> 
> Changes in v2:
> - Refactor the send path of userspace mbox cmds. (Dan, Ben)
> - Patch 3 commit log - update the need to block. (Dan)
> - Return -EBUSY (not -EINVAL), when blocking immediate mode. (Ben)
> - Remove unneeded cast of void (payload_in). (dan)
> - s/u64/__le64 in struct cxl_mbox_set_partition_info. (Dan)
> 
> Alison Schofield (9):
>   cxl/mbox: Move cxl_mem_command construction to helper funcs
>   cxl/mbox: Move raw command warning to raw command validation
>   cxl/mbox: Move build of user mailbox cmd to a helper function
>   cxl/mbox: Construct a users cxl_mbox_cmd in the validation path
>   cxl/mbox: Remove dependency on cxl_mem_command for a debug msg
>   cxl/mbox: Make handle_mailbox_cmd_from_user() use a mbox param
>   cxl/mbox: Move cxl_mem_command param to a local variable
>   cxl/mbox: Block immediate mode in SET_PARTITION_INFO command
>   cxl/pmem: Remove CXL SET_PARTITION_INFO from exclusive_cmds list
> 
>  drivers/cxl/core/mbox.c | 311 +++++++++++++++++++++++++---------------
>  drivers/cxl/cxlmem.h    |   7 +
>  drivers/cxl/pmem.c      |   1 -
>  3 files changed, 200 insertions(+), 119 deletions(-)
> 
> 
> base-commit: 9b688fc651b9d2b633e8d959454670aba1c39162
Dan Williams March 30, 2022, 1:24 a.m. UTC | #2
On Fri, Mar 25, 2022 at 3:34 AM Jonathan Cameron
<Jonathan.Cameron@huawei.com> wrote:
>
> On Wed, 23 Mar 2022 18:11:17 -0700
> alison.schofield@intel.com wrote:
>
> > From: Alison Schofield <alison.schofield@intel.com>
> >
> > Blocking immediate mode in set-partition info triggered a
> > refactoring of the send path of userspace mailbox commands.
> >
> > The v1 to address the issue was a single patch [1] that inserted
> > a new immediate mode check in the send path where the payload was
> > available for examining. That was not in a validation function.
> >
> > The v2 patchset [2] added refactoring of the send path so that
> > validation work can all spawn from cxl_validate_cmd_from_user().
> >
> > Here, v3 offers a finer level of refactoring:
> >
> > Patches 1-7: Refactor existing code so that all validation work
> >       can spawn from cxl_validate_cmd_from_user().
> >
> >       The movement intends to cleanly rip the work of building a
> >       mailbox command away from handle_mailbox_command_from_user()
> >       and give it to cxl_validate_cmd_from_user().
>
> This makes me wonder a bit if
> cxl_validate_cmd_from_user() is an appropriate name given
> it now does more than validation?

Yeah, perhaps as a follow on, I think there's renaming possible to
make it clear what the difference is between:

cxl_send_cmd
cxl_mbox_send_cmd
cxl_pci_mbox_send
cxl_validate_cmd_from_user
handle_mailbox_cmd_from_user

---

cxl_send_cmd is really just a helper for the ioctl path so perhaps:
s/cxl_query_cmd/cxl_ioctl_query/
s/cxl_send_cmd/cxl_ioctl_send/

cxl_mbox_send_cmd() is the path that kernel-internal users take that
don't need to do any copy from user work to pass buffers to
cxl_pci_mbox_send() (which needs kernel buffers from
memcpy_{to,from}io()), so perhaps:
s/cxl_mbox_send_cmd/cxl_internal_cmd_send/

cxl_pci_mbox_send seems ok if the other function names change.

cxl_validate_cmd_from_user and handle_mailbox_cmd_from_user are really
doing three distinct operations. Check the payload for correctness,
check the command against the submit policy, and construct a kernel
command buffer from the user buffer. So how about:

cxl_ioctl_send_checks() (inspired by submit_bio_checks())
cxl_ioctl_send_to_kbuf()

...whatever we pick I think it's ok if this is done after this
reorganization completes with the current names.
Jonathan Cameron March 30, 2022, 3:05 p.m. UTC | #3
On Tue, 29 Mar 2022 18:24:50 -0700
Dan Williams <dan.j.williams@intel.com> wrote:

> On Fri, Mar 25, 2022 at 3:34 AM Jonathan Cameron
> <Jonathan.Cameron@huawei.com> wrote:
> >
> > On Wed, 23 Mar 2022 18:11:17 -0700
> > alison.schofield@intel.com wrote:
> >  
> > > From: Alison Schofield <alison.schofield@intel.com>
> > >
> > > Blocking immediate mode in set-partition info triggered a
> > > refactoring of the send path of userspace mailbox commands.
> > >
> > > The v1 to address the issue was a single patch [1] that inserted
> > > a new immediate mode check in the send path where the payload was
> > > available for examining. That was not in a validation function.
> > >
> > > The v2 patchset [2] added refactoring of the send path so that
> > > validation work can all spawn from cxl_validate_cmd_from_user().
> > >
> > > Here, v3 offers a finer level of refactoring:
> > >
> > > Patches 1-7: Refactor existing code so that all validation work
> > >       can spawn from cxl_validate_cmd_from_user().
> > >
> > >       The movement intends to cleanly rip the work of building a
> > >       mailbox command away from handle_mailbox_command_from_user()
> > >       and give it to cxl_validate_cmd_from_user().  
> >
> > This makes me wonder a bit if
> > cxl_validate_cmd_from_user() is an appropriate name given
> > it now does more than validation?  
> 
> Yeah, perhaps as a follow on, I think there's renaming possible to
> make it clear what the difference is between:
> 
> cxl_send_cmd
> cxl_mbox_send_cmd
> cxl_pci_mbox_send
> cxl_validate_cmd_from_user
> handle_mailbox_cmd_from_user
> 
> ---
> 
> cxl_send_cmd is really just a helper for the ioctl path so perhaps:
> s/cxl_query_cmd/cxl_ioctl_query/
> s/cxl_send_cmd/cxl_ioctl_send/
> 
> cxl_mbox_send_cmd() is the path that kernel-internal users take that
> don't need to do any copy from user work to pass buffers to
> cxl_pci_mbox_send() (which needs kernel buffers from
> memcpy_{to,from}io()), so perhaps:
> s/cxl_mbox_send_cmd/cxl_internal_cmd_send/
> 
> cxl_pci_mbox_send seems ok if the other function names change.
> 
> cxl_validate_cmd_from_user and handle_mailbox_cmd_from_user are really
> doing three distinct operations. Check the payload for correctness,
> check the command against the submit policy, and construct a kernel
> command buffer from the user buffer. So how about:
> 
> cxl_ioctl_send_checks() (inspired by submit_bio_checks())
> cxl_ioctl_send_to_kbuf()
> 
> ...whatever we pick I think it's ok if this is done after this
> reorganization completes with the current names.

Agreed. Keep this series clean, but then circle back to cleanup
the naming is a good approach.

Jonathan