Thanks,
Can Guo.
>
>>
>> >
>> > I think I will go with your suggestion.
>> > Effectively, in host mode, since it is deactivating "cold" regions,
>> > the lru list is kept relatively small, and contains only "hot" regions.
>>
>> hmm... I don't really have a idea on this, please go with whatever you
>> and Daejun think is fine here.
> I will take your advice and remove the worker.
>
>
> Thanks,
> Avri
>
>>
>> Thanks,
>> Can Guo.
>>
>> >
>> > Thanks,
>> > Avri
>> >
>> >>
>> >> Thanks,
>> >> Can Guo.
>> >>
>> >> > But yes, I can do that.
>> >> > Better to get ack from Daejun first.
>> >> >
>> >> > Thanks,
>> >> > Avri
>> >> >
>> >> >>
>> >> >> Thanks,
>> >> >> Can Guo.
>> >> >>
>> >> >> > +{
>> >> >> > + struct ufshpb_lu *hpb;
>> >> >> > + struct victim_select_info *lru_info;
>> >> >> > + struct ufshpb_region *rgn;
>> >> >> > + unsigned long flags;
>> >> >> > +
>> >> >> > + hpb = container_of(work, struct ufshpb_lu,
>> ufshpb_lun_reset_work);
>> >> >> > +
>> >> >> > + lru_info = &hpb->lru_info;
>> >> >> > +
>> >> >> > + spin_lock_irqsave(&hpb->rgn_state_lock, flags);
>> >> >> > +
>> >> >> > + list_for_each_entry(rgn, &lru_info->lh_lru_rgn, list_lru_rgn)
>> >> >> > + set_bit(RGN_FLAG_UPDATE, &rgn->rgn_flags);
>> >> >> > +
>> >> >> > + spin_unlock_irqrestore(&hpb->rgn_state_lock, flags);
>> >> >> > +}
>> >> >> > +
>> >> >> > static void ufshpb_normalization_work_handler(struct work_struct
>> >> >> > *work)
>> >> >> > {
>> >> >> > struct ufshpb_lu *hpb;
>> >> >> > @@ -1798,6 +1832,8 @@ static int ufshpb_alloc_region_tbl(struct
>> >> >> > ufs_hba *hba, struct ufshpb_lu *hpb)
>> >> >> > } else {
>> >> >> > rgn->rgn_state = HPB_RGN_INACTIVE;
>> >> >> > }
>> >> >> > +
>> >> >> > + rgn->rgn_flags = 0;
>> >> >> > }
>> >> >> >
>> >> >> > return 0;
>> >> >> > @@ -2012,9 +2048,12 @@ static int ufshpb_lu_hpb_init(struct
>> ufs_hba
>> >> >> > *hba, struct ufshpb_lu *hpb)
>> >> >> > INIT_LIST_HEAD(&hpb->list_hpb_lu);
>> >> >> >
>> >> >> > INIT_WORK(&hpb->map_work, ufshpb_map_work_handler);
>> >> >> > - if (hpb->is_hcm)
>> >> >> > + if (hpb->is_hcm) {
>> >> >> > INIT_WORK(&hpb->ufshpb_normalization_work,
>> >> >> > ufshpb_normalization_work_handler);
>> >> >> > + INIT_WORK(&hpb->ufshpb_lun_reset_work,
>> >> >> > + ufshpb_reset_work_handler);
>> >> >> > + }
>> >> >> >
>> >> >> > hpb->map_req_cache =
kmem_cache_create("ufshpb_req_cache",
>> >> >> > sizeof(struct ufshpb_req), 0, 0, NULL);
>> >> >> > @@ -2114,8 +2153,10 @@ static void
ufshpb_discard_rsp_lists(struct
>> >> >> > ufshpb_lu *hpb)
>> >> >> >
>> >> >> > static void ufshpb_cancel_jobs(struct ufshpb_lu *hpb)
>> >> >> > {
>> >> >> > - if (hpb->is_hcm)
>> >> >> > + if (hpb->is_hcm) {
>> >> >> > + cancel_work_sync(&hpb->ufshpb_lun_reset_work);
>> >> >> > cancel_work_sync(&hpb->ufshpb_normalization_work);
>> >> >> > + }
>> >> >> > cancel_work_sync(&hpb->map_work);
>> >> >> > }
>> >> >> >
>> >> >> > diff --git a/drivers/scsi/ufs/ufshpb.h b/drivers/scsi/ufs/ufshpb.h
>> >> >> > index 84598a317897..37c1b0ea0c0a 100644
>> >> >> > --- a/drivers/scsi/ufs/ufshpb.h
>> >> >> > +++ b/drivers/scsi/ufs/ufshpb.h
>> >> >> > @@ -121,6 +121,7 @@ struct ufshpb_region {
>> >> >> > struct list_head list_lru_rgn;
>> >> >> > unsigned long rgn_flags;
>> >> >> > #define RGN_FLAG_DIRTY 0
>> >> >> > +#define RGN_FLAG_UPDATE 1
>> >> >> >
>> >> >> > /* region reads - for host mode */
>> >> >> > spinlock_t rgn_lock;
>> >> >> > @@ -217,6 +218,7 @@ struct ufshpb_lu {
>> >> >> > /* for selecting victim */
>> >> >> > struct victim_select_info lru_info;
>> >> >> > struct work_struct ufshpb_normalization_work;
>> >> >> > + struct work_struct ufshpb_lun_reset_work;
>> >> >> >
>> >> >> > /* pinned region information */
>> >> >> > u32 lu_pinned_start;