Skip to content

Commit

Permalink
ptp: reduce stack usage when reading external time stamps
Browse files Browse the repository at this point in the history
This patch removes the large buffer from the stack of the read file
operation and replaces it with a kmalloced buffer.

Signed-off-by: Richard Cochran <richardcochran@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Richard Cochran authored and David S. Miller committed Nov 26, 2012
1 parent cfd1979 commit c7ec0ba
Showing 1 changed file with 17 additions and 5 deletions.
22 changes: 17 additions & 5 deletions drivers/ptp/ptp_chardev.c
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
#include <linux/posix-clock.h>
#include <linux/poll.h>
#include <linux/sched.h>
#include <linux/slab.h>

#include "ptp_private.h"

Expand Down Expand Up @@ -136,20 +137,23 @@ unsigned int ptp_poll(struct posix_clock *pc, struct file *fp, poll_table *wait)
return queue_cnt(&ptp->tsevq) ? POLLIN : 0;
}

#define EXTTS_BUFSIZE (PTP_BUF_TIMESTAMPS * sizeof(struct ptp_extts_event))

ssize_t ptp_read(struct posix_clock *pc,
uint rdflags, char __user *buf, size_t cnt)
{
struct ptp_clock *ptp = container_of(pc, struct ptp_clock, clock);
struct timestamp_event_queue *queue = &ptp->tsevq;
struct ptp_extts_event event[PTP_BUF_TIMESTAMPS];
struct ptp_extts_event *event;
unsigned long flags;
size_t qcnt, i;
int result;

if (cnt % sizeof(struct ptp_extts_event) != 0)
return -EINVAL;

if (cnt > sizeof(event))
cnt = sizeof(event);
if (cnt > EXTTS_BUFSIZE)
cnt = EXTTS_BUFSIZE;

cnt = cnt / sizeof(struct ptp_extts_event);

Expand All @@ -167,6 +171,12 @@ ssize_t ptp_read(struct posix_clock *pc,
return -ENODEV;
}

event = kmalloc(EXTTS_BUFSIZE, GFP_KERNEL);
if (!event) {
mutex_unlock(&ptp->tsevq_mux);
return -ENOMEM;
}

spin_lock_irqsave(&queue->lock, flags);

qcnt = queue_cnt(queue);
Expand All @@ -185,8 +195,10 @@ ssize_t ptp_read(struct posix_clock *pc,

mutex_unlock(&ptp->tsevq_mux);

result = cnt;
if (copy_to_user(buf, event, cnt))
return -EFAULT;
result = -EFAULT;

return cnt;
kfree(event);
return result;
}

0 comments on commit c7ec0ba

Please sign in to comment.