* Re: [PATCH net] net/smc: Fix lookup of netdev by using ib_device_get_netdev() [not found] ` <20241106135910.GF5006@unreal> @ 2024-11-07 11:56 ` Halil Pasic 2024-11-07 12:13 ` Leon Romanovsky 2024-11-07 23:40 ` Namjae Jeon 0 siblings, 2 replies; 20+ messages in thread From: Halil Pasic @ 2024-11-07 11:56 UTC (permalink / raw) To: Leon Romanovsky Cc: Wenjia Zhang, Wen Gu, D. Wythe, Tony Lu, David Miller, Jakub Kicinski, Eric Dumazet, Paolo Abeni, netdev, linux-rdma, linux-s390, Heiko Carstens, Jan Karcher, Gerd Bayer, Alexandra Winter, Nils Hoppmann, Niklas Schnell, Thorsten Winkler, Karsten Graul, Stefan Raspl, Aswin K, Halil Pasic, linux-cifs On Wed, 6 Nov 2024 15:59:10 +0200 Leon Romanovsky <leon@kernel.org> wrote: > > Does fs/smb/server/transport_rdma.c qualify as inside of RDMA core code? > > RDMA core code is drivers/infiniband/core/*. Understood. So this is a violation of the no direct access to the callbacks rule. > > > I would guess it is not, and I would not actually mind sending a patch > > but I have trouble figuring out the logic behind commit ecce70cf17d9 > > ("ksmbd: fix missing RDMA-capable flag for IPoIB device in > > ksmbd_rdma_capable_netdev()"). > > It is strange version of RDMA-CM. All other ULPs use RDMA-CM to avoid > GID, netdev and fabric complexity. I'm not familiar enough with either of the subsystems. Based on your answer my guess is that it ain't outright bugous but still a layering violation. Copying linux-cifs@vger.kernel.org so that the smb are aware. Thank you very much for all the explanations! Regards, Halil ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH net] net/smc: Fix lookup of netdev by using ib_device_get_netdev() 2024-11-07 11:56 ` [PATCH net] net/smc: Fix lookup of netdev by using ib_device_get_netdev() Halil Pasic @ 2024-11-07 12:13 ` Leon Romanovsky 2024-11-07 23:40 ` Namjae Jeon 1 sibling, 0 replies; 20+ messages in thread From: Leon Romanovsky @ 2024-11-07 12:13 UTC (permalink / raw) To: Halil Pasic Cc: Wenjia Zhang, Wen Gu, D. Wythe, Tony Lu, David Miller, Jakub Kicinski, Eric Dumazet, Paolo Abeni, netdev, linux-rdma, linux-s390, Heiko Carstens, Jan Karcher, Gerd Bayer, Alexandra Winter, Nils Hoppmann, Niklas Schnell, Thorsten Winkler, Karsten Graul, Stefan Raspl, Aswin K, linux-cifs On Thu, Nov 07, 2024 at 12:56:43PM +0100, Halil Pasic wrote: > On Wed, 6 Nov 2024 15:59:10 +0200 > Leon Romanovsky <leon@kernel.org> wrote: > > > > Does fs/smb/server/transport_rdma.c qualify as inside of RDMA core code? > > > > RDMA core code is drivers/infiniband/core/*. > > Understood. So this is a violation of the no direct access to the > callbacks rule. It is not rule, but more common sense. Callbacks don't provide any module reference counting, module autoload e.t.c It is very rare situation where you call device callbacks from one subsystem in another. I'm not familiar with such situations. > > > > > > I would guess it is not, and I would not actually mind sending a patch > > > but I have trouble figuring out the logic behind commit ecce70cf17d9 > > > ("ksmbd: fix missing RDMA-capable flag for IPoIB device in > > > ksmbd_rdma_capable_netdev()"). > > > > It is strange version of RDMA-CM. All other ULPs use RDMA-CM to avoid > > GID, netdev and fabric complexity. > > I'm not familiar enough with either of the subsystems. Based on your > answer my guess is that it ain't outright bugous but still a layering > violation. Copying linux-cifs@vger.kernel.org so that > the smb are aware. > > Thank you very much for all the explanations! > > Regards, > Halil ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH net] net/smc: Fix lookup of netdev by using ib_device_get_netdev() 2024-11-07 11:56 ` [PATCH net] net/smc: Fix lookup of netdev by using ib_device_get_netdev() Halil Pasic 2024-11-07 12:13 ` Leon Romanovsky @ 2024-11-07 23:40 ` Namjae Jeon 2024-11-08 17:59 ` Leon Romanovsky 1 sibling, 1 reply; 20+ messages in thread From: Namjae Jeon @ 2024-11-07 23:40 UTC (permalink / raw) To: Halil Pasic Cc: Leon Romanovsky, Wenjia Zhang, Wen Gu, D. Wythe, Tony Lu, David Miller, Jakub Kicinski, Eric Dumazet, Paolo Abeni, netdev, linux-rdma, linux-s390, Heiko Carstens, Jan Karcher, Gerd Bayer, Alexandra Winter, Nils Hoppmann, Niklas Schnell, Thorsten Winkler, Karsten Graul, Stefan Raspl, Aswin K, linux-cifs, Kangjing Huang On Thu, Nov 7, 2024 at 9:00 PM Halil Pasic <pasic@linux.ibm.com> wrote: > > On Wed, 6 Nov 2024 15:59:10 +0200 > Leon Romanovsky <leon@kernel.org> wrote: > > > > Does fs/smb/server/transport_rdma.c qualify as inside of RDMA core code? > > > > RDMA core code is drivers/infiniband/core/*. > > Understood. So this is a violation of the no direct access to the > callbacks rule. > > > > > > I would guess it is not, and I would not actually mind sending a patch > > > but I have trouble figuring out the logic behind commit ecce70cf17d9 > > > ("ksmbd: fix missing RDMA-capable flag for IPoIB device in > > > ksmbd_rdma_capable_netdev()"). > > > > It is strange version of RDMA-CM. All other ULPs use RDMA-CM to avoid > > GID, netdev and fabric complexity. > > I'm not familiar enough with either of the subsystems. Based on your > answer my guess is that it ain't outright bugous but still a layering > violation. Copying linux-cifs@vger.kernel.org so that > the smb are aware. Could you please elaborate what the violation is ? I would also appreciate it if you could suggest to me how to fix this. Thanks. > > Thank you very much for all the explanations! > > Regards, > Halil > ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH net] net/smc: Fix lookup of netdev by using ib_device_get_netdev() 2024-11-07 23:40 ` Namjae Jeon @ 2024-11-08 17:59 ` Leon Romanovsky 2024-11-09 5:32 ` Namjae Jeon 2024-12-13 11:07 ` Kangjing Huang 0 siblings, 2 replies; 20+ messages in thread From: Leon Romanovsky @ 2024-11-08 17:59 UTC (permalink / raw) To: Namjae Jeon Cc: Halil Pasic, Wenjia Zhang, Wen Gu, D. Wythe, Tony Lu, David Miller, Jakub Kicinski, Eric Dumazet, Paolo Abeni, netdev, linux-rdma, linux-s390, Heiko Carstens, Jan Karcher, Gerd Bayer, Alexandra Winter, Nils Hoppmann, Niklas Schnell, Thorsten Winkler, Karsten Graul, Stefan Raspl, Aswin K, linux-cifs, Kangjing Huang On Fri, Nov 08, 2024 at 08:40:40AM +0900, Namjae Jeon wrote: > On Thu, Nov 7, 2024 at 9:00 PM Halil Pasic <pasic@linux.ibm.com> wrote: > > > > On Wed, 6 Nov 2024 15:59:10 +0200 > > Leon Romanovsky <leon@kernel.org> wrote: > > > > > > Does fs/smb/server/transport_rdma.c qualify as inside of RDMA core code? > > > > > > RDMA core code is drivers/infiniband/core/*. > > > > Understood. So this is a violation of the no direct access to the > > callbacks rule. > > > > > > > > > I would guess it is not, and I would not actually mind sending a patch > > > > but I have trouble figuring out the logic behind commit ecce70cf17d9 > > > > ("ksmbd: fix missing RDMA-capable flag for IPoIB device in > > > > ksmbd_rdma_capable_netdev()"). > > > > > > It is strange version of RDMA-CM. All other ULPs use RDMA-CM to avoid > > > GID, netdev and fabric complexity. > > > > I'm not familiar enough with either of the subsystems. Based on your > > answer my guess is that it ain't outright bugous but still a layering > > violation. Copying linux-cifs@vger.kernel.org so that > > the smb are aware. > Could you please elaborate what the violation is ? There are many, but the most screaming is that ksmbd has logic to differentiate IPoIB devices. These devices are pure netdev devices and should be treated like that. ULPs should treat them exactly as they treat netdev devices. > I would also appreciate it if you could suggest to me how to fix this. > > Thanks. > > > > Thank you very much for all the explanations! > > > > Regards, > > Halil > > ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH net] net/smc: Fix lookup of netdev by using ib_device_get_netdev() 2024-11-08 17:59 ` Leon Romanovsky @ 2024-11-09 5:32 ` Namjae Jeon 2024-12-13 11:07 ` Kangjing Huang 1 sibling, 0 replies; 20+ messages in thread From: Namjae Jeon @ 2024-11-09 5:32 UTC (permalink / raw) To: Leon Romanovsky Cc: Halil Pasic, Wenjia Zhang, Wen Gu, D. Wythe, Tony Lu, David Miller, Jakub Kicinski, Eric Dumazet, Paolo Abeni, netdev, linux-rdma, linux-s390, Heiko Carstens, Jan Karcher, Gerd Bayer, Alexandra Winter, Nils Hoppmann, Niklas Schnell, Thorsten Winkler, Karsten Graul, Stefan Raspl, Aswin K, linux-cifs, Kangjing Huang On Sat, Nov 9, 2024 at 2:59 AM Leon Romanovsky <leon@kernel.org> wrote: > > On Fri, Nov 08, 2024 at 08:40:40AM +0900, Namjae Jeon wrote: > > On Thu, Nov 7, 2024 at 9:00 PM Halil Pasic <pasic@linux.ibm.com> wrote: > > > > > > On Wed, 6 Nov 2024 15:59:10 +0200 > > > Leon Romanovsky <leon@kernel.org> wrote: > > > > > > > > Does fs/smb/server/transport_rdma.c qualify as inside of RDMA core code? > > > > > > > > RDMA core code is drivers/infiniband/core/*. > > > > > > Understood. So this is a violation of the no direct access to the > > > callbacks rule. > > > > > > > > > > > > I would guess it is not, and I would not actually mind sending a patch > > > > > but I have trouble figuring out the logic behind commit ecce70cf17d9 > > > > > ("ksmbd: fix missing RDMA-capable flag for IPoIB device in > > > > > ksmbd_rdma_capable_netdev()"). > > > > > > > > It is strange version of RDMA-CM. All other ULPs use RDMA-CM to avoid > > > > GID, netdev and fabric complexity. > > > > > > I'm not familiar enough with either of the subsystems. Based on your > > > answer my guess is that it ain't outright bugous but still a layering > > > violation. Copying linux-cifs@vger.kernel.org so that > > > the smb are aware. > > Could you please elaborate what the violation is ? > > There are many, but the most screaming is that ksmbd has logic to > differentiate IPoIB devices. These devices are pure netdev devices > and should be treated like that. ULPs should treat them exactly > as they treat netdev devices. Okay, I'll discuss with Kangjing if there's another way to avoid this issue. If not, I'll revert the patch. Thanks. > > > I would also appreciate it if you could suggest to me how to fix this. > > > > Thanks. > > > > > > Thank you very much for all the explanations! > > > > > > Regards, > > > Halil > > > ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH net] net/smc: Fix lookup of netdev by using ib_device_get_netdev() 2024-11-08 17:59 ` Leon Romanovsky 2024-11-09 5:32 ` Namjae Jeon @ 2024-12-13 11:07 ` Kangjing Huang 2024-12-13 12:15 ` Leon Romanovsky 2024-12-14 2:33 ` Namjae Jeon 1 sibling, 2 replies; 20+ messages in thread From: Kangjing Huang @ 2024-12-13 11:07 UTC (permalink / raw) To: Leon Romanovsky; +Cc: Namjae Jeon, linux-cifs Hi there, I am the original author of commit ecce70cf17d9 ("ksmbd: fix missing RDMA-capable flag for IPoIB device in ksmbd_rdma_capable_netdev()"), as mentioned in the thread. I am working on modifying the patch to take care of the layering violation. The original patch was meant to fix an issue with ksmbd, where an IPoIB netdev was not recognized as RDMA-capable. The original version of the capability evaluation tries to match each netdev to ib_device by calling get_netdev in ib verbs. However this only works in cases where the ib_device is the upper layer of netdev (e.g. RoCE), and since with IPoIB it is the other way around (netdev is the upper layer of ib_device), get_netdev won't work anymore. I tried to replicate the behavior of device matching reversely in the original version of my patch using GID, which ended up as the layering violation. However I am unaware of any exported functions from the IPoIB driver that could do the reverse lookup from netdev to the lower layer ib_device. Actually it seems that the IPoIB driver does not have any exported symbols at all. It might be that the device matching in reverse just does not make any sense and does not need to be done at all. As long as it is an IPoIB device (netdev->type == ARPHRD_INFINIBAND) it might be ok to just automatically assume it is RDMA-capable. I am not 100% sure about this though. I am uncertain about how to proceed at this point and would like to know your thoughts and opinions on this. Thanks, Kangjing On Fri, Nov 8, 2024 at 5:59 PM Leon Romanovsky <leon@kernel.org> wrote: > > On Fri, Nov 08, 2024 at 08:40:40AM +0900, Namjae Jeon wrote: > > On Thu, Nov 7, 2024 at 9:00 PM Halil Pasic <pasic@linux.ibm.com> wrote: > > > > > > On Wed, 6 Nov 2024 15:59:10 +0200 > > > Leon Romanovsky <leon@kernel.org> wrote: > > > > > > > > Does fs/smb/server/transport_rdma.c qualify as inside of RDMA core code? > > > > > > > > RDMA core code is drivers/infiniband/core/*. > > > > > > Understood. So this is a violation of the no direct access to the > > > callbacks rule. > > > > > > > > > > > > I would guess it is not, and I would not actually mind sending a patch > > > > > but I have trouble figuring out the logic behind commit ecce70cf17d9 > > > > > ("ksmbd: fix missing RDMA-capable flag for IPoIB device in > > > > > ksmbd_rdma_capable_netdev()"). > > > > > > > > It is strange version of RDMA-CM. All other ULPs use RDMA-CM to avoid > > > > GID, netdev and fabric complexity. > > > > > > I'm not familiar enough with either of the subsystems. Based on your > > > answer my guess is that it ain't outright bugous but still a layering > > > violation. Copying linux-cifs@vger.kernel.org so that > > > the smb are aware. > > Could you please elaborate what the violation is ? > > There are many, but the most screaming is that ksmbd has logic to > differentiate IPoIB devices. These devices are pure netdev devices > and should be treated like that. ULPs should treat them exactly > as they treat netdev devices. > > > I would also appreciate it if you could suggest to me how to fix this. > > > > Thanks. > > > > > > Thank you very much for all the explanations! > > > > > > Regards, > > > Halil > > > -- Kangjing "Chaser" Huang ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH net] net/smc: Fix lookup of netdev by using ib_device_get_netdev() 2024-12-13 11:07 ` Kangjing Huang @ 2024-12-13 12:15 ` Leon Romanovsky 2024-12-14 2:33 ` Namjae Jeon 1 sibling, 0 replies; 20+ messages in thread From: Leon Romanovsky @ 2024-12-13 12:15 UTC (permalink / raw) To: Kangjing Huang; +Cc: Namjae Jeon, linux-cifs On Fri, Dec 13, 2024, at 13:07, Kangjing Huang wrote: > Hi there, > > I am the original author of commit ecce70cf17d9 ("ksmbd: fix missing > RDMA-capable flag for IPoIB device in ksmbd_rdma_capable_netdev()"), > as mentioned in the thread. > > I am working on modifying the patch to take care of the layering > violation. The original patch was meant to fix an issue with ksmbd, > where an IPoIB netdev was not recognized as RDMA-capable. This is exactly the purpose and design of IPoIB, to present regular netdev to the users and hide IB layer from them. > The original > version of the capability evaluation tries to match each netdev to > ib_device by calling get_netdev in ib verbs. However this only works > in cases where the ib_device is the upper layer of netdev (e.g. RoCE), > and since with IPoIB it is the other way around (netdev is the upper > layer of ib_device), get_netdev won't work anymore. > > I tried to replicate the behavior of device matching reversely in the > original version of my patch using GID, which ended up as the layering > violation. However I am unaware of any exported functions from the > IPoIB driver that could do the reverse lookup from netdev to the lower > layer ib_device. Actually it seems that the IPoIB driver does not have > any exported symbols at all. > > It might be that the device matching in reverse just does not make any > sense and does not need to be done at all. As long as it is an IPoIB > device (netdev->type == ARPHRD_INFINIBAND) it might be ok to just > automatically assume it is RDMA-capable. I am not 100% sure about this > though. > > I am uncertain about how to proceed at this point and would like to > know your thoughts and opinions on this. Delete this code completely and make sure that ksmbd has two paths only. One for netdevs and one for ib_devices. It is upto users to decide on which interface to run. Thanks > > Thanks, > Kangjing > > On Fri, Nov 8, 2024 at 5:59 PM Leon Romanovsky <leon@kernel.org> wrote: >> >> On Fri, Nov 08, 2024 at 08:40:40AM +0900, Namjae Jeon wrote: >> > On Thu, Nov 7, 2024 at 9:00 PM Halil Pasic <pasic@linux.ibm.com> wrote: >> > > >> > > On Wed, 6 Nov 2024 15:59:10 +0200 >> > > Leon Romanovsky <leon@kernel.org> wrote: >> > > >> > > > > Does fs/smb/server/transport_rdma.c qualify as inside of RDMA core code? >> > > > >> > > > RDMA core code is drivers/infiniband/core/*. >> > > >> > > Understood. So this is a violation of the no direct access to the >> > > callbacks rule. >> > > >> > > > >> > > > > I would guess it is not, and I would not actually mind sending a patch >> > > > > but I have trouble figuring out the logic behind commit ecce70cf17d9 >> > > > > ("ksmbd: fix missing RDMA-capable flag for IPoIB device in >> > > > > ksmbd_rdma_capable_netdev()"). >> > > > >> > > > It is strange version of RDMA-CM. All other ULPs use RDMA-CM to avoid >> > > > GID, netdev and fabric complexity. >> > > >> > > I'm not familiar enough with either of the subsystems. Based on your >> > > answer my guess is that it ain't outright bugous but still a layering >> > > violation. Copying linux-cifs@vger.kernel.org so that >> > > the smb are aware. >> > Could you please elaborate what the violation is ? >> >> There are many, but the most screaming is that ksmbd has logic to >> differentiate IPoIB devices. These devices are pure netdev devices >> and should be treated like that. ULPs should treat them exactly >> as they treat netdev devices. >> >> > I would also appreciate it if you could suggest to me how to fix this. >> > >> > Thanks. >> > > >> > > Thank you very much for all the explanations! >> > > >> > > Regards, >> > > Halil >> > > > > > > -- > Kangjing "Chaser" Huang ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH net] net/smc: Fix lookup of netdev by using ib_device_get_netdev() 2024-12-13 11:07 ` Kangjing Huang 2024-12-13 12:15 ` Leon Romanovsky @ 2024-12-14 2:33 ` Namjae Jeon 2024-12-14 6:06 ` Leon Romanovsky 1 sibling, 1 reply; 20+ messages in thread From: Namjae Jeon @ 2024-12-14 2:33 UTC (permalink / raw) To: Kangjing Huang; +Cc: Leon Romanovsky, linux-cifs On Fri, Dec 13, 2024 at 8:07 PM Kangjing Huang <huangkangjing@gmail.com> wrote: > > Hi there, > > I am the original author of commit ecce70cf17d9 ("ksmbd: fix missing > RDMA-capable flag for IPoIB device in ksmbd_rdma_capable_netdev()"), > as mentioned in the thread. > > I am working on modifying the patch to take care of the layering > violation. The original patch was meant to fix an issue with ksmbd, > where an IPoIB netdev was not recognized as RDMA-capable. The original > version of the capability evaluation tries to match each netdev to > ib_device by calling get_netdev in ib verbs. However this only works > in cases where the ib_device is the upper layer of netdev (e.g. RoCE), > and since with IPoIB it is the other way around (netdev is the upper > layer of ib_device), get_netdev won't work anymore. > > I tried to replicate the behavior of device matching reversely in the > original version of my patch using GID, which ended up as the layering > violation. However I am unaware of any exported functions from the > IPoIB driver that could do the reverse lookup from netdev to the lower > layer ib_device. Actually it seems that the IPoIB driver does not have > any exported symbols at all. > > It might be that the device matching in reverse just does not make any > sense and does not need to be done at all. As long as it is an IPoIB > device (netdev->type == ARPHRD_INFINIBAND) it might be ok to just > automatically assume it is RDMA-capable. I am not 100% sure about this > though. Why can't we assume RDMA-capable if it's ARPHRD_INFINIBAND type? How about assuming it's RDMA-capable and allowing users to turn RDMA-capable on/off via sysfs? Thanks! > > I am uncertain about how to proceed at this point and would like to > know your thoughts and opinions on this. > > Thanks, > Kangjing > > On Fri, Nov 8, 2024 at 5:59 PM Leon Romanovsky <leon@kernel.org> wrote: > > > > On Fri, Nov 08, 2024 at 08:40:40AM +0900, Namjae Jeon wrote: > > > On Thu, Nov 7, 2024 at 9:00 PM Halil Pasic <pasic@linux.ibm.com> wrote: > > > > > > > > On Wed, 6 Nov 2024 15:59:10 +0200 > > > > Leon Romanovsky <leon@kernel.org> wrote: > > > > > > > > > > Does fs/smb/server/transport_rdma.c qualify as inside of RDMA core code? > > > > > > > > > > RDMA core code is drivers/infiniband/core/*. > > > > > > > > Understood. So this is a violation of the no direct access to the > > > > callbacks rule. > > > > > > > > > > > > > > > I would guess it is not, and I would not actually mind sending a patch > > > > > > but I have trouble figuring out the logic behind commit ecce70cf17d9 > > > > > > ("ksmbd: fix missing RDMA-capable flag for IPoIB device in > > > > > > ksmbd_rdma_capable_netdev()"). > > > > > > > > > > It is strange version of RDMA-CM. All other ULPs use RDMA-CM to avoid > > > > > GID, netdev and fabric complexity. > > > > > > > > I'm not familiar enough with either of the subsystems. Based on your > > > > answer my guess is that it ain't outright bugous but still a layering > > > > violation. Copying linux-cifs@vger.kernel.org so that > > > > the smb are aware. > > > Could you please elaborate what the violation is ? > > > > There are many, but the most screaming is that ksmbd has logic to > > differentiate IPoIB devices. These devices are pure netdev devices > > and should be treated like that. ULPs should treat them exactly > > as they treat netdev devices. > > > > > I would also appreciate it if you could suggest to me how to fix this. > > > > > > Thanks. > > > > > > > > Thank you very much for all the explanations! > > > > > > > > Regards, > > > > Halil > > > > > > > > -- > Kangjing "Chaser" Huang ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH net] net/smc: Fix lookup of netdev by using ib_device_get_netdev() 2024-12-14 2:33 ` Namjae Jeon @ 2024-12-14 6:06 ` Leon Romanovsky 2024-12-14 8:02 ` Kangjing Huang 0 siblings, 1 reply; 20+ messages in thread From: Leon Romanovsky @ 2024-12-14 6:06 UTC (permalink / raw) To: Namjae Jeon, Kangjing Huang; +Cc: linux-cifs On Sat, Dec 14, 2024, at 04:33, Namjae Jeon wrote: > On Fri, Dec 13, 2024 at 8:07 PM Kangjing Huang <huangkangjing@gmail.com> wrote: >> >> Hi there, >> >> I am the original author of commit ecce70cf17d9 ("ksmbd: fix missing >> RDMA-capable flag for IPoIB device in ksmbd_rdma_capable_netdev()"), >> as mentioned in the thread. >> >> I am working on modifying the patch to take care of the layering >> violation. The original patch was meant to fix an issue with ksmbd, >> where an IPoIB netdev was not recognized as RDMA-capable. The original >> version of the capability evaluation tries to match each netdev to >> ib_device by calling get_netdev in ib verbs. However this only works >> in cases where the ib_device is the upper layer of netdev (e.g. RoCE), >> and since with IPoIB it is the other way around (netdev is the upper >> layer of ib_device), get_netdev won't work anymore. >> >> I tried to replicate the behavior of device matching reversely in the >> original version of my patch using GID, which ended up as the layering >> violation. However I am unaware of any exported functions from the >> IPoIB driver that could do the reverse lookup from netdev to the lower >> layer ib_device. Actually it seems that the IPoIB driver does not have >> any exported symbols at all. >> >> It might be that the device matching in reverse just does not make any >> sense and does not need to be done at all. As long as it is an IPoIB >> device (netdev->type == ARPHRD_INFINIBAND) it might be ok to just >> automatically assume it is RDMA-capable. I am not 100% sure about this >> though. > Why can't we assume RDMA-capable if it's ARPHRD_INFINIBAND type? > How about assuming it's RDMA-capable and allowing users to turn > RDMA-capable on/off via sysfs? Any attempt to treat ipoib differently from regular netdevice is wrong by definition. > > Thanks! >> >> I am uncertain about how to proceed at this point and would like to >> know your thoughts and opinions on this. >> >> Thanks, >> Kangjing >> >> On Fri, Nov 8, 2024 at 5:59 PM Leon Romanovsky <leon@kernel.org> wrote: >> > >> > On Fri, Nov 08, 2024 at 08:40:40AM +0900, Namjae Jeon wrote: >> > > On Thu, Nov 7, 2024 at 9:00 PM Halil Pasic <pasic@linux.ibm.com> wrote: >> > > > >> > > > On Wed, 6 Nov 2024 15:59:10 +0200 >> > > > Leon Romanovsky <leon@kernel.org> wrote: >> > > > >> > > > > > Does fs/smb/server/transport_rdma.c qualify as inside of RDMA core code? >> > > > > >> > > > > RDMA core code is drivers/infiniband/core/*. >> > > > >> > > > Understood. So this is a violation of the no direct access to the >> > > > callbacks rule. >> > > > >> > > > > >> > > > > > I would guess it is not, and I would not actually mind sending a patch >> > > > > > but I have trouble figuring out the logic behind commit ecce70cf17d9 >> > > > > > ("ksmbd: fix missing RDMA-capable flag for IPoIB device in >> > > > > > ksmbd_rdma_capable_netdev()"). >> > > > > >> > > > > It is strange version of RDMA-CM. All other ULPs use RDMA-CM to avoid >> > > > > GID, netdev and fabric complexity. >> > > > >> > > > I'm not familiar enough with either of the subsystems. Based on your >> > > > answer my guess is that it ain't outright bugous but still a layering >> > > > violation. Copying linux-cifs@vger.kernel.org so that >> > > > the smb are aware. >> > > Could you please elaborate what the violation is ? >> > >> > There are many, but the most screaming is that ksmbd has logic to >> > differentiate IPoIB devices. These devices are pure netdev devices >> > and should be treated like that. ULPs should treat them exactly >> > as they treat netdev devices. >> > >> > > I would also appreciate it if you could suggest to me how to fix this. >> > > >> > > Thanks. >> > > > >> > > > Thank you very much for all the explanations! >> > > > >> > > > Regards, >> > > > Halil >> > > > >> >> >> >> -- >> Kangjing "Chaser" Huang ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH net] net/smc: Fix lookup of netdev by using ib_device_get_netdev() 2024-12-14 6:06 ` Leon Romanovsky @ 2024-12-14 8:02 ` Kangjing Huang 2024-12-19 16:56 ` Leon Romanovsky 0 siblings, 1 reply; 20+ messages in thread From: Kangjing Huang @ 2024-12-14 8:02 UTC (permalink / raw) To: Leon Romanovsky; +Cc: Namjae Jeon, linux-cifs On Sat, Dec 14, 2024 at 1:06 AM Leon Romanovsky <leon@kernel.org> wrote: > > > > On Sat, Dec 14, 2024, at 04:33, Namjae Jeon wrote: > > On Fri, Dec 13, 2024 at 8:07 PM Kangjing Huang <huangkangjing@gmail.com> wrote: > >> > >> Hi there, > >> > >> I am the original author of commit ecce70cf17d9 ("ksmbd: fix missing > >> RDMA-capable flag for IPoIB device in ksmbd_rdma_capable_netdev()"), > >> as mentioned in the thread. > >> > >> I am working on modifying the patch to take care of the layering > >> violation. The original patch was meant to fix an issue with ksmbd, > >> where an IPoIB netdev was not recognized as RDMA-capable. The original > >> version of the capability evaluation tries to match each netdev to > >> ib_device by calling get_netdev in ib verbs. However this only works > >> in cases where the ib_device is the upper layer of netdev (e.g. RoCE), > >> and since with IPoIB it is the other way around (netdev is the upper > >> layer of ib_device), get_netdev won't work anymore. > >> > >> I tried to replicate the behavior of device matching reversely in the > >> original version of my patch using GID, which ended up as the layering > >> violation. However I am unaware of any exported functions from the > >> IPoIB driver that could do the reverse lookup from netdev to the lower > >> layer ib_device. Actually it seems that the IPoIB driver does not have > >> any exported symbols at all. > >> > >> It might be that the device matching in reverse just does not make any > >> sense and does not need to be done at all. As long as it is an IPoIB > >> device (netdev->type == ARPHRD_INFINIBAND) it might be ok to just > >> automatically assume it is RDMA-capable. I am not 100% sure about this > >> though. > > Why can't we assume RDMA-capable if it's ARPHRD_INFINIBAND type? > > How about assuming it's RDMA-capable and allowing users to turn > > RDMA-capable on/off via sysfs? It does make more sense to me at this point to just broadly assume all ARPHRD_INFINIBAND types to be RDMA-capable, we just need to make sure this assumption indeed holds and figure out to what extent this could involve the same layering violation. > > Any attempt to treat ipoib differently from regular netdevice is wrong by definition. > I would agree that the design direction to treat ipoib as a pure regular net_device is the good way to go. But the problem with ksmbd and ipoib devices stems from the SMB protocol itself. In contrast to protocols that focus on certain functionalities like nfs, SMB actually tries to manage network interfaces actively in the protocol itself: SMB protocol's RDMA support (dubbed SMB Direct) is a sub-feature of SMB Multichannel. Multichannel is designed to let client and server find multiple data paths automatically (imagine a pair of hosts with multiple adapters connected by multiple cables) to increase bandwidth. So client can initiate a FSCTL_QUERY_NETWORK_INTERFACE_INFO request and server is expected to respond with NETWORK_INTERFACE_INFO containing _all_ local network interface informations, including their capabilities such as RDMA_CAPABLE (for details see ref [MS-SMB2] 3.3.5.15.11) Only upon seeing the capability flag would a client attempt to initiate a RDMA connection. Reference: [MS-SMB2](https://winprotocoldoc.z19.web.core.windows.net/MS-SMB2/%5bMS-SMB2%5d.pdf) TLDR is that the SMB protocol requires the server to enumerate all net_devices and indicate their RDMA capability, and ksmbd_rdma_capable_netdev() is only used in that process. Given such context, I wonder what should be the best way to approach this? Is using ARPHRD_INFINIBAND good enough and acceptable in terms of layering? > > > > Thanks! > >> > >> I am uncertain about how to proceed at this point and would like to > >> know your thoughts and opinions on this. > >> > >> Thanks, > >> Kangjing > >> > >> On Fri, Nov 8, 2024 at 5:59 PM Leon Romanovsky <leon@kernel.org> wrote: > >> > > >> > On Fri, Nov 08, 2024 at 08:40:40AM +0900, Namjae Jeon wrote: > >> > > On Thu, Nov 7, 2024 at 9:00 PM Halil Pasic <pasic@linux.ibm.com> wrote: > >> > > > > >> > > > On Wed, 6 Nov 2024 15:59:10 +0200 > >> > > > Leon Romanovsky <leon@kernel.org> wrote: > >> > > > > >> > > > > > Does fs/smb/server/transport_rdma.c qualify as inside of RDMA core code? > >> > > > > > >> > > > > RDMA core code is drivers/infiniband/core/*. > >> > > > > >> > > > Understood. So this is a violation of the no direct access to the > >> > > > callbacks rule. > >> > > > > >> > > > > > >> > > > > > I would guess it is not, and I would not actually mind sending a patch > >> > > > > > but I have trouble figuring out the logic behind commit ecce70cf17d9 > >> > > > > > ("ksmbd: fix missing RDMA-capable flag for IPoIB device in > >> > > > > > ksmbd_rdma_capable_netdev()"). > >> > > > > > >> > > > > It is strange version of RDMA-CM. All other ULPs use RDMA-CM to avoid > >> > > > > GID, netdev and fabric complexity. > >> > > > > >> > > > I'm not familiar enough with either of the subsystems. Based on your > >> > > > answer my guess is that it ain't outright bugous but still a layering > >> > > > violation. Copying linux-cifs@vger.kernel.org so that > >> > > > the smb are aware. > >> > > Could you please elaborate what the violation is ? > >> > > >> > There are many, but the most screaming is that ksmbd has logic to > >> > differentiate IPoIB devices. These devices are pure netdev devices > >> > and should be treated like that. ULPs should treat them exactly > >> > as they treat netdev devices. > >> > > >> > > I would also appreciate it if you could suggest to me how to fix this. > >> > > > >> > > Thanks. > >> > > > > >> > > > Thank you very much for all the explanations! > >> > > > > >> > > > Regards, > >> > > > Halil > >> > > > > >> > >> > >> > >> -- > >> Kangjing "Chaser" Huang -- Kangjing "Chaser" Huang ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH net] net/smc: Fix lookup of netdev by using ib_device_get_netdev() 2024-12-14 8:02 ` Kangjing Huang @ 2024-12-19 16:56 ` Leon Romanovsky 2025-01-07 22:51 ` Kangjing Huang 0 siblings, 1 reply; 20+ messages in thread From: Leon Romanovsky @ 2024-12-19 16:56 UTC (permalink / raw) To: Kangjing Huang; +Cc: Namjae Jeon, linux-cifs On Sat, Dec 14, 2024 at 08:02:14AM +0000, Kangjing Huang wrote: > On Sat, Dec 14, 2024 at 1:06 AM Leon Romanovsky <leon@kernel.org> wrote: > > > > > > > > On Sat, Dec 14, 2024, at 04:33, Namjae Jeon wrote: > > > On Fri, Dec 13, 2024 at 8:07 PM Kangjing Huang <huangkangjing@gmail.com> wrote: > > >> > > >> Hi there, > > >> > > >> I am the original author of commit ecce70cf17d9 ("ksmbd: fix missing > > >> RDMA-capable flag for IPoIB device in ksmbd_rdma_capable_netdev()"), > > >> as mentioned in the thread. > > >> > > >> I am working on modifying the patch to take care of the layering > > >> violation. The original patch was meant to fix an issue with ksmbd, > > >> where an IPoIB netdev was not recognized as RDMA-capable. The original > > >> version of the capability evaluation tries to match each netdev to > > >> ib_device by calling get_netdev in ib verbs. However this only works > > >> in cases where the ib_device is the upper layer of netdev (e.g. RoCE), > > >> and since with IPoIB it is the other way around (netdev is the upper > > >> layer of ib_device), get_netdev won't work anymore. > > >> > > >> I tried to replicate the behavior of device matching reversely in the > > >> original version of my patch using GID, which ended up as the layering > > >> violation. However I am unaware of any exported functions from the > > >> IPoIB driver that could do the reverse lookup from netdev to the lower > > >> layer ib_device. Actually it seems that the IPoIB driver does not have > > >> any exported symbols at all. > > >> > > >> It might be that the device matching in reverse just does not make any > > >> sense and does not need to be done at all. As long as it is an IPoIB > > >> device (netdev->type == ARPHRD_INFINIBAND) it might be ok to just > > >> automatically assume it is RDMA-capable. I am not 100% sure about this > > >> though. > > > Why can't we assume RDMA-capable if it's ARPHRD_INFINIBAND type? > > > How about assuming it's RDMA-capable and allowing users to turn > > > RDMA-capable on/off via sysfs? > It does make more sense to me at this point to just broadly assume all > ARPHRD_INFINIBAND types to be RDMA-capable, we just need to make sure > this assumption indeed holds and figure out to what extent this could > involve the same layering violation. > > > > > Any attempt to treat ipoib differently from regular netdevice is wrong by definition. > > > I would agree that the design direction to treat ipoib as a pure > regular net_device is the good way to go. But the problem with ksmbd > and ipoib devices stems from the SMB protocol itself. > > In contrast to protocols that focus on certain functionalities like > nfs, SMB actually tries to manage network interfaces actively in the > protocol itself: SMB protocol's RDMA support (dubbed SMB Direct) is a > sub-feature of SMB Multichannel. Multichannel is designed to let > client and server find multiple data paths automatically (imagine a > pair of hosts with multiple adapters connected by multiple cables) to > increase bandwidth. So client can initiate a > FSCTL_QUERY_NETWORK_INTERFACE_INFO request and server is expected to > respond with NETWORK_INTERFACE_INFO containing _all_ local network > interface informations, including their capabilities such as > RDMA_CAPABLE (for details see ref [MS-SMB2] 3.3.5.15.11) Only upon > seeing the capability flag would a client attempt to initiate a RDMA > connection. > > Reference: [MS-SMB2](https://winprotocoldoc.z19.web.core.windows.net/MS-SMB2/%5bMS-SMB2%5d.pdf) > > TLDR is that the SMB protocol requires the server to enumerate all > net_devices and indicate their RDMA capability, and > ksmbd_rdma_capable_netdev() is only used in that process. Given such > context, I wonder what should be the best way to approach this? Is > using ARPHRD_INFINIBAND good enough and acceptable in terms of > layering? The thing is that ARPHRD_INFINIBAND indeed represent IPoIB and it is right check if netdev is IPoIB or not. The layering problem is that upper layers (ULPs) should use it as regular netdevice. Thanks > > > > > > > Thanks! > > >> > > >> I am uncertain about how to proceed at this point and would like to > > >> know your thoughts and opinions on this. > > >> > > >> Thanks, > > >> Kangjing > > >> > > >> On Fri, Nov 8, 2024 at 5:59 PM Leon Romanovsky <leon@kernel.org> wrote: > > >> > > > >> > On Fri, Nov 08, 2024 at 08:40:40AM +0900, Namjae Jeon wrote: > > >> > > On Thu, Nov 7, 2024 at 9:00 PM Halil Pasic <pasic@linux.ibm.com> wrote: > > >> > > > > > >> > > > On Wed, 6 Nov 2024 15:59:10 +0200 > > >> > > > Leon Romanovsky <leon@kernel.org> wrote: > > >> > > > > > >> > > > > > Does fs/smb/server/transport_rdma.c qualify as inside of RDMA core code? > > >> > > > > > > >> > > > > RDMA core code is drivers/infiniband/core/*. > > >> > > > > > >> > > > Understood. So this is a violation of the no direct access to the > > >> > > > callbacks rule. > > >> > > > > > >> > > > > > > >> > > > > > I would guess it is not, and I would not actually mind sending a patch > > >> > > > > > but I have trouble figuring out the logic behind commit ecce70cf17d9 > > >> > > > > > ("ksmbd: fix missing RDMA-capable flag for IPoIB device in > > >> > > > > > ksmbd_rdma_capable_netdev()"). > > >> > > > > > > >> > > > > It is strange version of RDMA-CM. All other ULPs use RDMA-CM to avoid > > >> > > > > GID, netdev and fabric complexity. > > >> > > > > > >> > > > I'm not familiar enough with either of the subsystems. Based on your > > >> > > > answer my guess is that it ain't outright bugous but still a layering > > >> > > > violation. Copying linux-cifs@vger.kernel.org so that > > >> > > > the smb are aware. > > >> > > Could you please elaborate what the violation is ? > > >> > > > >> > There are many, but the most screaming is that ksmbd has logic to > > >> > differentiate IPoIB devices. These devices are pure netdev devices > > >> > and should be treated like that. ULPs should treat them exactly > > >> > as they treat netdev devices. > > >> > > > >> > > I would also appreciate it if you could suggest to me how to fix this. > > >> > > > > >> > > Thanks. > > >> > > > > > >> > > > Thank you very much for all the explanations! > > >> > > > > > >> > > > Regards, > > >> > > > Halil > > >> > > > > > >> > > >> > > >> > > >> -- > > >> Kangjing "Chaser" Huang > > > > -- > Kangjing "Chaser" Huang ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH net] net/smc: Fix lookup of netdev by using ib_device_get_netdev() 2024-12-19 16:56 ` Leon Romanovsky @ 2025-01-07 22:51 ` Kangjing Huang 2025-01-08 9:31 ` Leon Romanovsky 2025-01-09 8:02 ` Christoph Hellwig 0 siblings, 2 replies; 20+ messages in thread From: Kangjing Huang @ 2025-01-07 22:51 UTC (permalink / raw) To: Leon Romanovsky; +Cc: Namjae Jeon, linux-cifs On Thu, Dec 19, 2024 at 4:56 PM Leon Romanovsky <leon@kernel.org> wrote: > > On Sat, Dec 14, 2024 at 08:02:14AM +0000, Kangjing Huang wrote: > > On Sat, Dec 14, 2024 at 1:06 AM Leon Romanovsky <leon@kernel.org> wrote: > > > > > > > > > > > > On Sat, Dec 14, 2024, at 04:33, Namjae Jeon wrote: > > > > On Fri, Dec 13, 2024 at 8:07 PM Kangjing Huang <huangkangjing@gmail.com> wrote: > > > >> > > > >> Hi there, > > > >> > > > >> I am the original author of commit ecce70cf17d9 ("ksmbd: fix missing > > > >> RDMA-capable flag for IPoIB device in ksmbd_rdma_capable_netdev()"), > > > >> as mentioned in the thread. > > > >> > > > >> I am working on modifying the patch to take care of the layering > > > >> violation. The original patch was meant to fix an issue with ksmbd, > > > >> where an IPoIB netdev was not recognized as RDMA-capable. The original > > > >> version of the capability evaluation tries to match each netdev to > > > >> ib_device by calling get_netdev in ib verbs. However this only works > > > >> in cases where the ib_device is the upper layer of netdev (e.g. RoCE), > > > >> and since with IPoIB it is the other way around (netdev is the upper > > > >> layer of ib_device), get_netdev won't work anymore. > > > >> > > > >> I tried to replicate the behavior of device matching reversely in the > > > >> original version of my patch using GID, which ended up as the layering > > > >> violation. However I am unaware of any exported functions from the > > > >> IPoIB driver that could do the reverse lookup from netdev to the lower > > > >> layer ib_device. Actually it seems that the IPoIB driver does not have > > > >> any exported symbols at all. > > > >> > > > >> It might be that the device matching in reverse just does not make any > > > >> sense and does not need to be done at all. As long as it is an IPoIB > > > >> device (netdev->type == ARPHRD_INFINIBAND) it might be ok to just > > > >> automatically assume it is RDMA-capable. I am not 100% sure about this > > > >> though. > > > > Why can't we assume RDMA-capable if it's ARPHRD_INFINIBAND type? > > > > How about assuming it's RDMA-capable and allowing users to turn > > > > RDMA-capable on/off via sysfs? > > It does make more sense to me at this point to just broadly assume all > > ARPHRD_INFINIBAND types to be RDMA-capable, we just need to make sure > > this assumption indeed holds and figure out to what extent this could > > involve the same layering violation. > > > > > > > > Any attempt to treat ipoib differently from regular netdevice is wrong by definition. > > > > > I would agree that the design direction to treat ipoib as a pure > > regular net_device is the good way to go. But the problem with ksmbd > > and ipoib devices stems from the SMB protocol itself. > > > > In contrast to protocols that focus on certain functionalities like > > nfs, SMB actually tries to manage network interfaces actively in the > > protocol itself: SMB protocol's RDMA support (dubbed SMB Direct) is a > > sub-feature of SMB Multichannel. Multichannel is designed to let > > client and server find multiple data paths automatically (imagine a > > pair of hosts with multiple adapters connected by multiple cables) to > > increase bandwidth. So client can initiate a > > FSCTL_QUERY_NETWORK_INTERFACE_INFO request and server is expected to > > respond with NETWORK_INTERFACE_INFO containing _all_ local network > > interface informations, including their capabilities such as > > RDMA_CAPABLE (for details see ref [MS-SMB2] 3.3.5.15.11) Only upon > > seeing the capability flag would a client attempt to initiate a RDMA > > connection. > > > > Reference: [MS-SMB2](https://winprotocoldoc.z19.web.core.windows.net/MS-SMB2/%5bMS-SMB2%5d.pdf) > > > > TLDR is that the SMB protocol requires the server to enumerate all > > net_devices and indicate their RDMA capability, and > > ksmbd_rdma_capable_netdev() is only used in that process. Given such > > context, I wonder what should be the best way to approach this? Is > > using ARPHRD_INFINIBAND good enough and acceptable in terms of > > layering? > > The thing is that ARPHRD_INFINIBAND indeed represent IPoIB and it is > right check if netdev is IPoIB or not. The layering problem is that > upper layers (ULPs) should use it as regular netdevice. This is good to know. However, since the SMB protocol explicitly calls for enumeration of all network interfaces on the server host, including their RDMA capabilities, I believe this is a sensible exception to the layering rule. Or is there anyway else to do this enumeration from the kernel space? Or we can give up implementing the full spec of the SMB protocol and call for explicit configuration from user space on how to respond to the IOCTL requests in question. Which one looks more sensible to you? Thanks > > Thanks > > > > > > > > > > > Thanks! > > > >> > > > >> I am uncertain about how to proceed at this point and would like to > > > >> know your thoughts and opinions on this. > > > >> > > > >> Thanks, > > > >> Kangjing > > > >> > > > >> On Fri, Nov 8, 2024 at 5:59 PM Leon Romanovsky <leon@kernel.org> wrote: > > > >> > > > > >> > On Fri, Nov 08, 2024 at 08:40:40AM +0900, Namjae Jeon wrote: > > > >> > > On Thu, Nov 7, 2024 at 9:00 PM Halil Pasic <pasic@linux.ibm.com> wrote: > > > >> > > > > > > >> > > > On Wed, 6 Nov 2024 15:59:10 +0200 > > > >> > > > Leon Romanovsky <leon@kernel.org> wrote: > > > >> > > > > > > >> > > > > > Does fs/smb/server/transport_rdma.c qualify as inside of RDMA core code? > > > >> > > > > > > > >> > > > > RDMA core code is drivers/infiniband/core/*. > > > >> > > > > > > >> > > > Understood. So this is a violation of the no direct access to the > > > >> > > > callbacks rule. > > > >> > > > > > > >> > > > > > > > >> > > > > > I would guess it is not, and I would not actually mind sending a patch > > > >> > > > > > but I have trouble figuring out the logic behind commit ecce70cf17d9 > > > >> > > > > > ("ksmbd: fix missing RDMA-capable flag for IPoIB device in > > > >> > > > > > ksmbd_rdma_capable_netdev()"). > > > >> > > > > > > > >> > > > > It is strange version of RDMA-CM. All other ULPs use RDMA-CM to avoid > > > >> > > > > GID, netdev and fabric complexity. > > > >> > > > > > > >> > > > I'm not familiar enough with either of the subsystems. Based on your > > > >> > > > answer my guess is that it ain't outright bugous but still a layering > > > >> > > > violation. Copying linux-cifs@vger.kernel.org so that > > > >> > > > the smb are aware. > > > >> > > Could you please elaborate what the violation is ? > > > >> > > > > >> > There are many, but the most screaming is that ksmbd has logic to > > > >> > differentiate IPoIB devices. These devices are pure netdev devices > > > >> > and should be treated like that. ULPs should treat them exactly > > > >> > as they treat netdev devices. > > > >> > > > > >> > > I would also appreciate it if you could suggest to me how to fix this. > > > >> > > > > > >> > > Thanks. > > > >> > > > > > > >> > > > Thank you very much for all the explanations! > > > >> > > > > > > >> > > > Regards, > > > >> > > > Halil > > > >> > > > > > > >> > > > >> > > > >> > > > >> -- > > > >> Kangjing "Chaser" Huang > > > > > > > > -- > > Kangjing "Chaser" Huang -- Kangjing "Chaser" Huang ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH net] net/smc: Fix lookup of netdev by using ib_device_get_netdev() 2025-01-07 22:51 ` Kangjing Huang @ 2025-01-08 9:31 ` Leon Romanovsky 2025-01-08 17:27 ` Tom Talpey 2025-01-09 8:02 ` Christoph Hellwig 1 sibling, 1 reply; 20+ messages in thread From: Leon Romanovsky @ 2025-01-08 9:31 UTC (permalink / raw) To: Kangjing Huang; +Cc: Namjae Jeon, linux-cifs On Tue, Jan 07, 2025 at 10:51:19PM +0000, Kangjing Huang wrote: > On Thu, Dec 19, 2024 at 4:56 PM Leon Romanovsky <leon@kernel.org> wrote: > > > > On Sat, Dec 14, 2024 at 08:02:14AM +0000, Kangjing Huang wrote: > > > On Sat, Dec 14, 2024 at 1:06 AM Leon Romanovsky <leon@kernel.org> wrote: > > > > > > > > > > > > > > > > On Sat, Dec 14, 2024, at 04:33, Namjae Jeon wrote: > > > > > On Fri, Dec 13, 2024 at 8:07 PM Kangjing Huang <huangkangjing@gmail.com> wrote: > > > > >> > > > > >> Hi there, > > > > >> > > > > >> I am the original author of commit ecce70cf17d9 ("ksmbd: fix missing > > > > >> RDMA-capable flag for IPoIB device in ksmbd_rdma_capable_netdev()"), > > > > >> as mentioned in the thread. > > > > >> > > > > >> I am working on modifying the patch to take care of the layering > > > > >> violation. The original patch was meant to fix an issue with ksmbd, > > > > >> where an IPoIB netdev was not recognized as RDMA-capable. The original > > > > >> version of the capability evaluation tries to match each netdev to > > > > >> ib_device by calling get_netdev in ib verbs. However this only works > > > > >> in cases where the ib_device is the upper layer of netdev (e.g. RoCE), > > > > >> and since with IPoIB it is the other way around (netdev is the upper > > > > >> layer of ib_device), get_netdev won't work anymore. > > > > >> > > > > >> I tried to replicate the behavior of device matching reversely in the > > > > >> original version of my patch using GID, which ended up as the layering > > > > >> violation. However I am unaware of any exported functions from the > > > > >> IPoIB driver that could do the reverse lookup from netdev to the lower > > > > >> layer ib_device. Actually it seems that the IPoIB driver does not have > > > > >> any exported symbols at all. > > > > >> > > > > >> It might be that the device matching in reverse just does not make any > > > > >> sense and does not need to be done at all. As long as it is an IPoIB > > > > >> device (netdev->type == ARPHRD_INFINIBAND) it might be ok to just > > > > >> automatically assume it is RDMA-capable. I am not 100% sure about this > > > > >> though. > > > > > Why can't we assume RDMA-capable if it's ARPHRD_INFINIBAND type? > > > > > How about assuming it's RDMA-capable and allowing users to turn > > > > > RDMA-capable on/off via sysfs? > > > It does make more sense to me at this point to just broadly assume all > > > ARPHRD_INFINIBAND types to be RDMA-capable, we just need to make sure > > > this assumption indeed holds and figure out to what extent this could > > > involve the same layering violation. > > > > > > > > > > > Any attempt to treat ipoib differently from regular netdevice is wrong by definition. > > > > > > > I would agree that the design direction to treat ipoib as a pure > > > regular net_device is the good way to go. But the problem with ksmbd > > > and ipoib devices stems from the SMB protocol itself. > > > > > > In contrast to protocols that focus on certain functionalities like > > > nfs, SMB actually tries to manage network interfaces actively in the > > > protocol itself: SMB protocol's RDMA support (dubbed SMB Direct) is a > > > sub-feature of SMB Multichannel. Multichannel is designed to let > > > client and server find multiple data paths automatically (imagine a > > > pair of hosts with multiple adapters connected by multiple cables) to > > > increase bandwidth. So client can initiate a > > > FSCTL_QUERY_NETWORK_INTERFACE_INFO request and server is expected to > > > respond with NETWORK_INTERFACE_INFO containing _all_ local network > > > interface informations, including their capabilities such as > > > RDMA_CAPABLE (for details see ref [MS-SMB2] 3.3.5.15.11) Only upon > > > seeing the capability flag would a client attempt to initiate a RDMA > > > connection. > > > > > > Reference: [MS-SMB2](https://winprotocoldoc.z19.web.core.windows.net/MS-SMB2/%5bMS-SMB2%5d.pdf) > > > > > > TLDR is that the SMB protocol requires the server to enumerate all > > > net_devices and indicate their RDMA capability, and > > > ksmbd_rdma_capable_netdev() is only used in that process. Given such > > > context, I wonder what should be the best way to approach this? Is > > > using ARPHRD_INFINIBAND good enough and acceptable in terms of > > > layering? > > > > > The thing is that ARPHRD_INFINIBAND indeed represent IPoIB and it is > > right check if netdev is IPoIB or not. The layering problem is that > > upper layers (ULPs) should use it as regular netdevice. > > This is good to know. However, since the SMB protocol explicitly calls > for enumeration of all network interfaces on the server host, > including their RDMA capabilities, I believe this is a sensible > exception to the layering rule. Or is there anyway else to do this > enumeration from the kernel space? > > Or we can give up implementing the full spec of the SMB protocol and > call for explicit configuration from user space on how to respond to > the IOCTL requests in question. Which one looks more sensible to you? My preference is to have same IPoIB treatment for all ULPs, including SMB. My GUESS is that SMB specification authors didn't take into account HW and Linux SW development around IPoIB and weren't aware of IPoIB offload which is implemented and enabled by default in all modern IB NICs and Linux OSes. That offload allows line-rate for IPoIB, something that is not possible for SW IPoIB. Thanks > > Thanks > > > > > Thanks > > > > > > > > > > > > > > > Thanks! > > > > >> > > > > >> I am uncertain about how to proceed at this point and would like to > > > > >> know your thoughts and opinions on this. > > > > >> > > > > >> Thanks, > > > > >> Kangjing > > > > >> > > > > >> On Fri, Nov 8, 2024 at 5:59 PM Leon Romanovsky <leon@kernel.org> wrote: > > > > >> > > > > > >> > On Fri, Nov 08, 2024 at 08:40:40AM +0900, Namjae Jeon wrote: > > > > >> > > On Thu, Nov 7, 2024 at 9:00 PM Halil Pasic <pasic@linux.ibm.com> wrote: > > > > >> > > > > > > > >> > > > On Wed, 6 Nov 2024 15:59:10 +0200 > > > > >> > > > Leon Romanovsky <leon@kernel.org> wrote: > > > > >> > > > > > > > >> > > > > > Does fs/smb/server/transport_rdma.c qualify as inside of RDMA core code? > > > > >> > > > > > > > > >> > > > > RDMA core code is drivers/infiniband/core/*. > > > > >> > > > > > > > >> > > > Understood. So this is a violation of the no direct access to the > > > > >> > > > callbacks rule. > > > > >> > > > > > > > >> > > > > > > > > >> > > > > > I would guess it is not, and I would not actually mind sending a patch > > > > >> > > > > > but I have trouble figuring out the logic behind commit ecce70cf17d9 > > > > >> > > > > > ("ksmbd: fix missing RDMA-capable flag for IPoIB device in > > > > >> > > > > > ksmbd_rdma_capable_netdev()"). > > > > >> > > > > > > > > >> > > > > It is strange version of RDMA-CM. All other ULPs use RDMA-CM to avoid > > > > >> > > > > GID, netdev and fabric complexity. > > > > >> > > > > > > > >> > > > I'm not familiar enough with either of the subsystems. Based on your > > > > >> > > > answer my guess is that it ain't outright bugous but still a layering > > > > >> > > > violation. Copying linux-cifs@vger.kernel.org so that > > > > >> > > > the smb are aware. > > > > >> > > Could you please elaborate what the violation is ? > > > > >> > > > > > >> > There are many, but the most screaming is that ksmbd has logic to > > > > >> > differentiate IPoIB devices. These devices are pure netdev devices > > > > >> > and should be treated like that. ULPs should treat them exactly > > > > >> > as they treat netdev devices. > > > > >> > > > > > >> > > I would also appreciate it if you could suggest to me how to fix this. > > > > >> > > > > > > >> > > Thanks. > > > > >> > > > > > > > >> > > > Thank you very much for all the explanations! > > > > >> > > > > > > > >> > > > Regards, > > > > >> > > > Halil > > > > >> > > > > > > > >> > > > > >> > > > > >> > > > > >> -- > > > > >> Kangjing "Chaser" Huang > > > > > > > > > > > > -- > > > Kangjing "Chaser" Huang > > > > -- > Kangjing "Chaser" Huang ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH net] net/smc: Fix lookup of netdev by using ib_device_get_netdev() 2025-01-08 9:31 ` Leon Romanovsky @ 2025-01-08 17:27 ` Tom Talpey 2025-01-08 22:40 ` Kangjing Huang 0 siblings, 1 reply; 20+ messages in thread From: Tom Talpey @ 2025-01-08 17:27 UTC (permalink / raw) To: Leon Romanovsky, Kangjing Huang; +Cc: Namjae Jeon, linux-cifs On 1/8/2025 4:31 AM, Leon Romanovsky wrote: > On Tue, Jan 07, 2025 at 10:51:19PM +0000, Kangjing Huang wrote: >> On Thu, Dec 19, 2024 at 4:56 PM Leon Romanovsky <leon@kernel.org> wrote: >>> >>> On Sat, Dec 14, 2024 at 08:02:14AM +0000, Kangjing Huang wrote: >>>> On Sat, Dec 14, 2024 at 1:06 AM Leon Romanovsky <leon@kernel.org> wrote: >>>>> >>>>> >>>>> >>>>> On Sat, Dec 14, 2024, at 04:33, Namjae Jeon wrote: >>>>>> On Fri, Dec 13, 2024 at 8:07 PM Kangjing Huang <huangkangjing@gmail.com> wrote: >>>>>>> >>>>>>> Hi there, >>>>>>> >>>>>>> I am the original author of commit ecce70cf17d9 ("ksmbd: fix missing >>>>>>> RDMA-capable flag for IPoIB device in ksmbd_rdma_capable_netdev()"), >>>>>>> as mentioned in the thread. >>>>>>> >>>>>>> I am working on modifying the patch to take care of the layering >>>>>>> violation. The original patch was meant to fix an issue with ksmbd, >>>>>>> where an IPoIB netdev was not recognized as RDMA-capable. The original >>>>>>> version of the capability evaluation tries to match each netdev to >>>>>>> ib_device by calling get_netdev in ib verbs. However this only works >>>>>>> in cases where the ib_device is the upper layer of netdev (e.g. RoCE), >>>>>>> and since with IPoIB it is the other way around (netdev is the upper >>>>>>> layer of ib_device), get_netdev won't work anymore. >>>>>>> >>>>>>> I tried to replicate the behavior of device matching reversely in the >>>>>>> original version of my patch using GID, which ended up as the layering >>>>>>> violation. However I am unaware of any exported functions from the >>>>>>> IPoIB driver that could do the reverse lookup from netdev to the lower >>>>>>> layer ib_device. Actually it seems that the IPoIB driver does not have >>>>>>> any exported symbols at all. >>>>>>> >>>>>>> It might be that the device matching in reverse just does not make any >>>>>>> sense and does not need to be done at all. As long as it is an IPoIB >>>>>>> device (netdev->type == ARPHRD_INFINIBAND) it might be ok to just >>>>>>> automatically assume it is RDMA-capable. I am not 100% sure about this >>>>>>> though. >>>>>> Why can't we assume RDMA-capable if it's ARPHRD_INFINIBAND type? >>>>>> How about assuming it's RDMA-capable and allowing users to turn >>>>>> RDMA-capable on/off via sysfs? >>>> It does make more sense to me at this point to just broadly assume all >>>> ARPHRD_INFINIBAND types to be RDMA-capable, we just need to make sure >>>> this assumption indeed holds and figure out to what extent this could >>>> involve the same layering violation. >>>> >>>>> >>>>> Any attempt to treat ipoib differently from regular netdevice is wrong by definition. >>>>> >>>> I would agree that the design direction to treat ipoib as a pure >>>> regular net_device is the good way to go. But the problem with ksmbd >>>> and ipoib devices stems from the SMB protocol itself. >>>> >>>> In contrast to protocols that focus on certain functionalities like >>>> nfs, SMB actually tries to manage network interfaces actively in the >>>> protocol itself: SMB protocol's RDMA support (dubbed SMB Direct) is a >>>> sub-feature of SMB Multichannel. Multichannel is designed to let >>>> client and server find multiple data paths automatically (imagine a >>>> pair of hosts with multiple adapters connected by multiple cables) to >>>> increase bandwidth. So client can initiate a >>>> FSCTL_QUERY_NETWORK_INTERFACE_INFO request and server is expected to >>>> respond with NETWORK_INTERFACE_INFO containing _all_ local network >>>> interface informations, including their capabilities such as >>>> RDMA_CAPABLE (for details see ref [MS-SMB2] 3.3.5.15.11) Only upon >>>> seeing the capability flag would a client attempt to initiate a RDMA >>>> connection. >>>> >>>> Reference: [MS-SMB2](https://winprotocoldoc.z19.web.core.windows.net/MS-SMB2/%5bMS-SMB2%5d.pdf) >>>> >>>> TLDR is that the SMB protocol requires the server to enumerate all >>>> net_devices and indicate their RDMA capability, and >>>> ksmbd_rdma_capable_netdev() is only used in that process. Given such >>>> context, I wonder what should be the best way to approach this? Is >>>> using ARPHRD_INFINIBAND good enough and acceptable in terms of >>>> layering? >>> >> >>> The thing is that ARPHRD_INFINIBAND indeed represent IPoIB and it is >>> right check if netdev is IPoIB or not. The layering problem is that >>> upper layers (ULPs) should use it as regular netdevice. >> >> This is good to know. However, since the SMB protocol explicitly calls >> for enumeration of all network interfaces on the server host, >> including their RDMA capabilities, I believe this is a sensible >> exception to the layering rule. Or is there anyway else to do this >> enumeration from the kernel space? >> >> Or we can give up implementing the full spec of the SMB protocol and >> call for explicit configuration from user space on how to respond to >> the IOCTL requests in question. Which one looks more sensible to you? > > My preference is to have same IPoIB treatment for all ULPs, including SMB. > > My GUESS is that SMB specification authors didn't take into account HW and > Linux SW development around IPoIB and weren't aware of IPoIB offload which > is implemented and enabled by default in all modern IB NICs and Linux OSes. The SMB3 specification is completely unconcerned with IPoIB and any other layer-2 or layer-3 implementation details. It merely discusses an exchange of network interface capabilities such as link speed and RDMA support. The SMB3 client uses this list to implement multichannel. I totally agree that inspecting ARPHRD_INFINIBAND is an incorrect method of building this list. Just because an interface supports IPoIB does not mean it also exposes RDMA, especially in-kernel. And that ignores any non-IB transport too of course. Kangjing, please educate me if I'm confused here, but doesn't the code in ksmbd_rdma_capable_netdev() look up the ib_device anyway, at the end of the function? > if (rdma_capable == false) { > struct ib_device *ibdev; > > ibdev = ib_device_get_by_netdev(netdev, RDMA_DRIVER_UNKNOWN); > if (ibdev) { > if (rdma_frwr_is_supported(&ibdev->attrs)) > rdma_capable = true; > ib_device_put(ibdev); > } > } > > return rdma_capable; So, why is the code concerned at all with ARPHRD_INFINIBAND just a few lines above? And why does it look in the smb_direct_device_list first? Tom. > > That offload allows line-rate for IPoIB, something that is not possible > for SW IPoIB. > > Thanks > >> >> Thanks >> >>> >>> Thanks >>> >>>> >>>>>> >>>>>> Thanks! >>>>>>> >>>>>>> I am uncertain about how to proceed at this point and would like to >>>>>>> know your thoughts and opinions on this. >>>>>>> >>>>>>> Thanks, >>>>>>> Kangjing >>>>>>> >>>>>>> On Fri, Nov 8, 2024 at 5:59 PM Leon Romanovsky <leon@kernel.org> wrote: >>>>>>>> >>>>>>>> On Fri, Nov 08, 2024 at 08:40:40AM +0900, Namjae Jeon wrote: >>>>>>>>> On Thu, Nov 7, 2024 at 9:00 PM Halil Pasic <pasic@linux.ibm.com> wrote: >>>>>>>>>> >>>>>>>>>> On Wed, 6 Nov 2024 15:59:10 +0200 >>>>>>>>>> Leon Romanovsky <leon@kernel.org> wrote: >>>>>>>>>> >>>>>>>>>>>> Does fs/smb/server/transport_rdma.c qualify as inside of RDMA core code? >>>>>>>>>>> >>>>>>>>>>> RDMA core code is drivers/infiniband/core/*. >>>>>>>>>> >>>>>>>>>> Understood. So this is a violation of the no direct access to the >>>>>>>>>> callbacks rule. >>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>>> I would guess it is not, and I would not actually mind sending a patch >>>>>>>>>>>> but I have trouble figuring out the logic behind commit ecce70cf17d9 >>>>>>>>>>>> ("ksmbd: fix missing RDMA-capable flag for IPoIB device in >>>>>>>>>>>> ksmbd_rdma_capable_netdev()"). >>>>>>>>>>> >>>>>>>>>>> It is strange version of RDMA-CM. All other ULPs use RDMA-CM to avoid >>>>>>>>>>> GID, netdev and fabric complexity. >>>>>>>>>> >>>>>>>>>> I'm not familiar enough with either of the subsystems. Based on your >>>>>>>>>> answer my guess is that it ain't outright bugous but still a layering >>>>>>>>>> violation. Copying linux-cifs@vger.kernel.org so that >>>>>>>>>> the smb are aware. >>>>>>>>> Could you please elaborate what the violation is ? >>>>>>>> >>>>>>>> There are many, but the most screaming is that ksmbd has logic to >>>>>>>> differentiate IPoIB devices. These devices are pure netdev devices >>>>>>>> and should be treated like that. ULPs should treat them exactly >>>>>>>> as they treat netdev devices. >>>>>>>> >>>>>>>>> I would also appreciate it if you could suggest to me how to fix this. >>>>>>>>> >>>>>>>>> Thanks. >>>>>>>>>> >>>>>>>>>> Thank you very much for all the explanations! >>>>>>>>>> >>>>>>>>>> Regards, >>>>>>>>>> Halil >>>>>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> -- >>>>>>> Kangjing "Chaser" Huang >>>> >>>> >>>> >>>> -- >>>> Kangjing "Chaser" Huang >> >> >> >> -- >> Kangjing "Chaser" Huang > > ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH net] net/smc: Fix lookup of netdev by using ib_device_get_netdev() 2025-01-08 17:27 ` Tom Talpey @ 2025-01-08 22:40 ` Kangjing Huang 2025-01-09 7:59 ` Leon Romanovsky 0 siblings, 1 reply; 20+ messages in thread From: Kangjing Huang @ 2025-01-08 22:40 UTC (permalink / raw) To: Tom Talpey, Leon Romanovsky; +Cc: Namjae Jeon, linux-cifs On Wed, Jan 8, 2025 at 5:27 PM Tom Talpey <tom@talpey.com> wrote: > > On 1/8/2025 4:31 AM, Leon Romanovsky wrote: > > On Tue, Jan 07, 2025 at 10:51:19PM +0000, Kangjing Huang wrote: > >> On Thu, Dec 19, 2024 at 4:56 PM Leon Romanovsky <leon@kernel.org> wrote: > >>> > >>> On Sat, Dec 14, 2024 at 08:02:14AM +0000, Kangjing Huang wrote: > >>>> On Sat, Dec 14, 2024 at 1:06 AM Leon Romanovsky <leon@kernel.org> wrote: > >>>>> > >>>>> > >>>>> > >>>>> On Sat, Dec 14, 2024, at 04:33, Namjae Jeon wrote: > >>>>>> On Fri, Dec 13, 2024 at 8:07 PM Kangjing Huang <huangkangjing@gmail.com> wrote: > >>>>>>> > >>>>>>> Hi there, > >>>>>>> > >>>>>>> I am the original author of commit ecce70cf17d9 ("ksmbd: fix missing > >>>>>>> RDMA-capable flag for IPoIB device in ksmbd_rdma_capable_netdev()"), > >>>>>>> as mentioned in the thread. > >>>>>>> > >>>>>>> I am working on modifying the patch to take care of the layering > >>>>>>> violation. The original patch was meant to fix an issue with ksmbd, > >>>>>>> where an IPoIB netdev was not recognized as RDMA-capable. The original > >>>>>>> version of the capability evaluation tries to match each netdev to > >>>>>>> ib_device by calling get_netdev in ib verbs. However this only works > >>>>>>> in cases where the ib_device is the upper layer of netdev (e.g. RoCE), > >>>>>>> and since with IPoIB it is the other way around (netdev is the upper > >>>>>>> layer of ib_device), get_netdev won't work anymore. > >>>>>>> > >>>>>>> I tried to replicate the behavior of device matching reversely in the > >>>>>>> original version of my patch using GID, which ended up as the layering > >>>>>>> violation. However I am unaware of any exported functions from the > >>>>>>> IPoIB driver that could do the reverse lookup from netdev to the lower > >>>>>>> layer ib_device. Actually it seems that the IPoIB driver does not have > >>>>>>> any exported symbols at all. > >>>>>>> > >>>>>>> It might be that the device matching in reverse just does not make any > >>>>>>> sense and does not need to be done at all. As long as it is an IPoIB > >>>>>>> device (netdev->type == ARPHRD_INFINIBAND) it might be ok to just > >>>>>>> automatically assume it is RDMA-capable. I am not 100% sure about this > >>>>>>> though. > >>>>>> Why can't we assume RDMA-capable if it's ARPHRD_INFINIBAND type? > >>>>>> How about assuming it's RDMA-capable and allowing users to turn > >>>>>> RDMA-capable on/off via sysfs? > >>>> It does make more sense to me at this point to just broadly assume all > >>>> ARPHRD_INFINIBAND types to be RDMA-capable, we just need to make sure > >>>> this assumption indeed holds and figure out to what extent this could > >>>> involve the same layering violation. > >>>> > >>>>> > >>>>> Any attempt to treat ipoib differently from regular netdevice is wrong by definition. > >>>>> > >>>> I would agree that the design direction to treat ipoib as a pure > >>>> regular net_device is the good way to go. But the problem with ksmbd > >>>> and ipoib devices stems from the SMB protocol itself. > >>>> > >>>> In contrast to protocols that focus on certain functionalities like > >>>> nfs, SMB actually tries to manage network interfaces actively in the > >>>> protocol itself: SMB protocol's RDMA support (dubbed SMB Direct) is a > >>>> sub-feature of SMB Multichannel. Multichannel is designed to let > >>>> client and server find multiple data paths automatically (imagine a > >>>> pair of hosts with multiple adapters connected by multiple cables) to > >>>> increase bandwidth. So client can initiate a > >>>> FSCTL_QUERY_NETWORK_INTERFACE_INFO request and server is expected to > >>>> respond with NETWORK_INTERFACE_INFO containing _all_ local network > >>>> interface informations, including their capabilities such as > >>>> RDMA_CAPABLE (for details see ref [MS-SMB2] 3.3.5.15.11) Only upon > >>>> seeing the capability flag would a client attempt to initiate a RDMA > >>>> connection. > >>>> > >>>> Reference: [MS-SMB2](https://winprotocoldoc.z19.web.core.windows.net/MS-SMB2/%5bMS-SMB2%5d.pdf) > >>>> > >>>> TLDR is that the SMB protocol requires the server to enumerate all > >>>> net_devices and indicate their RDMA capability, and > >>>> ksmbd_rdma_capable_netdev() is only used in that process. Given such > >>>> context, I wonder what should be the best way to approach this? Is > >>>> using ARPHRD_INFINIBAND good enough and acceptable in terms of > >>>> layering? > >>> > >> > >>> The thing is that ARPHRD_INFINIBAND indeed represent IPoIB and it is > >>> right check if netdev is IPoIB or not. The layering problem is that > >>> upper layers (ULPs) should use it as regular netdevice. > >> > >> This is good to know. However, since the SMB protocol explicitly calls > >> for enumeration of all network interfaces on the server host, > >> including their RDMA capabilities, I believe this is a sensible > >> exception to the layering rule. Or is there anyway else to do this > >> enumeration from the kernel space? > >> > >> Or we can give up implementing the full spec of the SMB protocol and > >> call for explicit configuration from user space on how to respond to > >> the IOCTL requests in question. Which one looks more sensible to you? > > > > My preference is to have same IPoIB treatment for all ULPs, including SMB. If that is the case, then we don't really have many options left but to expose the advertisement of rdma-capable flags as a configurable option from the user space (maybe via sysfs). I am not sure if this will allow the user to mark an interface as RDMA-capable despite its incapability, or would the capability check be allowed to be made from the configuration validation site? > > > > My GUESS is that SMB specification authors didn't take into account HW and > > Linux SW development around IPoIB and weren't aware of IPoIB offload which > > is implemented and enabled by default in all modern IB NICs and Linux OSes. > > The SMB3 specification is completely unconcerned with IPoIB and any > other layer-2 or layer-3 implementation details. It merely discusses > an exchange of network interface capabilities such as link speed and > RDMA support. The SMB3 client uses this list to implement multichannel. > > I totally agree that inspecting ARPHRD_INFINIBAND is an incorrect method > of building this list. Just because an interface supports IPoIB does not > mean it also exposes RDMA, especially in-kernel. And that ignores any > non-IB transport too of course. I see, so if I understand this argument correctly, the point is that even if an IPoIB device *is* guaranteed to have some RDMA support in the stack (since IPoIB is ULP of an IB device, which always supports RDMA), it does not necessarily want to expose that capability to its own ULP in the stacks above, right? However if this is the case, then what would be the correct way to determine the capability flag from a ULP? > > Kangjing, please educate me if I'm confused here, but doesn't the > code in ksmbd_rdma_capable_netdev() look up the ib_device anyway, at > the end of the function? > > > if (rdma_capable == false) { > > struct ib_device *ibdev; > > > > ibdev = ib_device_get_by_netdev(netdev, RDMA_DRIVER_UNKNOWN); > > if (ibdev) { > > if (rdma_frwr_is_supported(&ibdev->attrs)) > > rdma_capable = true; > > ib_device_put(ibdev); > > } > > } > > > > return rdma_capable; > > So, why is the code concerned at all with ARPHRD_INFINIBAND just a few > lines above? This check does not work with IPoIB devices. For IPoIB devices ib_device_get_by_netdev would just return null. Correct me if I am wrong but I think this API is intended to work with RDMA/IB transport as ULP of a normal netdev transport (e.g. RoCE, iWARP). It essentially only performs a lookup of the devices up the stack, not down the stack, thus not working for IPoIB devices. I feel this is somehow intended as well since it works inline with the principle that IPoIB devices should just be treated like a normal netdev. This is probably true for the get_netdev verb on ib_device, and the ib_device_get_netdev API, they are just performing the lookup in reverse direction. > And why does it look in the smb_direct_device_list first? I don't know - this section of code is already here before my patch, and it confuses me a lot too. It is actually doing the lookup in one direction and then doing it again in the other direction, probably on the same mapping. I just left it there during initial patch submission, just in fear of breaking any strange corner cases. Thanks, Kangjing > > Tom. > > > > > That offload allows line-rate for IPoIB, something that is not possible > > for SW IPoIB. > > > > Thanks > > > >> > >> Thanks > >> > >>> > >>> Thanks > >>> > >>>> > >>>>>> > >>>>>> Thanks! > >>>>>>> > >>>>>>> I am uncertain about how to proceed at this point and would like to > >>>>>>> know your thoughts and opinions on this. > >>>>>>> > >>>>>>> Thanks, > >>>>>>> Kangjing > >>>>>>> > >>>>>>> On Fri, Nov 8, 2024 at 5:59 PM Leon Romanovsky <leon@kernel.org> wrote: > >>>>>>>> > >>>>>>>> On Fri, Nov 08, 2024 at 08:40:40AM +0900, Namjae Jeon wrote: > >>>>>>>>> On Thu, Nov 7, 2024 at 9:00 PM Halil Pasic <pasic@linux.ibm.com> wrote: > >>>>>>>>>> > >>>>>>>>>> On Wed, 6 Nov 2024 15:59:10 +0200 > >>>>>>>>>> Leon Romanovsky <leon@kernel.org> wrote: > >>>>>>>>>> > >>>>>>>>>>>> Does fs/smb/server/transport_rdma.c qualify as inside of RDMA core code? > >>>>>>>>>>> > >>>>>>>>>>> RDMA core code is drivers/infiniband/core/*. > >>>>>>>>>> > >>>>>>>>>> Understood. So this is a violation of the no direct access to the > >>>>>>>>>> callbacks rule. > >>>>>>>>>> > >>>>>>>>>>> > >>>>>>>>>>>> I would guess it is not, and I would not actually mind sending a patch > >>>>>>>>>>>> but I have trouble figuring out the logic behind commit ecce70cf17d9 > >>>>>>>>>>>> ("ksmbd: fix missing RDMA-capable flag for IPoIB device in > >>>>>>>>>>>> ksmbd_rdma_capable_netdev()"). > >>>>>>>>>>> > >>>>>>>>>>> It is strange version of RDMA-CM. All other ULPs use RDMA-CM to avoid > >>>>>>>>>>> GID, netdev and fabric complexity. > >>>>>>>>>> > >>>>>>>>>> I'm not familiar enough with either of the subsystems. Based on your > >>>>>>>>>> answer my guess is that it ain't outright bugous but still a layering > >>>>>>>>>> violation. Copying linux-cifs@vger.kernel.org so that > >>>>>>>>>> the smb are aware. > >>>>>>>>> Could you please elaborate what the violation is ? > >>>>>>>> > >>>>>>>> There are many, but the most screaming is that ksmbd has logic to > >>>>>>>> differentiate IPoIB devices. These devices are pure netdev devices > >>>>>>>> and should be treated like that. ULPs should treat them exactly > >>>>>>>> as they treat netdev devices. > >>>>>>>> > >>>>>>>>> I would also appreciate it if you could suggest to me how to fix this. > >>>>>>>>> > >>>>>>>>> Thanks. > >>>>>>>>>> > >>>>>>>>>> Thank you very much for all the explanations! > >>>>>>>>>> > >>>>>>>>>> Regards, > >>>>>>>>>> Halil > >>>>>>>>>> > >>>>>>> > >>>>>>> > >>>>>>> > >>>>>>> -- > >>>>>>> Kangjing "Chaser" Huang > >>>> > >>>> > >>>> > >>>> -- > >>>> Kangjing "Chaser" Huang > >> > >> > >> > >> -- > >> Kangjing "Chaser" Huang > > > > > -- Kangjing "Chaser" Huang ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH net] net/smc: Fix lookup of netdev by using ib_device_get_netdev() 2025-01-08 22:40 ` Kangjing Huang @ 2025-01-09 7:59 ` Leon Romanovsky 0 siblings, 0 replies; 20+ messages in thread From: Leon Romanovsky @ 2025-01-09 7:59 UTC (permalink / raw) To: Kangjing Huang; +Cc: Tom Talpey, Namjae Jeon, linux-cifs On Wed, Jan 08, 2025 at 10:40:22PM +0000, Kangjing Huang wrote: > On Wed, Jan 8, 2025 at 5:27 PM Tom Talpey <tom@talpey.com> wrote: > > > > On 1/8/2025 4:31 AM, Leon Romanovsky wrote: > > > On Tue, Jan 07, 2025 at 10:51:19PM +0000, Kangjing Huang wrote: > > >> On Thu, Dec 19, 2024 at 4:56 PM Leon Romanovsky <leon@kernel.org> wrote: > > >>> > > >>> On Sat, Dec 14, 2024 at 08:02:14AM +0000, Kangjing Huang wrote: > > >>>> On Sat, Dec 14, 2024 at 1:06 AM Leon Romanovsky <leon@kernel.org> wrote: > > >>>>> > > >>>>> > > >>>>> > > >>>>> On Sat, Dec 14, 2024, at 04:33, Namjae Jeon wrote: > > >>>>>> On Fri, Dec 13, 2024 at 8:07 PM Kangjing Huang <huangkangjing@gmail.com> wrote: > > >>>>>>> > > >>>>>>> Hi there, > > >>>>>>> > > >>>>>>> I am the original author of commit ecce70cf17d9 ("ksmbd: fix missing > > >>>>>>> RDMA-capable flag for IPoIB device in ksmbd_rdma_capable_netdev()"), > > >>>>>>> as mentioned in the thread. > > >>>>>>> > > >>>>>>> I am working on modifying the patch to take care of the layering > > >>>>>>> violation. The original patch was meant to fix an issue with ksmbd, > > >>>>>>> where an IPoIB netdev was not recognized as RDMA-capable. The original > > >>>>>>> version of the capability evaluation tries to match each netdev to > > >>>>>>> ib_device by calling get_netdev in ib verbs. However this only works > > >>>>>>> in cases where the ib_device is the upper layer of netdev (e.g. RoCE), > > >>>>>>> and since with IPoIB it is the other way around (netdev is the upper > > >>>>>>> layer of ib_device), get_netdev won't work anymore. > > >>>>>>> > > >>>>>>> I tried to replicate the behavior of device matching reversely in the > > >>>>>>> original version of my patch using GID, which ended up as the layering > > >>>>>>> violation. However I am unaware of any exported functions from the > > >>>>>>> IPoIB driver that could do the reverse lookup from netdev to the lower > > >>>>>>> layer ib_device. Actually it seems that the IPoIB driver does not have > > >>>>>>> any exported symbols at all. > > >>>>>>> > > >>>>>>> It might be that the device matching in reverse just does not make any > > >>>>>>> sense and does not need to be done at all. As long as it is an IPoIB > > >>>>>>> device (netdev->type == ARPHRD_INFINIBAND) it might be ok to just > > >>>>>>> automatically assume it is RDMA-capable. I am not 100% sure about this > > >>>>>>> though. > > >>>>>> Why can't we assume RDMA-capable if it's ARPHRD_INFINIBAND type? > > >>>>>> How about assuming it's RDMA-capable and allowing users to turn > > >>>>>> RDMA-capable on/off via sysfs? > > >>>> It does make more sense to me at this point to just broadly assume all > > >>>> ARPHRD_INFINIBAND types to be RDMA-capable, we just need to make sure > > >>>> this assumption indeed holds and figure out to what extent this could > > >>>> involve the same layering violation. > > >>>> > > >>>>> > > >>>>> Any attempt to treat ipoib differently from regular netdevice is wrong by definition. > > >>>>> > > >>>> I would agree that the design direction to treat ipoib as a pure > > >>>> regular net_device is the good way to go. But the problem with ksmbd > > >>>> and ipoib devices stems from the SMB protocol itself. > > >>>> > > >>>> In contrast to protocols that focus on certain functionalities like > > >>>> nfs, SMB actually tries to manage network interfaces actively in the > > >>>> protocol itself: SMB protocol's RDMA support (dubbed SMB Direct) is a > > >>>> sub-feature of SMB Multichannel. Multichannel is designed to let > > >>>> client and server find multiple data paths automatically (imagine a > > >>>> pair of hosts with multiple adapters connected by multiple cables) to > > >>>> increase bandwidth. So client can initiate a > > >>>> FSCTL_QUERY_NETWORK_INTERFACE_INFO request and server is expected to > > >>>> respond with NETWORK_INTERFACE_INFO containing _all_ local network > > >>>> interface informations, including their capabilities such as > > >>>> RDMA_CAPABLE (for details see ref [MS-SMB2] 3.3.5.15.11) Only upon > > >>>> seeing the capability flag would a client attempt to initiate a RDMA > > >>>> connection. > > >>>> > > >>>> Reference: [MS-SMB2](https://winprotocoldoc.z19.web.core.windows.net/MS-SMB2/%5bMS-SMB2%5d.pdf) > > >>>> > > >>>> TLDR is that the SMB protocol requires the server to enumerate all > > >>>> net_devices and indicate their RDMA capability, and > > >>>> ksmbd_rdma_capable_netdev() is only used in that process. Given such > > >>>> context, I wonder what should be the best way to approach this? Is > > >>>> using ARPHRD_INFINIBAND good enough and acceptable in terms of > > >>>> layering? > > >>> > > >> > > >>> The thing is that ARPHRD_INFINIBAND indeed represent IPoIB and it is > > >>> right check if netdev is IPoIB or not. The layering problem is that > > >>> upper layers (ULPs) should use it as regular netdevice. > > >> > > >> This is good to know. However, since the SMB protocol explicitly calls > > >> for enumeration of all network interfaces on the server host, > > >> including their RDMA capabilities, I believe this is a sensible > > >> exception to the layering rule. Or is there anyway else to do this > > >> enumeration from the kernel space? > > >> > > >> Or we can give up implementing the full spec of the SMB protocol and > > >> call for explicit configuration from user space on how to respond to > > >> the IOCTL requests in question. Which one looks more sensible to you? > > > > > > My preference is to have same IPoIB treatment for all ULPs, including SMB. > > If that is the case, then we don't really have many options left but > to expose the advertisement of rdma-capable flags as a configurable > option from the user space (maybe via sysfs). I am not sure if this > will allow the user to mark an interface as RDMA-capable despite its > incapability, or would the capability check be allowed to be made from > the configuration validation site? Except SMB spec, why do you need to provide "RDMA-capable" information? Is it must? What will it give to the users? Why can't you treat IPoIB like any other netdevice? > > > > > > > My GUESS is that SMB specification authors didn't take into account HW and > > > Linux SW development around IPoIB and weren't aware of IPoIB offload which > > > is implemented and enabled by default in all modern IB NICs and Linux OSes. > > > > The SMB3 specification is completely unconcerned with IPoIB and any > > other layer-2 or layer-3 implementation details. It merely discusses > > an exchange of network interface capabilities such as link speed and > > RDMA support. The SMB3 client uses this list to implement multichannel. > > > > I totally agree that inspecting ARPHRD_INFINIBAND is an incorrect method > > of building this list. Just because an interface supports IPoIB does not > > mean it also exposes RDMA, especially in-kernel. And that ignores any > > non-IB transport too of course. > > I see, so if I understand this argument correctly, the point is that > even if an IPoIB device *is* guaranteed to have some RDMA support in > the stack (since IPoIB is ULP of an IB device, which always supports > RDMA), it does not necessarily want to expose that capability to its > own ULP in the stacks above, right? However if this is the case, then > what would be the correct way to determine the capability flag from a > ULP? Let's start with an answer to more simple question: "why do you need this capability flag?" > > > > > Kangjing, please educate me if I'm confused here, but doesn't the > > code in ksmbd_rdma_capable_netdev() look up the ib_device anyway, at > > the end of the function? > > > > > if (rdma_capable == false) { > > > struct ib_device *ibdev; > > > > > > ibdev = ib_device_get_by_netdev(netdev, RDMA_DRIVER_UNKNOWN); > > > if (ibdev) { > > > if (rdma_frwr_is_supported(&ibdev->attrs)) > > > rdma_capable = true; > > > ib_device_put(ibdev); > > > } > > > } > > > > > > return rdma_capable; > > > > So, why is the code concerned at all with ARPHRD_INFINIBAND just a few > > lines above? > > This check does not work with IPoIB devices. For IPoIB devices > ib_device_get_by_netdev would just return null. > > Correct me if I am wrong but I think this API is intended to work with > RDMA/IB transport as ULP of a normal netdev transport (e.g. RoCE, > iWARP). It essentially only performs a lookup of the devices up the > stack, not down the stack, thus not working for IPoIB devices. I feel > this is somehow intended as well since it works inline with the > principle that IPoIB devices should just be treated like a normal > netdev. > > This is probably true for the get_netdev verb on ib_device, and the > ib_device_get_netdev API, they are just performing the lookup in > reverse direction. Yes, ib_device_get_by_netdev and get_netdev are intended to perform lookup of ib device based on underlying netdev, but in IPoIB case you are interested in ib device based on upper netdev. So this leads to another question, if user didn't ask to connect SMB to IB device and chose netdevice (IPoIB) instead, why are you still forcing him to take IB path? If it is not user's decision and you are choosing devices from the list, you already have in your list the IB device which is connected to IPoIB. Thanks ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH net] net/smc: Fix lookup of netdev by using ib_device_get_netdev() 2025-01-07 22:51 ` Kangjing Huang 2025-01-08 9:31 ` Leon Romanovsky @ 2025-01-09 8:02 ` Christoph Hellwig 2025-01-09 10:43 ` Kangjing Huang 1 sibling, 1 reply; 20+ messages in thread From: Christoph Hellwig @ 2025-01-09 8:02 UTC (permalink / raw) To: Kangjing Huang; +Cc: Leon Romanovsky, Namjae Jeon, linux-cifs On Tue, Jan 07, 2025 at 10:51:19PM +0000, Kangjing Huang wrote: > This is good to know. However, since the SMB protocol explicitly calls > for enumeration of all network interfaces on the server host, > including their RDMA capabilities, I believe this is a sensible > exception to the layering rule. Or is there anyway else to do this > enumeration from the kernel space? No, it's not a sensible exception. It's a massive data leak and a completely idiotic protocol feasture Linux should not support. If the protocol requires a lsit of network interfaces, a Linux server should require explicitly require that list to be configured and not expose private information to the untrusted network. ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH net] net/smc: Fix lookup of netdev by using ib_device_get_netdev() 2025-01-09 8:02 ` Christoph Hellwig @ 2025-01-09 10:43 ` Kangjing Huang 2025-01-09 17:49 ` Tom Talpey 0 siblings, 1 reply; 20+ messages in thread From: Kangjing Huang @ 2025-01-09 10:43 UTC (permalink / raw) To: Christoph Hellwig, Leon Romanovsky; +Cc: Namjae Jeon, linux-cifs On Thu, Jan 9, 2025 at 8:02 AM Christoph Hellwig <hch@infradead.org> wrote: > > On Tue, Jan 07, 2025 at 10:51:19PM +0000, Kangjing Huang wrote: > > This is good to know. However, since the SMB protocol explicitly calls > > for enumeration of all network interfaces on the server host, > > including their RDMA capabilities, I believe this is a sensible > > exception to the layering rule. Or is there anyway else to do this > > enumeration from the kernel space? > > No, it's not a sensible exception. It's a massive data leak and a > completely idiotic protocol feasture Linux should not support. If the > protocol requires a lsit of network interfaces, a Linux server should > require explicitly require that list to be configured and not expose > private information to the untrusted network. > I see the point. I wasn't thinking about it from the security perspective too much and would agree with you on this argument about data leaks. The protocol itself is not necessarily unsecured, since in the spec it calls for enumeration in an "implementation-specific manner"[1]. I would interpret that as the implementation could enumerate interfaces as it sees fit to its functional and security perspectives. The spec only requires the server to always return a list of client-usable interfaces, that does not need to always be the full interface list. That being said, from ksmbd's implementation perspective, this definitely needs to be something to be explicitly configured. ref: [1](https://winprotocoldoc.z19.web.core.windows.net/MS-SMB2/%5bMS-SMB2%5d-240729.pdf) sec 3.3.5.15.11 On Thu, Jan 9, 2025 at 7:59 AM Leon Romanovsky <leon@kernel.org> wrote: ... > Except SMB spec, why do you need to provide "RDMA-capable" information? > Is it must? What will it give to the users? Why can't you treat IPoIB > like any other netdevice? ... > Let's start with an answer to more simple question: "why do you need > this capability flag?" The short answer is: a Windows client requires this flag to be present to actually utilize RDMA. Long answer: Although SMB-Direct (Microsoft speak for SMB over RDMA) protocol technically is just wrapping SMB packets in RDMA transport, allowing for a SMB connection to be completely handshaked and established in RDMA context, without any need for transferring ip packets. This kind of connection seems to be never happening for the actual client implementation in Windows. Under Windows, SMB Direct is only enabled when SMB multichannel is enabled. And there is no way for the user to specify if they want to connect to the IPoIB endpoint or RDMA endpoint - the client simply connects to the ip interface first, uses the aforementioned IOCTL request to query the RDMA capabilities for all interfaces, and upon finding usable RDMA-capable interfaces, opens preferred data channels on RDMA transport to carry the actual data. As far as I know there is no way from a Windows user's perspective to modify this behavior and upon disabling SMB multichannel, SMB will just disable RDMA support and transfer everything over IP. The RDMA transport is only "automatically upgraded to", no explicit configurations are available whatsoever. So if ksmbd does not send out capability flags to indicate the Windows client to initiate RDMA transport as a side channel, the client will just keep working with connections on the ip stack and the user can never utilize RDMA. To be clear: I would strongly agree that the Windows client's behavior here is pretty stupid and is just outright dumb design. In configuring my two-workstation setup utilizing this protocol, the no-config design of the Windows side has created far more problems than it has solved. It also somehow brought me here submitting my first kernel patch. However if we want any interoperability of ksmbd with Windows clients on the RDMA front, we would need to implement the IOCTL response to some degree and send out the RDMA capability flags. My apologies for not making this context earlier, I was too hyper-focused on the code itself to fall into the classic XY problem trap. Disclaimer: all my knowledge and research about windows client is limited to the edition I have access to (Windows 10 Pro Workstation), I have no idea if Windows server edition's client is different. ... > > Yes, ib_device_get_by_netdev and get_netdev are intended to perform > lookup of ib device based on underlying netdev, but in IPoIB case you > are interested in ib device based on upper netdev. > > So this leads to another question, if user didn't ask to connect SMB to > IB device and chose netdevice (IPoIB) instead, why are you still forcing > him to take IB path? If it is not user's decision and you are choosing > devices from the list, you already have in your list the IB device which > is connected to IPoIB. This is related to the long answer to the first question. Basically using a Windows client the user cannot make decisions to use RDMA or not, it is not the decision of the server, either - the client will enumerate the interfaces and make decisions for the user. And due to the presence of SMB multichannel, the ip interface receiving the interface enumeration request is not even guaranteed to be the connected IPoIB interface - the multichannel protocol is designed to work with service discovery, where it is totally possible that the initial connection will be established on another data path, before the client discovers another better path potentially with RDMA capability. The only way for ksmbd to be fully compatible with these is to implement the interface enumeration to some degree. Although I am indeed convinced that this needs to be explicitly configured to avoid any security risks. Thanks > > Thanks -- Kangjing "Chaser" Huang ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH net] net/smc: Fix lookup of netdev by using ib_device_get_netdev() 2025-01-09 10:43 ` Kangjing Huang @ 2025-01-09 17:49 ` Tom Talpey 2025-01-15 7:17 ` Christoph Hellwig 0 siblings, 1 reply; 20+ messages in thread From: Tom Talpey @ 2025-01-09 17:49 UTC (permalink / raw) To: Kangjing Huang, Christoph Hellwig, Leon Romanovsky Cc: Namjae Jeon, linux-cifs On 1/9/2025 5:43 AM, Kangjing Huang wrote: > On Thu, Jan 9, 2025 at 8:02 AM Christoph Hellwig <hch@infradead.org> wrote: >> >> On Tue, Jan 07, 2025 at 10:51:19PM +0000, Kangjing Huang wrote: >>> This is good to know. However, since the SMB protocol explicitly calls >>> for enumeration of all network interfaces on the server host, >>> including their RDMA capabilities, I believe this is a sensible >>> exception to the layering rule. Or is there anyway else to do this >>> enumeration from the kernel space? >> >> No, it's not a sensible exception. It's a massive data leak and a >> completely idiotic protocol feasture Linux should not support. If the >> protocol requires a lsit of network interfaces, a Linux server should >> require explicitly require that list to be configured and not expose >> private information to the untrusted network. >> > > I see the point. I wasn't thinking about it from the security > perspective too much and would agree with you on this argument about > data leaks. > > The protocol itself is not necessarily unsecured, since in the spec it > calls for enumeration in an "implementation-specific manner"[1]. I > would interpret that as the implementation could enumerate interfaces > as it sees fit to its functional and security perspectives. The spec > only requires the server to always return a list of client-usable > interfaces, that does not need to always be the full interface list. Absolutely. Windows has a number of filters on both sides to decide which interfaces to advertise (server) and which to actually connect to (client). For example, back-end cluster interfaces are never exposed via QUERY_NETWORK_INTERFACES. The ksmbd.conf file already has the "interfaces=" stanza, perhaps you/we should simply consider using that list as the base. This effectively would force the "bind interfaces only" flag to true for RDMA adapters however. Making system-specific lists like these explicitly opt-in is rarely popular. Another alternative is to use the rdma_cm, which is the actual thing controlling the listeners. When it begins listening on an adapter, perhaps there's a callout that ksmbd can monitor to enumerate the endpoints that will respond to 445/5445. Tom. > > That being said, from ksmbd's implementation perspective, this > definitely needs to be something to be explicitly configured. > > ref: [1](https://winprotocoldoc.z19.web.core.windows.net/MS-SMB2/%5bMS-SMB2%5d-240729.pdf) > sec 3.3.5.15.11 > > On Thu, Jan 9, 2025 at 7:59 AM Leon Romanovsky <leon@kernel.org> wrote: > ... > >> Except SMB spec, why do you need to provide "RDMA-capable" information? >> Is it must? What will it give to the users? Why can't you treat IPoIB >> like any other netdevice? > > ... > >> Let's start with an answer to more simple question: "why do you need >> this capability flag?" > > The short answer is: a Windows client requires this flag to be present > to actually utilize RDMA. > > Long answer: > > Although SMB-Direct (Microsoft speak for SMB over RDMA) protocol > technically is just wrapping SMB packets in RDMA transport, allowing > for a SMB connection to be completely handshaked and established in > RDMA context, without any need for transferring ip packets. This kind > of connection seems to be never happening for the actual client > implementation in Windows. > > Under Windows, SMB Direct is only enabled when SMB multichannel is > enabled. And there is no way for the user to specify if they want to > connect to the IPoIB endpoint or RDMA endpoint - the client simply > connects to the ip interface first, uses the aforementioned IOCTL > request to query the RDMA capabilities for all interfaces, and upon > finding usable RDMA-capable interfaces, opens preferred data channels > on RDMA transport to carry the actual data. > > As far as I know there is no way from a Windows user's perspective to > modify this behavior and upon disabling SMB multichannel, SMB will > just disable RDMA support and transfer everything over IP. The RDMA > transport is only "automatically upgraded to", no explicit > configurations are available whatsoever. > > So if ksmbd does not send out capability flags to indicate the Windows > client to initiate RDMA transport as a side channel, the client will > just keep working with connections on the ip stack and the user can > never utilize RDMA. > > To be clear: I would strongly agree that the Windows client's behavior > here is pretty stupid and is just outright dumb design. In configuring > my two-workstation setup utilizing this protocol, the no-config design > of the Windows side has created far more problems than it has solved. > It also somehow brought me here submitting my first kernel patch. > However if we want any interoperability of ksmbd with Windows clients > on the RDMA front, we would need to implement the IOCTL response to > some degree and send out the RDMA capability flags. > > My apologies for not making this context earlier, I was too > hyper-focused on the code itself to fall into the classic XY problem > trap. > > Disclaimer: all my knowledge and research about windows client is > limited to the edition I have access to (Windows 10 Pro Workstation), > I have no idea if Windows server edition's client is different. > > ... > >> >> Yes, ib_device_get_by_netdev and get_netdev are intended to perform >> lookup of ib device based on underlying netdev, but in IPoIB case you >> are interested in ib device based on upper netdev. >> >> So this leads to another question, if user didn't ask to connect SMB to >> IB device and chose netdevice (IPoIB) instead, why are you still forcing >> him to take IB path? If it is not user's decision and you are choosing >> devices from the list, you already have in your list the IB device which >> is connected to IPoIB. > > This is related to the long answer to the first question. Basically > using a Windows client the user cannot make decisions to use RDMA or > not, it is not the decision of the server, either - the client will > enumerate the interfaces and make decisions for the user. And due to > the presence of SMB multichannel, the ip interface receiving the > interface enumeration request is not even guaranteed to be the > connected IPoIB interface - the multichannel protocol is designed to > work with service discovery, where it is totally possible that the > initial connection will be established on another data path, before > the client discovers another better path potentially with RDMA > capability. The only way for ksmbd to be fully compatible with these > is to implement the interface enumeration to some degree. Although I > am indeed convinced that this needs to be explicitly configured to > avoid any security risks. > > Thanks > > >> >> Thanks > > > > > -- > Kangjing "Chaser" Huang > > ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH net] net/smc: Fix lookup of netdev by using ib_device_get_netdev() 2025-01-09 17:49 ` Tom Talpey @ 2025-01-15 7:17 ` Christoph Hellwig 0 siblings, 0 replies; 20+ messages in thread From: Christoph Hellwig @ 2025-01-15 7:17 UTC (permalink / raw) To: Tom Talpey Cc: Kangjing Huang, Christoph Hellwig, Leon Romanovsky, Namjae Jeon, linux-cifs On Thu, Jan 09, 2025 at 12:49:16PM -0500, Tom Talpey wrote: > Absolutely. Windows has a number of filters on both sides to decide > which interfaces to advertise (server) and which to actually connect > to (client). For example, back-end cluster interfaces are never > exposed via QUERY_NETWORK_INTERFACES. > > The ksmbd.conf file already has the "interfaces=" stanza, perhaps > you/we should simply consider using that list as the base. This > effectively would force the "bind interfaces only" flag to true > for RDMA adapters however. Making system-specific lists like these > explicitly opt-in is rarely popular. Filter still seems like the wrong approach vs an explicitly configured list. That's what for example nvme over fabrics does for discovery. ^ permalink raw reply [flat|nested] 20+ messages in thread
end of thread, other threads:[~2025-01-15 7:17 UTC | newest]
Thread overview: 20+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <20241025072356.56093-1-wenjia@linux.ibm.com>
[not found] ` <20241027201857.GA1615717@unreal>
[not found] ` <8d17b403-aefa-4f36-a913-7ace41cf2551@linux.ibm.com>
[not found] ` <20241105112313.GE311159@unreal>
[not found] ` <20241106102439.4ca5effc.pasic@linux.ibm.com>
[not found] ` <20241106135910.GF5006@unreal>
2024-11-07 11:56 ` [PATCH net] net/smc: Fix lookup of netdev by using ib_device_get_netdev() Halil Pasic
2024-11-07 12:13 ` Leon Romanovsky
2024-11-07 23:40 ` Namjae Jeon
2024-11-08 17:59 ` Leon Romanovsky
2024-11-09 5:32 ` Namjae Jeon
2024-12-13 11:07 ` Kangjing Huang
2024-12-13 12:15 ` Leon Romanovsky
2024-12-14 2:33 ` Namjae Jeon
2024-12-14 6:06 ` Leon Romanovsky
2024-12-14 8:02 ` Kangjing Huang
2024-12-19 16:56 ` Leon Romanovsky
2025-01-07 22:51 ` Kangjing Huang
2025-01-08 9:31 ` Leon Romanovsky
2025-01-08 17:27 ` Tom Talpey
2025-01-08 22:40 ` Kangjing Huang
2025-01-09 7:59 ` Leon Romanovsky
2025-01-09 8:02 ` Christoph Hellwig
2025-01-09 10:43 ` Kangjing Huang
2025-01-09 17:49 ` Tom Talpey
2025-01-15 7:17 ` Christoph Hellwig
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox