diff
+static void free_chan_table(struct netvsc_channel *chan_table)
+{
+	int i;
+	for (i = 0; i < VRSS_CHANNEL_MAX; i++) {
+		xdp_rxq_info_unreg(&chan_table[i].xdp_rxq);
+		kfree(chan_table[i].recv_buf);
+		vfree(chan_table[i].mrc.slots);
+	}
+}
+
 static void free_netvsc_device(struct rcu_head *head)
 {
 	struct netvsc_device *nvdev
 		= container_of(head, struct netvsc_device, rcu);
-	int i;
+	free_chan_table(nvdev->chan_table);
 	kfree(nvdev->extension);
 	vfree(nvdev->recv_buf);
 	vfree(nvdev->send_buf);
 	bitmap_free(nvdev->send_section_map);
 
-	for (i = 0; i < VRSS_CHANNEL_MAX; i++) {
-		xdp_rxq_info_unreg(&nvdev->chan_table[i].xdp_rxq);
-		kfree(nvdev->chan_table[i].recv_buf);
-		vfree(nvdev->chan_table[i].mrc.slots);
-	}
 	kfree(nvdev);
 }
