diff
 static void free_netvsc_device(struct rcu_head *head)
 {
 	struct netvsc_device *nvdev
 		= container_of(head, struct netvsc_device, rcu);
 	int i;
+	struct netvsc_channel chan_table_copy[VRSS_CHANNEL_MAX];
+
+	memcpy(chan_table_copy, nvdev->chan_table, sizeof(chan_table_copy));
 
 	kfree(nvdev->extension);
 	vfree(nvdev->recv_buf);
 	vfree(nvdev->send_buf);
 	bitmap_free(nvdev->send_section_map);
+	kfree(nvdev);
 
 	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);
+		xdp_rxq_info_unreg(&chan_table_copy[i].xdp_rxq);
+		kfree(chan_table_copy[i].recv_buf);
+		vfree(chan_table_copy[i].mrc.slots);
 	}
-	kfree(nvdev);
 }
