Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit fba82272 authored by OGAWA Hirofumi's avatar OGAWA Hirofumi Committed by Jens Axboe
Browse files

[PATCH 1/2] iosched: fix typo and barrier()



On rmmod path, cfq/as waits to make sure all io-contexts was
freed. However, it's using complete(), not wait_for_completion().

I think barrier() is not enough in here. To avoid the following case,
this patch replaces barrier() with smb_wmb().

	cpu0			visibility			cpu1
	                [ioc_gnone=NULL,ioc_count=1]

ioc_gnone = &all_gone		NULL,ioc_count=1
atomic_read(&ioc_count)		NULL,ioc_count=1
wait_for_completion()		NULL,ioc_count=0	atomic_sub_and_test()
				NULL,ioc_count=0	if ( && ioc_gone)
						    [ioc_gone==NULL,
						    so doesn't call complete()]
			   &all_gone,ioc_count=0

Signed-off-by: default avatarOGAWA Hirofumi <hirofumi@mail.parknet.co.jp>
Signed-off-by: default avatarJens Axboe <axboe@suse.de>
parent a9a5cd5d
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -1844,9 +1844,10 @@ static void __exit as_exit(void)
	DECLARE_COMPLETION(all_gone);
	elv_unregister(&iosched_as);
	ioc_gone = &all_gone;
	barrier();
	/* ioc_gone's update must be visible before reading ioc_count */
	smp_wmb();
	if (atomic_read(&ioc_count))
		complete(ioc_gone);
		wait_for_completion(ioc_gone);
	synchronize_rcu();
	kmem_cache_destroy(arq_pool);
}
+3 −2
Original line number Diff line number Diff line
@@ -2439,9 +2439,10 @@ static void __exit cfq_exit(void)
	DECLARE_COMPLETION(all_gone);
	elv_unregister(&iosched_cfq);
	ioc_gone = &all_gone;
	barrier();
	/* ioc_gone's update must be visible before reading ioc_count */
	smp_wmb();
	if (atomic_read(&ioc_count))
		complete(ioc_gone);
		wait_for_completion(ioc_gone);
	synchronize_rcu();
	cfq_slab_kill();
}