On 23.11.20 08:37, Jan Kiszka wrote:
> From: Jan Kiszka <[email protected]>
> 
> The carrier of our virtual link is supposed to go on only when both
> sides are in RUN state. So far, it only went on when one side entered
> RUN by being int READY before and not when RUN was reached via
> ivshm_net_open().
> 
> Fix this by moving the carrier management into ivshm_net_run and
> ivshm_net_do_stop, respectively. Make sure that netif_carrier_on is only
> called when the peer in in RUN state already.
> 
> Reported-by: Jiafei Pan <[email protected]>
> Signed-off-by: Jan Kiszka <[email protected]>
> ---
>  drivers/net/ivshmem-net.c | 28 ++++++++++++++--------------
>  1 file changed, 14 insertions(+), 14 deletions(-)
> 
> diff --git a/drivers/net/ivshmem-net.c b/drivers/net/ivshmem-net.c
> index 1b22b1cc5ea3..56c2c87e7498 100644
> --- a/drivers/net/ivshmem-net.c
> +++ b/drivers/net/ivshmem-net.c
> @@ -549,6 +549,9 @@ static void ivshm_net_run(struct net_device *ndev)
>       if (!netif_running(ndev))
>               return;
>  
> +     if (in->last_peer_state == IVSHM_NET_STATE_RUN)
> +             netif_carrier_on(ndev);
> +
>       if (test_and_set_bit(IVSHM_NET_FLAG_RUN, &in->flags))
>               return;
>  
> @@ -567,6 +570,7 @@ static void ivshm_net_do_stop(struct net_device *ndev)
>       if (!test_and_clear_bit(IVSHM_NET_FLAG_RUN, &in->flags))
>               return;
>  
> +     netif_carrier_off(ndev);
>       netif_stop_queue(ndev);
>       napi_disable(&in->napi);
>  }
> @@ -616,22 +620,18 @@ static void ivshm_net_state_change(struct work_struct 
> *work)
>               break;
>  
>       case IVSHM_NET_STATE_READY:
> -             /*
> -              * Link is up and we are running once the remote is in READY or
> -              * RUN.
> -              */
> +     case IVSHM_NET_STATE_RUN:
>               if (peer_state >= IVSHM_NET_STATE_READY) {
> -                     netif_carrier_on(ndev);
> +                     /*
> +                      * Link is up and we are running once the remote is in
> +                      * READY or RUN.
> +                      */
>                       ivshm_net_run(ndev);
> -                     break;
> -             }
> -             /* fall through */
> -     case IVSHM_NET_STATE_RUN:
> -             /*
> -              * If the remote goes to RESET, we need to follow immediately.
> -              */
> -             if (peer_state == IVSHM_NET_STATE_RESET) {
> -                     netif_carrier_off(ndev);
> +             } else if (peer_state == IVSHM_NET_STATE_RESET) {
> +                     /*
> +                      * If the remote goes to RESET, we need to follow
> +                      * immediately.
> +                      */
>                       ivshm_net_do_stop(ndev);
>               }
>               break;
> 

5.10-rc5 queue was updated on
http://git.kiszka.org/?p=linux.git;a=shortlog;h=refs/heads/queues/jailhouse.
Once you can confirm that this works for you, I will also update
jailhouse/enabling queues with the two patches.

Jan

-- 
Siemens AG, T RDA IOT
Corporate Competence Center Embedded Linux

-- 
You received this message because you are subscribed to the Google Groups 
"Jailhouse" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/jailhouse-dev/93643562-d6ee-c66d-ac8d-180f98e5acd1%40siemens.com.

Reply via email to