diff mbox series

[PATCHv5,for-next,1/1] RDMA/rxe: Disable ipv6 features when ipv6.disable in cmdline

Message ID 20210413234252.12209-1-yanjun.zhu@intel.com (mailing list archive)
State Changes Requested
Delegated to: Jason Gunthorpe
Headers show
Series [PATCHv5,for-next,1/1] RDMA/rxe: Disable ipv6 features when ipv6.disable in cmdline | expand

Commit Message

Zhu Yanjun April 13, 2021, 11:42 p.m. UTC
From: Zhu Yanjun <zyjzyj2000@gmail.com>

When ipv6.disable=1 is set in cmdline, ipv6 is actually disabled
in the stack. As such, the operations of ipv6 in RXE will fail.
So ipv6 features in RXE should also be disabled in RXE.

Link: https://lore.kernel.org/linux-rdma/880d7b59-4b17-a44f-1a91-88257bfc3aaa@redhat.com/T/#t
Fixes: 8700e3e7c4857 ("Soft RoCE driver")
Reported-by: Yi Zhang <yi.zhang@redhat.com>
Signed-off-by: Zhu Yanjun <zyjzyj2000@gmail.com>
---
V4->V5: Clean up signature block and remove error message
V3->V4: Check the returned value instead of ipv6 module
V2->V3: Remove print message
V1->V2: Modify the pr_info messages
---
 drivers/infiniband/sw/rxe/rxe_net.c | 13 ++++++++++++-
 1 file changed, 12 insertions(+), 1 deletion(-)

Comments

Leon Romanovsky April 13, 2021, 10:48 a.m. UTC | #1
On Tue, Apr 13, 2021 at 07:42:52PM -0400, Zhu Yanjun wrote:
> From: Zhu Yanjun <zyjzyj2000@gmail.com>
> 
> When ipv6.disable=1 is set in cmdline, ipv6 is actually disabled
> in the stack. As such, the operations of ipv6 in RXE will fail.
> So ipv6 features in RXE should also be disabled in RXE.
> 
> Link: https://lore.kernel.org/linux-rdma/880d7b59-4b17-a44f-1a91-88257bfc3aaa@redhat.com/T/#t
> Fixes: 8700e3e7c4857 ("Soft RoCE driver")
> Reported-by: Yi Zhang <yi.zhang@redhat.com>
> Signed-off-by: Zhu Yanjun <zyjzyj2000@gmail.com>
> ---
> V4->V5: Clean up signature block and remove error message
> V3->V4: Check the returned value instead of ipv6 module
> V2->V3: Remove print message
> V1->V2: Modify the pr_info messages
> ---
>  drivers/infiniband/sw/rxe/rxe_net.c | 13 ++++++++++++-
>  1 file changed, 12 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/infiniband/sw/rxe/rxe_net.c b/drivers/infiniband/sw/rxe/rxe_net.c
> index 01662727dca0..984c3ac449bd 100644
> --- a/drivers/infiniband/sw/rxe/rxe_net.c
> +++ b/drivers/infiniband/sw/rxe/rxe_net.c
> @@ -208,7 +208,13 @@ static struct socket *rxe_setup_udp_tunnel(struct net *net, __be16 port,
>  	/* Create UDP socket */
>  	err = udp_sock_create(net, &udp_cfg, &sock);
>  	if (err < 0) {
> -		pr_err("failed to create udp socket. err = %d\n", err);
> +		/* If UDP tunnel over ipv6 fails with -EAFNOSUPPORT, the tunnel
> +		 * over ipv4 still works. This error message will not pop out.
> +		 * If UDP tunnle over ipv4 fails or other errors with ipv6
> +		 * tunnel, this error should pop out.
> +		 */
> +		if (!((err == -EAFNOSUPPORT) && (ipv6)))

You have too much brackets.

if (err != -EAFNOSUPPORT || !ipv6)))

