@@ -308,19 +308,19 @@ static struct mlx5_vhca_data_buffer *
308
308
mlx5vf_mig_file_get_stop_copy_buf (struct mlx5_vf_migration_file * migf ,
309
309
u8 index , size_t required_length )
310
310
{
311
+ u32 npages = DIV_ROUND_UP (required_length , PAGE_SIZE );
311
312
struct mlx5_vhca_data_buffer * buf = migf -> buf [index ];
312
313
u8 chunk_num ;
313
314
314
315
WARN_ON (!buf );
315
316
chunk_num = buf -> stop_copy_chunk_num ;
316
317
buf -> migf -> buf [index ] = NULL ;
317
318
/* Checking whether the pre-allocated buffer can fit */
318
- if (buf -> allocated_length >= required_length )
319
+ if (buf -> npages >= npages )
319
320
return buf ;
320
321
321
322
mlx5vf_put_data_buffer (buf );
322
- buf = mlx5vf_get_data_buffer (buf -> migf , required_length ,
323
- DMA_FROM_DEVICE );
323
+ buf = mlx5vf_get_data_buffer (buf -> migf , npages , DMA_FROM_DEVICE );
324
324
if (IS_ERR (buf ))
325
325
return buf ;
326
326
@@ -373,7 +373,8 @@ static int mlx5vf_add_stop_copy_header(struct mlx5_vf_migration_file *migf,
373
373
u8 * to_buff ;
374
374
int ret ;
375
375
376
- header_buf = mlx5vf_get_data_buffer (migf , size , DMA_NONE );
376
+ header_buf = mlx5vf_get_data_buffer (migf , DIV_ROUND_UP (size , PAGE_SIZE ),
377
+ DMA_NONE );
377
378
if (IS_ERR (header_buf ))
378
379
return PTR_ERR (header_buf );
379
380
@@ -388,7 +389,7 @@ static int mlx5vf_add_stop_copy_header(struct mlx5_vf_migration_file *migf,
388
389
to_buff = kmap_local_page (page );
389
390
memcpy (to_buff , & header , sizeof (header ));
390
391
header_buf -> length = sizeof (header );
391
- data .stop_copy_size = cpu_to_le64 (migf -> buf [0 ]-> allocated_length );
392
+ data .stop_copy_size = cpu_to_le64 (migf -> buf [0 ]-> npages * PAGE_SIZE );
392
393
memcpy (to_buff + sizeof (header ), & data , sizeof (data ));
393
394
header_buf -> length += sizeof (data );
394
395
kunmap_local (to_buff );
@@ -437,15 +438,20 @@ static int mlx5vf_prep_stop_copy(struct mlx5vf_pci_core_device *mvdev,
437
438
438
439
num_chunks = mvdev -> chunk_mode ? MAX_NUM_CHUNKS : 1 ;
439
440
for (i = 0 ; i < num_chunks ; i ++ ) {
440
- buf = mlx5vf_get_data_buffer (migf , inc_state_size , DMA_FROM_DEVICE );
441
+ buf = mlx5vf_get_data_buffer (
442
+ migf , DIV_ROUND_UP (inc_state_size , PAGE_SIZE ),
443
+ DMA_FROM_DEVICE );
441
444
if (IS_ERR (buf )) {
442
445
ret = PTR_ERR (buf );
443
446
goto err ;
444
447
}
445
448
446
449
migf -> buf [i ] = buf ;
447
- buf = mlx5vf_get_data_buffer (migf ,
448
- sizeof (struct mlx5_vf_migration_header ), DMA_NONE );
450
+ buf = mlx5vf_get_data_buffer (
451
+ migf ,
452
+ DIV_ROUND_UP (sizeof (struct mlx5_vf_migration_header ),
453
+ PAGE_SIZE ),
454
+ DMA_NONE );
449
455
if (IS_ERR (buf )) {
450
456
ret = PTR_ERR (buf );
451
457
goto err ;
@@ -553,7 +559,8 @@ static long mlx5vf_precopy_ioctl(struct file *filp, unsigned int cmd,
553
559
* We finished transferring the current state and the device has a
554
560
* dirty state, save a new state to be ready for.
555
561
*/
556
- buf = mlx5vf_get_data_buffer (migf , inc_length , DMA_FROM_DEVICE );
562
+ buf = mlx5vf_get_data_buffer (migf , DIV_ROUND_UP (inc_length , PAGE_SIZE ),
563
+ DMA_FROM_DEVICE );
557
564
if (IS_ERR (buf )) {
558
565
ret = PTR_ERR (buf );
559
566
mlx5vf_mark_err (migf );
@@ -675,8 +682,8 @@ mlx5vf_pci_save_device_data(struct mlx5vf_pci_core_device *mvdev, bool track)
675
682
676
683
if (track ) {
677
684
/* leave the allocated buffer ready for the stop-copy phase */
678
- buf = mlx5vf_alloc_data_buffer (migf ,
679
- migf -> buf [ 0 ] -> allocated_length , DMA_FROM_DEVICE );
685
+ buf = mlx5vf_alloc_data_buffer (migf , migf -> buf [ 0 ] -> npages ,
686
+ DMA_FROM_DEVICE );
680
687
if (IS_ERR (buf )) {
681
688
ret = PTR_ERR (buf );
682
689
goto out_pd ;
@@ -917,11 +924,14 @@ static ssize_t mlx5vf_resume_write(struct file *filp, const char __user *buf,
917
924
goto out_unlock ;
918
925
break ;
919
926
case MLX5_VF_LOAD_STATE_PREP_HEADER_DATA :
920
- if (vhca_buf_header -> allocated_length < migf -> record_size ) {
927
+ {
928
+ u32 npages = DIV_ROUND_UP (migf -> record_size , PAGE_SIZE );
929
+
930
+ if (vhca_buf_header -> npages < npages ) {
921
931
mlx5vf_free_data_buffer (vhca_buf_header );
922
932
923
- migf -> buf_header [0 ] = mlx5vf_alloc_data_buffer (migf ,
924
- migf -> record_size , DMA_NONE );
933
+ migf -> buf_header [0 ] = mlx5vf_alloc_data_buffer (
934
+ migf , npages , DMA_NONE );
925
935
if (IS_ERR (migf -> buf_header [0 ])) {
926
936
ret = PTR_ERR (migf -> buf_header [0 ]);
927
937
migf -> buf_header [0 ] = NULL ;
@@ -934,6 +944,7 @@ static ssize_t mlx5vf_resume_write(struct file *filp, const char __user *buf,
934
944
vhca_buf_header -> start_pos = migf -> max_pos ;
935
945
migf -> load_state = MLX5_VF_LOAD_STATE_READ_HEADER_DATA ;
936
946
break ;
947
+ }
937
948
case MLX5_VF_LOAD_STATE_READ_HEADER_DATA :
938
949
ret = mlx5vf_resume_read_header_data (migf , vhca_buf_header ,
939
950
& buf , & len , pos , & done );
@@ -944,12 +955,13 @@ static ssize_t mlx5vf_resume_write(struct file *filp, const char __user *buf,
944
955
{
945
956
u64 size = max (migf -> record_size ,
946
957
migf -> stop_copy_prep_size );
958
+ u32 npages = DIV_ROUND_UP (size , PAGE_SIZE );
947
959
948
- if (vhca_buf -> allocated_length < size ) {
960
+ if (vhca_buf -> npages < npages ) {
949
961
mlx5vf_free_data_buffer (vhca_buf );
950
962
951
- migf -> buf [0 ] = mlx5vf_alloc_data_buffer (migf ,
952
- size , DMA_TO_DEVICE );
963
+ migf -> buf [0 ] = mlx5vf_alloc_data_buffer (
964
+ migf , npages , DMA_TO_DEVICE );
953
965
if (IS_ERR (migf -> buf [0 ])) {
954
966
ret = PTR_ERR (migf -> buf [0 ]);
955
967
migf -> buf [0 ] = NULL ;
@@ -1037,8 +1049,11 @@ mlx5vf_pci_resume_device_data(struct mlx5vf_pci_core_device *mvdev)
1037
1049
}
1038
1050
1039
1051
migf -> buf [0 ] = buf ;
1040
- buf = mlx5vf_alloc_data_buffer (migf ,
1041
- sizeof (struct mlx5_vf_migration_header ), DMA_NONE );
1052
+ buf = mlx5vf_alloc_data_buffer (
1053
+ migf ,
1054
+ DIV_ROUND_UP (sizeof (struct mlx5_vf_migration_header ),
1055
+ PAGE_SIZE ),
1056
+ DMA_NONE );
1042
1057
if (IS_ERR (buf )) {
1043
1058
ret = PTR_ERR (buf );
1044
1059
goto out_buf ;
@@ -1148,7 +1163,8 @@ mlx5vf_pci_step_device_state_locked(struct mlx5vf_pci_core_device *mvdev,
1148
1163
MLX5VF_QUERY_INC | MLX5VF_QUERY_CLEANUP );
1149
1164
if (ret )
1150
1165
return ERR_PTR (ret );
1151
- buf = mlx5vf_get_data_buffer (migf , size , DMA_FROM_DEVICE );
1166
+ buf = mlx5vf_get_data_buffer (migf ,
1167
+ DIV_ROUND_UP (size , PAGE_SIZE ), DMA_FROM_DEVICE );
1152
1168
if (IS_ERR (buf ))
1153
1169
return ERR_CAST (buf );
1154
1170
/* pre_copy cleanup */
0 commit comments