[RFC,v6,02/10] xfs: create helper for ticket-less log res ungrant
diff mbox series

Message ID 20200406123632.20873-3-bfoster@redhat.com
State New
Headers show
Series
  • xfs: automatic relogging experiment
Related show

Commit Message

Brian Foster April 6, 2020, 12:36 p.m. UTC
Log reservation is currently acquired and released via log tickets.
The relog mechanism introduces behavior where relog reservation is
transferred between transaction log tickets and an external pool of
relog reservation for active relog items. Certain contexts will be
able to release outstanding relog reservation without the need for a
log ticket. Factor out a helper to allow byte granularity log
reservation ungrant.

Signed-off-by: Brian Foster <bfoster@redhat.com>
---
 fs/xfs/xfs_log.c | 20 ++++++++++++++++----
 fs/xfs/xfs_log.h |  1 +
 2 files changed, 17 insertions(+), 4 deletions(-)

Comments

Allison Collins April 6, 2020, 11:52 p.m. UTC | #1
On 4/6/20 5:36 AM, Brian Foster wrote:
> Log reservation is currently acquired and released via log tickets.
> The relog mechanism introduces behavior where relog reservation is
> transferred between transaction log tickets and an external pool of
> relog reservation for active relog items. Certain contexts will be
> able to release outstanding relog reservation without the need for a
> log ticket. Factor out a helper to allow byte granularity log
> reservation ungrant.
> 
> Signed-off-by: Brian Foster <bfoster@redhat.com>
Looks straight forward:
Reviewed-by: Allison Collins <allison.henderson@oracle.com>

> ---
>   fs/xfs/xfs_log.c | 20 ++++++++++++++++----
>   fs/xfs/xfs_log.h |  1 +
>   2 files changed, 17 insertions(+), 4 deletions(-)
> 
> diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c
> index 00fda2e8e738..d6b63490a78b 100644
> --- a/fs/xfs/xfs_log.c
> +++ b/fs/xfs/xfs_log.c
> @@ -2980,6 +2980,21 @@ xfs_log_ticket_regrant(
>   	xfs_log_ticket_put(ticket);
>   }
>   
> +/*
> + * Restore log reservation directly to the grant heads.
> + */
> +void
> +xfs_log_ungrant_bytes(
> +	struct xfs_mount	*mp,
> +	int			bytes)
> +{
> +	struct xlog		*log = mp->m_log;
> +
> +	xlog_grant_sub_space(log, &log->l_reserve_head.grant, bytes);
> +	xlog_grant_sub_space(log, &log->l_write_head.grant, bytes);
> +	xfs_log_space_wake(mp);
> +}
> +
>   /*
>    * Give back the space left from a reservation.
>    *
> @@ -3018,12 +3033,9 @@ xfs_log_ticket_ungrant(
>   		bytes += ticket->t_unit_res*ticket->t_cnt;
>   	}
>   
> -	xlog_grant_sub_space(log, &log->l_reserve_head.grant, bytes);
> -	xlog_grant_sub_space(log, &log->l_write_head.grant, bytes);
> -
> +	xfs_log_ungrant_bytes(log->l_mp, bytes);
>   	trace_xfs_log_ticket_ungrant_exit(log, ticket);
>   
> -	xfs_log_space_wake(log->l_mp);
>   	xfs_log_ticket_put(ticket);
>   }
>   
> diff --git a/fs/xfs/xfs_log.h b/fs/xfs/xfs_log.h
> index 1412d6993f1e..6d2f30f42245 100644
> --- a/fs/xfs/xfs_log.h
> +++ b/fs/xfs/xfs_log.h
> @@ -125,6 +125,7 @@ int	  xfs_log_reserve(struct xfs_mount *mp,
>   			  uint8_t		   clientid,
>   			  bool		   permanent);
>   int	  xfs_log_regrant(struct xfs_mount *mp, struct xlog_ticket *tic);
> +void	  xfs_log_ungrant_bytes(struct xfs_mount *mp, int bytes);
>   void      xfs_log_unmount(struct xfs_mount *mp);
>   int	  xfs_log_force_umount(struct xfs_mount *mp, int logerror);
>   
>

Patch
diff mbox series

diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c
index 00fda2e8e738..d6b63490a78b 100644
--- a/fs/xfs/xfs_log.c
+++ b/fs/xfs/xfs_log.c
@@ -2980,6 +2980,21 @@  xfs_log_ticket_regrant(
 	xfs_log_ticket_put(ticket);
 }
 
+/*
+ * Restore log reservation directly to the grant heads.
+ */
+void
+xfs_log_ungrant_bytes(
+	struct xfs_mount	*mp,
+	int			bytes)
+{
+	struct xlog		*log = mp->m_log;
+
+	xlog_grant_sub_space(log, &log->l_reserve_head.grant, bytes);
+	xlog_grant_sub_space(log, &log->l_write_head.grant, bytes);
+	xfs_log_space_wake(mp);
+}
+
 /*
  * Give back the space left from a reservation.
  *
@@ -3018,12 +3033,9 @@  xfs_log_ticket_ungrant(
 		bytes += ticket->t_unit_res*ticket->t_cnt;
 	}
 
-	xlog_grant_sub_space(log, &log->l_reserve_head.grant, bytes);
-	xlog_grant_sub_space(log, &log->l_write_head.grant, bytes);
-
+	xfs_log_ungrant_bytes(log->l_mp, bytes);
 	trace_xfs_log_ticket_ungrant_exit(log, ticket);
 
-	xfs_log_space_wake(log->l_mp);
 	xfs_log_ticket_put(ticket);
 }
 
diff --git a/fs/xfs/xfs_log.h b/fs/xfs/xfs_log.h
index 1412d6993f1e..6d2f30f42245 100644
--- a/fs/xfs/xfs_log.h
+++ b/fs/xfs/xfs_log.h
@@ -125,6 +125,7 @@  int	  xfs_log_reserve(struct xfs_mount *mp,
 			  uint8_t		   clientid,
 			  bool		   permanent);
 int	  xfs_log_regrant(struct xfs_mount *mp, struct xlog_ticket *tic);
+void	  xfs_log_ungrant_bytes(struct xfs_mount *mp, int bytes);
 void      xfs_log_unmount(struct xfs_mount *mp);
 int	  xfs_log_force_umount(struct xfs_mount *mp, int logerror);