From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752849AbcELMtn (ORCPT ); Thu, 12 May 2016 08:49:43 -0400 Received: from mx1.redhat.com ([209.132.183.28]:40871 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751502AbcELMtm (ORCPT ); Thu, 12 May 2016 08:49:42 -0400 From: Vitaly Kuznetsov To: netdev@vger.kernel.org Cc: linux-kernel@vger.kernel.org, devel@linuxdriverproject.org, Haiyang Zhang , "K. Y. Srinivasan" Subject: [PATCH 0/6] hv_netvsc: avoid races on mtu change/set channels Date: Thu, 12 May 2016 14:49:32 +0200 Message-Id: <1463057378-21118-1-git-send-email-vkuznets@redhat.com> X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.25]); Thu, 12 May 2016 12:49:41 +0000 (UTC) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org MTU change and set channels operations are implemented as netvsc device re-creation destroying internal structures (struct net_device stays). This is really unfortunate but there is no support from Hyper-V host to do it in a different way. Such re-creation is unsurprisingly racy, Haiyang reported a crash when netvsc_change_mtu() is racing with netvsc_link_change() but I was able to identify additional races upon investigation. Both netvsc_set_channels() and netvsc_change_mtu() race against: 1) netvsc_link_change() 2) netvsc_remove() 3) netvsc_send() To solve these issues without introducing new locks some refactoring is required. We need to get rid of very complex link graph in all the internal structures and avoid traveling through structures which are being removed. Vitaly Kuznetsov (6): hv_netvsc: move start_remove flag to net_device_context hv_netvsc: use start_remove flag to protect netvsc_link_change() hv_netvsc: untangle the pointer mess hv_netvsc: get rid of struct net_device pointer in struct netvsc_device hv_netvsc: synchronize netvsc_change_mtu()/netvsc_set_channels() with netvsc_remove() hv_netvsc: set nvdev link after populating chn_table drivers/net/hyperv/hyperv_net.h | 15 ++--- drivers/net/hyperv/netvsc.c | 130 ++++++++++++++++---------------------- drivers/net/hyperv/netvsc_drv.c | 104 +++++++++++++++++------------- drivers/net/hyperv/rndis_filter.c | 82 ++++++++++++------------ 4 files changed, 164 insertions(+), 167 deletions(-) -- 2.5.5