> +			pr_err("failed to create udp socket. err = %d\n", err);
>  		return ERR_PTR(err);
>  	}
>  
> @@ -620,6 +626,11 @@ static int rxe_net_ipv6_init(void)
>  	recv_sockets.sk6 = rxe_setup_udp_tunnel(&init_net,
>  						htons(ROCE_V2_UDP_DPORT), true);
>  	if (IS_ERR(recv_sockets.sk6)) {
> +		/* Though IPv6 is not supported, IPv4 still needs to continue
> +		 */
> +		if (PTR_ERR(recv_sockets.sk6) == -EAFNOSUPPORT)
> +			return 0;
> +
>  		recv_sockets.sk6 = NULL;
>  		pr_err("Failed to create IPv6 UDP tunnel\n");
>  		return -1;
> -- 
> 2.27.0
>
Kamal Heib April 13, 2021, 1:56 p.m. UTC | #2
On 4/14/21 2:42 AM, Zhu Yanjun wrote:
> From: Zhu Yanjun <zyjzyj2000@gmail.com>
> 
> When ipv6.disable=1 is set in cmdline, ipv6 is actually disabled
> in the stack. As such, the operations of ipv6 in RXE will fail.
> So ipv6 features in RXE should also be disabled in RXE.
> 
> Link: https://lore.kernel.org/linux-rdma/880d7b59-4b17-a44f-1a91-88257bfc3aaa@redhat.com/T/#t
> Fixes: 8700e3e7c4857 ("Soft RoCE driver")
> Reported-by: Yi Zhang <yi.zhang@redhat.com>
> Signed-off-by: Zhu Yanjun <zyjzyj2000@gmail.com>
> ---
> V4->V5: Clean up signature block and remove error message
> V3->V4: Check the returned value instead of ipv6 module
> V2->V3: Remove print message
> V1->V2: Modify the pr_info messages
> ---
>  drivers/infiniband/sw/rxe/rxe_net.c | 13 ++++++++++++-
>  1 file changed, 12 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/infiniband/sw/rxe/rxe_net.c b/drivers/infiniband/sw/rxe/rxe_net.c
> index 01662727dca0..984c3ac449bd 100644
> --- a/drivers/infiniband/sw/rxe/rxe_net.c
> +++ b/drivers/infiniband/sw/rxe/rxe_net.c
> @@ -208,7 +208,13 @@ static struct socket *rxe_setup_udp_tunnel(struct net *net, __be16 port,
>  	/* Create UDP socket */
>  	err = udp_sock_create(net, &udp_cfg, &sock);
>  	if (err < 0) {
> -		pr_err("failed to create udp socket. err = %d\n", err);
> +		/* If UDP tunnel over ipv6 fails with -EAFNOSUPPORT, the tunnel
> +		 * over ipv4 still works. This error message will not pop out.
> +		 * If UDP tunnle over ipv4 fails or other errors with ipv6
> +		 * tunnel, this error should pop out.
> +		 */
> +		if (!((err == -EAFNOSUPPORT) && (ipv6)))
> +			pr_err("failed to create udp socket. err = %d\n", err);
>  		return ERR_PTR(err);
>  	}
>  
> @@ -620,6 +626,11 @@ static int rxe_net_ipv6_init(void)
>  	recv_sockets.sk6 = rxe_setup_udp_tunnel(&init_net,
>  						htons(ROCE_V2_UDP_DPORT), true);
>  	if (IS_ERR(recv_sockets.sk6)) {
> +		/* Though IPv6 is not supported, IPv4 still needs to continue
> +		 */
> +		if (PTR_ERR(recv_sockets.sk6) == -EAFNOSUPPORT)
> +			return 0;
> +
>  		recv_sockets.sk6 = NULL;
>  		pr_err("Failed to create IPv6 UDP tunnel\n");
>  		return -1;
> 

I think the following change is much simpler than changing the udp_sock_create()
helper function?


diff --git a/drivers/infiniband/sw/rxe/rxe_net.c
b/drivers/infiniband/sw/rxe/rxe_net.c
index 01662727dca0..b56d6f76ab31 100644
--- a/drivers/infiniband/sw/rxe/rxe_net.c
+++ b/drivers/infiniband/sw/rxe/rxe_net.c
@@ -621,6 +621,11 @@ static int rxe_net_ipv6_init(void)
                                                htons(ROCE_V2_UDP_DPORT), true);
        if (IS_ERR(recv_sockets.sk6)) {
                recv_sockets.sk6 = NULL;
+               if (PTR_ERR(recv_sockets.sk6) == -EAFNOSUPPORT) {
+                       pr_warn("Create IPv6 UDP tunnel is not supported\n");
+                       return 0;
+               }
+
                pr_err("Failed to create IPv6 UDP tunnel\n");
                return -1;
        }
Leon Romanovsky April 13, 2021, 2:39 p.m. UTC | #3
On Tue, Apr 13, 2021 at 04:56:05PM +0300, Kamal Heib wrote:
> 
> 
> On 4/14/21 2:42 AM, Zhu Yanjun wrote:
> > From: Zhu Yanjun <zyjzyj2000@gmail.com>
> > 
> > When ipv6.disable=1 is set in cmdline, ipv6 is actually disabled
> > in the stack. As such, the operations of ipv6 in RXE will fail.
> > So ipv6 features in RXE should also be disabled in RXE.
> > 
> > Link: https://lore.kernel.org/linux-rdma/880d7b59-4b17-a44f-1a91-88257bfc3aaa@redhat.com/T/#t
> > Fixes: 8700e3e7c4857 ("Soft RoCE driver")
> > Reported-by: Yi Zhang <yi.zhang@redhat.com>
> > Signed-off-by: Zhu Yanjun <zyjzyj2000@gmail.com>
> > ---
> > V4->V5: Clean up signature block and remove error message
> > V3->V4: Check the returned value instead of ipv6 module
> > V2->V3: Remove print message
> > V1->V2: Modify the pr_info messages
> > ---
> >  drivers/infiniband/sw/rxe/rxe_net.c | 13 ++++++++++++-
> >  1 file changed, 12 insertions(+), 1 deletion(-)
> > 
> > diff --git a/drivers/infiniband/sw/rxe/rxe_net.c b/drivers/infiniband/sw/rxe/rxe_net.c
> > index 01662727dca0..984c3ac449bd 100644
> > --- a/drivers/infiniband/sw/rxe/rxe_net.c
> > +++ b/drivers/infiniband/sw/rxe/rxe_net.c
> > @@ -208,7 +208,13 @@ static struct socket *rxe_setup_udp_tunnel(struct net *net, __be16 port,
> >  	/* Create UDP socket */
> >  	err = udp_sock_create(net, &udp_cfg, &sock);
> >  	if (err < 0) {
> > -		pr_err("failed to create udp socket. err = %d\n", err);
> > +		/* If UDP tunnel over ipv6 fails with -EAFNOSUPPORT, the tunnel
> > +		 * over ipv4 still works. This error message will not pop out.
> > +		 * If UDP tunnle over ipv4 fails or other errors with ipv6
> > +		 * tunnel, this error should pop out.
> > +		 */
> > +		if (!((err == -EAFNOSUPPORT) && (ipv6)))
> > +			pr_err("failed to create udp socket. err = %d\n", err);
> >  		return ERR_PTR(err);
> >  	}
> >  
> > @@ -620,6 +626,11 @@ static int rxe_net_ipv6_init(void)
> >  	recv_sockets.sk6 = rxe_setup_udp_tunnel(&init_net,
> >  						htons(ROCE_V2_UDP_DPORT), true);
> >  	if (IS_ERR(recv_sockets.sk6)) {
> > +		/* Though IPv6 is not supported, IPv4 still needs to continue
> > +		 */
> > +		if (PTR_ERR(recv_sockets.sk6) == -EAFNOSUPPORT)
> > +			return 0;
> > +
> >  		recv_sockets.sk6 = NULL;
> >  		pr_err("Failed to create IPv6 UDP tunnel\n");
> >  		return -1;
> > 
> 
> I think the following change is much simpler than changing the udp_sock_create()
> helper function?
> 
> 
> diff --git a/drivers/infiniband/sw/rxe/rxe_net.c
> b/drivers/infiniband/sw/rxe/rxe_net.c
> index 01662727dca0..b56d6f76ab31 100644
> --- a/drivers/infiniband/sw/rxe/rxe_net.c
> +++ b/drivers/infiniband/sw/rxe/rxe_net.c
> @@ -621,6 +621,11 @@ static int rxe_net_ipv6_init(void)
>                                                 htons(ROCE_V2_UDP_DPORT), true);
>         if (IS_ERR(recv_sockets.sk6)) {
>                 recv_sockets.sk6 = NULL;
> +               if (PTR_ERR(recv_sockets.sk6) == -EAFNOSUPPORT) {

You have "recv_sockets.sk6 = NULL;" in the line above.

> +                       pr_warn("Create IPv6 UDP tunnel is not supported\n");
> +                       return 0;
> +               }
> +
>                 pr_err("Failed to create IPv6 UDP tunnel\n");
>                 return -1;
>         }
> -- 
> 2.26.3
> 
> 
> Thanks,
> Kamal
>
Kamal Heib April 13, 2021, 7:34 p.m. UTC | #4
On 4/13/21 5:39 PM, Leon Romanovsky wrote:
> On Tue, Apr 13, 2021 at 04:56:05PM +0300, Kamal Heib wrote:
>>
>>
>> On 4/14/21 2:42 AM, Zhu Yanjun wrote:
>>> From: Zhu Yanjun <zyjzyj2000@gmail.com>
>>>
>>> When ipv6.disable=1 is set in cmdline, ipv6 is actually disabled
>>> in the stack. As such, the operations of ipv6 in RXE will fail.
>>> So ipv6 features in RXE should also be disabled in RXE.
>>>
>>> Link: https://lore.kernel.org/linux-rdma/880d7b59-4b17-a44f-1a91-88257bfc3aaa@redhat.com/T/#t
>>> Fixes: 8700e3e7c4857 ("Soft RoCE driver")
>>> Reported-by: Yi Zhang <yi.zhang@redhat.com>
>>> Signed-off-by: Zhu Yanjun <zyjzyj2000@gmail.com>
>>> ---
>>> V4->V5: Clean up signature block and remove error message
>>> V3->V4: Check the returned value instead of ipv6 module
>>> V2->V3: Remove print message
>>> V1->V2: Modify the pr_info messages
>>> ---
>>>  drivers/infiniband/sw/rxe/rxe_net.c | 13 ++++++++++++-
>>>  1 file changed, 12 insertions(+), 1 deletion(-)
>>>
>>> diff --git a/drivers/infiniband/sw/rxe/rxe_net.c b/drivers/infiniband/sw/rxe/rxe_net.c
>>> index 01662727dca0..984c3ac449bd 100644
>>> --- a/drivers/infiniband/sw/rxe/rxe_net.c
>>> +++ b/drivers/infiniband/sw/rxe/rxe_net.c
>>> @@ -208,7 +208,13 @@ static struct socket *rxe_setup_udp_tunnel(struct net *net, __be16 port,
>>>  	/* Create UDP socket */
>>>  	err = udp_sock_create(net, &udp_cfg, &sock);
>>>  	if (err < 0) {
>>> -		pr_err("failed to create udp socket. err = %d\n", err);
>>> +		/* If UDP tunnel over ipv6 fails with -EAFNOSUPPORT, the tunnel
>>> +		 * over ipv4 still works. This error message will not pop out.
>>> +		 * If UDP tunnle over ipv4 fails or other errors with ipv6
>>> +		 * tunnel, this error should pop out.
>>> +		 */
>>> +		if (!((err == -EAFNOSUPPORT) && (ipv6)))
>>> +			pr_err("failed to create udp socket. err = %d\n", err);
>>>  		return ERR_PTR(err);
>>>  	}
>>>  
>>> @@ -620,6 +626,11 @@ static int rxe_net_ipv6_init(void)
>>>  	recv_sockets.sk6 = rxe_setup_udp_tunnel(&init_net,
>>>  						htons(ROCE_V2_UDP_DPORT), true);
>>>  	if (IS_ERR(recv_sockets.sk6)) {
>>> +		/* Though IPv6 is not supported, IPv4 still needs to continue
>>> +		 */
>>> +		if (PTR_ERR(recv_sockets.sk6) == -EAFNOSUPPORT)
>>> +			return 0;
>>> +
>>>  		recv_sockets.sk6 = NULL;
>>>  		pr_err("Failed to create IPv6 UDP tunnel\n");
>>>  		return -1;
>>>
>>
>> I think the following change is much simpler than changing the udp_sock_create()
>> helper function?
>>
>>
>> diff --git a/drivers/infiniband/sw/rxe/rxe_net.c
>> b/drivers/infiniband/sw/rxe/rxe_net.c
>> index 01662727dca0..b56d6f76ab31 100644
>> --- a/drivers/infiniband/sw/rxe/rxe_net.c
>> +++ b/drivers/infiniband/sw/rxe/rxe_net.c
>> @@ -621,6 +621,11 @@ static int rxe_net_ipv6_init(void)
>>                                                 htons(ROCE_V2_UDP_DPORT), true);
>>         if (IS_ERR(recv_sockets.sk6)) {
>>                 recv_sockets.sk6 = NULL;
>> +               if (PTR_ERR(recv_sockets.sk6) == -EAFNOSUPPORT) {
> 
> You have "recv_sockets.sk6 = NULL;" in the line above.
> 

Sorry, my bad...

The idea is to handle this issue in the error path of rxe_net_ipv6_init()
instead of changing the udp_sock_create(), also to make sure that
"recv_sockets.sk6" is set to NULL.

diff --git a/drivers/infiniband/sw/rxe/rxe_net.c
b/drivers/infiniband/sw/rxe/rxe_net.c
index 01662727dca0..445a47f82f42 100644
--- a/drivers/infiniband/sw/rxe/rxe_net.c
+++ b/drivers/infiniband/sw/rxe/rxe_net.c
@@ -615,17 +615,25 @@ static int rxe_net_ipv4_init(void)

 static int rxe_net_ipv6_init(void)
 {
+       int err = 0;
 #if IS_ENABLED(CONFIG_IPV6)

        recv_sockets.sk6 = rxe_setup_udp_tunnel(&init_net,
                                                htons(ROCE_V2_UDP_DPORT), true);
        if (IS_ERR(recv_sockets.sk6)) {
+
+               if (PTR_ERR(recv_sockets.sk6) == -EAFNOSUPPORT) {
+                       pr_warn("Create IPv6 UDP tunnel is not supported\n");
+                       err = 0;
+               } else {
+                       pr_err("Failed to create IPv6 UDP tunnel\n");
+                       err = -1;
+               }
+
                recv_sockets.sk6 = NULL;
-               pr_err("Failed to create IPv6 UDP tunnel\n");
-               return -1;
        }
 #endif
-       return 0;
+       return err;
 }

>> +                       pr_warn("Create IPv6 UDP tunnel is not supported\n");
>> +                       return 0;
>> +               }
>> +
>>                 pr_err("Failed to create IPv6 UDP tunnel\n");
>>                 return -1;
>>         }
>> -- 
>> 2.26.3
>>
>>
>> Thanks,
>> Kamal
>>
>
Zhu Yanjun April 14, 2021, 3:46 a.m. UTC | #5
On Tue, Apr 13, 2021 at 6:48 PM Leon Romanovsky <leon@kernel.org> wrote:
>
> On Tue, Apr 13, 2021 at 07:42:52PM -0400, Zhu Yanjun wrote:
> > From: Zhu Yanjun <zyjzyj2000@gmail.com>
> >
> > When ipv6.disable=1 is set in cmdline, ipv6 is actually disabled
> > in the stack. As such, the operations of ipv6 in RXE will fail.
> > So ipv6 features in RXE should also be disabled in RXE.
> >
> > Link: https://lore.kernel.org/linux-rdma/880d7b59-4b17-a44f-1a91-88257bfc3aaa@redhat.com/T/#t
> > Fixes: 8700e3e7c4857 ("Soft RoCE driver")
> > Reported-by: Yi Zhang <yi.zhang@redhat.com>
> > Signed-off-by: Zhu Yanjun <zyjzyj2000@gmail.com>
> > ---
> > V4->V5: Clean up signature block and remove error message
> > V3->V4: Check the returned value instead of ipv6 module
> > V2->V3: Remove print message
> > V1->V2: Modify the pr_info messages
> > ---
> >  drivers/infiniband/sw/rxe/rxe_net.c | 13 ++++++++++++-
> >  1 file changed, 12 insertions(+), 1 deletion(-)
> >
> > diff --git a/drivers/infiniband/sw/rxe/rxe_net.c b/drivers/infiniband/sw/rxe/rxe_net.c
> > index 01662727dca0..984c3ac449bd 100644
> > --- a/drivers/infiniband/sw/rxe/rxe_net.c
> > +++ b/drivers/infiniband/sw/rxe/rxe_net.c
> > @@ -208,7 +208,13 @@ static struct socket *rxe_setup_udp_tunnel(struct net *net, __be16 port,
> >       /* Create UDP socket */
> >       err = udp_sock_create(net, &udp_cfg, &sock);
> >       if (err < 0) {
> > -             pr_err("failed to create udp socket. err = %d\n", err);
> > +             /* If UDP tunnel over ipv6 fails with -EAFNOSUPPORT, the tunnel
> > +              * over ipv4 still works. This error message will not pop out.
> > +              * If UDP tunnle over ipv4 fails or other errors with ipv6
> > +              * tunnel, this error should pop out.
> > +              */
> > +             if (!((err == -EAFNOSUPPORT) && (ipv6)))
>
> You have too much brackets.

My code corresponds with the comments.

Zhu Yanjun

>
> if (err != -EAFNOSUPPORT || !ipv6)))
>
> > +                     pr_err("failed to create udp socket. err = %d\n", err);
> >               return ERR_PTR(err);
> >       }
> >
> > @@ -620,6 +626,11 @@ static int rxe_net_ipv6_init(void)
> >       recv_sockets.sk6 = rxe_setup_udp_tunnel(&init_net,
> >                                               htons(ROCE_V2_UDP_DPORT), true);
> >       if (IS_ERR(recv_sockets.sk6)) {
> > +             /* Though IPv6 is not supported, IPv4 still needs to continue
> > +              */
> > +             if (PTR_ERR(recv_sockets.sk6) == -EAFNOSUPPORT)
> > +                     return 0;
> > +
> >               recv_sockets.sk6 = NULL;
> >               pr_err("Failed to create IPv6 UDP tunnel\n");
> >               return -1;
> > --
> > 2.27.0
> >
Zhu Yanjun April 15, 2021, 2:53 p.m. UTC | #6
On Wed, Apr 14, 2021 at 3:34 AM Kamal Heib <kheib@redhat.com> wrote:
>
>
>
> On 4/13/21 5:39 PM, Leon Romanovsky wrote:
> > On Tue, Apr 13, 2021 at 04:56:05PM +0300, Kamal Heib wrote:
> >>
> >>
> >> On 4/14/21 2:42 AM, Zhu Yanjun wrote:
> >>> From: Zhu Yanjun <zyjzyj2000@gmail.com>
> >>>
> >>> When ipv6.disable=1 is set in cmdline, ipv6 is actually disabled
> >>> in the stack. As such, the operations of ipv6 in RXE will fail.
> >>> So ipv6 features in RXE should also be disabled in RXE.
> >>>
> >>> Link: https://lore.kernel.org/linux-rdma/880d7b59-4b17-a44f-1a91-88257bfc3aaa@redhat.com/T/#t
> >>> Fixes: 8700e3e7c4857 ("Soft RoCE driver")
> >>> Reported-by: Yi Zhang <yi.zhang@redhat.com>
> >>> Signed-off-by: Zhu Yanjun <zyjzyj2000@gmail.com>
> >>> ---
> >>> V4->V5: Clean up signature block and remove error message
> >>> V3->V4: Check the returned value instead of ipv6 module
> >>> V2->V3: Remove print message
> >>> V1->V2: Modify the pr_info messages
> >>> ---
> >>>  drivers/infiniband/sw/rxe/rxe_net.c | 13 ++++++++++++-
> >>>  1 file changed, 12 insertions(+), 1 deletion(-)
> >>>
> >>> diff --git a/drivers/infiniband/sw/rxe/rxe_net.c b/drivers/infiniband/sw/rxe/rxe_net.c
> >>> index 01662727dca0..984c3ac449bd 100644
> >>> --- a/drivers/infiniband/sw/rxe/rxe_net.c
> >>> +++ b/drivers/infiniband/sw/rxe/rxe_net.c
> >>> @@ -208,7 +208,13 @@ static struct socket *rxe_setup_udp_tunnel(struct net *net, __be16 port,
> >>>     /* Create UDP socket */
> >>>     err = udp_sock_create(net, &udp_cfg, &sock);
> >>>     if (err < 0) {
> >>> -           pr_err("failed to create udp socket. err = %d\n", err);
> >>> +           /* If UDP tunnel over ipv6 fails with -EAFNOSUPPORT, the tunnel
> >>> +            * over ipv4 still works. This error message will not pop out.
> >>> +            * If UDP tunnle over ipv4 fails or other errors with ipv6
> >>> +            * tunnel, this error should pop out.
> >>> +            */
> >>> +           if (!((err == -EAFNOSUPPORT) && (ipv6)))
> >>> +                   pr_err("failed to create udp socket. err = %d\n", err);
> >>>             return ERR_PTR(err);
> >>>     }
> >>>
> >>> @@ -620,6 +626,11 @@ static int rxe_net_ipv6_init(void)
> >>>     recv_sockets.sk6 = rxe_setup_udp_tunnel(&init_net,
> >>>                                             htons(ROCE_V2_UDP_DPORT), true);
> >>>     if (IS_ERR(recv_sockets.sk6)) {
> >>> +           /* Though IPv6 is not supported, IPv4 still needs to continue
> >>> +            */
> >>> +           if (PTR_ERR(recv_sockets.sk6) == -EAFNOSUPPORT)
> >>> +                   return 0;
> >>> +
> >>>             recv_sockets.sk6 = NULL;
> >>>             pr_err("Failed to create IPv6 UDP tunnel\n");
> >>>             return -1;
> >>>
> >>
> >> I think the following change is much simpler than changing the udp_sock_create()
> >> helper function?
> >>
> >>
> >> diff --git a/drivers/infiniband/sw/rxe/rxe_net.c
> >> b/drivers/infiniband/sw/rxe/rxe_net.c
> >> index 01662727dca0..b56d6f76ab31 100644
> >> --- a/drivers/infiniband/sw/rxe/rxe_net.c
> >> +++ b/drivers/infiniband/sw/rxe/rxe_net.c
> >> @@ -621,6 +621,11 @@ static int rxe_net_ipv6_init(void)
> >>                                                 htons(ROCE_V2_UDP_DPORT), true);
> >>         if (IS_ERR(recv_sockets.sk6)) {
> >>                 recv_sockets.sk6 = NULL;
> >> +               if (PTR_ERR(recv_sockets.sk6) == -EAFNOSUPPORT) {
> >
> > You have "recv_sockets.sk6 = NULL;" in the line above.
> >
>
> Sorry, my bad...
>
> The idea is to handle this issue in the error path of rxe_net_ipv6_init()
> instead of changing the udp_sock_create(), also to make sure that

We do not change udp_sock_create.

> "recv_sockets.sk6" is set to NULL.

Is it necessary to set recv_sockets_sk6 to NULL?

Zhu Yanjun
>
> diff --git a/drivers/infiniband/sw/rxe/rxe_net.c
> b/drivers/infiniband/sw/rxe/rxe_net.c
> index 01662727dca0..445a47f82f42 100644
> --- a/drivers/infiniband/sw/rxe/rxe_net.c
> +++ b/drivers/infiniband/sw/rxe/rxe_net.c
> @@ -615,17 +615,25 @@ static int rxe_net_ipv4_init(void)
>
>  static int rxe_net_ipv6_init(void)
>  {
> +       int err = 0;
>  #if IS_ENABLED(CONFIG_IPV6)
>
>         recv_sockets.sk6 = rxe_setup_udp_tunnel(&init_net,
>                                                 htons(ROCE_V2_UDP_DPORT), true);
>         if (IS_ERR(recv_sockets.sk6)) {
> +
> +               if (PTR_ERR(recv_sockets.sk6) == -EAFNOSUPPORT) {
> +                       pr_warn("Create IPv6 UDP tunnel is not supported\n");
> +                       err = 0;
> +               } else {
> +                       pr_err("Failed to create IPv6 UDP tunnel\n");
> +                       err = -1;
> +               }
> +
>                 recv_sockets.sk6 = NULL;
> -               pr_err("Failed to create IPv6 UDP tunnel\n");
> -               return -1;
>         }
>  #endif
> -       return 0;
> +       return err;
>  }
>
> >> +                       pr_warn("Create IPv6 UDP tunnel is not supported\n");
> >> +                       return 0;
> >> +               }
> >> +
> >>                 pr_err("Failed to create IPv6 UDP tunnel\n");
> >>                 return -1;
> >>         }
> >> --
> >> 2.26.3
> >>
> >>
> >> Thanks,
> >> Kamal
> >>
> >
>
diff mbox series

Patch

diff --git a/drivers/infiniband/sw/rxe/rxe_net.c b/drivers/infiniband/sw/rxe/rxe_net.c
index 01662727dca0..984c3ac449bd 100644
--- a/drivers/infiniband/sw/rxe/rxe_net.c
+++ b/drivers/infiniband/sw/rxe/rxe_net.c
@@ -208,7 +208,13 @@  static struct socket *rxe_setup_udp_tunnel(struct net *net, __be16 port,
 	/* Create UDP socket */
 	err = udp_sock_create(net, &udp_cfg, &sock);
 	if (err < 0) {
-		pr_err("failed to create udp socket. err = %d\n", err);
+		/* If UDP tunnel over ipv6 fails with -EAFNOSUPPORT, the tunnel
+		 * over ipv4 still works. This error message will not pop out.
+		 * If UDP tunnle over ipv4 fails or other errors with ipv6
+		 * tunnel, this error should pop out.
+		 */
+		if (!((err == -EAFNOSUPPORT) && (ipv6)))
+			pr_err("failed to create udp socket. err = %d\n", err);
 		return ERR_PTR(err);
 	}
 
@@ -620,6 +626,11 @@  static int rxe_net_ipv6_init(void)
 	recv_sockets.sk6 = rxe_setup_udp_tunnel(&init_net,
 						htons(ROCE_V2_UDP_DPORT), true);
 	if (IS_ERR(recv_sockets.sk6)) {
+		/* Though IPv6 is not supported, IPv4 still needs to continue
+		 */
+		if (PTR_ERR(recv_sockets.sk6) == -EAFNOSUPPORT)
+			return 0;
+
 		recv_sockets.sk6 = NULL;
 		pr_err("Failed to create IPv6 UDP tunnel\n");
 		return -1;