提交 fba82272 编写于 作者: O OGAWA Hirofumi 提交者: Jens Axboe

[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: NOGAWA Hirofumi <hirofumi@mail.parknet.co.jp>
Signed-off-by: NJens Axboe <axboe@suse.de>
上级 a9a5cd5d
......@@ -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);
}
......
......@@ -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();
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册