Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
2
22b970495
Manage
Activity
Members
Labels
Plan
Issues
0
Issue boards
Milestones
Wiki
Code
Merge requests
0
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package Registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Summer2022
22b970495
Commits
3941dae1
Commit
3941dae1
authored
8 years ago
by
Al Viro
Browse files
Options
Downloads
Patches
Plain Diff
drm_dp_aux_dev: switch to read_iter/write_iter
Signed-off-by:
Al Viro
<
viro@zeniv.linux.org.uk
>
parent
2ea659a9
No related branches found
Branches containing commit
No related tags found
Tags containing commit
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
drivers/gpu/drm/drm_dp_aux_dev.c
+46
-63
46 additions, 63 deletions
drivers/gpu/drm/drm_dp_aux_dev.c
with
46 additions
and
63 deletions
drivers/gpu/drm/drm_dp_aux_dev.c
+
46
−
63
View file @
3941dae1
...
...
@@ -32,6 +32,7 @@
#include
<linux/kernel.h>
#include
<linux/module.h>
#include
<linux/uaccess.h>
#include
<linux/uio.h>
#include
<drm/drm_dp_helper.h>
#include
<drm/drm_crtc.h>
#include
<drm/drmP.h>
...
...
@@ -140,101 +141,83 @@ static loff_t auxdev_llseek(struct file *file, loff_t offset, int whence)
return
fixed_size_llseek
(
file
,
offset
,
whence
,
AUX_MAX_OFFSET
);
}
static
ssize_t
auxdev_read
(
struct
file
*
file
,
char
__user
*
buf
,
size_t
count
,
loff_t
*
offset
)
static
ssize_t
auxdev_read_iter
(
struct
kiocb
*
iocb
,
struct
iov_iter
*
to
)
{
s
ize_t
bytes_pending
,
num_bytes_processed
=
0
;
struct
drm_dp_aux_dev
*
aux_dev
=
file
->
private_data
;
s
truct
drm_dp_aux_dev
*
aux_dev
=
iocb
->
ki_filp
->
private_data
;
loff_t
pos
=
iocb
->
ki_pos
;
ssize_t
res
=
0
;
if
(
!
atomic_inc_not_zero
(
&
aux_dev
->
usecount
))
return
-
ENODEV
;
bytes_pending
=
min
((
loff_t
)
count
,
AUX_MAX_OFFSET
-
(
*
offset
));
if
(
!
access_ok
(
VERIFY_WRITE
,
buf
,
bytes_pending
))
{
res
=
-
EFAULT
;
goto
out
;
}
iov_iter_truncate
(
to
,
AUX_MAX_OFFSET
-
pos
);
while
(
bytes_pending
>
0
)
{
uint8_t
local
buf
[
DP_AUX_MAX_PAYLOAD_BYTES
];
ssize_t
todo
=
min
_t
(
size_t
,
bytes_pending
,
sizeof
(
local
buf
));
while
(
iov_iter_count
(
to
)
)
{
uint8_t
buf
[
DP_AUX_MAX_PAYLOAD_BYTES
];
ssize_t
todo
=
min
(
iov_iter_count
(
to
)
,
sizeof
(
buf
));
if
(
signal_pending
(
current
))
{
res
=
num_bytes_processed
?
num_bytes_processed
:
-
ERESTARTSYS
;
goto
out
;
res
=
-
ERESTARTSYS
;
break
;
}
res
=
drm_dp_dpcd_read
(
aux_dev
->
aux
,
*
offset
,
localbuf
,
todo
);
if
(
res
<=
0
)
{
res
=
num_bytes_processed
?
num_bytes_processed
:
res
;
goto
out
;
}
if
(
__copy_to_user
(
buf
+
num_bytes_processed
,
localbuf
,
res
))
{
res
=
num_bytes_processed
?
num_bytes_processed
:
-
EFAULT
;
goto
out
;
res
=
drm_dp_dpcd_read
(
aux_dev
->
aux
,
pos
,
buf
,
todo
);
if
(
res
<=
0
)
break
;
if
(
copy_to_iter
(
buf
,
res
,
to
)
!=
res
)
{
res
=
-
EFAULT
;
break
;
}
bytes_pending
-=
res
;
*
offset
+=
res
;
num_bytes_processed
+=
res
;
res
=
num_bytes_processed
;
pos
+=
res
;
}
out:
if
(
pos
!=
iocb
->
ki_pos
)
res
=
pos
-
iocb
->
ki_pos
;
iocb
->
ki_pos
=
pos
;
atomic_dec
(
&
aux_dev
->
usecount
);
wake_up_atomic_t
(
&
aux_dev
->
usecount
);
return
res
;
}
static
ssize_t
auxdev_write
(
struct
file
*
file
,
const
char
__user
*
buf
,
size_t
count
,
loff_t
*
offset
)
static
ssize_t
auxdev_write_iter
(
struct
kiocb
*
iocb
,
struct
iov_iter
*
from
)
{
s
ize_t
bytes_pending
,
num_bytes_processed
=
0
;
struct
drm_dp_aux_dev
*
aux_dev
=
file
->
private_data
;
s
truct
drm_dp_aux_dev
*
aux_dev
=
iocb
->
ki_filp
->
private_data
;
loff_t
pos
=
iocb
->
ki_pos
;
ssize_t
res
=
0
;
if
(
!
atomic_inc_not_zero
(
&
aux_dev
->
usecount
))
return
-
ENODEV
;
bytes_pending
=
min
((
loff_t
)
count
,
AUX_MAX_OFFSET
-
*
offset
);
if
(
!
access_ok
(
VERIFY_READ
,
buf
,
bytes_pending
))
{
res
=
-
EFAULT
;
goto
out
;
}
iov_iter_truncate
(
from
,
AUX_MAX_OFFSET
-
pos
);
while
(
bytes_pending
>
0
)
{
uint8_t
local
buf
[
DP_AUX_MAX_PAYLOAD_BYTES
];
ssize_t
todo
=
min
_t
(
size_t
,
bytes_pending
,
sizeof
(
local
buf
));
while
(
iov_iter_count
(
from
)
)
{
uint8_t
buf
[
DP_AUX_MAX_PAYLOAD_BYTES
];
ssize_t
todo
=
min
(
iov_iter_count
(
from
)
,
sizeof
(
buf
));
if
(
signal_pending
(
current
))
{
res
=
num_bytes_processed
?
num_bytes_processed
:
-
ERESTARTSYS
;
goto
out
;
res
=
-
ERESTARTSYS
;
break
;
}
if
(
__copy_from_user
(
localbuf
,
buf
+
num_bytes_processed
,
todo
))
{
res
=
num_bytes_processed
?
num_bytes_processed
:
-
EFAULT
;
goto
out
;
if
(
!
copy_from_iter_full
(
buf
,
todo
,
from
))
{
res
=
-
EFAULT
;
break
;
}
res
=
drm_dp_dpcd_write
(
aux_dev
->
aux
,
*
offset
,
localbuf
,
todo
);
if
(
res
<=
0
)
{
res
=
num_bytes_processed
?
num_bytes_processed
:
res
;
goto
out
;
}
bytes_pending
-=
res
;
*
offset
+=
res
;
num_bytes_processed
+=
res
;
res
=
num_bytes_processed
;
res
=
drm_dp_dpcd_write
(
aux_dev
->
aux
,
pos
,
buf
,
todo
);
if
(
res
<=
0
)
break
;
pos
+=
res
;
}
out:
if
(
pos
!=
iocb
->
ki_pos
)
res
=
pos
-
iocb
->
ki_pos
;
iocb
->
ki_pos
=
pos
;
atomic_dec
(
&
aux_dev
->
usecount
);
wake_up_atomic_t
(
&
aux_dev
->
usecount
);
return
res
;
...
...
@@ -251,8 +234,8 @@ static int auxdev_release(struct inode *inode, struct file *file)
static
const
struct
file_operations
auxdev_fops
=
{
.
owner
=
THIS_MODULE
,
.
llseek
=
auxdev_llseek
,
.
read
=
auxdev_read
,
.
write
=
auxdev_write
,
.
read
_iter
=
auxdev_read
_iter
,
.
write
_iter
=
auxdev_write
_iter
,
.
open
=
auxdev_open
,
.
release
=
auxdev_release
,
};
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment