Explorar o código

Fix bug when plugging several disks + fix bus between disk and disk

Corentin Salingue %!s(int64=7) %!d(string=hai) anos
pai
achega
e7a456b3a1
Modificáronse 1 ficheiros con 25 adicións e 16 borrados
  1. 25 16
      src/core/disk.c

+ 25 - 16
src/core/disk.c

@@ -53,7 +53,7 @@ static inline unsigned get_location_with_node(unsigned node);
 
 static struct disk_register **disk_register_list = NULL;
 static unsigned memnode_to_disknode[STARPU_MAXNODES];
-static int disk_number = -1;
+static int disk_number = 0;
 static int size_register_list = 2;
 
 int starpu_disk_swap_node = -1;
@@ -101,14 +101,14 @@ int starpu_disk_register(struct starpu_disk_ops *func, void *parameter, starpu_s
 	}
 	
 	//Add bus for disk <-> disk copy
-	if (func->copy != NULL)
+	if (func->copy != NULL && disk_register_list != NULL)
 	{
 		int disk;
-		for (disk = 0; disk < disk_number; disk++)
-			if (disk_register_list[disk]->functions->copy != NULL)
+		for (disk = 0; disk < size_register_list; disk++)
+			if (disk_register_list[disk] != NULL && disk_register_list[disk]->functions->copy != NULL && disk_register_list[disk]->functions->copy == func->copy)
 			{
-				_starpu_register_bus(disk_memnode, disk);
-				_starpu_register_bus(disk, disk_memnode);
+				_starpu_register_bus(disk_memnode, disk_register_list[disk]->node);
+				_starpu_register_bus(disk_register_list[disk]->node, disk_memnode);
 			}
 	}
 
@@ -140,24 +140,27 @@ void _starpu_disk_unregister(void)
 	int i;
 
 	/* search disk and delete it */
-	for (i = 0; i <= disk_number; ++i)
+	for (i = 0; i < size_register_list; ++i)
 	{
+		if (disk_register_list[i] == NULL)
+			continue;
+
 		_starpu_set_disk_flag(disk_register_list[i]->node, STARPU_DISK_NO_RECLAIM);
 		_starpu_free_all_automatically_allocated_buffers(disk_register_list[i]->node);
 
 		/* don't forget to unplug */
 		disk_register_list[i]->functions->unplug(disk_register_list[i]->base);
 		free(disk_register_list[i]);
+		disk_register_list[i] = NULL;
+
+		disk_number--;
 	}
 
 	/* no disk in the list -> delete the list */
-	disk_number--;
+	free(disk_register_list);
+	disk_register_list = NULL;
 
-	if (disk_register_list != NULL && disk_number == -1)
-	{
-		free(disk_register_list);
-		disk_register_list = NULL;
-	}
+	STARPU_ASSERT_MSG(disk_number == 0, "Some disks are not unregistered !");
 }
 
 /* interface between user and disk memory */
@@ -408,13 +411,19 @@ static int add_disk_in_list(unsigned node,  struct starpu_disk_ops *func, void *
 	/* initialization */
 	if (disk_register_list == NULL)
 	{
-		_STARPU_MALLOC(disk_register_list, size_register_list*sizeof(struct disk_register *));
+		_STARPU_CALLOC(disk_register_list, size_register_list, sizeof(struct disk_register *));
 	}
 	/* small size -> new size  */
-	if ((disk_number+1) > size_register_list)
+	if (disk_number >= size_register_list)
 	{
+		int old_size = size_register_list;
 		size_register_list *= 2;
 		_STARPU_REALLOC(disk_register_list, size_register_list*sizeof(struct disk_register *));
+
+		/* Initialize the new part */
+		int i;
+		for (i = old_size; i < size_register_list; i++)
+			disk_register_list[i] = NULL;
 	}
 
 	struct disk_register *dr;
@@ -423,7 +432,7 @@ static int add_disk_in_list(unsigned node,  struct starpu_disk_ops *func, void *
 	dr->base = base;
 	dr->flag = STARPU_DISK_ALL;
 	dr->functions = func;
-	n = ++disk_number;
+	n = disk_number++;
 	disk_register_list[n] = dr;
 	memnode_to_disknode[node] = n;
 	return n;