On Thu 21-03-24 15:12:21, Kemeng Shi wrote: > > > on 3/20/2024 11:15 PM, Tejun Heo wrote: > > Hello, > > > > On Wed, Mar 20, 2024 at 07:02:22PM +0800, Kemeng Shi wrote: > >> We never use gdtc->dom set with GDTC_INIT_NO_WB, just remove unneeded > >> GDTC_INIT_NO_WB > >> > >> Signed-off-by: Kemeng Shi <shikemeng@xxxxxxxxxxxxxxx> > > ... > >> void global_dirty_limits(unsigned long *pbackground, unsigned long *pdirty) > >> { > >> - struct dirty_throttle_control gdtc = { GDTC_INIT_NO_WB }; > >> + struct dirty_throttle_control gdtc = { }; > > > > Even if it's currently not referenced, wouldn't it still be better to always > > guarantee that a dtc's dom is always initialized? I'm not sure what we get > > by removing this. > As we explicitly use GDTC_INIT_NO_WB to set global_wb_domain before > calculating dirty limit with domain_dirty_limits, I intuitively think the > dirty limit calculation in domain_dirty_limits is related to > global_wb_domain when CONFIG_WRITEBACK_CGROUP is enabled while the truth > is not. So this is a little confusing to me. I'm not sure I understand your confusion. domain_dirty_limits() calculates the dirty limit (and background dirty limit) for the dirty_throttle_control passed in. If you pass dtc initialized with GDTC_INIT[_NO_WB], it will compute global dirty limits. If the dtc passed in is initialized with MDTC_INIT() it will compute cgroup specific dirty limits. Now because domain_dirty_limits() does not scale the limits based on each device throughput - that is done only later in __wb_calc_thresh() to avoid relatively expensive computations when we don't need them - and also because the effective dirty limit (dtc->dom->dirty_limit) is not updated by domain_dirty_limits(), domain_dirty_limits() does not need dtc->dom at all. But that is a technical detail of implementation and I don't want this technical detail to be relied on by even more code. What might have confused you is that GDTC_INIT_NO_WB is defined to be empty when CONFIG_CGROUP_WRITEBACK is disabled. But this is only because in that case dtc_dom() function unconditionally returns global_wb_domain so we don't bother with initializing (or even having) the 'dom' field anywhere. Now I agree this whole code is substantially confusing and complex and it would all deserve some serious thought how to make it more readable. But even after thinking about it again I don't think removing GDTC_INIT_NO_WB is the right way to go. Honza -- Jan Kara <jack@xxxxxxxx> SUSE Labs, CR