* [PATCH 0/5] SRP kernel patches for kernel v5.14
@ 2021-05-12 3:27 Bart Van Assche
2021-05-12 3:27 ` [PATCH 1/5] RDMA/ib_hdrs.h: Remove a superfluous cast Bart Van Assche
` (4 more replies)
0 siblings, 5 replies; 17+ messages in thread
From: Bart Van Assche @ 2021-05-12 3:27 UTC (permalink / raw)
To: Jason Gunthorpe
Cc: Leon Romanovsky, Doug Ledford, linux-rdma, Bart Van Assche
Hi Jason,
Please consider the five patches in this series for kernel v5.14.
Thanks,
Bart.
Bart Van Assche (5):
RDMA/ib_hdrs.h: Remove a superfluous cast
RDMA/srp: Add more structure size checks
RDMA/srp: Apply the __packed attribute to members instead of
structures
RDMA/srp: Fix a recently introduced memory leak
RDMA/srp: Make struct scsi_cmnd and struct srp_request adjacent
drivers/infiniband/ulp/srp/ib_srp.c | 154 ++++++++++++----------------
drivers/infiniband/ulp/srp/ib_srp.h | 2 -
include/rdma/ib_hdrs.h | 2 +-
include/scsi/srp.h | 26 ++---
4 files changed, 76 insertions(+), 108 deletions(-)
^ permalink raw reply [flat|nested] 17+ messages in thread* [PATCH 1/5] RDMA/ib_hdrs.h: Remove a superfluous cast 2021-05-12 3:27 [PATCH 0/5] SRP kernel patches for kernel v5.14 Bart Van Assche @ 2021-05-12 3:27 ` Bart Van Assche 2021-05-19 9:00 ` Leon Romanovsky 2021-05-12 3:27 ` [PATCH 2/5] RDMA/srp: Add more structure size checks Bart Van Assche ` (3 subsequent siblings) 4 siblings, 1 reply; 17+ messages in thread From: Bart Van Assche @ 2021-05-12 3:27 UTC (permalink / raw) To: Jason Gunthorpe Cc: Leon Romanovsky, Doug Ledford, linux-rdma, Bart Van Assche, Don Hiatt, Dennis Dalessandro be16_to_cpu() returns a u16 value. Remove the superfluous u16 cast. That cast was introduced by commit 7dafbab3753f ("IB/hfi1: Add functions to parse BTH/IB headers"). Cc: Don Hiatt <don.hiatt@intel.com> Cc: Dennis Dalessandro <dennis.dalessandro@intel.com> Signed-off-by: Bart Van Assche <bvanassche@acm.org> --- include/rdma/ib_hdrs.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/rdma/ib_hdrs.h b/include/rdma/ib_hdrs.h index 57c1ac881d08..82483120539f 100644 --- a/include/rdma/ib_hdrs.h +++ b/include/rdma/ib_hdrs.h @@ -208,7 +208,7 @@ static inline u8 ib_get_lver(struct ib_header *hdr) static inline u16 ib_get_len(struct ib_header *hdr) { - return (u16)(be16_to_cpu(hdr->lrh[2])); + return be16_to_cpu(hdr->lrh[2]); } static inline u32 ib_get_qkey(struct ib_other_headers *ohdr) ^ permalink raw reply related [flat|nested] 17+ messages in thread
* Re: [PATCH 1/5] RDMA/ib_hdrs.h: Remove a superfluous cast 2021-05-12 3:27 ` [PATCH 1/5] RDMA/ib_hdrs.h: Remove a superfluous cast Bart Van Assche @ 2021-05-19 9:00 ` Leon Romanovsky 2021-05-24 3:12 ` Bart Van Assche 0 siblings, 1 reply; 17+ messages in thread From: Leon Romanovsky @ 2021-05-19 9:00 UTC (permalink / raw) To: Bart Van Assche Cc: Jason Gunthorpe, Doug Ledford, linux-rdma, Don Hiatt, Dennis Dalessandro On Tue, May 11, 2021 at 08:27:48PM -0700, Bart Van Assche wrote: > be16_to_cpu() returns a u16 value. Remove the superfluous u16 cast. That > cast was introduced by commit 7dafbab3753f ("IB/hfi1: Add functions to > parse BTH/IB headers"). > > Cc: Don Hiatt <don.hiatt@intel.com> > Cc: Dennis Dalessandro <dennis.dalessandro@intel.com> > Signed-off-by: Bart Van Assche <bvanassche@acm.org> > --- > include/rdma/ib_hdrs.h | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/include/rdma/ib_hdrs.h b/include/rdma/ib_hdrs.h > index 57c1ac881d08..82483120539f 100644 > --- a/include/rdma/ib_hdrs.h > +++ b/include/rdma/ib_hdrs.h > @@ -208,7 +208,7 @@ static inline u8 ib_get_lver(struct ib_header *hdr) > > static inline u16 ib_get_len(struct ib_header *hdr) > { > - return (u16)(be16_to_cpu(hdr->lrh[2])); > + return be16_to_cpu(hdr->lrh[2]); > } > > static inline u32 ib_get_qkey(struct ib_other_headers *ohdr) It is unclear why this function in the header. It is called only once. Thanks, Reviewed-by: Leon Romanovsky <leonro@nvidia.com> ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH 1/5] RDMA/ib_hdrs.h: Remove a superfluous cast 2021-05-19 9:00 ` Leon Romanovsky @ 2021-05-24 3:12 ` Bart Van Assche 0 siblings, 0 replies; 17+ messages in thread From: Bart Van Assche @ 2021-05-24 3:12 UTC (permalink / raw) To: Leon Romanovsky Cc: Jason Gunthorpe, Doug Ledford, linux-rdma, Don Hiatt, Dennis Dalessandro On 5/19/21 2:00 AM, Leon Romanovsky wrote: > On Tue, May 11, 2021 at 08:27:48PM -0700, Bart Van Assche wrote: >> diff --git a/include/rdma/ib_hdrs.h b/include/rdma/ib_hdrs.h >> index 57c1ac881d08..82483120539f 100644 >> --- a/include/rdma/ib_hdrs.h >> +++ b/include/rdma/ib_hdrs.h >> @@ -208,7 +208,7 @@ static inline u8 ib_get_lver(struct ib_header *hdr) >> >> static inline u16 ib_get_len(struct ib_header *hdr) >> { >> - return (u16)(be16_to_cpu(hdr->lrh[2])); >> + return be16_to_cpu(hdr->lrh[2]); >> } >> >> static inline u32 ib_get_qkey(struct ib_other_headers *ohdr) > > It is unclear why this function in the header. It is called only once. That's a good point. I will move it into the .c file that uses this function. Thanks, Bart. ^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH 2/5] RDMA/srp: Add more structure size checks 2021-05-12 3:27 [PATCH 0/5] SRP kernel patches for kernel v5.14 Bart Van Assche 2021-05-12 3:27 ` [PATCH 1/5] RDMA/ib_hdrs.h: Remove a superfluous cast Bart Van Assche @ 2021-05-12 3:27 ` Bart Van Assche 2021-05-19 9:01 ` Leon Romanovsky 2021-05-12 3:27 ` [PATCH 3/5] RDMA/srp: Apply the __packed attribute to members instead of structures Bart Van Assche ` (2 subsequent siblings) 4 siblings, 1 reply; 17+ messages in thread From: Bart Van Assche @ 2021-05-12 3:27 UTC (permalink / raw) To: Jason Gunthorpe Cc: Leon Romanovsky, Doug Ledford, linux-rdma, Bart Van Assche, Nicolas Morey-Chaisemartin Before modifying how the __packed attribute is used, add compile time size checks for the structures that will be modified. Cc: Nicolas Morey-Chaisemartin <nmoreychaisemartin@suse.com> Signed-off-by: Bart Van Assche <bvanassche@acm.org> --- drivers/infiniband/ulp/srp/ib_srp.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/drivers/infiniband/ulp/srp/ib_srp.c b/drivers/infiniband/ulp/srp/ib_srp.c index 31f8aa2c40ed..0f66bf015db6 100644 --- a/drivers/infiniband/ulp/srp/ib_srp.c +++ b/drivers/infiniband/ulp/srp/ib_srp.c @@ -4078,10 +4078,13 @@ static int __init srp_init_module(void) { int ret; + BUILD_BUG_ON(sizeof(struct srp_aer_req) != 36); + BUILD_BUG_ON(sizeof(struct srp_cmd) != 48); BUILD_BUG_ON(sizeof(struct srp_imm_buf) != 4); + BUILD_BUG_ON(sizeof(struct srp_indirect_buf) != 20); BUILD_BUG_ON(sizeof(struct srp_login_req) != 64); BUILD_BUG_ON(sizeof(struct srp_login_req_rdma) != 56); - BUILD_BUG_ON(sizeof(struct srp_cmd) != 48); + BUILD_BUG_ON(sizeof(struct srp_rsp) != 36); if (srp_sg_tablesize) { pr_warn("srp_sg_tablesize is deprecated, please use cmd_sg_entries\n"); ^ permalink raw reply related [flat|nested] 17+ messages in thread
* Re: [PATCH 2/5] RDMA/srp: Add more structure size checks 2021-05-12 3:27 ` [PATCH 2/5] RDMA/srp: Add more structure size checks Bart Van Assche @ 2021-05-19 9:01 ` Leon Romanovsky 0 siblings, 0 replies; 17+ messages in thread From: Leon Romanovsky @ 2021-05-19 9:01 UTC (permalink / raw) To: Bart Van Assche Cc: Jason Gunthorpe, Doug Ledford, linux-rdma, Nicolas Morey-Chaisemartin On Tue, May 11, 2021 at 08:27:49PM -0700, Bart Van Assche wrote: > Before modifying how the __packed attribute is used, add compile time > size checks for the structures that will be modified. > > Cc: Nicolas Morey-Chaisemartin <nmoreychaisemartin@suse.com> > Signed-off-by: Bart Van Assche <bvanassche@acm.org> > --- > drivers/infiniband/ulp/srp/ib_srp.c | 5 ++++- > 1 file changed, 4 insertions(+), 1 deletion(-) > Thanks, Reviewed-by: Leon Romanovsky <leonro@nvidia.com> ^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH 3/5] RDMA/srp: Apply the __packed attribute to members instead of structures 2021-05-12 3:27 [PATCH 0/5] SRP kernel patches for kernel v5.14 Bart Van Assche 2021-05-12 3:27 ` [PATCH 1/5] RDMA/ib_hdrs.h: Remove a superfluous cast Bart Van Assche 2021-05-12 3:27 ` [PATCH 2/5] RDMA/srp: Add more structure size checks Bart Van Assche @ 2021-05-12 3:27 ` Bart Van Assche 2021-05-20 14:48 ` Jason Gunthorpe 2021-05-12 3:27 ` [PATCH 4/5] RDMA/srp: Fix a recently introduced memory leak Bart Van Assche 2021-05-12 3:27 ` [PATCH 5/5] RDMA/srp: Make struct scsi_cmnd and struct srp_request adjacent Bart Van Assche 4 siblings, 1 reply; 17+ messages in thread From: Bart Van Assche @ 2021-05-12 3:27 UTC (permalink / raw) To: Jason Gunthorpe Cc: Leon Romanovsky, Doug Ledford, linux-rdma, Bart Van Assche, Nicolas Morey-Chaisemartin Applying the __packed attribute to an entire data structure results in suboptimal code on architectures that do not support unaligned accesses. Hence apply the __packed attribute only to those data members that are not naturally aligned. Cc: Nicolas Morey-Chaisemartin <nmoreychaisemartin@suse.com> Signed-off-by: Bart Van Assche <bvanassche@acm.org> --- include/scsi/srp.h | 26 +++++++++----------------- 1 file changed, 9 insertions(+), 17 deletions(-) diff --git a/include/scsi/srp.h b/include/scsi/srp.h index 177d8026e96f..84d2b5fc1409 100644 --- a/include/scsi/srp.h +++ b/include/scsi/srp.h @@ -107,10 +107,10 @@ struct srp_direct_buf { * having the 20-byte structure padded to 24 bytes on 64-bit architectures. */ struct srp_indirect_buf { - struct srp_direct_buf table_desc; + struct srp_direct_buf table_desc __packed; __be32 len; - struct srp_direct_buf desc_list[]; -} __attribute__((packed)); + struct srp_direct_buf desc_list[] __packed; +}; /* Immediate data buffer descriptor as defined in SRP2. */ struct srp_imm_buf { @@ -175,13 +175,13 @@ struct srp_login_rsp { u8 opcode; u8 reserved1[3]; __be32 req_lim_delta; - u64 tag; + u64 tag __packed; __be32 max_it_iu_len; __be32 max_ti_iu_len; __be16 buf_fmt; u8 rsp_flags; u8 reserved2[25]; -} __attribute__((packed)); +}; struct srp_login_rej { u8 opcode; @@ -207,10 +207,6 @@ struct srp_t_logout { u64 tag; }; -/* - * We need the packed attribute because the SRP spec only aligns the - * 8-byte LUN field to 4 bytes. - */ struct srp_tsk_mgmt { u8 opcode; u8 sol_not; @@ -225,10 +221,6 @@ struct srp_tsk_mgmt { u8 reserved5[8]; }; -/* - * We need the packed attribute because the SRP spec only aligns the - * 8-byte LUN field to 4 bytes. - */ struct srp_cmd { u8 opcode; u8 sol_not; @@ -266,7 +258,7 @@ struct srp_rsp { u8 sol_not; u8 reserved1[2]; __be32 req_lim_delta; - u64 tag; + u64 tag __packed; u8 reserved2[2]; u8 flags; u8 status; @@ -275,7 +267,7 @@ struct srp_rsp { __be32 sense_data_len; __be32 resp_data_len; u8 data[]; -} __attribute__((packed)); +}; struct srp_cred_req { u8 opcode; @@ -301,13 +293,13 @@ struct srp_aer_req { u8 sol_not; u8 reserved[2]; __be32 req_lim_delta; - u64 tag; + u64 tag __packed; u32 reserved2; struct scsi_lun lun; __be32 sense_data_len; u32 reserved3; u8 sense_data[]; -} __attribute__((packed)); +}; struct srp_aer_rsp { u8 opcode; ^ permalink raw reply related [flat|nested] 17+ messages in thread
* Re: [PATCH 3/5] RDMA/srp: Apply the __packed attribute to members instead of structures 2021-05-12 3:27 ` [PATCH 3/5] RDMA/srp: Apply the __packed attribute to members instead of structures Bart Van Assche @ 2021-05-20 14:48 ` Jason Gunthorpe 2021-05-24 3:41 ` Bart Van Assche 0 siblings, 1 reply; 17+ messages in thread From: Jason Gunthorpe @ 2021-05-20 14:48 UTC (permalink / raw) To: Bart Van Assche Cc: Leon Romanovsky, Doug Ledford, linux-rdma, Nicolas Morey-Chaisemartin On Tue, May 11, 2021 at 08:27:50PM -0700, Bart Van Assche wrote: > @@ -107,10 +107,10 @@ struct srp_direct_buf { > * having the 20-byte structure padded to 24 bytes on 64-bit architectures. > */ > struct srp_indirect_buf { > - struct srp_direct_buf table_desc; > + struct srp_direct_buf table_desc __packed; > __be32 len; > - struct srp_direct_buf desc_list[]; > -} __attribute__((packed)); > + struct srp_direct_buf desc_list[] __packed; > +}; > > /* Immediate data buffer descriptor as defined in SRP2. */ > struct srp_imm_buf { > @@ -175,13 +175,13 @@ struct srp_login_rsp { > u8 opcode; > u8 reserved1[3]; > __be32 req_lim_delta; > - u64 tag; > + u64 tag __packed; What you really want is just something like this: typedef u64 __attribute__((aligned(4))) compat_u64; And then use that every place you have the u64 and forget about packed entirely. Except for a couple exceptions IBA mads are always aligned to 4 bytes, only the 64 bit quantities are unaligned. But really this whole thing should be replaced with the IBA_FIELD macros like include/rdma/ibta_vol1_c12.h demos. Then it would be sparse safe and obviously endian correct as well. I suppose you are respinning this due to the other comments? Jason ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH 3/5] RDMA/srp: Apply the __packed attribute to members instead of structures 2021-05-20 14:48 ` Jason Gunthorpe @ 2021-05-24 3:41 ` Bart Van Assche 2021-05-24 23:00 ` Jason Gunthorpe 0 siblings, 1 reply; 17+ messages in thread From: Bart Van Assche @ 2021-05-24 3:41 UTC (permalink / raw) To: Jason Gunthorpe Cc: Leon Romanovsky, Doug Ledford, linux-rdma, Nicolas Morey-Chaisemartin On 5/20/21 7:48 AM, Jason Gunthorpe wrote: > On Tue, May 11, 2021 at 08:27:50PM -0700, Bart Van Assche wrote: >> @@ -107,10 +107,10 @@ struct srp_direct_buf { >> * having the 20-byte structure padded to 24 bytes on 64-bit architectures. >> */ >> struct srp_indirect_buf { >> - struct srp_direct_buf table_desc; >> + struct srp_direct_buf table_desc __packed; >> __be32 len; >> - struct srp_direct_buf desc_list[]; >> -} __attribute__((packed)); >> + struct srp_direct_buf desc_list[] __packed; >> +}; >> >> /* Immediate data buffer descriptor as defined in SRP2. */ >> struct srp_imm_buf { >> @@ -175,13 +175,13 @@ struct srp_login_rsp { >> u8 opcode; >> u8 reserved1[3]; >> __be32 req_lim_delta; >> - u64 tag; >> + u64 tag __packed; > > What you really want is just something like this: > > typedef u64 __attribute__((aligned(4))) compat_u64; > > And then use that every place you have the u64 and forget about packed > entirely. Really? My understanding is that the aligned attribute can be used to increase alignment of a structure member but not to decrease it. From https://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html#Common-Variable-Attributes: "When used on a struct, or struct member, the aligned attribute can only increase the alignment; in order to decrease it, the packed attribute must be specified as well." Additionally, there is a recommendation in Documentation/process/coding-style.rst not to introduce new typedefs. > Except for a couple exceptions IBA mads are always aligned to 4 bytes, > only the 64 bit quantities are unaligned. > > But really this whole thing should be replaced with the IBA_FIELD > macros like include/rdma/ibta_vol1_c12.h demos. > > Then it would be sparse safe and obviously endian correct as well. I prefer a structure over the IBA_FIELD macros so I will change __packed into __packed __aligned(4). Thanks, Bart. ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH 3/5] RDMA/srp: Apply the __packed attribute to members instead of structures 2021-05-24 3:41 ` Bart Van Assche @ 2021-05-24 23:00 ` Jason Gunthorpe 0 siblings, 0 replies; 17+ messages in thread From: Jason Gunthorpe @ 2021-05-24 23:00 UTC (permalink / raw) To: Bart Van Assche Cc: Leon Romanovsky, Doug Ledford, linux-rdma, Nicolas Morey-Chaisemartin On Sun, May 23, 2021 at 08:41:25PM -0700, Bart Van Assche wrote: > On 5/20/21 7:48 AM, Jason Gunthorpe wrote: > > On Tue, May 11, 2021 at 08:27:50PM -0700, Bart Van Assche wrote: > >> @@ -107,10 +107,10 @@ struct srp_direct_buf { > >> * having the 20-byte structure padded to 24 bytes on 64-bit architectures. > >> */ > >> struct srp_indirect_buf { > >> - struct srp_direct_buf table_desc; > >> + struct srp_direct_buf table_desc __packed; > >> __be32 len; > >> - struct srp_direct_buf desc_list[]; > >> -} __attribute__((packed)); > >> + struct srp_direct_buf desc_list[] __packed; > >> +}; > >> > >> /* Immediate data buffer descriptor as defined in SRP2. */ > >> struct srp_imm_buf { > >> @@ -175,13 +175,13 @@ struct srp_login_rsp { > >> u8 opcode; > >> u8 reserved1[3]; > >> __be32 req_lim_delta; > >> - u64 tag; > >> + u64 tag __packed; > > > > What you really want is just something like this: > > > > typedef u64 __attribute__((aligned(4))) compat_u64; > > > > And then use that every place you have the u64 and forget about packed > > entirely. > > Really? My understanding is that the aligned attribute can be used to > increase alignment of a structure member but not to decrease it. I didn't test it, but that is pre-existing code in Linux.. Maybe it doesn't work and/or needs packed too > Additionally, there is a recommendation in > Documentation/process/coding-style.rst not to introduce new typedefs. That we tend to selective ignore <shrug> > > Except for a couple exceptions IBA mads are always aligned to 4 bytes, > > only the 64 bit quantities are unaligned. > > > > But really this whole thing should be replaced with the IBA_FIELD > > macros like include/rdma/ibta_vol1_c12.h demos. > > > > Then it would be sparse safe and obviously endian correct as well. > > I prefer a structure over the IBA_FIELD macros so I will change __packed > into __packed __aligned(4). IMHO the struct is alot worse due to lack of endian safety and complexity in establishing the layout. Jason ^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH 4/5] RDMA/srp: Fix a recently introduced memory leak 2021-05-12 3:27 [PATCH 0/5] SRP kernel patches for kernel v5.14 Bart Van Assche ` (2 preceding siblings ...) 2021-05-12 3:27 ` [PATCH 3/5] RDMA/srp: Apply the __packed attribute to members instead of structures Bart Van Assche @ 2021-05-12 3:27 ` Bart Van Assche 2021-05-12 8:15 ` Max Gurtovoy 2021-05-12 3:27 ` [PATCH 5/5] RDMA/srp: Make struct scsi_cmnd and struct srp_request adjacent Bart Van Assche 4 siblings, 1 reply; 17+ messages in thread From: Bart Van Assche @ 2021-05-12 3:27 UTC (permalink / raw) To: Jason Gunthorpe Cc: Leon Romanovsky, Doug Ledford, linux-rdma, Bart Van Assche, Max Gurtovoy, Nicolas Morey-Chaisemartin Only allocate an mr_list if it will be used and if it will be freed. Cc: Max Gurtovoy <maxg@mellanox.com> Cc: Nicolas Morey-Chaisemartin <nmoreychaisemartin@suse.com> Fixes: f273ad4f8d90 ("RDMA/srp: Remove support for FMR memory registration") Signed-off-by: Bart Van Assche <bvanassche@acm.org> --- drivers/infiniband/ulp/srp/ib_srp.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/drivers/infiniband/ulp/srp/ib_srp.c b/drivers/infiniband/ulp/srp/ib_srp.c index 0f66bf015db6..52db42af421b 100644 --- a/drivers/infiniband/ulp/srp/ib_srp.c +++ b/drivers/infiniband/ulp/srp/ib_srp.c @@ -1009,12 +1009,13 @@ static int srp_alloc_req_data(struct srp_rdma_ch *ch) for (i = 0; i < target->req_ring_size; ++i) { req = &ch->req_ring[i]; - mr_list = kmalloc_array(target->mr_per_cmd, sizeof(void *), - GFP_KERNEL); - if (!mr_list) - goto out; - if (srp_dev->use_fast_reg) + if (srp_dev->use_fast_reg) { + mr_list = kmalloc_array(target->mr_per_cmd, + sizeof(void *), GFP_KERNEL); + if (!mr_list) + goto out; req->fr_list = mr_list; + } req->indirect_desc = kmalloc(target->indirect_size, GFP_KERNEL); if (!req->indirect_desc) goto out; ^ permalink raw reply related [flat|nested] 17+ messages in thread
* Re: [PATCH 4/5] RDMA/srp: Fix a recently introduced memory leak 2021-05-12 3:27 ` [PATCH 4/5] RDMA/srp: Fix a recently introduced memory leak Bart Van Assche @ 2021-05-12 8:15 ` Max Gurtovoy 2021-05-12 16:14 ` Bart Van Assche 0 siblings, 1 reply; 17+ messages in thread From: Max Gurtovoy @ 2021-05-12 8:15 UTC (permalink / raw) To: Bart Van Assche, Jason Gunthorpe Cc: Leon Romanovsky, Doug Ledford, linux-rdma, Max Gurtovoy, Nicolas Morey-Chaisemartin On 5/12/2021 6:27 AM, Bart Van Assche wrote: > Only allocate an mr_list if it will be used and if it will be freed. > > Cc: Max Gurtovoy <maxg@mellanox.com> > Cc: Nicolas Morey-Chaisemartin <nmoreychaisemartin@suse.com> > Fixes: f273ad4f8d90 ("RDMA/srp: Remove support for FMR memory registration") > Signed-off-by: Bart Van Assche <bvanassche@acm.org> > --- > drivers/infiniband/ulp/srp/ib_srp.c | 11 ++++++----- > 1 file changed, 6 insertions(+), 5 deletions(-) > > diff --git a/drivers/infiniband/ulp/srp/ib_srp.c b/drivers/infiniband/ulp/srp/ib_srp.c > index 0f66bf015db6..52db42af421b 100644 > --- a/drivers/infiniband/ulp/srp/ib_srp.c > +++ b/drivers/infiniband/ulp/srp/ib_srp.c > @@ -1009,12 +1009,13 @@ static int srp_alloc_req_data(struct srp_rdma_ch *ch) > > for (i = 0; i < target->req_ring_size; ++i) { > req = &ch->req_ring[i]; > - mr_list = kmalloc_array(target->mr_per_cmd, sizeof(void *), > - GFP_KERNEL); > - if (!mr_list) > - goto out; > - if (srp_dev->use_fast_reg) > + if (srp_dev->use_fast_reg) { > + mr_list = kmalloc_array(target->mr_per_cmd, > + sizeof(void *), GFP_KERNEL); > + if (!mr_list) > + goto out; > req->fr_list = mr_list; > + } > req->indirect_desc = kmalloc(target->indirect_size, GFP_KERNEL); > if (!req->indirect_desc) > goto out; Looks good, maybe we can remove the local mr_list variable while we're here ? otherwise, Reviewed-by: Max Gurtovoy <mgurtovoy@nvidia.com> ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH 4/5] RDMA/srp: Fix a recently introduced memory leak 2021-05-12 8:15 ` Max Gurtovoy @ 2021-05-12 16:14 ` Bart Van Assche 0 siblings, 0 replies; 17+ messages in thread From: Bart Van Assche @ 2021-05-12 16:14 UTC (permalink / raw) To: Max Gurtovoy, Jason Gunthorpe Cc: Leon Romanovsky, Doug Ledford, linux-rdma, Max Gurtovoy, Nicolas Morey-Chaisemartin On 5/12/21 1:15 AM, Max Gurtovoy wrote: > maybe we can remove the local mr_list variable while we're here ? > > otherwise, > > Reviewed-by: Max Gurtovoy <mgurtovoy@nvidia.com> Hi Max, I will remove the mr_list variable if I have to repost this patch series. Thanks, Bart. ^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH 5/5] RDMA/srp: Make struct scsi_cmnd and struct srp_request adjacent 2021-05-12 3:27 [PATCH 0/5] SRP kernel patches for kernel v5.14 Bart Van Assche ` (3 preceding siblings ...) 2021-05-12 3:27 ` [PATCH 4/5] RDMA/srp: Fix a recently introduced memory leak Bart Van Assche @ 2021-05-12 3:27 ` Bart Van Assche 2021-05-19 9:09 ` Leon Romanovsky 4 siblings, 1 reply; 17+ messages in thread From: Bart Van Assche @ 2021-05-12 3:27 UTC (permalink / raw) To: Jason Gunthorpe Cc: Leon Romanovsky, Doug Ledford, linux-rdma, Bart Van Assche, Nicolas Morey-Chaisemartin Define .init_cmd_priv and .exit_cmd_priv callback functions in struct scsi_host_template. Set .cmd_size such that the SCSI core allocates per-command private data. Use scsi_cmd_priv() to access that private data. Remove the req_ring pointer from struct srp_rdma_ch since it is no longer necessary. Convert srp_alloc_req_data() and srp_free_req_data() into functions that initialize one instance of the SRP-private command data. This is a micro-optimization since this patch removes several pointer dereferences from the hot path. Note: due to commit e73a5e8e8003 ("scsi: core: Only return started requests from scsi_host_find_tag()"), it is no longer necessary to protect the completion path against duplicate responses. Cc: Nicolas Morey-Chaisemartin <nmoreychaisemartin@suse.com> Signed-off-by: Bart Van Assche <bvanassche@acm.org> --- drivers/infiniband/ulp/srp/ib_srp.c | 156 ++++++++++++---------------- drivers/infiniband/ulp/srp/ib_srp.h | 2 - 2 files changed, 65 insertions(+), 93 deletions(-) diff --git a/drivers/infiniband/ulp/srp/ib_srp.c b/drivers/infiniband/ulp/srp/ib_srp.c index 52db42af421b..773ac5929082 100644 --- a/drivers/infiniband/ulp/srp/ib_srp.c +++ b/drivers/infiniband/ulp/srp/ib_srp.c @@ -965,69 +965,55 @@ static void srp_disconnect_target(struct srp_target_port *target) } } -static void srp_free_req_data(struct srp_target_port *target, - struct srp_rdma_ch *ch) +static int srp_exit_cmd_priv(struct Scsi_Host *shost, struct scsi_cmnd *cmd) { + struct srp_target_port *target = host_to_target(shost); struct srp_device *dev = target->srp_host->srp_dev; struct ib_device *ibdev = dev->dev; - struct srp_request *req; - int i; + struct srp_request *req = scsi_cmd_priv(cmd); - if (!ch->req_ring) - return; - - for (i = 0; i < target->req_ring_size; ++i) { - req = &ch->req_ring[i]; - if (dev->use_fast_reg) - kfree(req->fr_list); - if (req->indirect_dma_addr) { - ib_dma_unmap_single(ibdev, req->indirect_dma_addr, - target->indirect_size, - DMA_TO_DEVICE); - } - kfree(req->indirect_desc); + if (dev->use_fast_reg) + kfree(req->fr_list); + if (req->indirect_dma_addr) { + ib_dma_unmap_single(ibdev, req->indirect_dma_addr, + target->indirect_size, + DMA_TO_DEVICE); } + kfree(req->indirect_desc); - kfree(ch->req_ring); - ch->req_ring = NULL; + return 0; } -static int srp_alloc_req_data(struct srp_rdma_ch *ch) +static int srp_init_cmd_priv(struct Scsi_Host *shost, struct scsi_cmnd *cmd) { - struct srp_target_port *target = ch->target; + struct srp_target_port *target = host_to_target(shost); struct srp_device *srp_dev = target->srp_host->srp_dev; struct ib_device *ibdev = srp_dev->dev; - struct srp_request *req; + struct srp_request *req = scsi_cmd_priv(cmd); void *mr_list; dma_addr_t dma_addr; - int i, ret = -ENOMEM; - - ch->req_ring = kcalloc(target->req_ring_size, sizeof(*ch->req_ring), - GFP_KERNEL); - if (!ch->req_ring) - goto out; + int ret = -ENOMEM; - for (i = 0; i < target->req_ring_size; ++i) { - req = &ch->req_ring[i]; - if (srp_dev->use_fast_reg) { - mr_list = kmalloc_array(target->mr_per_cmd, - sizeof(void *), GFP_KERNEL); - if (!mr_list) - goto out; - req->fr_list = mr_list; - } - req->indirect_desc = kmalloc(target->indirect_size, GFP_KERNEL); - if (!req->indirect_desc) - goto out; - - dma_addr = ib_dma_map_single(ibdev, req->indirect_desc, - target->indirect_size, - DMA_TO_DEVICE); - if (ib_dma_mapping_error(ibdev, dma_addr)) + if (srp_dev->use_fast_reg) { + mr_list = kmalloc_array(target->mr_per_cmd, sizeof(void *), + GFP_KERNEL); + if (!mr_list) goto out; + req->fr_list = mr_list; + } + req->indirect_desc = kmalloc(target->indirect_size, GFP_KERNEL); + if (!req->indirect_desc) + goto out; - req->indirect_dma_addr = dma_addr; + dma_addr = ib_dma_map_single(ibdev, req->indirect_desc, + target->indirect_size, + DMA_TO_DEVICE); + if (ib_dma_mapping_error(ibdev, dma_addr)) { + srp_exit_cmd_priv(shost, cmd); + goto out; } + + req->indirect_dma_addr = dma_addr; ret = 0; out: @@ -1069,10 +1055,6 @@ static void srp_remove_target(struct srp_target_port *target) } cancel_work_sync(&target->tl_err_work); srp_rport_put(target->rport); - for (i = 0; i < target->ch_count; i++) { - ch = &target->ch[i]; - srp_free_req_data(target, ch); - } kfree(target->ch); target->ch = NULL; @@ -1291,22 +1273,32 @@ static void srp_finish_req(struct srp_rdma_ch *ch, struct srp_request *req, } } -static void srp_terminate_io(struct srp_rport *rport) +struct srp_terminate_context { + struct srp_target_port *srp_target; + int scsi_result; +}; + +static bool srp_terminate_cmd(struct scsi_cmnd *scmnd, void *context_ptr, + bool reserved) { - struct srp_target_port *target = rport->lld_data; - struct srp_rdma_ch *ch; - int i, j; + struct srp_terminate_context *context = context_ptr; + struct srp_target_port *target = context->srp_target; + u32 tag = blk_mq_unique_tag(scmnd->request); + struct srp_rdma_ch *ch = &target->ch[blk_mq_unique_tag_to_hwq(tag)]; + struct srp_request *req = scsi_cmd_priv(scmnd); - for (i = 0; i < target->ch_count; i++) { - ch = &target->ch[i]; + srp_finish_req(ch, req, NULL, context->scsi_result); - for (j = 0; j < target->req_ring_size; ++j) { - struct srp_request *req = &ch->req_ring[j]; + return true; +} - srp_finish_req(ch, req, NULL, - DID_TRANSPORT_FAILFAST << 16); - } - } +static void srp_terminate_io(struct srp_rport *rport) +{ + struct srp_target_port *target = rport->lld_data; + struct srp_terminate_context context = { .srp_target = target, + .scsi_result = DID_TRANSPORT_FAILFAST << 16 }; + + scsi_host_busy_iter(target->scsi_host, srp_terminate_cmd, &context); } /* Calculate maximum initiator to target information unit length. */ @@ -1362,13 +1354,12 @@ static int srp_rport_reconnect(struct srp_rport *rport) ch = &target->ch[i]; ret += srp_new_cm_id(ch); } - for (i = 0; i < target->ch_count; i++) { - ch = &target->ch[i]; - for (j = 0; j < target->req_ring_size; ++j) { - struct srp_request *req = &ch->req_ring[j]; + { + struct srp_terminate_context context = { + .srp_target = target, .scsi_result = DID_RESET << 16}; - srp_finish_req(ch, req, NULL, DID_RESET << 16); - } + scsi_host_busy_iter(target->scsi_host, srp_terminate_cmd, + &context); } for (i = 0; i < target->ch_count; i++) { ch = &target->ch[i]; @@ -1964,13 +1955,10 @@ static void srp_process_rsp(struct srp_rdma_ch *ch, struct srp_rsp *rsp) spin_unlock_irqrestore(&ch->lock, flags); } else { scmnd = scsi_host_find_tag(target->scsi_host, rsp->tag); - if (scmnd && scmnd->host_scribble) { - req = (void *)scmnd->host_scribble; + if (scmnd) { + req = scsi_cmd_priv(scmnd); scmnd = srp_claim_req(ch, req, NULL, scmnd); } else { - scmnd = NULL; - } - if (!scmnd) { shost_printk(KERN_ERR, target->scsi_host, "Null scmnd for RSP w/tag %#016llx received on ch %td / QP %#x\n", rsp->tag, ch - target->ch, ch->qp->qp_num); @@ -2002,7 +1990,6 @@ static void srp_process_rsp(struct srp_rdma_ch *ch, struct srp_rsp *rsp) srp_free_req(ch, req, scmnd, be32_to_cpu(rsp->req_lim_delta)); - scmnd->host_scribble = NULL; scmnd->scsi_done(scmnd); } } @@ -2170,13 +2157,12 @@ static int srp_queuecommand(struct Scsi_Host *shost, struct scsi_cmnd *scmnd) { struct srp_target_port *target = host_to_target(shost); struct srp_rdma_ch *ch; - struct srp_request *req; + struct srp_request *req = scsi_cmd_priv(scmnd); struct srp_iu *iu; struct srp_cmd *cmd; struct ib_device *dev; unsigned long flags; u32 tag; - u16 idx; int len, ret; scmnd->result = srp_chkready(target->rport); @@ -2186,10 +2172,6 @@ static int srp_queuecommand(struct Scsi_Host *shost, struct scsi_cmnd *scmnd) WARN_ON_ONCE(scmnd->request->tag < 0); tag = blk_mq_unique_tag(scmnd->request); ch = &target->ch[blk_mq_unique_tag_to_hwq(tag)]; - idx = blk_mq_unique_tag_to_tag(tag); - WARN_ONCE(idx >= target->req_ring_size, "%s: tag %#x: idx %d >= %d\n", - dev_name(&shost->shost_gendev), tag, idx, - target->req_ring_size); spin_lock_irqsave(&ch->lock, flags); iu = __srp_get_tx_iu(ch, SRP_IU_CMD); @@ -2198,13 +2180,10 @@ static int srp_queuecommand(struct Scsi_Host *shost, struct scsi_cmnd *scmnd) if (!iu) goto err; - req = &ch->req_ring[idx]; dev = target->srp_host->srp_dev->dev; ib_dma_sync_single_for_cpu(dev, iu->dma, ch->max_it_iu_len, DMA_TO_DEVICE); - scmnd->host_scribble = (void *) req; - cmd = iu->buf; memset(cmd, 0, sizeof *cmd); @@ -3085,6 +3064,8 @@ static struct scsi_host_template srp_template = { .target_alloc = srp_target_alloc, .slave_configure = srp_slave_configure, .info = srp_target_info, + .init_cmd_priv = srp_init_cmd_priv, + .exit_cmd_priv = srp_exit_cmd_priv, .queuecommand = srp_queuecommand, .change_queue_depth = srp_change_queue_depth, .eh_timed_out = srp_timed_out, @@ -3098,6 +3079,7 @@ static struct scsi_host_template srp_template = { .cmd_per_lun = SRP_DEFAULT_CMD_SQ_SIZE, .shost_attrs = srp_host_attrs, .track_queue_depth = 1, + .cmd_size = sizeof(struct srp_request), }; static int srp_sdev_count(struct Scsi_Host *host) @@ -3677,8 +3659,6 @@ static ssize_t srp_create_target(struct device *dev, if (ret) goto out; - target->req_ring_size = target->queue_size - SRP_TSK_MGMT_SQ_SIZE; - if (!srp_conn_unique(target->srp_host, target)) { if (target->using_rdma_cm) { shost_printk(KERN_INFO, target->scsi_host, @@ -3781,10 +3761,6 @@ static ssize_t srp_create_target(struct device *dev, if (ret) goto err_disconnect; - ret = srp_alloc_req_data(ch); - if (ret) - goto err_disconnect; - ret = srp_connect_ch(ch, max_iu_len, multich); if (ret) { char dst[64]; @@ -3803,7 +3779,6 @@ static ssize_t srp_create_target(struct device *dev, goto free_ch; } else { srp_free_ch_ib(target, ch); - srp_free_req_data(target, ch); target->ch_count = ch - target->ch; goto connected; } @@ -3864,7 +3839,6 @@ static ssize_t srp_create_target(struct device *dev, for (i = 0; i < target->ch_count; i++) { ch = &target->ch[i]; srp_free_ch_ib(target, ch); - srp_free_req_data(target, ch); } kfree(target->ch); diff --git a/drivers/infiniband/ulp/srp/ib_srp.h b/drivers/infiniband/ulp/srp/ib_srp.h index 6818cac0a3b7..abccddeea1e3 100644 --- a/drivers/infiniband/ulp/srp/ib_srp.h +++ b/drivers/infiniband/ulp/srp/ib_srp.h @@ -174,7 +174,6 @@ struct srp_rdma_ch { struct srp_iu **tx_ring; struct srp_iu **rx_ring; - struct srp_request *req_ring; int comp_vector; u64 tsk_mgmt_tag; @@ -220,7 +219,6 @@ struct srp_target_port { int mr_pool_size; int mr_per_cmd; int queue_size; - int req_ring_size; int comp_vector; int tl_retry_count; ^ permalink raw reply related [flat|nested] 17+ messages in thread
* Re: [PATCH 5/5] RDMA/srp: Make struct scsi_cmnd and struct srp_request adjacent 2021-05-12 3:27 ` [PATCH 5/5] RDMA/srp: Make struct scsi_cmnd and struct srp_request adjacent Bart Van Assche @ 2021-05-19 9:09 ` Leon Romanovsky 2021-05-19 15:13 ` Bart Van Assche 0 siblings, 1 reply; 17+ messages in thread From: Leon Romanovsky @ 2021-05-19 9:09 UTC (permalink / raw) To: Bart Van Assche Cc: Jason Gunthorpe, Doug Ledford, linux-rdma, Nicolas Morey-Chaisemartin On Tue, May 11, 2021 at 08:27:52PM -0700, Bart Van Assche wrote: > Define .init_cmd_priv and .exit_cmd_priv callback functions in struct > scsi_host_template. Set .cmd_size such that the SCSI core allocates > per-command private data. Use scsi_cmd_priv() to access that private > data. Remove the req_ring pointer from struct srp_rdma_ch since it is > no longer necessary. Convert srp_alloc_req_data() and srp_free_req_data() > into functions that initialize one instance of the SRP-private command > data. This is a micro-optimization since this patch removes several > pointer dereferences from the hot path. > > Note: due to commit e73a5e8e8003 ("scsi: core: Only return started requests > from scsi_host_find_tag()"), it is no longer necessary to protect the > completion path against duplicate responses. > > Cc: Nicolas Morey-Chaisemartin <nmoreychaisemartin@suse.com> > Signed-off-by: Bart Van Assche <bvanassche@acm.org> > --- > drivers/infiniband/ulp/srp/ib_srp.c | 156 ++++++++++++---------------- > drivers/infiniband/ulp/srp/ib_srp.h | 2 - > 2 files changed, 65 insertions(+), 93 deletions(-) > > diff --git a/drivers/infiniband/ulp/srp/ib_srp.c b/drivers/infiniband/ulp/srp/ib_srp.c > index 52db42af421b..773ac5929082 100644 > --- a/drivers/infiniband/ulp/srp/ib_srp.c > +++ b/drivers/infiniband/ulp/srp/ib_srp.c > @@ -965,69 +965,55 @@ static void srp_disconnect_target(struct srp_target_port *target) > } > } > > -static void srp_free_req_data(struct srp_target_port *target, > - struct srp_rdma_ch *ch) > +static int srp_exit_cmd_priv(struct Scsi_Host *shost, struct scsi_cmnd *cmd) > { > + struct srp_target_port *target = host_to_target(shost); > struct srp_device *dev = target->srp_host->srp_dev; > struct ib_device *ibdev = dev->dev; > - struct srp_request *req; > - int i; > + struct srp_request *req = scsi_cmd_priv(cmd); > > - if (!ch->req_ring) > - return; > - > - for (i = 0; i < target->req_ring_size; ++i) { > - req = &ch->req_ring[i]; > - if (dev->use_fast_reg) > - kfree(req->fr_list); > - if (req->indirect_dma_addr) { > - ib_dma_unmap_single(ibdev, req->indirect_dma_addr, > - target->indirect_size, > - DMA_TO_DEVICE); > - } > - kfree(req->indirect_desc); > + if (dev->use_fast_reg) > + kfree(req->fr_list); Isn't cleaner will be to ensure that fr_list is NULL for !dev->use_fast_reg path? In patch #4 https://lore.kernel.org/linux-rdma/20210512032752.16611-5-bvanassche@acm.org Thanks ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH 5/5] RDMA/srp: Make struct scsi_cmnd and struct srp_request adjacent 2021-05-19 9:09 ` Leon Romanovsky @ 2021-05-19 15:13 ` Bart Van Assche 2021-05-19 15:32 ` Leon Romanovsky 0 siblings, 1 reply; 17+ messages in thread From: Bart Van Assche @ 2021-05-19 15:13 UTC (permalink / raw) To: Leon Romanovsky Cc: Jason Gunthorpe, Doug Ledford, linux-rdma, Nicolas Morey-Chaisemartin On 5/19/21 2:09 AM, Leon Romanovsky wrote: > On Tue, May 11, 2021 at 08:27:52PM -0700, Bart Van Assche wrote: >> -static void srp_free_req_data(struct srp_target_port *target, >> - struct srp_rdma_ch *ch) >> +static int srp_exit_cmd_priv(struct Scsi_Host *shost, struct scsi_cmnd *cmd) >> { >> + struct srp_target_port *target = host_to_target(shost); >> struct srp_device *dev = target->srp_host->srp_dev; >> struct ib_device *ibdev = dev->dev; >> - struct srp_request *req; >> - int i; >> + struct srp_request *req = scsi_cmd_priv(cmd); >> >> - if (!ch->req_ring) >> - return; >> - >> - for (i = 0; i < target->req_ring_size; ++i) { >> - req = &ch->req_ring[i]; >> - if (dev->use_fast_reg) >> - kfree(req->fr_list); >> - if (req->indirect_dma_addr) { >> - ib_dma_unmap_single(ibdev, req->indirect_dma_addr, >> - target->indirect_size, >> - DMA_TO_DEVICE); >> - } >> - kfree(req->indirect_desc); >> + if (dev->use_fast_reg) >> + kfree(req->fr_list); > > Isn't cleaner will be to ensure that fr_list is NULL for !dev->use_fast_reg path? > In patch #4 https://lore.kernel.org/linux-rdma/20210512032752.16611-5-bvanassche@acm.org Hi Leon, I think that per-request private data is zero-initialized and hence that it is not necessary to clear req->fr_list explicitly. blk_mq_alloc_rqs() passes __GFP_ZERO to alloc_pages_node(). blk_mq_alloc_rqs() does not only allocate block layer requests (struct request) but also per-request private data (set->cmd_size). Thanks, Bart. ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH 5/5] RDMA/srp: Make struct scsi_cmnd and struct srp_request adjacent 2021-05-19 15:13 ` Bart Van Assche @ 2021-05-19 15:32 ` Leon Romanovsky 0 siblings, 0 replies; 17+ messages in thread From: Leon Romanovsky @ 2021-05-19 15:32 UTC (permalink / raw) To: Bart Van Assche Cc: Jason Gunthorpe, Doug Ledford, linux-rdma, Nicolas Morey-Chaisemartin On Wed, May 19, 2021 at 08:13:09AM -0700, Bart Van Assche wrote: > On 5/19/21 2:09 AM, Leon Romanovsky wrote: > > On Tue, May 11, 2021 at 08:27:52PM -0700, Bart Van Assche wrote: > >> -static void srp_free_req_data(struct srp_target_port *target, > >> - struct srp_rdma_ch *ch) > >> +static int srp_exit_cmd_priv(struct Scsi_Host *shost, struct scsi_cmnd *cmd) > >> { > >> + struct srp_target_port *target = host_to_target(shost); > >> struct srp_device *dev = target->srp_host->srp_dev; > >> struct ib_device *ibdev = dev->dev; > >> - struct srp_request *req; > >> - int i; > >> + struct srp_request *req = scsi_cmd_priv(cmd); > >> > >> - if (!ch->req_ring) > >> - return; > >> - > >> - for (i = 0; i < target->req_ring_size; ++i) { > >> - req = &ch->req_ring[i]; > >> - if (dev->use_fast_reg) > >> - kfree(req->fr_list); > >> - if (req->indirect_dma_addr) { > >> - ib_dma_unmap_single(ibdev, req->indirect_dma_addr, > >> - target->indirect_size, > >> - DMA_TO_DEVICE); > >> - } > >> - kfree(req->indirect_desc); > >> + if (dev->use_fast_reg) > >> + kfree(req->fr_list); > > > > Isn't cleaner will be to ensure that fr_list is NULL for !dev->use_fast_reg path? > > In patch #4 https://lore.kernel.org/linux-rdma/20210512032752.16611-5-bvanassche@acm.org > > Hi Leon, > > I think that per-request private data is zero-initialized and hence that > it is not necessary to clear req->fr_list explicitly. blk_mq_alloc_rqs() > passes __GFP_ZERO to alloc_pages_node(). blk_mq_alloc_rqs() does not > only allocate block layer requests (struct request) but also per-request > private data (set->cmd_size). So you don't need this "if (dev->use_fast_reg)" check. Thanks > > Thanks, > > Bart. > > ^ permalink raw reply [flat|nested] 17+ messages in thread
end of thread, other threads:[~2021-05-24 23:00 UTC | newest] Thread overview: 17+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2021-05-12 3:27 [PATCH 0/5] SRP kernel patches for kernel v5.14 Bart Van Assche 2021-05-12 3:27 ` [PATCH 1/5] RDMA/ib_hdrs.h: Remove a superfluous cast Bart Van Assche 2021-05-19 9:00 ` Leon Romanovsky 2021-05-24 3:12 ` Bart Van Assche 2021-05-12 3:27 ` [PATCH 2/5] RDMA/srp: Add more structure size checks Bart Van Assche 2021-05-19 9:01 ` Leon Romanovsky 2021-05-12 3:27 ` [PATCH 3/5] RDMA/srp: Apply the __packed attribute to members instead of structures Bart Van Assche 2021-05-20 14:48 ` Jason Gunthorpe 2021-05-24 3:41 ` Bart Van Assche 2021-05-24 23:00 ` Jason Gunthorpe 2021-05-12 3:27 ` [PATCH 4/5] RDMA/srp: Fix a recently introduced memory leak Bart Van Assche 2021-05-12 8:15 ` Max Gurtovoy 2021-05-12 16:14 ` Bart Van Assche 2021-05-12 3:27 ` [PATCH 5/5] RDMA/srp: Make struct scsi_cmnd and struct srp_request adjacent Bart Van Assche 2021-05-19 9:09 ` Leon Romanovsky 2021-05-19 15:13 ` Bart Van Assche 2021-05-19 15:32 ` Leon Romanovsky
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox