RE: [[PATCH v1] 02/37] [CIFS] SMBD: Add structure for SMBD transport
From: Long Li
Date: Sat Aug 12 2017 - 04:33:01 EST
> -----Original Message-----
> From: Stefan Metzmacher [mailto:metze@xxxxxxxxx]
> Sent: Monday, August 7, 2017 11:58 PM
> To: Steve French <sfrench@xxxxxxxxx>; linux-cifs@xxxxxxxxxxxxxxx; samba-
> technical@xxxxxxxxxxxxxxx; linux-kernel@xxxxxxxxxxxxxxx
> Cc: Long Li <longli@xxxxxxxxxxxxx>
> Subject: Re: [[PATCH v1] 02/37] [CIFS] SMBD: Add structure for SMBD
> transport
>
> Hi Li,
>
> thanks for providing this patchset, I guess it will be a huge win to have
> SMBDirect support for the kernel client!
>
> > Define a new structure for SMBD transport. This stucture will have all
> > the information on the transport, and it will be stored in the current SMB
> session.
> ...
> > +/*
> > + * The context for the SMBDirect transport
> > + * Everything related to the transport is here. It has several
> logical parts
> > + * 1. RDMA related structures
> > + * 2. SMBDirect connection parameters
> > + * 3. Reassembly queue for data receive path
> > + * 4. mempools for allocating packets */ struct cifs_rdma_info {
> > + struct TCP_Server_Info *server_info;
> > +
> > + // for debug purposes
> > + unsigned int count_receive_buffer;
> > + unsigned int count_get_receive_buffer;
> > + unsigned int count_put_receive_buffer;
> > + unsigned int count_send_empty;
> > +};
> > +#endif
> >
>
> It seems that the new transport is tied to it's caller regarding structures and
> naming conventions.
>
> I think it would be better to strictly separate them, as I'd like to use the
> SMBDirect transport also from the userspace for the client side e.g. in
> Samba's '[lib]smbclient', but also in Samba's server side code 'smbd'.
Thank you for reviewing the patch set.
I think it is possible to separate the common code that implements the SMBDirect transport. There are some challenges to reuse the same code for both kernel and user spaces.
1. Kernel mode RDMA verbs are similar but different to user-mode ones.
2. Some RDMA features (e.g Fast Registration Work Request) are not available in user-mode.
3. Locking and synchronization mechanism is different
4. Memory management is different.
5. Process creation/scheduling and data sharing between processes are different, and there is no user-mode code running in interrupt/softirq.
Those needs to be abstracted through a layer, the rest of the code can be shared. I can work on this after patch set is reviewed.
>
> Would it be possible to isolate this in
> smb_direct.c and smb_direct.h while using
> smb_direct_* prefixes for structures and functions? Also avoiding the usage
> of other headers from fs/cifs/*.h, expect for something generic like nterr.h.
Sure I will make naming changes and clean up the header files.
>
> I guess 'struct cifs_rdma_info' would then be 'struct smb_direct_connection'.
> And it won't have a reference to struct TCP_Server_Info.
I will look for ways to remove reference to struct TCP_Server_Info . The reason why it has a reference to TCP_Server_Info is that: TCP_Server_Info represents a transport connection, although it also has many other TCP related code. SMBD needs to get to this connection TCP_Server_Info and set the transport status on shutdown (and maybe other situations).
Long
>
> It the strict layering is too much change, I'd at least like to have the name
> changes.
>
> This should relatively easy to do by using somthing like
>
> git format-patch --stdout -37 > before
>
> cat before | sed \
> -e 's!struct cifs_rdma_info!struct smb_direct_connection!g' \ -e
> 's!cifsrdma\.h!smb_direct.h!g' \ -e 's!cifsrdma\.c!smb_direct.c!g' \
> > after
>
> git reset --hard HEAD~37
> git am after
>
> metze