• Home
  • Raw
  • Download

Lines Matching +full:sg +full:- +full:micro

1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright(c) 2023 Advanced Micro Devices, Inc. */
32 lm_file->filep = in pds_vfio_get_lm_file()
34 if (IS_ERR(lm_file->filep)) in pds_vfio_get_lm_file()
37 stream_open(lm_file->filep->f_inode, lm_file->filep); in pds_vfio_get_lm_file()
38 mutex_init(&lm_file->lock); in pds_vfio_get_lm_file()
41 get_file(lm_file->filep); in pds_vfio_get_lm_file()
53 p = page_mem - offset_in_page(page_mem); in pds_vfio_get_lm_file()
66 if (sg_alloc_table_from_pages(&lm_file->sg_table, pages, npages, 0, in pds_vfio_get_lm_file()
70 lm_file->size = size; in pds_vfio_get_lm_file()
71 lm_file->pages = pages; in pds_vfio_get_lm_file()
72 lm_file->npages = npages; in pds_vfio_get_lm_file()
73 lm_file->page_mem = page_mem; in pds_vfio_get_lm_file()
74 lm_file->alloc_size = npages * PAGE_SIZE; in pds_vfio_get_lm_file()
83 fput(lm_file->filep); in pds_vfio_get_lm_file()
84 mutex_destroy(&lm_file->lock); in pds_vfio_get_lm_file()
93 mutex_lock(&lm_file->lock); in pds_vfio_put_lm_file()
95 lm_file->size = 0; in pds_vfio_put_lm_file()
96 lm_file->alloc_size = 0; in pds_vfio_put_lm_file()
99 sg_free_table(&lm_file->sg_table); in pds_vfio_put_lm_file()
101 kvfree(lm_file->page_mem); in pds_vfio_put_lm_file()
102 lm_file->page_mem = NULL; in pds_vfio_put_lm_file()
103 kfree(lm_file->pages); in pds_vfio_put_lm_file()
104 lm_file->pages = NULL; in pds_vfio_put_lm_file()
106 mutex_unlock(&lm_file->lock); in pds_vfio_put_lm_file()
109 fput(lm_file->filep); in pds_vfio_put_lm_file()
114 if (!pds_vfio->save_file) in pds_vfio_put_save_file()
117 pds_vfio_put_lm_file(pds_vfio->save_file); in pds_vfio_put_save_file()
118 pds_vfio->save_file = NULL; in pds_vfio_put_save_file()
123 if (!pds_vfio->restore_file) in pds_vfio_put_restore_file()
126 pds_vfio_put_lm_file(pds_vfio->restore_file); in pds_vfio_put_restore_file()
127 pds_vfio->restore_file = NULL; in pds_vfio_put_restore_file()
134 struct scatterlist *sg; in pds_vfio_get_file_page() local
138 if (offset < lm_file->last_offset || !lm_file->last_offset_sg) { in pds_vfio_get_file_page()
139 lm_file->last_offset = 0; in pds_vfio_get_file_page()
140 lm_file->last_offset_sg = lm_file->sg_table.sgl; in pds_vfio_get_file_page()
141 lm_file->sg_last_entry = 0; in pds_vfio_get_file_page()
144 cur_offset = lm_file->last_offset; in pds_vfio_get_file_page()
146 for_each_sg(lm_file->last_offset_sg, sg, in pds_vfio_get_file_page()
147 lm_file->sg_table.orig_nents - lm_file->sg_last_entry, i) { in pds_vfio_get_file_page()
148 if (offset < sg->length + cur_offset) { in pds_vfio_get_file_page()
149 lm_file->last_offset_sg = sg; in pds_vfio_get_file_page()
150 lm_file->sg_last_entry += i; in pds_vfio_get_file_page()
151 lm_file->last_offset = cur_offset; in pds_vfio_get_file_page()
152 return nth_page(sg_page(sg), in pds_vfio_get_file_page()
153 (offset - cur_offset) / PAGE_SIZE); in pds_vfio_get_file_page()
155 cur_offset += sg->length; in pds_vfio_get_file_page()
163 struct pds_vfio_lm_file *lm_file = filp->private_data; in pds_vfio_release_file()
165 mutex_lock(&lm_file->lock); in pds_vfio_release_file()
166 lm_file->filep->f_pos = 0; in pds_vfio_release_file()
167 lm_file->size = 0; in pds_vfio_release_file()
168 mutex_unlock(&lm_file->lock); in pds_vfio_release_file()
169 mutex_destroy(&lm_file->lock); in pds_vfio_release_file()
178 struct pds_vfio_lm_file *lm_file = filp->private_data; in pds_vfio_save_read()
182 return -ESPIPE; in pds_vfio_save_read()
183 pos = &filp->f_pos; in pds_vfio_save_read()
185 mutex_lock(&lm_file->lock); in pds_vfio_save_read()
186 if (*pos > lm_file->size) { in pds_vfio_save_read()
187 done = -EINVAL; in pds_vfio_save_read()
191 len = min_t(size_t, lm_file->size - *pos, len); in pds_vfio_save_read()
200 page = pds_vfio_get_file_page(lm_file, *pos - page_offset); in pds_vfio_save_read()
203 done = -EINVAL; in pds_vfio_save_read()
207 page_len = min_t(size_t, len, PAGE_SIZE - page_offset); in pds_vfio_save_read()
212 done = -EFAULT; in pds_vfio_save_read()
216 len -= page_len; in pds_vfio_save_read()
222 mutex_unlock(&lm_file->lock); in pds_vfio_save_read()
235 struct device *dev = &pds_vfio->vfio_coredev.pdev->dev; in pds_vfio_get_save_file()
251 return -EIO; in pds_vfio_get_save_file()
257 return -ENOENT; in pds_vfio_get_save_file()
261 lm_file->size, lm_file->alloc_size, lm_file->npages); in pds_vfio_get_save_file()
263 pds_vfio->save_file = lm_file; in pds_vfio_get_save_file()
271 struct pds_vfio_lm_file *lm_file = filp->private_data; in pds_vfio_restore_write()
276 return -ESPIPE; in pds_vfio_restore_write()
278 pos = &filp->f_pos; in pds_vfio_restore_write()
282 return -EINVAL; in pds_vfio_restore_write()
284 mutex_lock(&lm_file->lock); in pds_vfio_restore_write()
294 page = pds_vfio_get_file_page(lm_file, *pos - page_offset); in pds_vfio_restore_write()
297 done = -EINVAL; in pds_vfio_restore_write()
301 page_len = min_t(size_t, len, PAGE_SIZE - page_offset); in pds_vfio_restore_write()
306 done = -EFAULT; in pds_vfio_restore_write()
310 len -= page_len; in pds_vfio_restore_write()
313 lm_file->size += page_len; in pds_vfio_restore_write()
316 mutex_unlock(&lm_file->lock); in pds_vfio_restore_write()
329 struct device *dev = &pds_vfio->vfio_coredev.pdev->dev; in pds_vfio_get_restore_file()
338 return -EIO; in pds_vfio_get_restore_file()
344 return -ENOENT; in pds_vfio_get_restore_file()
346 pds_vfio->restore_file = lm_file; in pds_vfio_get_restore_file()
355 enum vfio_device_mig_state cur = pds_vfio->state; in pds_vfio_step_device_state_locked()
369 return pds_vfio->save_file->filep; in pds_vfio_step_device_state_locked()
383 return pds_vfio->restore_file->filep; in pds_vfio_step_device_state_locked()
433 return ERR_PTR(-EINVAL); in pds_vfio_step_device_state_locked()